要動態創建LABEL,又要在LABEL事件中執行代碼,該怎麼寫?

解决方案 »

  1.   

    把你要执行的代码写一个过程,动态创建完label后,将label的事件赋值为该过程。
    如:label.onclick:=myclick;
      

  2.   

    procedure myclick;
    begin
      showmessage('ok');
    end;var
    aa:tlabel;
    begin
      aa:=tlabel.create(self);
      aa.top:=30;
      aa.left:=30;
      aa.caption:='asdf';
      aa.onclick:=myclick;
    end;
      

  3.   

    其實我是想問Nmsmtp控件的OnConnect事件,我賦值時提示
    [Error] Mail.pas(143): Incompatible types: 'TNotifyEvent' and 'Procedure'
      

  4.   

    delphi对类型检测太严格,赋值为你自定义函数的入口指针好了。
      

  5.   

    type
      TMyNmsmtp = class(TNmsmtp)
        procedure TMyNmsmtpONConnect(Sender: TObject);
      private
        { Private declarations }
      protected
        { Protected declarations }
      public
        { Public declarations }
      published
        { Published declarations }
      end;
    procedure TMyNmsmtp.TMyNmsmtpONConnect(Sender: TObject);
    begin
      ----------end;function SendMail(Host,UserID,FromAddress,ToAddress,Body,Subject,Attachments: String):Boolean;
    Var
      Nmsmtp1:TMyNmsmtp;
    begin
      Nmsmtp1:=TMyNmsmtp.Create(Application);
      Nmsmtp1.OnConnect:=TMyNmsmtp.TMyNmsmtpONConnect;    //這句通不過
      Nmsmtp1.Host :=Host;
      nmsmtp1.Port :=25;
      nmsmtp1.UserID :=UserID;                               
      nmsmtp1.ReportLevel :=1;
      Nmsmtp1.TimeOut :=10000;
      nmsmtp1.Connect ;  
      -----------------
    end;
      

  6.   

    begin
      with TLabel.Create(self) do
      begin
        Parent := self;
        Caption := 'MyLabel';
        OnClick := MyClick;
      end;
    end;MyClick的事件代码同snowtiger2000(snowtiger)
      

  7.   

    将SendMail函数改成TMyNmsmtp.SendMail呢?
      

  8.   

    搞那么复杂干吗?试试下面type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        procedure TMyNmsmtpONConnect(Sender: TObject);
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.TMyNmsmtpONConnect(Sender: TObject);
    begin
      ----------
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      Nmsmtp1:TNmsmtp;
    begin
      Nmsmtp1:=TNmsmtp.Create(Application);
      Nmsmtp1.OnConnect:=TMyNmsmtpONConnect;    //這句通不過
      Nmsmtp1.Host :=Host;
      nmsmtp1.Port :=25;
      nmsmtp1.UserID :=UserID;
      nmsmtp1.ReportLevel :=1;
      Nmsmtp1.TimeOut :=10000;
      nmsmtp1.Connect ;  end;
      

  9.   

    TMyNmsmtp
    =>
    Nmsmtp1Nmsmtp1.OnConnect:=Nmsmtp1.TMyNmsmtpONConnect;牢记它和一般的过程是有区别的,一个类的成员是不存在地址的概念的,它只是一个虚拟的数据结构,当然不能赋值,所以只能赋值为实例化后的成员的地址当然你上面已经从TNMSmtp上派生了TMyNMSmtp,直接重载Create是比较好的做法constructor Create(AOwner: TComponent); override;constructor TMyNmsmtp.Create(AOwner: TComponent);
    begin
      inherited;
      Self.OnConnect:=Self.TMyNmsmtpONConnect;
    end;