Hi,
ok hab jetzt mal ein bisschen rumgeguckt und steh vor folgendem Problem.
Da ich bisher noch nie mit Quicksort oder anderen Sortieralgorithmen gearbeitet habe, habe ich mir gedacht ich guck mir erstmal, den von TStringlist an, da ich meistens(nicht immer), Strings vergleichen will.
Zur Informationen, ich weiss immer wenn ich Sortieren will, ib ich nach Integer oder nach String sortieren möchte(sonst ginge es wahrscheinlich eh nicht bzw würd nur Mist rauskommen).
So Ich hab folgende beiden Routinen geschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function TMyObjectList.SortierenName(Item1, Item2: TPerson): Integer; begin Result := AnsiCompareText(Item1.Name, Item2.Name); end;
function TMyObjectList.SortierenNameDes(Item1, Item2: TPerson): Integer; begin Result := AnsiCompareText(Item1.Name, Item2.Name); Result := -Result; end; |
Einmal wird alphabetisch nach Name sortiert und einmal umgekehrt.
Nun, das erste Probleme, was ich habe, ist, dass ich eine abgeleitete Klasse von TObjectList nehme, damit ich die Sort Funktion (welche von TList übernommen wird), nach meinen wünschen ändern kann.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| TMyObjectList = class(TObjectList) private function SortierenName(Item1, Item2: TPerson): Integer; function SortierenNameDes(Item1, Item2: TPerson): Integer; public procedure Sort(Compare: TListSortCompare); end; |
So, in Sort wollte ich jetzt nur, dass man entweder nach Nme alphabetisch bzw dem gegenteil sortieren kann. Allerdings kann ich die Sucheprozedur von TList nicht übernehmen, da ich auf FList nicht mehr zugreifen kann, hier mein Quellcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TMyObjectList.Sort(Compare: TListSortCompare; Mode: Byte); begin if Mode = 1 then QuickSort(FList, 0, Count - 1, SortierenName); if Mode = 2 then QuickSort(FList, 0, Count - 1, SortierenNameDes); end; |
Wenn ich es compile, bekomme ich folgende Errormeldung: Uncleared Indetifier 'FList'.
Hier der Quicksort Algorithmus - Dazu muss ich sagen, dass ich den Quicksort Algorithmus ruskopiert habe aus der Classes Unit(wo TList deklariert ist), in die Form, da er sonst nich benuztzbar war.:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| procedure QuickSort(SortList: PPointerList; L, R: Integer; SCompare: TListSortCompare); var I, J: Integer; P, T: Pointer; begin repeat I := L; J := R; P := SortList^[(L + R) shr 1]; repeat while SCompare(SortList^[I], P) < 0 do Inc(I); while SCompare(SortList^[J], P) > 0 do Dec(J); if I <= J then begin T := SortList^[I]; SortList^[I] := SortList^[J]; SortList^[J] := T; Inc(I); Dec(J); end; until I > J; if L < J then QuickSort(SortList, L, J, SCompare); L := I; until I >= R; end; |
Wie soll ich es machen, dass ich die Fehlermeldung umgehe? Einen eigenen Quicksort schreiben? Wenn ja, irgendeinen Ansatz? Habe bisher leider keien Erfahrung mit Sortierlagorithmen :/.
Hoffe auf baldige Antwort, danke.
Gruß
Carnivean