0

我有这个嵌套函数,我想修改 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;
4

1 回答 1

2

Rob Kennedy 在其他讨论中为您提供了解决方案:

使 SearchName2 成为一个有两个参数的函数,然后编写 FirstThat 以接受 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;

function SearchName2(Item: PFI; S: PChar):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;

function TListFI.IsIn(S: PChar): PFI;
egin
  IsIn := PFI(FirstThat(@SearchName2, S));
end;

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

function SearchName2(Item: PFI; S: PChar):Boolean;
begin
  SearchName2 := (StrIComp(Item^.Name, S) = 0);
end;
于 2014-02-04T01:54:24.180 回答