Averiguar la posición de un control dentro de TGridPanel
-
05-07-2019 - |
Pregunta
¿Cómo puedo averiguar la posición (índice de fila y columna) de los controles dentro de TGridPanel? Me gustaría usar el evento OnClick común para la cantidad de botones y necesito saber la posición X, Y del botón.
Estoy usando Delphi 2007.
Solución
Desafortunadamente, debido a la magia de TGridPanel , es un poco más complicado que solo obtener las propiedades Top y Left ...
Esto debería hacerlo para cualquier Control, adaptarlo a sus necesidades:
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;
Otros consejos
Puedes usar el reparto Sender como un botón t y luego pedirle su parte superior e izquierda, por ejemplo:
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;
O si solo quiere saber qué botón se presionó, también puede usar la propiedad TAG para insertar un número en cada botón y luego recuperar el valor de la etiqueta en su evento onclick. Solo recuerda configurar primero la propiedad Tag en algo. Puede hacer esto en el diseñador de formularios si solo está colocando botones en el panel de la cuadrícula o en la rutina que usa para crear e insertar sus botones.
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;
También puede usar la propiedad de etiqueta para almacenar más que solo un número entero, ya que un puntero actualmente usa el mismo tamaño de memoria que el entero, puede convertir un puntero en un entero e insertar ese valor en la propiedad de etiqueta. Solo tenga en cuenta que cualquier puntero que coloque en este campo aún se tratará como un número entero. Usted es responsable de la memoria a la que apunta, no será administrada por el componente.