Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 查找控制面板内控件的位置_Delphi_Vcl_Delphi 2007_Tgridpanel - Fatal编程技术网

Delphi 查找控制面板内控件的位置

Delphi 查找控制面板内控件的位置,delphi,vcl,delphi-2007,tgridpanel,Delphi,Vcl,Delphi 2007,Tgridpanel,如何找到TGridPanel中控件的位置(行和列索引)?我想使用公共OnClick事件来表示按钮的数量,并且需要知道按钮的X,Y位置 我使用的是Delphi 2007。您可以使用Sender cast作为tButton,然后要求它提供其顶部和左侧,例如: Procedure TForm1.OnClick(Sender:tObject); var X,Y : Integer; begin if Sender is TButton then begin X := TBut

如何找到TGridPanel中控件的位置(行和列索引)?我想使用公共OnClick事件来表示按钮的数量,并且需要知道按钮的X,Y位置


我使用的是Delphi 2007。

您可以使用Sender cast作为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属性。请注意,在此字段中放置的任何指针仍被视为整数。您负责它指向的内存,它将不由组件管理。

不幸的是,由于TGridPanel的魔力,它比只获取顶部和左侧属性要复杂一些

对于任何控制,都应该这样做,并根据您的需要进行调整:

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;

使用常规TPanel会很好,但没有解决TGridPanel的具体问题,在TGridPanel中,嵌入式控件使用行和列属性来代替Top和Left。(如在对象检查器中)