Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   StringGrid Sortieren (https://www.delphipraxis.net/163459-stringgrid-sortieren.html)

War10ck 29. Sep 2011 13:12

StringGrid Sortieren
 
Hallo,
ich hoffe ihr könnt mir helfen. Ich habe ein StringGrid mit n Zeilen und 6 Reihen.
In Reihe drei Sind Daten des Formats (TT.MM.JJJJ) eingetragen. Mein Ziel ist es das gesammte StringGrid entsprechend aufsteigend oder absteigend nach den Daten zu sortieren.

Ich habe im Internet bereits eine Procedure gefunden und diese etwas abgeändert:

Delphi-Quellcode:
procedure TForm1.Button9Click(Sender: TObject);
var
 i:Integer;
 tmpDatum: TDate;
 tmpString: String;
 j,m,t: Word;
 List: TSTringList;
 begin
 List := TStringList.Create;
 List.clear;
 for I := 1 to (Stringgrid2.RowCount-1) do
 begin
  if StringGrid2.Cells[2,i] = '' then break;
  tmpDatum := StrToDate(StringGrid2.Cells[2,i]);
  tmpString := FormatDateTime('YYYYMMdd',tmpDatum);
  List.Add(tmpString);
 end;

 {Das Leeren des Grids dient nur der Übersichtlichkeit, ansonsten
 können die Daten überschrieben werden.}
 for I := 1 to (Stringgrid2.RowCount) do
 StringGrid2.Cells[2,i] := '';

 {Sortiere die Liste}
 List.sorted := true;

 {Zurückschreiben der Werte in das Stringgrid}
 for I := 1 to (List.Count) do
 begin
  j := StrToInt(copy(List.Strings[i-1],1,4));
  m := StrToInt(copy(List.Strings[i-1],5,2));
  t := StrToInt(copy(List.Strings[i-1],7,2));
  tmpDatum := Encodedate(j,m,t);
  StringGrid2.Cells[2,i] := DateToStr(tmpDatum);
  Showmessage(ListNr.Text);
 end;

 end;
Damit wird Spalte 3 wunderbar nach Daten sortiert. Nur der Rest bleibt eben gleich. Wie mache ich nun weiter, dass nicht nur die 3. Spalte geändert wird, sondern auch die Daten der entsprechend anderen Reihen mit verschoben werden? :? Hoffe man kann mich verstehen und jemand hat einen Denkanstoß für mich.

MfG
War10ck

mkinzler 29. Sep 2011 13:13

AW: StringGrid Sortieren
 
Ich würde eher ein DBGrid verwenden und ggf ein MemDataSet als Datenquelle verwenden

War10ck 29. Sep 2011 13:16

AW: StringGrid Sortieren
 
Ist eher schlecht, da ich dann das gesammte Programm umschreiben müsste. Gibt doch sicherlich eine etwas kompliziertere Möglichkeit, die dann letztendlich aber für mich schneller ist?

War10ck

p80286 29. Sep 2011 13:37

AW: StringGrid Sortieren
 
die Daten, die Du in dem Strringgrid anzeigst, sind doch wohl irgendwo noch gespeichert (tlist,TObjectlist...)
wie wäre es denn wenn Du die sortieren würdest?

eine andere Möglichkeit wäre es den Inhalt einer Row als Object an den entsprechenden Datensatz in der Stringlist zu packen.

Gruß
K-H

War10ck 29. Sep 2011 14:33

AW: StringGrid Sortieren
 
Zitat:

Zitat von p80286 (Beitrag 1127481)
die Daten, die Du in dem Strringgrid anzeigst, sind doch wohl irgendwo noch gespeichert (tlist,TObjectlist...)
wie wäre es denn wenn Du die sortieren würdest?

Die Einzelnen Reihen sind jeweils in einer eigenen StringList gespeichert. Hilft mir aber eigentlich auch nicht oder?

Zitat:

Zitat von p80286 (Beitrag 1127481)
eine andere Möglichkeit wäre es den Inhalt einer Row als Object an den entsprechenden Datensatz in der Stringlist zu packen.

Kannst du mir das etwas genauer erklären oder einen erklärenden Link posten?

War10ck

DeddyH 29. Sep 2011 14:38

AW: StringGrid Sortieren
 
Hmmm... könnte man nicht die Rows in eine TObjectlist packen, diese sortieren und anschließend wieder ins StringGrid zurückschreiben? Allerdings erscheint mir das selbst etwas aufwändig.

War10ck 29. Sep 2011 15:32

AW: StringGrid Sortieren
 
Okay,
habs jetzt hinbekommen. War eigentlich gar nicht so schwer, vielleicht habt ihr mich aber auch nur falsch verstanden wer weiß?!
Ich hab einfach den BubbleSortalgorythmus ein wenig auf mein Problem angepasst, mag vielleicht nicht die eleganteste Lösung sein aber funktioniert.

Delphi-Quellcode:
procedure Change(Row, I: Integer);
var
  Dummy: String;
begin
  Dummy := Form1.StringGrid2.Cells[Row,I];
  Form1.StringGrid2.Cells[Row,I] := Form1.StringGrid2.Cells[Row,I+1];
  Form1.StringGrid2.Cells[Row,I+1] := Dummy;
end;
Delphi-Quellcode:
procedure TForm1.Button11Click(Sender: TObject);
var
 Done: boolean;
 I, N: integer;
begin
 N := StringGrid2.RowCount;
 repeat
   Done := true;
   for I := 1 to N - 2 do //I=1 => Überschrift auslassen
     if StrToDate(StringGrid2.Cells[2,I]) > StrToDate(Stringgrid2.Cells[2,I+1]) then
     begin
       Change(0, I);
       Change(1, I);
       Change(2, I);
       Change(3, I);
       Change(4, I);
       Change(5, I);
       Done := false;
     end;
 until Done;
end;
Danke an alle die sich Mühe gegeben haben mir zu helfen! :)

MfG War10ck


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf