根据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;
    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;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值