3

如果你想在 FireMonkey 的同一列中使用不同的单元格控件,你可以做什么。单元格控件似乎属于列,但在某些情况下(例如属性编辑器),某些行需要一个复选框,而其他行需要一个组合框或编辑控件。

提前致谢。

4

4 回答 4

5

我猜你会在这篇文章中找到解决方案。

示例自定义网格单元

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

于 2012-05-29T19:25:38.480 回答
2

Arnaud 在他的回答中已经链接到我的文章。本文涵盖了网格、列和单元格的基础知识。以下步骤应该让您启动并运行:

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

抱歉,我无法给出更详细的答案,但完全涵盖这一点需要一系列博客文章。

于 2012-05-29T21:50:19.533 回答
1

使用样式 - 在设置单元格数据时设置单元格样式 - 然后使用 onapplystyle 事件对新样式的单元格执行您需要的任何巧妙操作。

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

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

于 2012-05-29T21:26:04.117 回答
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; 

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

于 2012-11-21T01:15:20.937 回答