Delphi, кнопка Показать в другой ячейке TGridPanelLayout
Привет, я работаю с XE6, и я использую TGridPanelLayout с 4 столбцами и 4 рядами. На первой ячейке я показываю кнопку. Я хотел бы, чтобы при нажатии на эту кнопку эта кнопка появлялась в другой ячейке. Но я не могу найти, как это сделать, пока я пробовал это, но ничего не происходит.
procedure TForm4.Button1Click(Sender: TObject);
begin
GridMyPannel.ControlCollection.BeginUpdate;
GridMyPannel.ControlCollection.AddControl(Button1, 2, 2);
Button1.Parent := GridMyPannel;
end;
Я действительно новичок в Delphi. Может ли кто-нибудь дать мне пример того, как я могу это сделать?
2 ответа
TGridPanel
имеет свойство ControlCollection, которое позволяет получить доступ к Row
а также Column
свойства, которые также появляются на вашем TButton
как только вы поместили внутрь TGridpanel
, TButton
(точнее его суперкласс TControl
) не имеет Row
или же Column
имущество. Таким образом, мы должны получить контроль над 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;
Приведенный выше код находит кнопку и меняет ее Row
а также Column
свойство случайного значения. Обратите внимание, что вы не указали, TButton
является единственным контролем в рамках TGridpanel
, Это тот случай?
Я сделал ниже в нормальных VCL и XE3 и с TGridPanel (нет TGridPanelLayout в моем Delphi).
Проблема с GridPanel заключается в том, что он не позволяет помещать элементы управления (кнопки и т. Д.) В какую-либо ячейку (например, ячейку:1,1), не имея элементов управления в ячейках перед этой ячейкой. GridPanel всегда заполняет себя от индекса 0 и выше.
Так что хитрость в том, чтобы обмануть это. Теперь, в зависимости от того, есть ли у вас другие ячейки в GridPanel, вам нужно будет выделить место для кнопки, а также поместить что-то еще на ее место, если кнопка была в ячейке с более низким индексом.
Посмотрите на форму перед нажатием кнопки:
Обратите внимание, что я еще не создал элемент ControlItem в ячейке 1,0.
Я хочу переместить кнопку 1 в ячейку 1,0. Я не могу этого сделать, если сначала не поставлю что-то еще на свое место (ячейка 0,0). Я должен создать новый элемент ControlItem в ячейке 1,0, чтобы разместить 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;
Результат: