unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TMyClass = class
  private
    FGetStrProc:TGetStrProc;
  public
    property GetStrProc:TGetStrProc read FGetStrProc write FGetStrProc;
    procedure OnGetStrProc;
  end;  TForm1 = class(TForm)
    btn1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  MyObject:TMyClass;implementation{$R *.dfm}{ TMyClass }procedure TMyClass.OnGetStrProc;
begin
  if Assigned(FGetStrProc) then FGetStrProc('Hello, World');
end;procedure ReceiveMsg(const S: string);
begin
  ShowMessage(s);   //此处得到的是乱码
end;procedure TForm1.FormCreate(Sender: TObject);
var
  TmpEvent:TGetStrProc;
begin
  MyObject := TMyClass.Create;
  TMethod(TmpEvent).Code := @ReceiveMsg;
  TMethod(TmpEvent).Data := MyObject;
  MyObject.GetStrProc := TmpEvent;
end;procedure TForm1.btn1Click(Sender: TObject);
begin
  MyObject.OnGetStrProc;
end;end.
ReceiveMsg收不到正确的字符,不知道是什么原因.

解决方案 »

  1.   

    已解决,代码改成:
    procedure ReceiveMsg1(Address:Integer;const S: string);
    begin
      ShowMessage(s);   //此处得到的正确的值
    end;
    如果有参数,第一个参数必须是Data.
      

  2.   

    删掉:
    TMethod(TmpEvent).Code := @ReceiveMsg;
      TMethod(TmpEvent).Data := MyObject;
    有最后一句就足够了
      

  3.   


    这个恐怕不行,事件发生后,ReceiveMsg不会被调用。
      

  4.   

    delphi事件传参数总是隐含传一个Self指针。
      

  5.   

    至5楼:绝对会调用,因为你在事件处理中就已经调用了。不信你看VCL源码