2014-02-04 5 views
0

У меня есть эта вложенная функция, и я хочу изменить SearchName2, чтобы получить «S» в качестве параметра в качестве возможного решения проблемы, описанной в here.Передача параметра во вложенной функции

Я все еще изучаю 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; 
+0

Если вы не недеформированной ответьте на мой ответ, тогда вы должны отправить комментарий с просьбой разъяснить. Я мог бы показать вам пример. Вместо этого вы, видимо, боретесь с этим самостоятельно больше недели. –

ответ

2

Роб Кеннеди дал вам решение в other discussion:

сделать 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; 

С учетом сказанного, вы можете избавиться от использования StrNew() и StrDispose() полностью:

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

Я понимаю, что нужно делать, но я не знаю, как это сделать. Более того, я не знаю, почему в первую очередь возникает проблема, потому что S должна «существовать» для внутренней функции, по-видимому, это не так. – sandiego

+1

Вы не послушали, что Роб объяснил вам, как настроить стек вызовов внутренней функции. Вы обходите способность компилятора правильно вызвать внутреннюю функцию, поэтому вы вызываете побочные эффекты. –

+0

У меня так много, чтобы узнать, хе-хе, спасибо большое. – sandiego

Смежные вопросы