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