AGB  ·  Datenschutz  ·  Impressum  







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

TComponentList.Sort --> Endlosschleife

Ein Thema von berens · begonnen am 3. Jul 2009 · letzter Beitrag vom 3. Jul 2009
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

TComponentList.Sort --> Endlosschleife

  Alt 3. Jul 2009, 10:48
Hi!

Mein TComponentList.Sort (SortElement) wird niemals fertig. Kann mir jemand sagen, warum?

Delphi-Quellcode:
...
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;
Danke im Vorraus.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: TComponentList.Sort --> Endlosschleife

  Alt 3. Jul 2009, 11:01
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
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: TComponentList.Sort --> Endlosschleife

  Alt 3. Jul 2009, 11:05
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

Re: TComponentList.Sort --> Endlosschleife

  Alt 3. Jul 2009, 11:07
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:
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;
So läuft er nicht für jeden Satz in drei "If"s.

@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:
if length(TLayoutElement(Item1).Text) < Length(TLayoutElement(Item2).Text) then
      Result := -1
    else
      Result := 1;
Wenn aber der Text gleich ist gibt's ein Problem.
K-H
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

Re: TComponentList.Sort --> Endlosschleife

  Alt 3. Jul 2009, 11:07
Das ist eine allgemeine Anforderung an eine Compare Funktion. Du solltest auch eher auf
if (TLayoutElement(Item1).Top = TLayoutElement(Item2).Top) and (length(TLayoutElement(Item1).Text) = Length(TLayoutElement(Item2).Text) für Gleichheit (= 0) testen.

Viele Grüße
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: TComponentList.Sort --> Endlosschleife

  Alt 3. Jul 2009, 11:12
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:
Mit Sort können die Elemente des Arrays Items sortiert werden. Compare ist eine Vergleichsfunktion, die anzeigt, wie die Elemente sortiert sind.
Hier steht nirgendwo beschreiben, wie sortiert wird (Result < > = 0), bzw. dass man auch Vergleiche mit dem selben Item aufpassen muss.

Und zu TListSortCompare:
Zitat:
Das ist der Typ Classes.TListSortCompare.
Wie zur Hölle soll man das alles alleine rausfinden können? Das mit (Result < > = 0) konnte ich nur deswegen "wissen", weil ich hier in DP über einen alten Beitrag zum Thema Sort gestolpert bin, ansonsten hätte ich ausprobieren müssen.

Ich hab zwar Delphi 2009, mag aber noch nicht komplett drauf umsteigen. Wie schaut da die Hilfe aus?
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

Re: TComponentList.Sort --> Endlosschleife

  Alt 3. Jul 2009, 11:22
Zitat von berens:
Das mit gleichen Daten ist nicht das Problem, sondern mit gleichen Items: Warum vergleicht die Liste Apfel1 mit Apfel1?
Das ist auch bei der eigenen Sortierroutine von Borland so... da werden gleiche Items geswapped. Aber eine CompareFunktion sollte ja immer Größe/Kleiner/Gleich auswerten und entsprechendes Result zurückliefern. Alle Compares in Delphi machen das... größer, kleiner und gleich auswerten und behandeln.

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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

Re: TComponentList.Sort --> Endlosschleife

  Alt 3. Jul 2009, 11:34
Zitat von berens:

mirage228: Die Sortierung soll primär nach "Top" erfolgen, erst falls diese identlisch ist, nach Textlänge. Sind beide Texte gleichlang, ist es egal.

egal im Sinne von "gleich"? dann sollte es auch ein Result=0 geben!

egal im Sinne von "das juckt mich nicht"? Da gibt es bestimmt ein Problem das ordentlich zu programmieren. ;-)

Gruß
K-H
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: TComponentList.Sort --> Endlosschleife

  Alt 3. Jul 2009, 11:40
egal im Sinne von "das juckt mich nicht"? Da gibt es bestimmt ein Problem das ordentlich zu programmieren. ;-) Naja, "egal" im Sinne von: Je nachdem was der Benutzer sich vorgestellt hat, kann es richtig oder falsch sein.
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 )
  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 05:22 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