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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top