问题如下,
例如一个控件label1
其单击过程OnClick中含有变量sender
我想知道怎样根据这个sender找到
label1的指针
前提是不允许直接使用@label1,要根据Sender这个变量来确定

解决方案 »

  1.   

    Sender: 事件的触发者. 演示如下:unit Unit1;interfaceuses
      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.
      

  2.   

    感谢lihuasoft(坐井观天)的回答
    不过我要实现的是获取控件的指针,不是Sender的指针,Sender是局部变量,过程结束后,指针也就无效了
    我用在onclick结束后,指针也能指向正确的控件
      

  3.   

    说得透彻一点, Sender就是一个指针, 我代码里的P := Sender;这句, 并不是“Sender的指针”, 而是“Sender就是一个指针”
      

  4.   

    这样是否可以符合你想要的效果:unit Unit1;interfaceuses
      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.
      

  5.   

    全局变量 ctrlAddr:Pointer
    在label1的onclick过程里赋值 ctrlAddr:=Sender
    ctrlAddr是label1的地址么?
      

  6.   

    换成这样也是可以的: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;
      

  7.   

    我把程序主体意思说下
    我这里有label,image,shape三种动态生成的控件,数量和名称不定
    另有一个label movePos,单击以上三种控件后指针P就指向具体某一控件a
    然后拖动movePos,改变p所代表的控件的位置,
    这样单击不同的控件后,拖动movePos就改变相应的控件位置,
    所以我要在被拖动的onclick过程里给全局指针变量P赋值你上面的方法具体是不是还应该定义一个TControl的全局变量,然后根据不同的类型实例化?
    请明示
      

  8.   

    我在上面用
    var
      P : TLabel;
    只是在说这样一个意思:对象名字就是一个指针。
    回到最初的定义:
    var
      P : Pointer;
    在使用时,TLabel(P).Name这样的使用方式,只是在把这个指针强制转换为一个相应的类型使用。同理,你可以TControl(P).Name这样使用。而不必“还应该定义一个TControl的全局变量”。当然,如果:
    var
      P : TControl;
    也是可以的。
      

  9.   

    问题搞定,谢谢lihuasoft(坐井观天)的帮助,能加你好友么,我的qq:1466602 msn:[email protected],我是搞.net的,最近搞delphi,很是迷糊,希望能和你讨教delphi的上的一些东西。