Individuazione della posizione di un controllo all'interno di TGridPanel
-
05-07-2019 - |
Domanda
Come posso scoprire la posizione (indice di riga e colonna) dei controlli all'interno di TGridPanel? Vorrei utilizzare l'evento OnClick comune per il numero di pulsanti e ho bisogno di conoscere la posizione X, Y del pulsante.
Sto usando Delphi 2007.
Soluzione
Sfortunatamente, a causa della magia di TGridPanel , è un po 'più complicato del semplice ottenere le proprietà Top e Left ...
Questo dovrebbe farlo per qualsiasi controllo, adattarlo alle tue esigenze:
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;
Altri suggerimenti
Puoi usare il cast del mittente come un pulsante t, quindi chiederne la parte superiore e sinistra, ad esempio:
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 se vuoi solo sapere quale pulsante è stato premuto, puoi anche utilizzare la proprietà TAG per inserire un numero in ciascun pulsante, quindi recuperare il valore del tag nell'evento onclick. Ricorda solo di impostare prima la proprietà Tag su qualcosa. Puoi farlo nella finestra di progettazione del modulo se stai semplicemente facendo cadere i pulsanti nel pannello della griglia o nella routine che stai usando per creare e inserire i tuoi pulsanti.
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;
Puoi anche usare la proprietà tag per archiviare più di un solo numero intero, poiché un puntatore attualmente utilizza la stessa dimensione di memoria dell'intero, puoi lanciare un puntatore su un numero intero e inserire quel valore nella proprietà tag. Basta essere consapevoli del fatto che qualsiasi puntatore inserito in questo campo viene comunque trattato come un numero intero. Sei responsabile della memoria a cui punta, non sarà gestita dal componente.