Delphi 在嵌套函数中传递参数

Delphi 在嵌套函数中传递参数,delphi,parameter-passing,delphi-xe2,nested-function,Delphi,Parameter Passing,Delphi Xe2,Nested Function,我有这个嵌套函数,我想修改SearchName2以接收“S”作为参数,作为中所述问题的可能解决方案 我仍在学习Delphi,非常感谢您的帮助,我一直在搜索嵌套函数示例,但找不到任何类似的示例 PFI = ^TFI; TFI = record Id : TToken; Name : TName; Parameters : string; end; function TListFI.IsIn(S: PChar): PFI;

我有这个嵌套函数,我想修改SearchName2以接收“S”作为参数,作为中所述问题的可能解决方案

我仍在学习Delphi,非常感谢您的帮助,我一直在搜索嵌套函数示例,但找不到任何类似的示例

PFI = ^TFI;           
TFI = record
    Id         : TToken;
    Name       : TName;
    Parameters : string;
end;

function TListFI.IsIn(S: PChar): PFI;

  function SearchName2(Item: PFI):Boolean;
  var N1, N2: PChar;
  begin
    N1:= StrNew(Item^.Name);
    N2:= StrNew(S);
    SearchName2:= (StrComp(StrUpper(N1), StrUpper(N2)) = 0);
    StrDispose(N1);
    StrDispose(N2);
  end;

begin
  IsIn:= PFI(FirstThat(@SearchName2));
end;

Rob Kennedy在以下文件中为您提供了解决方案:

使SearchName2成为一个双参数函数,然后首先写入它以接受S作为参数,它可以转发到函数参数

你需要照Rob告诉你的去做,这就是解决方案,例如:

type
  TFuncionColeccion = function (Elemento: TObject; S: PChar): Boolean;

function TColeccion.FirstThat (Rutina: TFuncionColeccion; S: PChar): TObject;
var
  i: Integer;
begin
  For i:=0 to Count-1 do
    if Rutina(Items[i], S) then
    begin
      FirstThat:=Items[i];
      exit;
    end;
  FirstThat:=nil;
end;

话虽如此,您可以完全不用使用
StrNew()
StrDispose()

function SearchName2(Item: PFI; S: PChar):Boolean;
begin
  SearchName2 := (StrIComp(Item^.Name, S) = 0);
end;

我知道必须做什么,但我不知道怎么做。更糟糕的是,我不知道为什么一开始就有问题,因为内部函数应该“存在”S,显然它不存在。你没有听Rob向你解释如何设置内部函数的调用堆栈。您绕过了编译器正确调用内部函数的能力,因此造成了副作用。@sandiego我们不得不重复自己的操作,这让我们很沮丧。请务必仔细阅读提问时得到的答案。再次看到这段代码有点让人恼火,就像一股不会消失的臭味一样。@Remy如果您避免使用@来获取函数指针,这也会有所帮助。“非类型化的函数指针首先让我们陷入了困境。@DavidHeffernan:或者如果你不理解我的答案,那么你应该发表评论要求澄清。我可以给你举个例子。相反,很明显,你已经一个多星期都在独自努力解决这个问题了。
function SearchName2(Item: PFI; S: PChar):Boolean;
begin
  SearchName2 := (StrIComp(Item^.Name, S) = 0);
end;