Передача параметра во вложенную функцию

У меня есть эта вложенная функция, и я хочу изменить 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;

person sandiego    schedule 04.02.2014    source источник
comment
Если вы не поняли мой ответ, то вы должны были опубликовать комментарий с просьбой разъяснить. Я мог бы показать вам пример. Вместо этого вы, по-видимому, боролись с этим самостоятельно больше недели.   -  person Rob Kennedy    schedule 04.02.2014


Ответы (1)


Роб Кеннеди дал вам решение в другом обсуждении:

сделайте SearchName2 функцией с двумя аргументами, а затем напишите FirstThat, чтобы принять S в качестве параметра, который он может передать аргументу функции.

Вам нужно сделать то, что сказал вам Роб, это решение, например:

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;

With that said, you can get rid of the use of StrNew() and StrDispose() completely:

function SearchName2(Item: PFI; S: PChar):Boolean;
begin
  SearchName2 := (StrIComp(Item^.Name, S) = 0);
end;
person Remy Lebeau    schedule 04.02.2014
comment
Я понимаю, что нужно делать, но не знаю, как это сделать. Более того, я не знаю, почему вообще возникает проблема, потому что S должна существовать для внутренней функции, по-видимому, это не так. - person sandiego; 04.02.2014
comment
Вы не слушали, что Роб объяснил вам о том, как настраивается стек вызовов внутренней функции. Вы обходите способность компилятора правильно вызывать внутреннюю функцию, поэтому вы вызываете побочные эффекты. - person Remy Lebeau; 04.02.2014
comment
@sandiego Нам неприятно повторяться. Пожалуйста, убедитесь, что вы внимательно читаете ответы, которые вы получаете, когда задаете вопрос. Немного неприятно снова видеть этот код, как неприятный запах, который не исчезнет. - person David Heffernan; 04.02.2014
comment
@Remy Также было бы полезно, если бы вы избегали использования @ для получения указателей на функции. Нетипизированные указатели на функции — вот что в первую очередь привело нас к этой неразберихе. - person David Heffernan; 04.02.2014
comment
@RemyLebeau Ну, оба необходимы. И то, и другое имеет то приятное преимущество, что код в вопросе отклоняется компилятором. - person David Heffernan; 04.02.2014