Delphi-PRAXiS
Seite 1 von 2  1 2      

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. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.
Seite 1 von 2  1 2      

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