![]() |
Stringgrid inkl. Umlaute richtig sortieren
Hallo...
wie kann ich ein Stringgrid alphabetisch sortieren, so dass auch die Umlaute ordnungsgemäß sortiert werden? Grüße Steven |
Re: Stringgrid inkl. Umlaute richtig sortieren
Zitat:
|
Re: Stringgrid inkl. Umlaute richtig sortieren
So dachte ich mir das...
Umlaut: Ä bei AE einsortieren Ü bei UE einsortieren Ö bei OE einsortieren Beste Grüße Steven |
Re: Stringgrid inkl. Umlaute richtig sortieren
Moin Steven,
ohne Berücksichtigung der Gross-/Kleinschreibung kommt hier ![]() Da ich mal davon ausgehe, dass das StringGrid mehrere Spalten umfasst, müsstest Du allerdings die Sortierroutine selber schreiben, damit alle Zeilen erhalten bleiben. Bei einem ListView wäre das etwas einfacher. |
Re: Stringgrid inkl. Umlaute richtig sortieren
Zitat:
soweit ich weiss, ist sowas nur in Datenbanksoftware standardmässig verfügbar. Um selbst nach DIN zu sortieren, musst du Kopien der Strings anlegen, weil du vor dem Vergleich ä durch ae ... ß durch ss usw. ersetzen musst und der Ausgangsstring dabei theoretisch doppelt so lang werden kann. Darüber hinaus sind in der DIN glaube ich noch ein paar Feinheiten definiert wie die genaue Sortierreihenfolge von AE,Ae,aE,ae, aber man kann es ja auch übertreiben. In der EDV ist es üblich, Gross/Klein überhaupt nicht zu beachten. Gruss Reinhard |
Re: Stringgrid inkl. Umlaute richtig sortieren
Irgendwie müsste es sowas wie hier sein, arbeite auch mit den TMS Kompos TadvStringgrid:
Natürlich muss der Code anders aussehen, evt. wäre das aber eine Möglichkeit. Hab selber keinen Plan, ist nur mal so geraten.
Delphi-Quellcode:
Hätte ich doch besser eine Listview nehmen sollen, mißt nun ist das Programm fertig.
procedure TForm1.AdvStringGrid1CustomCompare(Sender: TObject; str1,
str2: String; var res: Integer); var i1,i2,code:integer; begin if (pos('Kb',str1)>0) then begin Delete(str1,Pos('Kb',str1),2); Val(str1,i1,code); i1 := i1 * 1024; end else Val(str1,i1,code); if (pos('Kb',str2)>0) then begin Delete(str2,Pos('Kb',str2),2); Val(str2,i2,code); i2:=i2*1024; end else Val(str2,i2,code); if i1 = i2 then res := 0 else begin if i1 > i2 then res := 1 else res := -1; end; end; ^^ |
Re: Stringgrid inkl. Umlaute richtig sortieren
Moin Steven,
ich kenne TadvStringgrid nicht, aber so wie die Sort-Routine aussieht dürfte sich das recht leicht einbauen lassen. So müsste das genügen:
Delphi-Quellcode:
Ich weiss jetzt nicht, ob AnsiCompareText evtl. garantiert auch -1,0 und 1 zurückgibt.
procedure TForm1.AdvStringGrid1CustomCompare(Sender: TObject; str1,
str2: String; var res: Integer); begin res := AnsiCompareText(str1,str2); if res < 0 then begin res := -1; end else begin if res > 0 then begin res := 1; end; end; end; Für den Fall könnte man dann auch die ganze if/then/else-Konstruktion auch weglassen. |
Re: Stringgrid inkl. Umlaute richtig sortieren
Guten Morgen Steven.
Das Ereignis OnCustomCompare() wird nicht unbedingt benötigt. Wenn du beim Ereignis OnGetFormat() die richtigen Angaben zu den einzelnen Spalten machst, dann sortiert das AdvStringGrid wie von selbst. Ich gehe von nicht-virtualisierten Zellinhalten aus:
Delphi-Quellcode:
Getippt und nicht getestet.
const // edit
SIZE_SUFFIX = ' Kb'; // Anpassen! SIZE_COLINDEX = 3; // Anpassen! procedure TDemoForm.AdvStringGridGetFormat(Sender: TObject; ACol: Integer; var AStyle: TSortStyle; var aPrefix, aSuffix: String); begin with Sender as TAdvStringGrid do case ACol of // edit SIZE_COLINDEX: // edit begin AStyle := ssNumeric; aSuffix := SIZE_SUFFIX; end; else AStyle := ssAnsiAlphaNoCase; // edit end; end; procedure TDemoForm.ButtonClick(Sender: TObject); begin with AdvStringGrid do SortByColumn(SIZE_COLINDEX); end; EDIT: (1) resourcestring durch const ersetzt: wegen SIZE_COLINDEX (2) case selector vereinfacht (3) erstes case label korrigiert: Konstante statt Literal (4) sort mode umgestellt: ssAlphabetic kennt keine lokalisierten strings Grüße vom marabu |
Re: Stringgrid inkl. Umlaute richtig sortieren
Dankeschön für eure Hilfe.
Gilt das dann für alle Spalten?
Delphi-Quellcode:
...oder muss ich
procedure TDemoForm.AdvStringGridGetFormat(Sender: TObject; ACol: Integer;
var AStyle: TSortStyle; var aPrefix, aSuffix: String); begin with Sender as TAdvStringGrid do case ACol - FixedCols of 1: begin AStyle := ssNumeric; aSuffix := SIZE_SUFFIX; end; else AStyle := ssAlphabetic; end; end;
Delphi-Quellcode:
für jede Spalte extra anlegen?
with AdvStringGrid do
SortByColumn(SIZE_COLINDEX); |
Re: Stringgrid inkl. Umlaute richtig sortieren
Hallo Steven,
jetzt habe ich meinen Code-Vorschlag mal getestet. Achte bitte auf meine Änderungen im Beitrag #8. Beim Ereignis OnGetFormat() habe ich nur für eine Spalte spezielle Vorkehrungen getroffen. Wenn du mehrere solche Spalten hast, dann musst du weitere case label einfügen. Die Sortierung habe ich der Einfachheit halber nur für eine Spalte und per Button gezeigt. Du wirst in deinem Code sicher auf das Klicken auf einen Spaltenkopf reagieren um die Sortierung zu wechseln. Oder du hast sogar mehr als eine Spalte als Sortierkriterium. Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 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 by Thomas Breitkreuz