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.