当我有一个数组,比如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
答案 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.