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;

Результат:

Другие вопросы по тегам