2012-11-21 1 views
1

Mason Wheeler는 문자열 목록을 비교하는 매우 좋은 절차를 작성했지만 콜백 절차 TStringCompareProc을 작성하는 방법을 이해하지 못합니다. 어떤 사람이 이것을 컴파일하도록 도울 수 있습니까?호환되지 않는 형식 수정 방법

type 
    TStringCompareProc = procedure(const value: string; const data: TObject) of object; 
    procedure StringListCompare(List1, List2: TStringList; matchProc: TStringEqualProc; 
            list1Proc, list2Proc: TStringCompareProc; presorted: boolean = false); 

    Usage: 

    procedure TForm1.MatchProc(const value: string; const data: TObject); 
    // match is found between the two lists 
    begin 
    // 
    end; 

    procedure TForm1.List1Proc(const value: string; const data: TObject); 
    // when the first list contains a string not in the second list 
    begin 
    // 
    end; 

    procedure TForm1.List2Proc(const value: string; const data: TObject); 
    // when the second list contains a string not in the first list 
    begin 
    // 
    end; 

    procedure TForm1.Compare1Click(Sender: TObject); 
    var 
    MatchProc: TStringEqualProc; 
    List1Proc: TStringCompareProc; 
    List2Proc: TStringCompareProc; 
    iValue: string; 
    iData: ^PString; 
    begin 
    iFinalStringList := StringListCompare(iNewFilesStringList, iExistingFilesStringList, 
       nil, nil, List1Proc(iValue, @iData), List2Proc(iValue, @iData), False); <- [DCC Error] Unit1.pas(1336): E2010 Incompatible types: 'TStringCompareProc' and 'procedure, untyped pointer or untyped parameter' 
    end; 
+0

의 쓰기, 당신은 새로운 일에 질문을 변경할 수 없습니다. 그것은 사람들을 혼란스럽게하고 당신이 찾고있는 질문을 찾기가 어렵게 만듭니다. 또한,이 질문에는 대답이 있기 때문에 아무도 그것을 방문하지 않고 도움을줍니다. 따라서이 질문을 원래 상태로 복원 한 다음 새 프로그래밍 질문에 * 새 * 질문을 작성해야합니다. 나는 당신을 위해 첫 번째 부분을했습니다. –

+0

감사합니다 Andreas, 나는 그것을 다루는 방법을 몰랐습니다 ... 한편 MatchProc을 제거하여 힌트와 경고 문제를 해결했습니다 : TStringEqualProc; List1Proc : TStringCompareProc; List2Proc : TStringCompareProc; vars ... 이제 작동합니다 ... 도와 줘서 고마워. – Bill

답변

2

StringListCompare의 인수로 List1ProcList2Proc를 작성해야합니다. 즉,

iFinalStringList := StringListCompare(iNewFilesStringList, 
    iExistingFilesStringList, nil, nil, List1Proc, List2Proc, False); 

대신에 StackOverflow에서

iFinalStringList := StringListCompare(iNewFilesStringList, 
    iExistingFilesStringList, nil, nil, List1Proc(iValue, @iData), 
    List2Proc(iValue, @iData), False); 
+0

사실, 또 다른 문제는 StringListCompare가 프로 시저이고 함수가 아니므로 iFinalStringList : =를 제거해야했습니다. 감사합니다 안드레아스 – Bill