如何找出TGridPanel内控件的位置(行和列索引)?我想对按钮的数量使用常见的OnClick事件,并且需要知道按钮的X,Y位置。
我正在使用Delphi 2007。
答案 0 :(得分:5)
不幸的是,由于 TGridPanel的魔力,它比获得Top和Left属性更复杂......
这应该适用于任何控件,使其适应您的需求:
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;
答案 1 :(得分:0)
你可以使用Sender强制转换为tButton,然后询问它的顶部和左边,例如:
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;
或者如果您只是想知道按下了什么按钮,您还可以使用TAG属性在每个按钮中插入一个数字,然后在onclick事件中检索标记值。只需记住首先将Tag属性设置为某个东西。如果只是将按钮放入网格面板或用于创建和插入按钮的例程中,您可以在表单设计器中执行此操作。
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;
您还可以使用tag属性来存储多个整数,因为指针当前使用与整数相同的内存大小,您可以将指针强制转换为整数并将该值插入tag属性。请注意,您在此字段中放置的任何指针仍被视为整数。您负责指向的内存,它不会由组件管理。