![]() |
Re: TObjectList - Sort crash (D7)
Zitat:
Kann es sein, daß du das Rückgabeergebnis irgendwo wieder freigibst? |
Re: TObjectList - Sort crash (D7)
Zitat:
Delphi-Quellcode:
@Dax just joking
TObjectList.Create(True);
|
Re: TObjectList - Sort crash (D7)
Ich habe eine Workaround gefunden.
Wenn ich mach jedem Add sofort sortiere, dann läuft es zumindest durch. Schöne und saubere Lösungen sehen anders aus :(
Delphi-Quellcode:
function TMyItemList.NewMyItem(a1,a2,a3:Integer):TmyItem;
begin Result := NIL; Result := TmyItem.Create(Self); Result.V1 := a1; Result.V2 := a2; Result.V3 := a3; Self.Add(Result); Self.Sort(MyListCompare); // Workaround - fix me ! end; |
Re: TObjectList - Sort crash (D7)
Ist zwar schon bissl älter, aber ich stehe gerade vor dem selben Problem, folgende Compare Methode:
Delphi-Quellcode:
Hab allerdings keine Ahnung was genau der Wert von Result bewirkt, also was passiert wenn Result 1,0 oder -1 ist?(Die D2005 Hilfe ist [strike]etwas[/strike] grottenschlecht)
function CompareNextStart(Item1, Item2: Pointer): Integer;
begin if(TMyItem(Item2).NextStart = 0)then Result:=1 else if(TMyItem(Item1).NextStart > TMyItem(Item2).NextStart)then Result:=0 else Result:=1; end; Ausserdem habe ich das gleiche Problem wie oben genannt, ich bekomme irgendwann einen Pointer übergeben welcher ins Nichts führt($16 oder so). Hatte jemand zu dem Problem mittlerweile ne Lösung?(Möcht jetz keinen neuen Thread aufmachen da es exakt das gleiche Problem ist) |
Re: TObjectList - Sort crash (D7)
Hallo,
kurz die Hilfe aus Delphi 7 per Copy&Paste, eventuell hilft es Dir weiter: Zitat:
Zitat:
|
Re: TObjectList - Sort crash (D7)
ok und wann werden die items dann getauscht? wenn 1, 0 oder -1 als ergebnis ist?
Ich habe das Problem das ich zB diese Liste: 0 1 4 3 0 6 2 so sortiert haben möchte: 1 2 3 4 6 0 0 Edit: Aaahhh probieren geht halt doch über studieren :mrgreen:
Delphi-Quellcode:
so gehts :dp:
function CompareNextStart(Item1, Item2: Pointer): Integer;
begin if(TMyItem(Item1).NextStart = 0)then Result:=1 else if(TMyItem(Item1).NextStart > TMyItem(Item2).NextStart)then Result:=1 else if(TMyItem(Item1).NextStart < TMyItem(Item2).NextStart)then Result:=-1 else Result:=0; end; |
Re: TObjectList - Sort crash (D7)
Hallo,
ein Versuch ohne Gewähr:
Delphi-Quellcode:
Getauscht wird, wenn Result <> 0.
function CompareNextStart(Item1, Item2: Pointer): Integer;
begin if (TMyItem(Item1).NextStart = 0) then Result := -99 // 0 ist im Wunschergebnis > als alles Andere. else if (TMyItem(Item2).NextStart = 0) then Result := 99 else if (TMyItem(Item1).NextStart < TMyItem(Item2).NextStart) then Result := 1 // Item1 ist < Item2 else if (TMyItem(Item1).NextStart > TMyItem(Item2).NextStart) then Result := -1 // Item1 ist > Item2 else Result := 0; // Item1 = Item2 end; PS: Du warst schneller als ich :( |
Re: TObjectList - Sort crash (D7)
Du hast ein anderes Ergebnis als ich ;)
Aber das getauscht wird wenn die beiden unterschiedlich sind kann ich fast nicht glauben, dann bekommt man ja nie ne sortierung hin ;) |
Re: TObjectList - Sort crash (D7)
Hallo,
Zitat:
|
Re: TObjectList - Sort crash (D7)
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:
Delphi-Quellcode:
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.
function funktionsname(Item1, Item2: Pointer): Integer;
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:
Hab's nicht ausprobiert, aber so müsste es eigentlich stimmen!
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 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-2025 by Thomas Breitkreuz