0

こんにちは、私は XE6 を使用しており、4 列と 4 行の TGridPanelLayout を使用しています。最初のセルにボタンを表示しています。私がやりたいことは、このボタンをクリックすると、そのボタンが別のセルに表示されるようにすることです。しかし、私はそれを行う方法を見つけることができません。これまでのところ、これを試しましたが、何も起こりません。

procedure TForm4.Button1Click(Sender: TObject);
begin
GridMyPannel.ControlCollection.BeginUpdate;
GridMyPannel.ControlCollection.AddControl(Button1, 2, 2);
Button1.Parent := GridMyPannel;
end;

私はDelphiで本当に新しいです。誰かが私がそれを行う方法の例を教えてもらえますか?

4

2 に答える 2

2

TGridPanelControlCollectionプロパティがあり、 内に配置すると、 にも表示されるRowおよびプロパティにアクセスできます。A (またはそのスーパークラス) にはorプロパティがありません。そのため、使用するラッパーを把握する必要があります。ColumnTButtonTGridpanelTButtonTControlRowColumnTControlItemTGridpanel

procedure TForm8.Button1Click(Sender: TObject);
var
    selectedControl:        TControl;
    itemIndex:              Integer;
    selectedControlItem:    TControlItem; // This knows about "Row" and "Column"
begin
    // This is the button we've clicked
    selectedControl := Sender as TControl;

    itemIndex := GridPanel1.ControlCollection.IndexOf(selectedControl);
    if (itemIndex <> -1) then begin
        selectedControlItem := GridPanel1.ControlCollection.Items[itemIndex];
        selectedControlItem.Row := Random(GridPanel1.RowCollection.Count);
        selectedControlItem.Column := Random(GridPanel1.ColumnCollection.Count);
    end;
end;

上記のコードは、ボタンを見つけて、そのRowandColumnプロパティをランダムな値に変更します。TButtonが 内の唯一のコントロールであるかどうかを指定しなかったことに注意してくださいTGridpanel。そうですか?

于 2015-02-20T09:26:58.123 に答える
1

以下は、通常の VCL と XE3 で、TGridPanel を使用して行いました (私の Delphi では TGridPanelLayout はありません)。

GridPanel の問題は、コントロール (ボタンなど) を任意のセル (Cell:1,1 など) に配置できず、そのセルの前のセルにコントロールがないことです。GridPanel は、常にインデックス 0 から上に向かっていっぱいになります。

したがって、トリックはそれをだますことです。GridPanel に既に他のセルがあるかどうかに応じて、ボタンが移動する場所を確保し、ボタンがより低いインデックスのセルにある場合は、その場所に何か他のものを配置する必要があります。

ボタンを押す前にフォームを見てください。

ここに画像の説明を入力

セル 1,0 に ControlItem をまだ作成していないことに注意してください。

ボタン 1 をセル 1,0 に移動したいと思います。最初にその場所 (セル 0,0) に何か他のものを配置しない限り、それを行うことはできません。ボタン 1 を収容するために、セル 1,0 に新しい ControlItem を作成する必要があります。

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Places CheckBox1 in the same cell as BUtton1
  GridPanel1.ControlCollection.ControlItems[0,0].Control := CheckBox1;
  // Create a new ControlItem for Button1 and in the same breath move
  // Button1 to it
  GridPanel1.ControlCollection.AddControl(Button1,1,0);
  // You know what this does. :)
  CheckBox1.Parent := GridPanel1;
end;

結果:

ここに画像の説明を入力

于 2015-02-20T06:34:04.020 に答える