Выяснение позиции элемента управления внутри TGridPanel

StackOverflow https://stackoverflow.com/questions/1405106

Вопрос

Как я могу узнать положение (индекс строки и столбца) элементов управления внутри TGridPanel? Я хотел бы использовать общее событие OnClick для количества кнопок, и мне нужно знать положение кнопки по оси X, Y.

Я использую Delphi 2007.

Это было полезно?

Решение

К сожалению, из-за магии TGridPanel это немного сложнее, чем просто получить свойства Top и Left ...

Это следует сделать для любого элемента управления, адаптировать его к вашим потребностям:

procedure GetRowColumn(const AControl: TControl; var ARow, AColumn: Integer);
var
  I: Integer;
begin
  if AControl.Parent is TGridPanel then
  begin
    I := TGridPanel(AControl.Parent).ControlCollection.IndexOf(AControl);
    if I > -1 then
    begin
      ARow := TGridPanel(AControl.Parent).ControlCollection[I].Row;
      AColumn := TGridPanel(AControl.Parent).ControlCollection[I].Column;
    end;
  end;
end;

procedure TForm1.ButtonClick(Sender: TObject);
var
  Row, Column : Integer;
begin
  GetRowColumn(Sender as TControl, Row, Column);
  // do something with Row and Column
  ShowMessage( Format('row=%d - col=%d',[Row, Column]));
end;

Другие советы

Вы можете использовать приведение Sender в качестве tButton, а затем запросить его верхнюю и левую сторону, например:

Procedure TForm1.OnClick(Sender:tObject);
var
  X,Y : Integer;
begin
  if Sender is TButton then
    begin
      X := TButton(Sender).Top;
      Y := TButton(Sender).Left;
      // do something with X & Y
    end;
end;

Или, если вы просто хотите узнать, какая кнопка была нажата, вы также можете использовать свойство TAG, чтобы вставить число в каждую кнопку, а затем получить значение тега в событии onclick. Просто не забудьте сначала установить свойство Tag на что-то. Это можно сделать в конструкторе форм, если вы просто перетаскиваете кнопки на панель сетки или в процедуру, которую вы используете для создания и вставки кнопок.

Procedure TForm1.OnClick(Sender:tObject);
var
  iButton : integer;
begin
  if Sender is TComponent then
    begin
      iButton := TComponent(Sender).Tag;
      // do something with iButton
    end;
end;

Вы также можете использовать свойство тега для хранения не только целого числа, так как указатель в настоящее время использует тот же размер памяти, что и целое число, вы можете привести указатель к целому числу и вставить это значение в свойство тега. Просто помните, что любой указатель, который вы помещаете в это поле, по-прежнему рассматривается как целое число. Вы несете ответственность за память, на которую он указывает, компонент не будет управляться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top