Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#17

Re: Stringgrid inkl. Umlaute richtig sortieren

  Alt 17. Jul 2007, 16:37
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
  Mit Zitat antworten Zitat