This seems like a basic question, but I tried searching and couldn't find an answer.
I have a function pointer declared like this:
THandleTableCellEdit = function(InitValue, FileNum, IENS, FieldNum : string;
GridInfo : TGridInfo;
var Changed, CanSelect : boolean;
ExtraInfo : string = '';
ExtraInfoSL : TStringList = nil;
Fields : string = '';
Identifier : string = '') : string;
I have a matching function to be used with such a function pointer:
function HandlePtrEdit(InitValue, FileNum, IENS, FieldNum : string;
GridInfo : TGridInfo;
var Changed, CanSelect : boolean;
ExtraInfo : string; ExtraInfoSL : TStringList;
Fields : string;
Identifier : string) : string;
I want to store this pointer off for later use, using a TStringList so that it can be linked to a name.
procedure TfrmTopicICDLinker.btnEditSectionClick(Sender: TObject);
var
frmGUIEditFMFile: TfrmGUIEditFMFile;
i : integer;
Data, IEN : string;
GridInfo : TGridInfo; //owned elsewhere
Handler : THandleTableCellEdit;
HandlerPtr : Pointer;
begin
i := lbSection.ItemIndex; if i < 0 then exit;
Data := lbSection.Items[i];
IEN := piece(Data,'^',4);
frmGUIEditFMFile := TfrmGUIEditFMFile.Create(Self);
try
frmGUIEditFMFile.SetGridsToShow([integer(tsgAdvanced)]);
frmGUIEditFMFile.PrepForm('22753', IEN+',', IntToStr(User.DUZ));
GridInfo := frmGUIEditFMFile.GridInfo(tsgAdvanced);
GridInfo.IdentifierCode := 'DO SUBRECID^TMGTIUT3(DIC,Y,+$GET(DIFILE))';
Handler := HandlePtrEdit;
HandlerPtr := Handler; //<---------- !! Error here !!
GridInfo.CustomPtrFieldEditors.AddObject('80', HandlerPtr);
frmGUIEditFMFile.ShowModal;
finally
frmGUIEditFMFile.Free;
end;
end;
The problem is that when I store the pointer, the compiler thinks I want to call the function pointer instead, and complains that there are "Not enough actual parameters". I have tried several ways of casting it to a standard pointer, but no luck.
How to I force the compiler to treat the function pointer like any other pointer, and not to try to evaluate it?
Is there a better way to solve this problem? I am using Delphi 2006 (!), so I can't use template/typed lists that I am aware of.
Thanks in advance.
You don't need the Handler
variable at all. You can assign the address of your function directly to your HandlerPtr
variable.
To get that address, you can use the @
operator:
If
F
is a routine (a function or procedure),@F
returnsF
's entry point. The type of@F
is alwaysPointer
.
HandlerPtr := @HandlePtrEdit;
Alternatively, you can use the Addr()
intrinsic:
The
Addr
function returns the address of a specified object.X
is any variable, procedure, or function identifier. The result is a pointer toX
.
HandlerPtr := Addr(HandlePtrEdit);