2011-01-24 9 views
8

Chcę posortować moją generyczną tobjectlist przy użyciu wbudowanej metody sortowania.Problem Delphi: Sortowanie Tobjectlist <>

tutaj jest to, co robię:

//create the list object 
myList := TObjectList<MyType>.Create(false); 

[...] //populate the list with unsorted entries 

//sort the list 
myList.sort(@Comparer); 

[...]//store sorted results back to array 

myList.Destroy; 

moja funkcja porównywarka wygląda następująco:

function Comparer(Item1, Item2 : pointer):integer; 
begin 
    result := myCompare(item1, item2); 
end; 

Według specyfikacji, powinien działać w ten sposób.

dostaję E2250 błędzie kompilator Nie przeciążona wersja „Sortuj” istnieć z tych parametrów (dokładna treść różni używam non angielska wersja RAD Studio)

nie mam pojęcia, dlaczego ten nie powinien bądź ważny Pascal - czy ktokolwiek z was ma wgląd w to, aby się nim podzielić?

+0

Chociaż Leonardo i ja zaoferowaliśmy więcej szczegółów, odpowiedź Roba jest dla ciebie najbardziej przydatna. Kompilator generalnie podaje jasne powody, dla których coś mu się sprzeciwia. –

Odpowiedz

8

Już prawie jesteś. Ponieważ nie wiem, co to jest MyType, może być konieczna zmiana połączenia na twoją funkcję myCompare.

myList.Sort(TComparer<MyType>.Construct(
    function (const L, R: MyType): integer 
    begin 
    result := myCompare(L, R); 
    end 
)); 
+0

+1 Leonardo. es bueno ver a otro programador delphi chileno por aqui, pense que estaba solo;). – RRUZ

+0

Heh. Habíamos hartos en los tiempos de Delphi 1 ... –

+0

Bueno me referia en realidad a StackOverflow, pero sobre delphi tienes razon, al parecer somos una raza en extinción. – RRUZ

6

TObjectList<T>.Sort jest zadeklarowana jako:

procedure Sort(const AComparer: IComparer<T>); 

IComparer<T> jest zdefiniowany jako:

IComparer<T> = interface 
    function Compare(const Left, Right: T): Integer; 
end; 

Jesteś instancji TObjectList<MyType> a więc trzeba zdać IComparer<MyType> do Sort. Aby to zrobić, potrzebujesz obiektu, który zapewni konkretną implementację tego interfejsu.

Jednym z oczywistych sposobów na zrobienie tego będzie podklasa TObjectList<MyType> i wdrożenie tam interfejsu.

Innym sposobem, aby to zrobić jest użycie TComparer<T> stworzyć IComparer<T> na żądanie przy użyciu jego funkcji Construct klasy. Będziesz musiał podać funkcję porównania:

TComparison<T> = reference to function(const Left, Right: T): Integer; 

Odpowiedź Leonarda pokazuje, jak to zrobić.

4

Jeśli kompilator mówi, że nie istnieje żadna przeciążona wersja z tym typem parametru, należy zadać sobie pytanie, jakie są przeciążenia: do. Sprawdź kod źródłowy lub the documentation, aby się dowiedzieć.

Zobaczysz, że TObjectList<T> dziedziczy dwie metody Sort od TList<T>. Jeden nie przyjmuje argumentów, a drugi odnosi się do czegoś implementującego interfejs IComparer<T>. Twoja samodzielna funkcja nie pasuje do tego. Napisz potomka TComparer<MyType> i zastąp jego metodę Compare.

Powiązane problemy