代码之家  ›  专栏  ›  技术社区  ›  Harriv

找出tgridpanel内控件的位置

  •  2
  • Harriv  · 技术社区  · 15 年前

    如何找出tgridpanel中控件的位置(行和列索引)?我想使用常见的onclick事件来计算按钮的数量,并且需要知道按钮的x,y位置。

    我用的是Delphi2007。

    2 回复  |  直到 15 年前
        1
  •  5
  •   Francesca    15 年前

    不幸的是,因为 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;
    
        2
  •  0
  •   skamradt    15 年前

    您可以使用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事件中检索标记值。只需记住首先将标记属性设置为某个值。如果只是将按钮放到网格面板中,或者在用于创建和插入按钮的例程中,则可以在表单设计器中执行此操作。

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