获取 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.
当我有一个数组,比方说,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.