【问题标题】:Finding out position of a control inside TGridPanel在 TGridPanel 中找出控件的位置
【发布时间】:2010-11-27 04:00:48
【问题描述】:

如何找出 TGridPanel 中控件的位置(行和列索引)?我想对按钮数量使用常见的 OnClick 事件,并且需要知道按钮的 X、Y 位置。

我使用的是 Delphi 2007。

【问题讨论】:

    标签: delphi vcl delphi-2007 tgridpanel


    【解决方案1】:

    不幸的是,由于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;
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 使用常规的 TPanel 会很好,但没有解决 TGridPanel 的特定问题,其中嵌入式控件具有要使用的 Row 和 Column 属性而不是 Top 和 Left。 (如在对象检查器中)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多