FireMonkey网格在同一列中具有不同的控件

时间:2012-05-29 18:53:44

标签: delphi grid delphi-xe2 firemonkey

如果您想在FireMonkey的网格的同一列中使用不同的单元格控件,可以执行哪些操作。 单元格控件似乎属于列,但有些情况(如属性编辑器),其中某些行需要复选框,而其他行需要组合框或编辑控件。

提前致谢。

4 个答案:

答案 0 :(得分:5)

我猜你会在this article中找到解决方案。

Sample custom grid cell

您必须创建一个自定义单元格类。

答案 1 :(得分:2)

Arnaud在答案中已经与我的文章联系在一起了。本文介绍了网格,列和单元格的基础知识。以下步骤可以帮助您启动并运行:

  • 创建样式,将要添加的控件添加到其中(即TCheckbox,TCombobox和TEdit)。在TLayout中添加这些,并将每个控件StyleName设置为令人难忘的东西。
  • 在你的单元格中,ApplyStyle使用FindStyleResource来提取你在上面使用StyleNames添加的控件。
  • 当网格调用单元格的SetData方法时,需要为每个控件设置Visible属性,以便只显示相应的属性。如果您无法从传入的数据中确定这一点,请向单元格添加事件处理程序以获取数据。
  • 你需要理清键盘处理,这会非常混乱。如果内存服务,你需要将键从网格/单元格传递给控件(或者是否从控件中捕获移动键并将它们传递给网格?对不起,如果我忘记确切的细节)。

对不起,我不能给出更详细的答案,但完全覆盖这一点需要一系列博客文章。

答案 2 :(得分:1)

使用样式 - 设置单元格数据时设置单元格样式 - 然后使用onapplystyle事件,使用新设置的单元格执行任何聪明的操作。

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

提示 - FindStyleResource是你的朋友: - )

答案 3 :(得分: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; 

我在我的网站上发布了我的方法并发布了详细的article,您可以在其中找到有关该主题的更多信息。