FireMonkey网格中同一列包含不同控件

3
如果您想在FireMonkey网格的同一列中使用不同的单元格控件,该怎么办呢?
单元格控件似乎属于列,但有些情况下(比如属性编辑器),某些行需要复选框,而其他行需要组合框或编辑控件。
提前致谢。
3个回答

2
以下步骤可使你开始运行:
  • 创建一个样式,并将想要显示的控件添加到其中(例如 TCheckbox、TCombobox 和 TEdit)。在 TLayout 中添加这些控件,并将每个控件的 StyleName 设置为一些容易记住的值。
  • 在单元格的 ApplyStyle 方法中使用 FindStyleResource 根据它们的 StyleNames 提取上述添加的控件。
  • 当网格调用单元格的 SetData 方法时,你需要设置每个控件的 Visible 属性,以便只显示适当的控件。如果无法从传入的数据确定此内容,则需向单元格添加事件处理程序以获取数据。
  • 需要解决键盘处理问题,这可能会变得非常混乱。如果我没记错的话,你需要将来自网格/单元格的键传递给控件(或者捕获控件的移动键并将其传递给网格?如果我忘了具体细节,请见谅)。

很抱歉我不能给出更详细的答案,因为完整地涵盖这个问题需要一系列的博客文章。


1
我也需要一个属性编辑器,并寻找一种在一列中托管不同单元格类型的方法。像上面建议的那样为每一行使用不同的样式可能是一个解决方案,但由于Firemonkey网格没有为特定行保留任何单元格控件,每次单元格控件显示在行上时,真正的样式将被应用于它。对于静态属性编辑器来说,这不是一个大问题,但对于一个具有许多行和每行不同单元格类型的真实网格,需要采用不同的策略。因此,我想出了一个不同的解决方案,我考虑在TColumn和单元格控件之间使用单元格类型代理,以便每个单元格代理将保留负责的单元格控件。首先,我有一个新的TColumn(TvariantColumn),它负责顶部策略。
vColumn := TVariantColumn.Create(Self);
vColumn.Header := 'Variant Column';
vColumn.OnGetCellProxyIndex := GetCellProxyIndex;
Grid1.AddObject(vColumn);

然后创建任何代理,例如

vColumn.NewCellProxy(TTextProxy); 
vColumn.NewCellProxy(TColorComboProxy);
vColumn.NewCellProxy(TComboColorProxy);

创建代理后,您还可以处理特定于代理的工作,例如

with TProgressProxy(vColumn.NewCellProxy(TProgressProxy)) do //4
begin
  Min := 0;
  Max := 100;
end;

with  TPopUpProxy(vColumn.NewCellProxy(TPopupProxy)) do //5
begin
  Items.Add('Istanbul');
  Items.Add('Paris');
  Items.Add('NewYork');
end; 

我在我的网站上写了一篇博客,详细介绍了我的方法,并发布了一篇文章,您可以在其中了解更多相关内容。


1

使用样式 - 在设置单元格数据时设置单元格样式 - 然后使用onapplystyle事件对新样式的单元格进行任何智能操作。

这样,您可以将所需的控件添加到样式中,然后使用onapplystyle访问控件(以设置事件等)。

提示 - FindStyleResource在这里是您的朋友 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接