Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi StringGrid nach Kriterien sortieren (https://www.delphipraxis.net/114635-stringgrid-nach-kriterien-sortieren.html)

Subsidenz 28. Mai 2008 20:39

Re: StringGrid nach Kriterien sortieren
 
Zitat:

Zitat von Hansa
Warum der Umweg über die Combobox ? Ich würde über Klick auf Titelleiste sortieren lassen. Wie das bei einzeiligen Stringgrids geht hat Quickanddirty angedeutet. Mit einzeilig meine ich pro zusammenhängender Wert. Manchmal braucht man mehr Zeilen, um was gut darzustellen.

Ja das ginge auch aber mein Programmierverständnis geht soweit, dass ich was mit Code-Schnipseln in vereinfachter Form anfangen kann. Ich bräuchte einen Anfang. :wink:

Hansa 28. Mai 2008 21:07

Re: StringGrid nach Kriterien sortieren
 
Die Spalten des Stringgrids sind TStrings. Das ist nicht weit von der TStringlist weg und die hat die Methode Sort. Genau das ist der Ansatz. Pseudocode :
Delphi-Quellcode:
MyStringList.Items := MyStringGrid.Cols [x];
MyStringList.Sort
..und wieder zurück ins Stringgrid
Jetzt ist wohl das Hauptproblem, dass die Zeilen ja wohl zusammenbleiben müssen und dann nützt die sortierte Spalte alleine auch nichts ? Tja, dann wirds schon nicht mehr trivial. Viele kennen nicht mal die Objects-Eigenschaft. Mir fällt tatsächlich dafür aber nur die Objects-Eigenschaft ein. Du packst die Zellen jeder ZEILE mit AddObject in ein TObject (ähnlich wie record zu behandeln). Dieses muss an der Stringliste (AddObject von TStringList -> F1) dranpappen. Jetzt wird diese sortiert und das zu jedem Stringlist-Item gehörende Objekt (quasi die vorherige Zeile) ist mitsortiert !! Das Objekt muss dann nur wieder in das Stringgrid hinein. Du kapito ? :shock: Mann ist das einfach. :mrgreen: Ich muss gerade ein Stringgrid sortieren, bei dem das, was zusammengehört auf 1-5 Zeilen verteilt ist (in EINEM Stringgrid !). Da mache ich das ähnlich wegen der variablen Zeilen ist allerdings sogar TObjectList nötig. Bin schon 2 Wochen dran und immer noch nicht fertig damit. :shock:

Subsidenz 28. Mai 2008 21:52

Re: StringGrid nach Kriterien sortieren
 
Zitat:

Zitat von Hansa
Die Spalten des Stringgrids sind TStrings. Das ist nicht weit von der TStringlist weg und die hat die Methode Sort. Genau das ist der Ansatz. Pseudocode :
Delphi-Quellcode:
MyStringList.Items := MyStringGrid.Cols [x];
MyStringList.Sort
..und wieder zurück ins Stringgrid
Jetzt ist wohl das Hauptproblem, dass die Zeilen ja wohl zusammenbleiben müssen und dann nützt die sortierte Spalte alleine auch nichts ? Tja, dann wirds schon nicht mehr trivial. Viele kennen nicht mal die Objects-Eigenschaft. Mir fällt tatsächlich dafür aber nur die Objects-Eigenschaft ein. Du packst die Zellen jeder ZEILE mit AddObject in ein TObject (ähnlich wie record zu behandeln). Dieses muss an der Stringliste (AddObject von TStringList -> F1) dranpappen. Jetzt wird diese sortiert und das zu jedem Stringlist-Item gehörende Objekt (quasi die vorherige Zeile) ist mitsortiert !! Das Objekt muss dann nur wieder in das Stringgrid hinein. Du kapito ? :shock: Mann ist das einfach. :mrgreen: Ich muss gerade ein Stringgrid sortieren, bei dem das, was zusammengehört auf 1-5 Zeilen verteilt ist (in EINEM Stringgrid !). Da mache ich das ähnlich wegen der variablen Zeilen ist allerdings sogar TObjectList nötig. Bin schon 2 Wochen dran und immer noch nicht fertig damit. :shock:

Ja ich glaube das Licht in meinem Hirn wird schon heller :mrgreen: . So langsam komm ich glaub ich dahinter. Ich versuchs einfach mal nach deiner Idee. Danke erstmal bis dahin. Wenn ich die Lösung hab post ich die mal.

MFG Subsidenz

grenzgaenger 28. Mai 2008 21:54

Re: StringGrid nach Kriterien sortieren
 
guckste hier: Hier im Forum suchenstringgrid sortieren

Subsidenz 15. Jun 2008 13:50

Re: StringGrid nach Kriterien sortieren
 
So nach langem Rumprobieren und Suchen hab ich es endlich geschafft.

Delphi-Quellcode:
procedure SortStringGrid(var GenStrGrid: TStringGrid; ThatCol: Integer);
const
  TheSeparator = '@';
var
  CountItem, I, J, K, ThePosition: integer;
  MyList: TStringList;
  MyString, TempString: string;
begin
  CountItem := GenStrGrid.RowCount;
  MyList       := TStringList.Create;
  MyList.Sorted := False;
  try
    begin
      for I := 1 to (CountItem - 1) do
        MyList.Add(GenStrGrid.Rows[I].Strings[ThatCol] + TheSeparator +
        GenStrGrid.Rows[I].Text);
        Mylist.Sort;
      for K := 1 to Mylist.Count do
       begin
        MyString := MyList.Strings[(K - 1)];
        ThePosition := Pos(TheSeparator, MyString);
        TempString := '';
        TempString := Copy(MyString, (ThePosition + 1), Length(MyString));
        MyList.Strings[(K - 1)] := '';
        MyList.Strings[(K - 1)] := TempString;
       end;
      for J := 1 to (CountItem - 1) do
        GenStrGrid.Rows[J].Text := MyList.Strings[(J - 1)];
      end;
  finally
    MyList.Free;
  end;
end;

procedure TForm1.exChange(Sender: TObject);
begin
SortStringGrid(grid, ex.ItemIndex)
end;
Die Lösung ist eigentlich ganz einfach, nur muss man erst mal darauf kommen. :P

MFG Subsidenz


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 Uhr.
Seite 2 von 2     12   

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