delphi 如何在赋值过程中控制函数指针?即存储指针的值而不是调用指针?

klh5stk1  于 2023-05-06  发布在  其他
关注(0)|答案(1)|浏览(194)

这似乎是一个基本的问题,但我试图搜索,无法找到答案。
我有一个函数指针声明如下:

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(!),所以我不能使用我知道的模板/类型列表。
先谢谢你了。

yrefmtwq

yrefmtwq1#

您根本不需要Handler变量。您可以将函数的 address 直接赋值给HandlerPtr变量。
要获取该地址,可以使用@运算符:
如果F是例程(函数或过程),则@F返回F的入口点。@F的类型始终为Pointer

HandlerPtr := @HandlePtrEdit;

或者,您可以使用Addr() intrinsic:
函数的作用是:返回指定对象的地址。X是任何变量、过程或函数标识符。结果是指向X的指针。

HandlerPtr := Addr(HandlePtrEdit);

相关问题