AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectList - Sort crash (D7)

Ein Thema von o-sch · begonnen am 11. Mär 2008 · letzter Beitrag vom 10. Feb 2009
Antwort Antwort
globetrotter77

Registriert seit: 16. Jan 2009
Ort: Nürnberg
236 Beiträge
 
Delphi 10.3 Rio
 
#1

Re: TObjectList - Sort crash (D7)

  Alt 10. Feb 2009, 16:48
Sort ist eine Methode von TList, die als einzigen Parameter den Namen einer Function vom Typ TListSortCompare erwartet.
Diese Function MUSS exakt folgende Deklaration besitzen:
function funktionsname(Item1, Item2: Pointer): Integer; TList.Sort ruft nun wiederum, falls überhaupt etwas in der Liste vorhanden ist, die interne Methode QuickSort auf, die sich rekursiv auch wieder selber aufruft, allerdings mit immer kleiner werdenden Intervallen, daher auch endlich.
Die eigentliche Sortierung erfolgt dabei durch blitzschnelles Umschlichten der auf die einzelnen Elemente zeigenden Pointer.

Nachdem die Liste selbst nicht wissen kann, nach welchen Kriterien sortiert werden soll, muss hierzu eben diese genannte Function übergeben werden, die ebenfalls nur mit den Pointern aufgerufen wird.

Hier kann man nach Herzenslust Sortiervorgaben programmieren.
Entscheidend für den intern durchlaufenen Algorithmus ist einzig und alleine, ob ein Wert rauskommt, der <0, =0 oder >0 ist
Auch wenn -7 zurückgegeben wird, wird das nicht anders behandelt als -1.

Es bedeuten:
<0 Item2 ist "kleiner" als Item1, wird also "vorher" einsortiert
=0 Item2 ist "gleich" Item1, da ist die Reihenfolge egal
>0 Item2 ist "größer" als Item1, wird also "nachher" einsortiert

Wieso so rum und nicht so, wie man's aus der Funktion herauslesen würde, weiß kein Mensch.

Wenn du also eine Spezialsortierung für die Nullwerte brauchst, muss die Funktion daher lauten (ich schreibe die Vergleiche mal andersrum, damit das Ergebnis (zumindest für mich) besser lesbar wird):
Delphi-Quellcode:
function CompareNextStart(Item1, Item2: Pointer): Integer;
begin
  if (TMyItem(Item1).NextStart = 0) and (TMyItem(Item2).NextStart <> 0) then
    Result := -1 // Item2 < Item1
  else if (TMyItem(Item2).NextStart = 0) and (TMyItem(Item1).NextStart <> 0) then
    Result := +1 // Item2 > Item1
  else if (TMyItem(Item2).NextStart = 0) and (TMyItem(Item1).NextStart = 0) then
    Result := 0 // Item2 = Item1
  else // ab hier ist keiner der beiden Werte 0
  if TMyItem(Item2).NextStart < TMyItem(Item1).NextStart then
    Result := -1 // Item2 < Item1
  else if TMyItem(Item2).NextStart > TMyItem(Item1).NextStart then
    Result := +1 // Item2 > Item1
  else
    Result := 0; // Item2 = Item1
end;
Hab's nicht ausprobiert, aber so müsste es eigentlich stimmen!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz