获取 Delphi 中发送方组件的数组索引

Get array index of sender component in Delphi

当我有一个数组,比方说,20 个组件,我从代码中以编程方式创建,并且我将相同的 onClick 过程添加到所有这些组件,有没有一种方法可以获得组件的数组索引通过过程的 Sender 变量?

我知道我可以通过 (Sender as TComponentType) 访问其他属性。属性,但这就是我能想到的对 Sender 变量所做的大部分事情。

示例:

var Button: array [0..9] of TButton;

for i := 0 to 9 do
  begin
    Button[i]:=TButton.Create(Self);
    Button[i].OnClick:=ButtonClick;
  end;


procedure ButtonClick(Sender: TObject);
begin
  // Here I'd like to get the "i" of the sender Button[i]
end

为了清楚起见,将不同的答案发布为社区维基(我没有投票),因为没有人出于某些奇怪的原因 post

您可以像这样使用 Tag 属性:

for i := 0 to 9 do
begin
  Button[i] := TButton.Create(Self);
  Button[i].OnClick := ButtonClick;
  Button[i].Tag := i;
end;

procedure ButtonClick(Sender: TObject);
var
  i: Integer;
begin
  // get the "i" of the sender Button from Tag
  i := TButton(Sender).Tag;
end;

为了清楚起见,将不同的答案发布为社区维基(我没有投票),因为没有人想 post 他们出于一些奇怪的原因

您可以遍历按钮,这比标签

少"elegant"
for i := 0 to 9 do
begin
  Button[i] := TButton.Create(Self);
  Button[i].OnClick := ButtonClick;
end;

procedure ButtonClick(Sender: TObject);
var
  i,j: Integer;
begin
  for j := 0 to 9 do
  if Button[j] = Sender then
    i := j;
end;

为了清楚起见,将不同的答案发布为社区维基(我没有投票),因为没有人出于某些奇怪的原因 post

您可以从 TButton 创建自定义后代并向其添加您自己的字段:

type
  TMyButton = class(TButton)
  public
    Tag2: Integer;
  end;

for i := 0 to 9 do
begin
  Button[i] := TMyButton.Create(Self);
  Button[i].OnClick := ButtonClick;
  Button[i].Tag2 := i;
end;

procedure ButtonClick(Sender: TObject);
var
  i: Integer;
begin
  // get the "i" of the sender Button from Tag
  i := TMyButton(Sender).Tag2;
end;
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure ButtonClick(Sender: TObject);
  private
  public
  end;

type
  TMyButton = class(TButton)
  public
    Tag2: Integer;
  end;

var
   Button: array [0..9] of TMyButton;
   Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonClick(Sender: TObject);
var
  i: Integer;
begin
  i := TMyButton(Sender).Tag2;
  showmessage('Button['+inttostr(i)+'] : Nilai i dari Button[i] = '+inttostr(i));
end;

procedure TForm1.FormShow(Sender: TObject);
var
   i : byte;
begin
   for i := 0 to 9 do
   begin
     Button[i] := TMyButton.Create(Form1);
     Button[i].Parent:= Form1;
     Button[i].OnClick := ButtonClick;
     Button[i].Tag2 := i;
     button[i].Top:=((button[i].Height+5)*i) + 10;
     Button[i].Left:=50;
     Button[i].Caption:='Button['+inttostr(i)+']';
   end;
end;

end.