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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top