Herauszufinden Position einer Sonde in TGridPanel
-
05-07-2019 - |
Frage
Wie kann ich die Position (Zeilen- und Spaltenindex) von Kontrollen innerhalb TGridPanel herausfinden kann? Ich möchte für die Anzahl der Tasten gemeinsam OnClick Ereignis verwenden und müssen die X kennen, Y-Position der Taste.
Ich bin mit Delphi 2007.
Lösung
Leider wegen die Magie der TGridPanel , ist es ein wenig komplizierter als nur die Top bekommen und Linke Eigenschaften ...
Dies sollte es für jede Kontrolle tun, passen sie an Ihre Bedürfnisse:
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;
Andere Tipps
Sie können Sender Guss als TButton verwenden und stellen sie dann für seine oben und links zum Beispiel:
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;
Oder wenn Ihr nur wollen wissen, welche Taste gedrückt wurde, können Sie auch die TAG-Eigenschaft verwenden, eine Zahl in jeder Taste zum Einfügen und anschließend den Tag-Wert in Ihrem Onclick-Ereignis abrufen. Denken Sie daran, zuerst die Tag-Eigenschaft auf etwas festgelegt. Sie können im Formular-Designer dies tun, wenn Ihr nur Tasten in die Gitterplatte oder in der Routine fallen Ihr mit Ihren Schaltflächen erstellen und einfügen.
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;
Sie können auch die Tag-Eigenschaft verwenden, um mehr zu speichern als nur eine ganze Zahl ist, da zur Zeit ein Zeiger die gleiche Speichergröße als integer verwendet man einen Zeiger auf eine ganze Zahl werfen kann und diesen Wert in die Tag-Eigenschaft einfügen. Seien Sie sich bewusst sein, dass jeder Zeiger in diesem Feld legen nach wie vor als eine ganze Zahl behandelt wird. Sie sind für den Speicher verantwortlich verweist er auf, wird es nicht von der Komponente verwaltet werden.