如何在运行时更新Fmx.TPopupCell项目

时间:2013-12-26 15:33:33

标签: delphi grid firemonkey delphi-xe5

我正在使用带有一个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以一个单元格开头,其下拉列表中有一个项目,后来又添加了另一个单元格(行),项目中的项目也变为两个。第二个单元格在单击时显示两个项目,但第一个单元格仅显示从头开始的一个项目。

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

2 个答案:

答案 0 :(得分:0)

我设法通过使用以下代码

来解决问题
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时,我都会调用此过程。

这可能不是最好的方法。

答案 1 :(得分:0)

这适合我:

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;

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