• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 144
  • Last Modified:

Pass either function OR procedure in same argument

I woudl like one argument in a procedure to be able to accept either a pocedure OR a function that returns a string. Is there a way of doing this?

Thanksm Tom.
0
boardtc
Asked:
boardtc
1 Solution
 
MBoCommented:
type
  TStringFunc=function(x:double):string;
  TSomeProc=procedure(var i:integer);

procedure GetSome(func:TStringFunc);overload;
procedure GetSome(proc:TSomeProc);overload;

implementation

procedure GetSome(func:TStringFunc);
begin
//
end;

procedure GetSome(proc:TSomeProc);overload;
begin
//
end;

0
 
boardtcAuthor Commented:
Thanks for the response. To clarify what I am looking for is to have one procedure be able to accept either a function or a procedure as an arguement rather than having 2 overloaded procedures.

Cheers, Tom.
0
 
CesarioCommented:
Dear tom,

AFAIK, its not possible.

Best Regards

Cesario
0
Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

 
MBoCommented:
I agree with Cesario.

Look at this  ;)

function a(i:integer):string;
begin
Result:=inttostr(i);
end;

procedure b(var i:integer);
begin
i:=i+1;
end;

procedure GetSome(p:pointer;var s:string);
var i:integer;
begin
i:=2;
if p=@a then
  s:=a(i);
if p=@b then begin
  b(i);
  s:=inttostr(i);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
GetSome(@a,s);
showmessage('func a '+s);
GetSome(@b,s);
showmessage('proc b '+s);
end;
0
 
MadshiCommented:
It's no problem to pass these things to one function, you can just pass the address:

procedure GiveMeAProcOrFunc(procOrFunc: pointer);

GiveMeAProcOrFunc(@someProc);
GiveMeAProcOrFunc(@stringReturningFunc);

However, the big problem is: What do you want to do with the procedure/function pointer once you got it in the "GiveMeAProcOrFunc" procedure? Do you want to *call* it? Then you somehow have to find out which parameters the function has, which calling convention and which result type (if any).

Could you please tell us for what purpose you need this exactly? Perhaps we can make alternative suggestions...

Regards, Madshi.
0
 
boardtcAuthor Commented:
Thanks for that. I am basically trying to avoid a try finally wrapper than is duplicated in a bunch of class methods and procedures (you of course can't pass class method pointers). It's not involved enough to justify an inheritance / strategy pattern solution so I guess I'll just have to suck it up :-)

Cheers, Tom.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Introducing Cloud Class® training courses

Tech changes fast. You can learn faster. That’s why we’re bringing professional training courses to Experts Exchange. With a subscription, you can access all the Cloud Class® courses to expand your education, prep for certifications, and get top-notch instructions.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now