无法同步通用TList和TListBox

时间:2013-11-13 17:20:23

标签: delphi listbox firemonkey delphi-xe5

我无法让TListbox与TList保持同步。每次将项添加到通用TList时,都会调用OnNotify,并且回调只调用一个过程:create_gradients。其代码如下:

  procedure TColor_Dialog.create_gradients;
  var Editor: TGradient_Editor;
      eGradient: Int32;
      y: single;
      s: string;
  begin
     List_Names.Clear;
     List_Gradients.Clear;

     for eGradient := 0 to FColor_Editor.nGradients - 1 do
     begin
        List_Names.Items.Add (FColor_Editor [eGradient].Check_Rainbow.Text);
     end; // for

     List_Gradients.BeginUpdate;
     try
        for eGradient := 0 to FColor_Editor.nGradients - 1 do
        begin
           Editor := FColor_Editor [eGradient];
           y := (eGradient + 1) * Editor.Height;
           Editor.Position.Y := y;
           s := Editor.Check_Rainbow.Text;
           List_Gradients.AddObject (Editor);
        end; // for
     finally
        List_Gradients.EndUpdate;
     end; // try..finally
  end; // create_gradients //

如您所见,它只是枚举列表中的所有项目。列表中的每个项目都是TGradient_Editor,而TFrame又有Check_Rainbow.Text作为父项。在父母身上有一些FMX控件作为combolorboxes,一个图像和一个复选框(Check_Rainbow)。 frame_%s用于识别目的。创建渐变编辑器时,它会从Owner创建一个唯一名称,其中%s是每次创建渐变编辑器时递增的序列号。 ParentList_Gradients都是List_Gradient

enter image description here

从上图可以看出会发生什么。右边的列表框被添加用于检查,并且只显示文本,顺便说一下,这是正确的顺序。当我使用调试器跟随向List_Gradients添加渐变编辑器时,它们将以相同的顺序处理。但渐变编辑器的顺序是错误。我必须提到渐变编辑器的aligop是alTop。我添加了一些代码以确保编辑器位于TListBox的最底部。

我似乎不明白。我无法想象顺序添加{{1}}不会导致正确的顺序。我做错了什么?

2 个答案:

答案 0 :(得分:3)

请改为尝试:

procedure TColor_Dialog.create_gradients;
var
  Editor: TGradient_Editor;
  eGradient: Int32;
  y: single;
begin
  List_Names.Clear;
  List_Gradients.Clear;

  for eGradient := 0 to FColor_Editor.nGradients - 1 do
  begin
    List_Names.Items.Add (FColor_Editor[eGradient].Check_Rainbow.Text);
  end;

  List_Gradients.BeginUpdate;
  try
    y := 0.0; // or whatever value you want to start at...
    for eGradient := 0 to FColor_Editor.nGradients - 1 do
    begin
      Editor := FColor_Editor[eGradient];
      Editor.Position.Y := y;
      List_Gradients.AddObject(Editor);
      y := y + Editor.Height;
    end;
  finally
    List_Gradients.EndUpdate;
  end;
end;

答案 1 :(得分:3)

根据要求,我将答案移到了本节。正确的代码是:

  procedure TColor_Dialog.create_gradients;
  var Editor: TGradient_Editor;
      eGradient: Int32;
      y: single;
  begin
     List_Gradients.BeginUpdate;
     try
        List_Gradients.Clear;
        y := 0;
        for eGradient := 0 to FColor_Editor.nGradients - 1 do
        begin
           Editor := FColor_Editor [eGradient];
           Editor.Position.X := 0;
           Editor.Position.Y := y;
           Editor.Width := List_Gradients.Width;
           List_Gradients.AddObject (Editor);
           y := y + Editor.Height;
        end; // for
     finally
        List_Gradients.EndUpdate;
     end; // try..finally
  end; // create_gradients //

并且不再使用任何对齐方式。将对象添加到TListBox是FMX的一个很好的功能。但是,要做好准备,事情有时会与预期不同。一方面:对象的定位方式与字符串不同。