Program Client;
uses unit1;procedure MyDo();
begin
writeln('dd');
readln();
end;
begin
    ff:=@MyDo;
    unitDo();end. 
        unit unit1;
interfacetype
  Mydo=procedure;
var
ff:Mydo;
procedure unitDo();implementationprocedure unitDo();
 begin
   ff();
 end;
beginend. 如果在unit1里将MyDo声明为函数指针,需要在Client里显式将MyDo赋值(有个弊端,客户端Client每次都需要将MyDo赋值)
unit1才可以调用客户端实现的函数。现在问题是,能否有什么方法,不需要客户端显式赋值,就
能够另unit1调用客户端实现的函数。?通过其他途径能够实现最好。
例如
类似下面例子的方式比较理想,但定义一个类然后继承虚函数。能否客户端不用继承这样的一个类呢?
Program Client;
uses unit1;procedure unit1.MyDo();
begin
writeln('dd');
readln();
end;
begin
  unitDo();
end. 

解决方案 »

  1.   

    一条赋值语句,够简单了。还优化什么?
    要么作为参数:unitDo(MyDo); 
    要么直接调用:MyDo;
      

  2.   

    To :ly_liuyang 我现在想实现的是让单元里面调用后期才实现的函数。上面只是一个例子。
    明白吗?
      

  3.   

      TMyFunction = class
      published
        procedure A;
        procedure B;
      end;procedure TMyFunction.A;
    begin
      ShowMessage('a');
    end;procedure TMyFunction.B;
    begin
      ShowMessage('b');
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      P :Procedure;
    begin
      P := TMyFunction.MethodAddress('a'); //调用函数a
      if Assigned(P) then
        P;
      P := TMyFunction.MethodAddress('b'); //调用函数b
      if Assigned(P) then
        P;
    end;这样能达到你的要求吗?
      

  4.   

    mastersky :
    消息怎么做?我的目的类似于,我封装好一个unit,当别人引用了我的unit之后就
    会进入我的消息机制,每到适当时候我会回调用户的函数,这些函数都是确定的
    但不知道用户是否实现,如果用户实现了,就调用用户自定义的,否则调用默认,或者什么都不作。基本的我都已经实现了,只是object pascal的类不好用(或者是我不会用),入口函数不能随意定义,
    只能Program Client 里定义,所以我就不能隐藏入口。能否像钩子一样让用户代码勾住unit单元的方法?定义方式不重要不知道我说明白没有
      

  5.   

    那就是回调函数的机制,当然可以实现啦
    VCL控件那些事件就是这样的嘛