Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

TComponentList.Sort Problem

  Alt 2. Okt 2006, 12:21
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;
  Mit Zitat antworten Zitat