Jestem nowicjuszem Delphi i nie wiem, w jaki sposób jest wywoływana metoda sortowania TList of Records w celu sortowania rekordów przez rosnącą wartość całkowitą. Mam zapis jak poniżej:Jak sortować listę ogólną za pomocą niestandardowego porównywalnika?
type
TMyRecord = record
str1: string;
str2: string;
intVal: integer;
end;
I rodzajowego listę takich zapisów:
TListMyRecord = TList<TMyRecord>;
próbowali znaleźć kod-przykład w plikach pomocy i znaleźć ten jeden:
MyList.Sort(@CompareNames);
Którego nie mogę użyć, ponieważ używa klas. Więc starałem się napisać własną funkcję porównania z nieco różnych parametrów:
function CompareIntVal(i1, i2: TMyRecord): Integer;
begin
Result := i1.intVal - i2.intVal;
end;
Ale kompilator zawsze rzuca „nie ma wystarczającej liczby parametrów” - błąd gdy zgłoszę go open.Sort(CompareIntVal);
, co wydaje się oczywiste; więc starałem się zatrzymać się bliżej do pliku pomocy:
function SortKB(Item1, Item2: Pointer): Integer;
begin
Result:=PMyRecord(Item1)^.intVal - PMyRecord(Item2)^.intVal;
end;
z PMyRecord jak PMyRecord = ^TMyRecord;
Próbowałem różnych sposobów wywoływania funkcji, zawsze się jakiś błąd ...
Dzięki wybitnie dużo! Czy muszę uwzględnić wszystko w "zastosowaniach" oprócz "zastosowań Generics.Collections, ...", ponieważ dostaję "niezadeklarowany" dla "TComparison" i "IComparer" w 'var Porównanie: TComparison; IntegerComparer: IComparer ; '? –
Potrzebujesz również Generics.Defaults. Znalazłeś kod źródłowy RTL. To ci pomoże. –
@ David, czy na pewno 'TComparer' jest dobrym wyborem dla podanego kodu? "TComparer" ma być abstrakcyjną klasą podstawową. Proponuję użyć 'TDelegatedComparer' dla twojego kodu. – TLama