Wie sortieren in einer class(TList)?

Für Fragen rund um die Ide und zum Debugger
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Wie sortieren in einer class(TList)?

Beitrag von br_klaus »

Hallo, da bin ich noch einmal. Habe ein kleines bei meiner TList-Klasse (habe die anderen Beiträge angeschaut, da fand ich keine Antwort darauf): Es geht um folgendes:

Wer kann mir sagen, was ich tun muß, um bei einer class(TList) sortieren zu können?
Ganz allgemein habe ich:

Code: Alles auswählen

Type
   PM = ^TM;
   TM = Record / Object / Class   
        < irgendwas >
    end; 
 
  TMList = class(TList)
    private
      function GetItem(idx:integer):PM;
      procedure SetItem(idx:integer; M: PM);
    public
      ListCompare: TListSortCompare;
      property Item[idx:integer]: PM read GetItem write SetItem;
      function AddItem: PM;
      procedure DeleteItem(idx:integer);
      procedure sort(compare: TListSortCompare);
          // TYPE TListSortCompare = function (Item1, Item2: Pointer): Integer;  -> Unit classes
      Function CompareM(item1,item2:Pointer):integer;
  end;
 
Und dann die Implementation:

Code: Alles auswählen

procedure TMList.Sort(compare:TListSortCompare);
    begin  inherited sort(compare); end;
 
  function TMList.GetItem(idx:integer):PM;
    begin Result := PM(inherited Get(idx)); end;
 
  procedure TMList.SetItem(idx:integer; M: PM);
    begin inherited Put(idx, M); end;
 
  Function TMLIst.AddItem: PM;
     begin  new(result); inherited add(result); end;
 
  Procedure TMList.DeleteItem(idx:integer);
     begin dispose(item[idx]; inherited; end;
 
  function TMList.CompareM(item1,item1:Pointer):integer;
    begin
    end;
Die Kompilierung geht ohne Fehler. Aber wie kann ich jetzt Sort aufrufen? Wenn ich da die eigene Funktion CompareM nenne, dann heißt es: falsche Parameter, nehme ich @CompareM, dann sind das inkompatible Typen, und eine Zuweisung an ListCompare gelingt mir auch nicht. (ListCompare := CompareM oder @CompareM).

Wäre es vielleicht einfacher, ein array of record / object / class zu nehmen und dann nur mit Zeigern auf diese einzelnen array-Elemente zu arbeiten? dann würde eine Prozedur Sort genügen, mit einer schon "eingebauten" Vergleichsfunktion, die damit von vornherein aufgerufen wird.
Oder ist das gehupft wie gesprungen?
Was mache ich verkehrt?

Herzlichen Dank!

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie sortieren in einer class(TList)?

Beitrag von theo »

Das ist eine einfache (Callback) Funktion. Nicht "of object"

Code: Alles auswählen

function ListSortCompareTest(Item1, Item2: Pointer): Integer;
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var MyList:TList;
begin
 //...
 MyList.Sort(@ListSortCompareTest);
 //...
end;

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Wie sortieren in einer class(TList)?

Beitrag von br_klaus »

Und was ist der Unterschied zwischen diesen? Was heißt Callback und was bedeutet "of object". Wo ist denn da ein Objekt? Die Funktion selber?

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie sortieren in einer class(TList)?

Beitrag von theo »

br_klaus hat geschrieben:Und was ist der Unterschied zwischen diesen? Was heißt Callback und was bedeutet "of object". Wo ist denn da ein Objekt? Die Funktion selber?
Unterschied:

Nicht
function TMList.ListSortCompareTest(Item1, Item2: Pointer): Integer;
sondern
function ListSortCompareTest(Item1, Item2: Pointer): Integer;

Also keine Methode sondern eine einfache Funktion.

Callback ist ähnlich wie ein Event. Du übergibst der Prozedure "Sort" einen Zeiger auf die Funktion, die es aufrufen soll um den Vergleich durchzuführen.

Antworten