Question

Comment puis-je connaître la position (index des lignes et des colonnes) des contrôles dans TGridPanel? J'aimerais utiliser un événement OnClick commun pour le nombre de boutons et connaître la position X, Y du bouton.

J'utilise Delphi 2007.

Était-ce utile?

La solution

Malheureusement, en raison de la magie de TGridPanel , il est un peu plus compliqué que de simplement obtenir les propriétés Top et Left ...

Cela devrait le faire pour n'importe quel contrôle, adaptez-le à vos besoins:

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;

Autres conseils

Vous pouvez utiliser la conversion Sender comme un tButton, puis lui demander son haut et son gauche, par exemple:

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;

Si vous souhaitez simplement savoir quel bouton a été enfoncé, vous pouvez également utiliser la propriété TAG pour insérer un numéro dans chaque bouton, puis récupérer la valeur de la balise dans votre événement onclick. N'oubliez pas de définir d'abord la propriété Tag sur quelque chose. Vous pouvez le faire dans le concepteur de formulaire si vous venez de déposer des boutons dans le panneau de la grille ou dans la routine que vous utilisez pour créer et insérer vos boutons.

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;

Vous pouvez également utiliser la propriété tag pour stocker davantage qu'un entier, puisqu'un pointeur utilise actuellement la même taille de mémoire que l'entier, vous pouvez convertir un pointeur en un entier et insérer cette valeur dans la propriété du tag. Sachez simplement que tout pointeur que vous placez dans ce champ est toujours traité comme un entier. Vous êtes responsable de la mémoire vers laquelle elle pointe, elle ne sera pas gérée par le composant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top