Diese Frage bezieht sich unter anderem auf:
http://www.delphipraxis.net/internal...istsortcompare
Aufgabe: Ich möchte eine Liste (bzw. Objekte) anhand ihrer SortID sortieren. (Mehrere Objekte mit Align=alTop sollen von oben nach unten sortiert werden können. Mit SortID merke ich mir (intern), an welche Position die Objekte stehen.
Tfoo ist quasi ein Container der variabel viele TBar Objekte enthält (in der ComponentList).
Sobald ich nun foo.sort aufrufe, stimmt zwar Item1, jedoch ist Item2 immer = $2 -->
Exception. Was auch immer das bedeutet.
Was tun?
Soweit ich das verstanden habe, besitzt TList intern eine Sortiermethode (Quicksort oder Bubblesort etc.) der jedoch die Sortierrichtung anhand meiner benutzerdefinierten Funktion vornimmt: Entsprechend des Results ist der Wert1 <, > oder = Wert2. Da ja die einzelnen Objekte der TComponentlist (denke ich mal) als Item1+2 übergeben werden, kann ich selbst definieren, welches Objekt < oder > ist, z.B. anhand meiner intSort, so wie ich es möchte. Bei der Fehlersuche kann ich auch immer die kompletten Objektdaten dieses Tbar einsehen (intSort etc.). Was ist denn nun mit diesem Item2 los? Schon bei dem ersten Vergleich spinnt es...
Delphi-Quellcode:
TMyListSortCompare = function (Item1, Item2: Pointer): Integer of object;
TBar= class(TMyPanel)
private
public
ID: integer;
intSort: integer;
:
end;
Tfoo= class(TMyPanel)
private
FCompareListItems:TMyListSortCompare;
function CompareSortID(Item1, Item2: Pointer): Integer;
:
public
ComponentList: TComponentList;
:
constructor Create(_Owner: TComponent); override;
end;
constructor Tfoo.Create(_Owner: TComponent);
begin
inherited Create(_Owner);
:
ComponentList := TComponentList.Create(True);
FCompareListItems:= CompareSortID;
:
end;
function Tfoo.CompareSortID(Item1, Item2: Pointer): Integer;
begin
if not Assigned(Item1) or not Assigned(Item2) then begin
Result := 0;
Exit;
end;
if (TBar(Item1).intSort < TBar(Item2).intSort) then begin
Result := -1; // i1 < i2
end else begin
if (TBar(Item1).intSort = TBar(Item2).intSort) then begin
Result := 0; // i1 = i2
end else begin
Result := 1; // i1 > i2
end;
end;
end;
procedure Tfoo.Sort;
begin
if ComponentList.Count > 1 then begin
ComponentList.Sort(TListSortCompare(@FCompareListItems));
end;
end;