Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sortiermethode mit TStringlist zurückverfolgen? (https://www.delphipraxis.net/40482-sortiermethode-mit-tstringlist-zurueckverfolgen.html)

ibp 16. Feb 2005 13:26


Sortiermethode mit TStringlist zurückverfolgen?
 
Hallo,
mir stellt sich eine Aufgabe und zwar habe ich ein StringGrid, dass mit Daten aus einer Datenbank gefüllt ist. Nun ist es per Programm möglich, sich über die Spalten eine Sortierreihenfolge zu definieren. Ich erstelle nun eine StringList, wobei jeder String aus dem Stringgrid zusammengesetzt wird, dieser kann je nach Zeile unterschiedliche Spalten haben.
Das sortieren ist ja jetzt nun nicht das Problem, sondern, dass ich einen Index brauche, wo jeder Datensatz vorher im Grid war (für weitere Verarbeitungen).

Gibt es noch andere Möglichkeit als mit Objekten zu arbeiten?

Delphi-Quellcode:
type
  TRfolge= class(TObject)
    position:integer;
  end;

  // ...


  slist:=TStringList.Create;

  // strings zusammensetzen
  for zeile:=0 to bis do
  begin
    s:='';
    for spalte:=0 to 3 do // nur für das beispiel, sonst unterschiedliche spalten
      s:=s+stringgrid2.Cells[spalte,zeile]; // zu sortierender String

    nr:=TRfolge.Create;
    nr.position:=zeile; // index merken

    slist.AddObject(s,nr);
  end;

  slist.Sort;

  //... weitere Verarbeitung

  // objekte freigeben
  for zeile:=0 to bis do
    (slist.Objects[zeile] as TRfolge).Free;

  sList.Free;

Thanatos81 16. Feb 2005 13:35

Re: Sortiermethode mit TStringlist
 
Hi ibp,

Brauchst du denn unbedingt ne TStringList? Sonst würde ich dir ein Record empfehlen:
Delphi-Quellcode:
type TEintrag = Record
   Inhalt  : string;
   Position : Integer;
end;
Davon legst du dir ein dynamisches Array an, und kannst das ganze dann mit nem Quicksort sortieren.

Gruß,
Thanatos81

ibp 16. Feb 2005 13:42

Re: Sortiermethode mit TStringlist
 
Zitat:

Zitat von Thanatos81
Hi ibp,

Brauchst du denn unbedingt ne TStringList? Sonst würde ich dir ein Record empfehlen:
Delphi-Quellcode:
type TEintrag = Record
   Inhalt  : string;
   Position : Integer;
end;
Davon legst du dir ein dynamisches Array an, und kannst das ganze dann mit nem Quicksort sortieren.

Gruß,
Thanatos81

Die in StringList implementierte Sortiermethode ist imho Quicksort.
Ich versuche arrays zu vermeiden, wenn es geht, da Datensätze hinzukommen können, ist dei Behandlung mit einer StringList einfacher!

Shaman 16. Feb 2005 14:34

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Hoi

Du brauchst ja nicht unbedingt Objekte zu erstellen:

Delphi-Quellcode:
slist.AddObject(s,TObject(Position));
tuts auch. Dann fällt schon mal Create und Free weg.

Gruss
Shaman

ibp 16. Feb 2005 16:48

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Zitat:

Zitat von Shaman
Hoi

Du brauchst ja nicht unbedingt Objekte zu erstellen:

Delphi-Quellcode:
slist.AddObject(s,TObject(Position));
tuts auch. Dann fällt schon mal Create und Free weg.

Gruss
Shaman

und wie wird dann der speicher wieder freigegeben, wenn du die position als tobjekt castest?

KrasserChecker 16. Feb 2005 16:59

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Gar nicht, da die Position nur eine Zahl ist, die als Zeiger behandelt wird.
Da dahinter ja kein Objekt steckt braucht auch nichts freigegeben werden.

Robert_G 16. Feb 2005 18:52

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Wird nicht vielmehr eine Box um Position angelegt um es als Objekt benutzen zu können?
Diese Box müsste sehr wohl freigegeben werden.
Oder vermische ich jetzt schon wieder .Net mit Delphi32? :freak: :gruebel:

ibp 16. Feb 2005 20:23

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
was passiert nun hiermit eigentlich genau?, ist das nun ein object und muss das freigegeben werden oder nicht?

Delphi-Quellcode:
stringlist.AddObject(s,TObject(Position))

KrasserChecker 17. Feb 2005 09:21

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
@ibp:
Delphi-Quellcode:
TObject(Position)
ist ein explizites Typecasting. Dabei wird Delphi dazu gezwungen die Ganzzahl (Position) als ein Zeiger auf TObject anzusehen.
Ausgeschrieben bedeutet das in etwa: Behandle "Position" als wäre es ein Zeiger. Da ein Zeiger auch nichts anderes als eine Ganzzahl ist, sind die beiden Typen ja kompatibel.
Nur, weil Delphi so tun soll, als wäre es ein Zeiger heisst das allerdings noch lange nicht, das dort auch ein gültiges Objekt existiert. Wo sollte das auch herkommen?

@Robert_G:
Wieso muss in .NET was freigegeben werden? Ich dachte dort gibt es einen Garbage-Collector...

Robert_G 17. Feb 2005 09:45

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Zitat:

Zitat von KrasserChecker
@Robert_G:
Wieso muss in .NET was freigegeben werden? Ich dachte dort gibt es einen Garbage-Collector...

Muss es nicht. Aber als Folge von Typensicherheit wird eine Box um den primitiven Wert gelegt (also Value types wie integer oder records werden in eine Instanz gepackt, bei der der Wert eine Art Feld ist).
Ich war mir jetzt nicht mehr sicher, ob Delphi das auch macht.
Ich "arbeite" schließlich nicht mehr damit sondern nutze es nur für ein paar private Spielereien.
Aber selbst wenn ich damit arbieten würde, mir würde es im Traum nicht einfallen sowas zu machen. Ist irgendwie unsauber und unschön. ;)

ibp 17. Feb 2005 10:00

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Zitat:

Zitat von Robert_G
Ist irgendwie unsauber und unschön. ;)

...finde ich irgendwie auch :cheers:, gibt es noch eine saubere lösung?

Shaman 17. Feb 2005 10:03

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Zitat:

Zitat von Robert_G
Aber selbst wenn ich damit arbieten würde, mir würde es im Traum nicht einfallen sowas zu machen. Ist irgendwie unsauber und unschön. ;)

Warum auch etwas schnell und einfach machen, wenn es doch auch umständlich und kompliziert geht, gell? :wink:

Ich sehe das ähnlich wie mit TComponent.Tag. Dem Benutzer wird die Möglichkeit gegeben, zusätzliche Daten zu speichern. Dazu wird eine Property eines bestimmten Typs bereitgestellt, welcher 4 Byte gross ist. Was man dann halt mit dem Platz macht, ist jedem selber überlassen. :-)

Gruss
Shaman

Robert_G 17. Feb 2005 10:07

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Zitat:

Zitat von ibp
Zitat:

Zitat von Robert_G
Ist irgendwie unsauber und unschön. ;)

...finde ich irgendwie auch :cheers:, gibt es noch eine saubere lösung?

Einfach eine eigene Liste von einer eigenen Klasse nehmen (aber nicht so einen TList-Krüppel ;) ).
Warum du TStringList nimmst weiß ich auch nicht. :gruebel:
Wenn es dir um's Sortieren geht shmia hat mal eine Basisklasse für Sortierungen in die CodeLib gesetzt.
Wenn du 2 strings mit AnsiCompareXXX (Ich den Funktionsnamen nicht mehr im Kopf) vergleichst bekommst du den zur Sortierung in den Klassen nötigen integer. ;)

Robert_G 17. Feb 2005 10:22

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Zitat:

Zitat von Shaman
Zitat:

Zitat von Robert_G
Aber selbst wenn ich damit arbieten würde, mir würde es im Traum nicht einfallen sowas zu machen. Ist irgendwie unsauber und unschön. ;)

Warum auch etwas schnell und einfach machen, wenn es doch auch umständlich und kompliziert geht, gell? :wink:

Ich sehe das ähnlich wie mit TComponent.Tag. Dem Benutzer wird die Möglichkeit gegeben, zusätzliche Daten zu speichern. Dazu wird eine Property eines bestimmten Typs bereitgestellt, welcher 4 Byte gross ist. Was man dann halt mit dem Platz macht, ist jedem selber überlassen. :-)

Du hast noch nie eine "richtige" Anwendung geschrieben, oder? Ich meine eine, von dein Gehaltscheck mindestens indirekt abhängt.
Wenn dem so wäre, wüsstest du, dass faules Programmieren buggy Programmieren ist. ;)
Nur durch Code, an dem man selbst gerne arbeitet und der eine intuitive Klassenstruktur enthält lässt sich solch ein Rumgecaste und unnötige darauffolgende Bugs vermeiden. ;)
Ich persönlich bin ein grottenschlechter Programmierer wenn ich mit hässlichem Code arbeiten muss. ;)

Shaman 17. Feb 2005 10:37

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Zitat:

Zitat von Robert_G
Du hast noch nie eine "richtige" Anwendung geschrieben, oder? Ich meine eine, von dein Gehaltscheck mindestens indirekt abhängt.

Oh doch, und ob :P

Ich sehe einfach überhaupt kein Problem dabei. Das "Rumgecaste" ist ja ziemlich übetrieben, das passiert normalerweise nur an zwei Stellen. Ich lagere solche Sachen immer in eine Prozedur aus, mach einen Kommentar dazu und alle sind glücklich. :)

Gruss
Shaman

ibp 17. Feb 2005 10:50

Re: Sortiermethode mit TStringlist zurückverfolgen?
 
Zitat:

Zitat von Robert_G
Warum du TStringList nimmst weiß ich auch nicht.

..weil es hauptsächlich strings sind die sortiert werden und der aufwand zu groß wäre da noch zu unterscheiden!.

Zitat:

Zitat von Robert_G
Wenn es dir um's Sortieren geht shmia hat mal eine Basisklasse für Sortierungen in die CodeLib gesetzt.

..es geht dabei meist um ca. 10..50 datensätze die sortiert werden, daher ist die methode zeitmässig egal.

Zitat:

Zitat von Robert_G
Wenn du 2 strings mit AnsiCompareXXX (Ich den Funktionsnamen nicht mehr im Kopf) vergleichst bekommst du den zur Sortierung in den Klassen nötigen integer. ;)

..es ist so, es gibt eine baumstruktur, die die datensätze navigieren. wenn ich nun die datenseite sortieren lasse, dann muss auch der baum dementsprechend umsortiert werden, dazu brauche ich den index vor der sortierung. es können im baum die datensätze unter umständen auch gleiche bezeichnungen haben, daher entfällt der nachträgliche vergleich im baum!

.. ich denke ich werde es so wie bei meinem ersten beitrag machen, da wie gesagt der harte typecast mir widerstrebt! es sei denn es hat noch jemand ne tolle idee!

erstmal danke an alle!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 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