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
Seite 2 von 3     12 3      
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#11

Re: TObjectList - Sort crash (D7)

  Alt 11. Mär 2008, 16:02
Zitat von o-sch:
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);
end;
Was machst du ausserhalb dieser Funktion mit dem Rückgabeergebnis?
Kann es sein, daß du das Rückgabeergebnis irgendwo wieder freigibst?
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
o-sch

Registriert seit: 18. Okt 2006
Ort: Essen
11 Beiträge
 
Delphi XE2 Enterprise
 
#12

Re: TObjectList - Sort crash (D7)

  Alt 11. Mär 2008, 17:51
Zitat von Tyrael Y.:
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);
end;
Was machst du ausserhalb dieser Funktion mit dem Rückgabeergebnis?
Kann es sein, daß du das Rückgabeergebnis irgendwo wieder freigibst?
Nein, leider nicht - das muss die Liste selbst machen. (OwnsObjects)

TObjectList.Create(True); @Dax just joking
  Mit Zitat antworten Zitat
o-sch

Registriert seit: 18. Okt 2006
Ort: Essen
11 Beiträge
 
Delphi XE2 Enterprise
 
#13

Re: TObjectList - Sort crash (D7)

  Alt 12. Mär 2008, 07:42
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;
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#14

Re: TObjectList - Sort crash (D7)

  Alt 10. Feb 2009, 13:29
Ist zwar schon bissl älter, aber ich stehe gerade vor dem selben Problem, folgende Compare Methode:
Delphi-Quellcode:
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;
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)

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)
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#15

Re: TObjectList - Sort crash (D7)

  Alt 10. Feb 2009, 13:42
Hallo,

kurz die Hilfe aus Delphi 7 per Copy&Paste, eventuell hilft es Dir weiter:
Zitat von Delphi 7-Hilfe:
TListSortCompare (Typ)
Der Typ TListSortCompare wird für Callback-Routinen verwendet, die zwei Listeneinträge miteinander vergleichen.

Unit

Classes

Delphi-Syntax:

type TListSortCompare = function (Item1, Item2: Pointer): Integer;

C++ Syntax:

typedef int __fastcall (*TListSortCompare)(void * Item1, void * Item2);

Beschreibung

TListSortCompare ist eine Vergleichsfunktion, die einen positiven Wert zurückgibt, wenn Item1 kleiner als Item2 ist. Der Rückgabewert ist Null, wenn beide Einträge gleich sind. Wenn Item1 größer als Item2 ist, ist der Rückgabewert negativ.

Wert Beschreibung

> 0 (positiv) Item1 ist kleiner als Item2
0 Item1 ist gleich Item2
< 0 (negativ) Item1 ist größer alsItem2
Zitat von Angel4585:
Ist zwar schon bissl älter, aber ich stehe gerade vor dem selben Problem, folgende Compare Methode:
Delphi-Quellcode:
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;
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)

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)
Deine Vergleichsfunktion liefert entweder 0 oder 1, aber nicht -1, liegt dort eventuell der Fehler?
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#16

Re: TObjectList - Sort crash (D7)

  Alt 10. Feb 2009, 13:53
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

Delphi-Quellcode:
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;
so gehts
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#17

Re: TObjectList - Sort crash (D7)

  Alt 10. Feb 2009, 14:07
Hallo,

ein Versuch ohne Gewähr:

Delphi-Quellcode:
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;
Getauscht wird, wenn Result <> 0.

PS: Du warst schneller als ich
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#18

Re: TObjectList - Sort crash (D7)

  Alt 10. Feb 2009, 14:22
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
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#19

Re: TObjectList - Sort crash (D7)

  Alt 10. Feb 2009, 14:28
Hallo,
Zitat von Angel4585:
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
schau mal (wenn Du Interesse hast) in die Classes.pas und suche dort nach TListSortCompare. Intern wird bei der Sortierung ein Quicksort verwandt. Eventuell kannst Du ja daran nachvollziehen, warum das Sortieren funktioniert.
  Mit Zitat antworten Zitat
globetrotter77

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

Re: TObjectList - Sort crash (D7)

  Alt 10. Feb 2009, 15: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
Seite 2 von 3     12 3      


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 17:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz