请问一个很奇怪的语法?
TCycleEvent = procedure(Sender: TObject; Current: Integer) of object;请问这个怎么用?有什么用处?

解决方案 »

  1.   

    单元A:
    unit PubFunction;interfaceuses Windows, Forms;Type
    TDoQuery=procedure (H:Thandle;mUserName:PChar;mPopo:Variant;UnitFlag:Integer;ModuleFlag:PChar);StdCall;
    调用:
    procedure TframeEmpManager.fbCxhmcClick(Sender: TObject);
    var
    LibHandle:THandle;
    mProc:TDoQuery;
    begin
      LibHandle:=LoadLibrary('MyQuery.dll');
      try
      if LibHandle<>0 then
      begin
        @mProc:=GetProcAddress(LibHandle,'DoQuery');
        if @mProc<>nil then mProc(Handle,Pchar(User.UserID),vLogin,1,PChar('110200'));
      end;
      finally
       FreeLibrary(LibHandle);
      end;
    end;
      

  2.   

    TCycleEvent = procedure(Sender: TObject; Current: Integer) of object;
     是对象的方法比如: AProcMethod:procedure(Sender:TObject) of object;为什么一定要加上of object呢?实际上,Object Pascal中一般的函数指针就相当于普通的指针,而AProcMethod则是一个对指针,它在Delphi中有一个对应的类型:TMethod。TMethod=record  Data, Code:Pointer;end;所以,我们在单元中可以这样:procedure TForm1.Button1Click2(Sender:TObject);begin  ShowMessage(‘Click2!’);end; procedure TForm1.FormCreate(Sender:TObject);var  Method:TMethod;begin  Method.Data := Self;  Method.Code := MethodAddress(‘Button1Click2’);  Button1.OnClick := TNotifyEvent(Method);end;当然,实际上只需要Button1.OnClick=Button1Click2即可;不过,这样可以让你明白在幕后发生的事情。值得注意的一点是,Button1Click2应该声明在published段(或者和其他构件的声明放在一起,因为默认作用域就是published),以便编译器为它产生RTTI信息,否则程序可能达不到预期的效果。