Delphi 在嵌套函数中传递参数
我有这个嵌套函数,我想修改SearchName2以接收“S”作为参数,作为中所述问题的可能解决方案 我仍在学习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;
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;