Delphi-PRAXiS
Seite 2 von 4     12 34      

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 inkl. Umlaute richtig sortieren (https://www.delphipraxis.net/95852-stringgrid-inkl-umlaute-richtig-sortieren.html)

Steven2 16. Jul 2007 13:38

Re: Stringgrid inkl. Umlaute richtig sortieren
 
Hallo marabu,
kann ich mehrere Umlaute so einfügen?

const
SIZE_SUFFIX = 'Ä,Ü,Ö';
SIZE_COLINDEX = 3;

Freundliche Grüße
Steven

Steven2 16. Jul 2007 14:02

Re: Stringgrid inkl. Umlaute richtig sortieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo marabu,
magst du dir mal bitte mein Beispiel ansehen.
Irgendwie krieg ich das nicht hin

Es gibt auch noch, evtl. ist das auch was?
Delphi-Quellcode:
aStyle:=ssAnsiAlphaNoCase;
Grüße Steven

marabu 16. Jul 2007 15:14

Re: Stringgrid inkl. Umlaute richtig sortieren
 
Hallo Steven,

ich habe mir dein Projekt angeschaut.

Mein Code-Beispiel war in erster Linie als Reaktion auf die Beiträge #6 und #7 entstanden. Du hattest dort eine Spalte mit Größenangaben und nachfolgendem ' Kb' eingeführt. Jetzt habe ich deinen ganzen Thread gelesen und erkenne ein ganz anderes Problem. Du möchtest nicht die Standardordnung (Ä nach A) für deine Strings, sondern die Telefonbuch-Ordnung (Ä wie AE). Windows unterstützt diese Ordnung grundsätzlich über den Sort Identifier SORT_GERMAN_PHONE_BOOK, den du über SetThreadLocale() für dein Programm wählen kannst.

Ich habe das soeben einmal ausprobiert. Da das Ergebnis nicht beeinflusst wird, vermute ich, dass die Compare-Funktionen in AdvStringGrid diese Einstellung ignorieren. Hier wäre sicher eine Anfrage an den Support von TMS angebracht.

EDIT: Getestet habe ich mit deinem Projekt.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  locale: LCID;
begin
  locale := GetThreadLocale;
  SetThreadLocale(locale or SORT_GERMAN_PHONE_BOOK shl 16);
  with AdvStringGrid1 do
    SortByColumn(2);
  SetThreadLocale(locale);
end;
Freundliche Grüße

Steven2 16. Jul 2007 16:47

Re: Stringgrid inkl. Umlaute richtig sortieren
 
Vielen Dank für deine SUPERHILFE.
Habe TMS schon damals mal angemailt, das ist die Antwort:
Zitat:

It is the Windows locale that determines the sort order of characters with accent, umlaut, etc..
We cannot change this rule.
See:
http://msdn2.microsoft.com/en-us/library/ms647476.aspx
for the compare method that is used in TAdvStringGrid.

If you want to use a different compare routine, you can do this by setting
sort style to ssCustom and providing it via OnCustomCompare.
verstanden habe ich es ehrlich gesagt nicht.

Ich schick denen jetzt mal deinen Beispielcode.
Grüße
Steven

marabu 16. Jul 2007 17:28

Re: Stringgrid inkl. Umlaute richtig sortieren
 
Hallo Steven,

wenn du meinen Code an TMS schickst, dann sollte TMS erkennen, dass sich die Flexibilität ihrer Komponente erhöht, wenn beim internen Aufruf von CompareString() GetThreadLocale() statt GetSystemDefaultLCID() verwendet wird. Nur so können alternative Sort Modi aktiviert werden ohne andere Anwendungen zu beeinflussen. Alle NT-basierten Windows-Versionen würden davon profitieren.

Freundliche Grüße

Steven2 17. Jul 2007 08:12

Re: Stringgrid inkl. Umlaute richtig sortieren
 
Hallo marabu...

Zitat:

If you want to use a different compare routine, you can do this by setting
sort style to ssCustom and providing it via OnCustomCompare.
das war die Antwort von TMS.

Freundliche Grüße
Steven

marabu 17. Jul 2007 16:37

Re: Stringgrid inkl. Umlaute richtig sortieren
 
Hallo Steven,

ich habe meinen Code aus deinem Test-Projekt jetzt so angepasst, dass abgesehen von der vierten Spalte (3 wegen nullbasiertem Index) mit den Kilobyte-Angaben alle anderen Spalten nach Art der deutschen Telefonbücher sortiert werden. Diese Anpassungen wären überflüssig, wenn TMS mit der ThreadLocale arbeiten würde.

Delphi-Quellcode:
const // edit
  SIZE_SUFFIX = ' Kb'; // so werden Angaben wie '123 Kb' numerisch korrrekt sortiert
  SIZE_COLINDEX = 3;   // nur in der vierten Spalte, der Rest sind Strings

procedure TForm1.Button1Click(Sender: TObject);
begin
  AdvStringGrid1.LoadFromCSV(ExtractFilePath(Application.ExeName)+'test.CSV');
end;

procedure TForm1.AdvStringGrid1GetFormat(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 := ssCustom; // edit
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with AdvStringGrid1 do
    SortByColumn(2);
end;

// Event Handler für OnCustomCompare() im OI erzeugen:
procedure TForm1.AdvStringGrid1CustomCompare(Sender: TObject; str1,
  str2: String; var Res: Integer);
begin
  // die Locale solltest du in deinem Programm an zentraler Stelle
  // gleich zu Beginn zwischenspeichern, damit der ständige Aufruf
  // von GetThreadLocale hier unterbleiben kann.
  Res := CompareString(GetThreadLocale or SORT_GERMAN_PHONE_BOOK shl 16,
      NORM_IGNORECASE, PChar(str1), Length(str1), Pchar(str2), Length(str2)) - 2;
end;
Freundliche Grüße

Steven2 17. Jul 2007 20:57

Re: Stringgrid inkl. Umlaute richtig sortieren
 
Hallo marabu,
es funktioniert...du hast mir sehr damit geholfen.
Danke!

Freundliche Grüße
Steven

Steven2 21. Jul 2007 17:53

Re: Stringgrid inkl. Umlaute richtig sortieren
 
Hallo..
zwei Fragen habe ich nun doch noch dazu.

Wie kann ich mehrere Umlaute überprüfen?
So kann ich nur einen Umlaut angeben.
Delphi-Quellcode:
  SIZE_SUFFIX = 'Ä'
Wie kann ich in allen Spalten des Stringgrids
So kann ich nur in einer bestimmten Spalte sortieren.
Delphi-Quellcode:
  SIZE_COLINDEX = 3;
Ich hoffe die Fragen gehören noch zu diesem Thread.

Freundliche Grüße
Steven

marabu 21. Jul 2007 19:58

Re: Stringgrid inkl. Umlaute richtig sortieren
 
Hallo Steven,

leider verstehe ich nicht was du vorhast. Kannst du das etwas ausführlicher erklären - eventuell mit Beispieldaten?

Freundliche Grüße


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

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