![]() |
TComponentList.Sort --> Endlosschleife
Hi!
Mein TComponentList.Sort (SortElement) wird niemals fertig. Kann mir jemand sagen, warum?
Delphi-Quellcode:
Danke im Vorraus.
...
TLayout private FCompareListItems:TListSortCompare; published Objects: TComponentList; public ... function InternalSortLayout(Item1, Item2: Pointer): Integer; begin Result := -1; if TLayoutElement(Item1).Top < TLayoutElement(Item2).Top then Result := -1; if TLayoutElement(Item1).Top > TLayoutElement(Item2).Top then Result := 1; if TLayoutElement(Item1).Top = TLayoutElement(Item2).Top then begin if length(TLayoutElement(Item1).Text) < Length(TLayoutElement(Item2).Text) then begin Result := -1; end else begin Result := 1; end; end; end; constructor TLayout.Create(_Owner: TComponent = NIL); begin inherited Create(_Owner); Objects := TComponentList.Create(True); FCompareListItems := InternalSortLayout; ... end; procedure TLayout.SortElement; begin if Objects.Count > 1 then begin Objects.Sort(FCompareListItems); end; end; |
Re: TComponentList.Sort --> Endlosschleife
Hallo berens,
die Vergleichsroutine kann durchaus für zwei identische Einträge aufgerufen werden. Sie muss in diesem Fall den Wert 0 liefern. Gruß Hawkeye |
Re: TComponentList.Sort --> Endlosschleife
Wie besch...eiden ist das denn? oO
Egal wie, so funktioniert es einwandfrei:
Delphi-Quellcode:
function InternalSortLayout(Item1, Item2: Pointer): Integer;
begin Result := 0; If Item1 = Item2 then begin exit; end; ... Danke Hawkeye219 :) |
Re: TComponentList.Sort --> Endlosschleife
Hallo berens,
abgesehen von der etwas unglücklichen Benutzing von "If" sehe ich da erst einmal keinen Fehler. Allerdings halte ich folgendes für etwas schneller:
Delphi-Quellcode:
So läuft er nicht für jeden Satz in drei "If"s.
if TLayoutElement(Item1).Top < TLayoutElement(Item2).Top then Result := -1
else if TLayoutElement(Item1).Top > TLayoutElement(Item2).Top then Result := 1 else if TLayoutElement(Item1).Top = TLayoutElement(Item2).Top then begin if length(TLayoutElement(Item1).Text) < Length(TLayoutElement(Item2).Text) then Result := -1 else Result := 1; end; @Hawkeye219 Wenn er aber unbeding keine "gleichen" Daten haben will? Sowas soll's ja geben. Gruß K-H Oh ich hab nicht aufgepasst:
Delphi-Quellcode:
Wenn aber der Text gleich ist gibt's ein Problem.
if length(TLayoutElement(Item1).Text) < Length(TLayoutElement(Item2).Text) then
Result := -1 else Result := 1; K-H |
Re: TComponentList.Sort --> Endlosschleife
Das ist eine allgemeine Anforderung an eine Compare Funktion. Du solltest auch eher auf
Delphi-Quellcode:
für Gleichheit (= 0) testen.
if (TLayoutElement(Item1).Top = TLayoutElement(Item2).Top) and (length(TLayoutElement(Item1).Text) = Length(TLayoutElement(Item2).Text)
Viele Grüße |
Re: TComponentList.Sort --> Endlosschleife
Das mit gleichen Daten ist nicht das Problem, sondern mit gleichen Items: Warum vergleicht die Liste Apfel1 mit Apfel1? Das Item steht nur einmal in der Liste, und kann deshalb natürlich auch nicht "vor sich" oder "hinter sich" einsortiert werden.
mirage228: Die Sortierung soll primär nach "Top" erfolgen, erst falls diese identlisch ist, nach Textlänge. Sind beide Texte gleichlang, ist es egal. Ich möchte einfach der Form halber nochmal angemerkt haben, dass die Hilfe in Delphi 2007 seeehr bescheiden ist. Alles zum Thema TList.Sort: Zitat:
Und zu TListSortCompare: Zitat:
Ich hab zwar Delphi 2009, mag aber noch nicht komplett drauf umsteigen. Wie schaut da die Hilfe aus? |
Re: TComponentList.Sort --> Endlosschleife
Zitat:
Letztlich aber auch nur konsequent, die komplette Vergleichsprüfung an die Funktion zu übergeben, also auch der Fall Item=Item, weshalb ich das jetzt nicht unbedingt als Design-Fehler sehe. |
Re: TComponentList.Sort --> Endlosschleife
Zitat:
egal im Sinne von "das juckt mich nicht"? Da gibt es bestimmt ein Problem das ordentlich zu programmieren. ;-) Gruß K-H |
Re: TComponentList.Sort --> Endlosschleife
Delphi-Quellcode:
Naja, "egal" im Sinne von: Je nachdem was der Benutzer sich vorgestellt hat, kann es richtig oder falsch sein.
egal im Sinne von "das juckt mich nicht"? Da gibt es bestimmt ein Problem das ordentlich zu programmieren. ;-)
Das ist hier ein Logikproblem, kein Problem der technischen Umsetzung. Hier müssen wir auf Feedback der User warten: Was ist passiert, und was hat der Benutzer an dieser Stelle erwartet, bzw. wie kann man festlegen, dass dies oder jenes passieren soll. Der genannte Fall tritt generell äußerst selten ein, und lässt sich durch ändern von "Top" durch den Benutzer eindeutig klären. Dafür sich jetzt im vorraus den Kopf zu zerbrechen, lohnt sich nicht (spätestens wenn der erste Kunde kommt und es genau andersherum haben will, als wie wir es dann gelöst haben ;) ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 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