Выяснение позиции элемента управления внутри TGridPanel
-
05-07-2019 - |
Вопрос
Как я могу узнать положение (индекс строки и столбца) элементов управления внутри 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;
Вы также можете использовать свойство тега для хранения не только целого числа, так как указатель в настоящее время использует тот же размер памяти, что и целое число, вы можете привести указатель к целому числу и вставить это значение в свойство тега. Просто помните, что любой указатель, который вы помещаете в это поле, по-прежнему рассматривается как целое число. Вы несете ответственность за память, на которую он указывает, компонент не будет управляться.