3

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

我正在使用德尔福 2007。

4

2 回答 2

6

不幸的是,由于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;
于 2009-09-10T17:37:53.497 回答
0

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

于 2009-09-10T14:57:13.397 回答