这似乎是一个基本的问题,但我试图搜索,无法找到答案。
我有一个函数指针声明如下:
THandleTableCellEdit = function(InitValue, FileNum, IENS, FieldNum : string;
GridInfo : TGridInfo;
var Changed, CanSelect : boolean;
ExtraInfo : string = '';
ExtraInfoSL : TStringList = nil;
Fields : string = '';
Identifier : string = '') : string;
我有一个匹配的函数可以与这样的函数指针一起使用:
function HandlePtrEdit(InitValue, FileNum, IENS, FieldNum : string;
GridInfo : TGridInfo;
var Changed, CanSelect : boolean;
ExtraInfo : string; ExtraInfoSL : TStringList;
Fields : string;
Identifier : string) : string;
我想使用TStringList将这个指针存储起来供以后使用,这样它就可以链接到一个名称。
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;
问题是,当我存储指针时,编译器认为我想调用函数指针,并抱怨“实际参数不足”。我已经尝试了几种方法铸造它的标准指针,但没有运气。
如何强制编译器像对待其他指针一样对待函数指针,而不是试图计算它?
有没有更好的方法来解决这个问题?我正在使用 Delphi 2006(!),所以我不能使用我知道的模板/类型列表。
先谢谢你了。
1条答案
按热度按时间yrefmtwq1#
您根本不需要
Handler
变量。您可以将函数的 address 直接赋值给HandlerPtr
变量。要获取该地址,可以使用
@
运算符:如果
F
是例程(函数或过程),则@F
返回F
的入口点。@F
的类型始终为Pointer
。或者,您可以使用
Addr()
intrinsic:函数的作用是:返回指定对象的地址。
X
是任何变量、过程或函数标识符。结果是指向X
的指针。