unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

type

  TMyCacl = class(TObject)

  public

    { Public declarations }

    function DynamicFun(funName: string; const a, b: integer): integer;

  published

    function add(const a, b: integer): integer;

    function dec(const a, b: integer): integer;

  end;

  TNewMyCacl = class(TMyCacl)

  published

    function Multi(const a, b: integer): integer;

  end;

  TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

{ TMyCacl }

 

function TMyCacl.add(const a, b: integer): integer;

begin

  result := a + b;

end;

 

function TMyCacl.dec(const a, b: integer): integer;

begin

  result := a - b;

end;

 

function TMyCacl.DynamicFun(funName: string;const  a, b: integer): integer;

var

  pfun: function(const a, b: integer): integer of object;

begin

  if self.MethodAddress(funName) <> nil then

  begin

    TMethod(pfun).Code := MethodAddress(funName);

    result := pfun(a, b);

  end

  else  result := 0;

end;

 

{ TNewMyCacl }

 

function TNewMyCacl.Multi(const a, b: integer): integer;

begin

  result := a * b;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var

  tmp: TMyCacl;

  i: integer;

begin

  tmp := TNewMyCacl.Create();

  if tmp.MethodAddress('Multi') <> nil  then

  begin

    i := tmp.DynamicFun('Multi', 102, 3);

    showmessage(inttostr(i));

  end;

  tmp.Free;

end;

 

end.