1

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 は、グラデーション エディターが作成されるたびにインクリメントされるシーケンス番号です。OwnerParentは両方List_Gradientsです。

ここに画像の説明を入力

上の画像から、何が起こっているかがわかります。右側のリストボックスはチェック用に追加されており、テキストのみを表示していますが、これは正しい順序です。デバッガーを使用してグラデーション エディターを追加すると、List_Gradientそれらは同じ順序で処理されます。しかし、グラデーション エディタの順序が間違っています。グラデーション エディターの配置は alTop であることに言及する必要があります。エディターが の一番下に配置されるようにするためのコードも追加しましたList_Gradients

私は何かを理解していないようです。TListBoxa に順次追加しても正しい順序にならないことは想像できません。私は何を間違っていますか?

4

2 に答える 2

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 の非常に優れた機能です。ただし、物事が予想とは異なる場合があることに注意してください。1 つには、オブジェクトは文字列と同じようには配置されません。

于 2013-11-15T10:26:06.517 に答える
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;
于 2013-11-13T20:31:05.197 に答える