0

嗨,我正在使用 XE6,我正在使用具有 4 列和 4 行的 TGridPanelLayout。在第一个单元格上,我正在显示一个按钮。我想做的是,当我点击这个按钮时,让那个按钮出现在不同的单元格中。但我找不到怎么做,到目前为止我试过这个,但没有任何反应。

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

我对德尔福真的很陌生。谁能给我一个例子来说明我该怎么做?

4

2 回答 2

2

ATGridPanel有一个ControlCollection属性,它允许访问RowColumn属性,TButton一旦您将其放入TGridpanel. A TButton(或者更确切地说它的超类TControl)没有 a RoworColumn属性。所以我们需要掌握TControlItem包装器的TGridpanel用途。

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;

上面的代码找到了按钮并将其RowColumn属性更改为随机值。请注意,您没有指定 是否TButtonTGridpanel. 是这样吗?

于 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,0 创建一个新的 ControlItem 来容纳 button1。

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 回答