Sender: 事件的触发者. 演示如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Label1_2_3_Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Label1_2_3_Click(Sender: TObject);
var
P : Pointer;
begin
Showmessage(TLabel(Sender).Name);
//也可以这样理解:
P := Sender;
Showmessage(TLabel(P).Name);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.OnClick := Label1_2_3_Click;
Label2.OnClick := Label1_2_3_Click;
Label3.OnClick := Label1_2_3_Click;
end;
end.
-----------------------------------------------------------------------------------------
感谢lihuasoft(坐井观天)的回答
不过我要实现的是获取控件的指针,不是Sender的指针,Sender是局部变量,过程结束后,指针也就无效了
我用在onclick结束后,指针也能指向正确的控件
----------------------------------------------------------------------------------------
说得透彻一点, Sender就是一个指针, 我代码里的P := Sender;这句, 并不是“Sender的指针”, 而是“Sender就是一个指针”
----------------------------------------------------------------------------------------
这样是否可以符合你想要的效果:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
procedure Label1_2_3_Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
P : Pointer;
procedure TForm1.Label1_2_3_Click(Sender: TObject);
begin
P := Sender;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.OnClick := Label1_2_3_Click;
Label2.OnClick := Label1_2_3_Click;
Label3.OnClick := Label1_2_3_Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if P<>nil then
Showmessage('最近一次被点击的Label是:' + TLabel(P).Name);
end;
end.
-----------------------------------------------------------------------------
换成这样也是可以的:
var
P : TLabel;
procedure TForm1.Label1_2_3_Click(Sender: TObject);
begin
P := TLabel(Sender); //对象之间的赋值, 仅仅是指针赋值而已 (“引用”)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.OnClick := Label1_2_3_Click;
Label2.OnClick := Label1_2_3_Click;
Label3.OnClick := Label1_2_3_Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if P<>nil then
Showmessage('最近一次被点击的Label是:' + P.Name);
end;