【问题标题】:How to update Fmx.TPopupCell items in run time如何在运行时更新 Fmx.TPopupCell 项目
【发布时间】:2013-12-26 15:33:33
【问题描述】:

我正在使用带有一个 TPopupColumn 的 fireMonkey 网格。此列的项目是确定的,并且在运行时也会发生变化。

问题是 TpopupColumn.items 中的更改仅反映在弹出列中新添加的行上,而旧的具有旧项(未更改)。

setlength(PointNames,NoMeasPoints);
setlength(PlaneNames,NoMeasPlanes);
PopupColumn1.Items.Clear;
Grid1.RowCount:=NoMeasPoints;
for i:=0 to NoMeasPlanes-1 do
begin
  PlaneNames[i]:= 'Plane '+inttostr(i+1);
  PopupColumn1.Items.Add(PlaneNames[i].ToString);
  Grid1.Repaint;
end;

例如,如果 PopupColumn1 从一个单元格开始,其下拉列表中有一个项目,然后添加了另一个单元格(行),其中项目也更改为两个。第二个单元格在单击时显示两个项目,但第一个单元格只显示它从一开始就有的一个项目。

有没有办法在运行时更新单元格。

【问题讨论】:

  • 这是什么语言?
  • 这个德尔福。我正在使用delphi xe5
  • 您需要遍历列中的每个单元格并更新每个单元格的项目。不过,进入牢房并不容易。也许使用 Column[n].Children?如果这还不足以让您继续前进,我稍后会给出正确的答案。
  • @MikeSutton,我试图完全按照您提到的去做,但 Column[n].Children 不包含 Items 属性来更改 popupCell.Items。我确实尝试删除所有 popupcolumn 然后再次创建它们。使用这种方式我设法访问和更新 PopupCell.Items。但是,当我尝试更改 gid.RowCount 时,我现在面临另一个问题,我得到内存访问冲突错误
  • 关于如何在运行时更新 PopupCell.Items 而不先删除它们然后再次创建它们的任何想法。删除和创建单元格确实会导致内存违规问题和显示问题(例如,单击时单元格未突出显示)

标签: delphi grid firemonkey delphi-xe5


【解决方案1】:

这对我有用:

procedure TForm1.Button1Click(Sender: TObject);
var Cell: TFMXObject;
begin
  if not (Grid1.Columns[0] is TPopupColumn) then
    EXIT;

  TPopupColumn(Grid1.Columns[0]).Items.Add('New Item');
  for Cell in Grid1.Columns[0].Children do
    if Cell is TPopupCell then
      TPopupCell(Cell).Items.Assign(TPopupColumn(Grid1.Columns[0]).Items);
end;

只需使用适当的列索引或您的网格。

【讨论】:

    【解决方案2】:

    我设法通过使用以下代码解决了这个问题,

    Procedure UpdateStringGrid1;
     Var i,j:integer;
     var item1:TPopupCell;
     Begin
      with MultiBalForm do
       begin
         Grid1.RowCount:=NoMeasPoints;
         setlength(PointNames,NoMeasPoints);
         setlength(PlaneNames,NoMeasPlanes);
         PopupColumn1.Items.Clear;
         popupcolumn1.DeleteChildren;
         for J := 0 to NoMeasPoints-1 do
         begin
           item1:=TPopupCell.Create(popupcolumn1);
           item1.Align:=TalignLayout.alTop;
           item1.Height:=25;
           for i:=0 to NoMeasPlanes-1 do
           begin
             PlaneNames[i]:='Plane ' + inttoStr(i+1);
             item1.Items.Add(PlaneNames[i].ToString);
           end;
           PopupColumn1.AddObject(item1);
         end;
      end;
    end;  
    

    每次我想通过使用“DeleteChildren”更新删除单元格的 popcolumn.items 时调用此过程,然后使用更新后的项目创建新的 popupcells。

    这可能不是最好的方法。

    【讨论】:

    • 注意:多次调用此过程时,尝试更改 PopupColumn1.RowCount 时出现错误“内存访问冲突”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多