TListbox と TList の同期を維持するのに問題があります。項目がジェネリック TList に追加されるたびに、OnNotify が呼び出され、コールバックは 1 つのプロシージャのみを呼び出します: 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) としていくつかの FMX コントロールがあります。Check_Rainbow.Text
識別目的で使用されます。グラデーション エディターが作成されると、一意の名前がframe_%s
作成されます。%s は、グラデーション エディターが作成されるたびにインクリメントされるシーケンス番号です。Owner
とParent
は両方List_Gradients
です。
上の画像から、何が起こっているかがわかります。右側のリストボックスはチェック用に追加されており、テキストのみを表示していますが、これは正しい順序です。デバッガーを使用してグラデーション エディターを追加すると、List_Gradient
それらは同じ順序で処理されます。しかし、グラデーション エディタの順序が間違っています。グラデーション エディターの配置は alTop であることに言及する必要があります。エディターが の一番下に配置されるようにするためのコードも追加しましたList_Gradients
。
私は何かを理解していないようです。TListBox
a に順次追加しても正しい順序にならないことは想像できません。私は何を間違っていますか?