我无法将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控件,如combolorbox,图像和复选框(Check_Rainbow)。 frame_%s
用于识别目的。创建渐变编辑器时,它将从Owner
创建一个唯一名称,其中%s是每次创建渐变编辑器时都会递增的序列号。 Parent
和List_Gradients
都是List_Gradient
。从上图可以看到会发生什么。右边的列表框已添加以进行检查,并仅显示文本,顺便说一句,这是正确的顺序。当我使用调试器来跟随渐变编辑器添加到
List_Gradients
时,它们的处理顺序相同。但是渐变编辑器的顺序是错误的。我不得不提到渐变编辑器的功能是alTop。我什至添加了一些代码来确保编辑器位于TListBox
的最底部。我似乎不明白某事。我无法想象顺序添加到不能导致正确的顺序。我究竟做错了什么?
最佳答案
尝试以下方法:
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;