Delphi,在不同的 TGridPanelLayout 单元格中显示按钮

Delphi, Show button in a different TGridPanelLayout cell

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

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

我真的是 Delphi 的新手。谁能举个例子说明我该怎么做?

我在普通 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;

结果:

A TGridPanel 有一个 ControlCollection 属性 允许访问 RowColumn 属性,这些属性也出现在您的 TButton 上一旦您将 TGridpanel 放入其中。 TButton(或者说它的超类 TControl)没有 RowColumn 属性。所以我们需要掌握 TGridpanel 使用的 TControlItem 包装器。

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 属性 更改为随机值。请注意,您没有指定 TButton 是否是 TGridpanel 中的唯一控件。是这样吗?