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

时间:2015-02-10 01:43:44

标签: delphi

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

我知道我可以通过(Sender as TComponentType).Property来访问其他属性,但这几乎是我能想到的使用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

4 个答案:

答案 0 :(得分:3)

为了清晰起见,将不同的答案发布为社区维基(对我来说没有投票),因为没有人想出于某些奇怪的原因发布它们

您可以使用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;

答案 1 :(得分:3)

为了清晰起见,将不同的答案发布为社区维基(对我来说没有投票),因为没有人想出于某些奇怪的原因发布它们

你可以迭代按钮,这是不那么优雅的#34;比标签

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;

答案 2 :(得分:3)

为了清晰起见,将不同的答案发布为社区维基(对我来说没有投票),因为没有人想出于某些奇怪的原因发布它们

您可以从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;

答案 3 :(得分:0)

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.