Connaître la position d'un contrôle dans TGridPanel
-
05-07-2019 - |
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.
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.