Ich muss diesen - doch schön älteren Thread - mal eben wieder ausgraben.
Möchte meine StringGrid mit dieser Funktion sortieren, das klappt auch ohne Probleme bei Integer-Werten etc.. Allerdings enthalten die zu sortieren Spalten ein Datum als String im Format TT.MM.JJJJ und dies möchte ich korrekt sortieren. Leider bekomme ich nicht den richtigen Dreh, die Funktion so umzuschreiben, dass das auch wirklich funktioniert. Hat da jemand einen Denkanstoss für mich oder sowas schon gemacht und kann mir da helfen?
Delphi-Quellcode:
var col,dir: integer;
function CompareStringGridRows(item1,item2: Pointer):integer;
var c1,c2: ^char;
n1,n2: integer;
begin
c1 :=@TStrings(item1).Strings[col][1];
c2 :=@TStrings(item2).Strings[col][1];
while (c1^ <>#0) and (c2^ <>#0) do
begin
if ((c1^ in ['0'..'9']) and (c2^ in ['0'..'9'])) then
begin
n1 :=0;
n2 :=0;
while (c1^ in ['0'..'9']) do
begin
n1 :=n1*10+ord(c1^)-ord('0');
inc(c1);
end;
while (c2^ in ['0'..'9']) do
begin
n2 :=n2*10+ord(c2^)-ord('0');
inc(c2);
end;
if n1 > n2 then
begin
result :=dir;
exit
end
else if n1 < n2 then
begin
result :=dir*-1;
exit;
end;
end
else //at least one is not a number
begin
if c1^ > c2^ then
begin
result :=dir;
exit;
end
else if c1^ < c2^ then
begin
result :=dir*-1;
exit;
end;
inc(c1);
inc(c2);
end;
end;
if c1^ =#0 then
begin
if c2^ =#0 then result :=0
else result :=dir*-1;
end
else result :=dir;
end;
procedure SortStringGrid(thegrid: TStringGrid; const col: integer);
var rows: TList;
i,j: integer;
tmp: TStrings;
begin
rows :=TList.Create;
rows.Capacity :=thegrid.RowCount-thegrid.fixedrows;
for i:=theGrid.fixedrows to thegrid.RowCount -1 do
begin
tmp :=TStringList.Create;
for j:=0 to thegrid.ColCount-1 do
tmp.AddObject(thegrid.cells[j,i],thegrid.Objects[j,i]);
//tmp.AddStrings(thegrid.Rows[i]);
thegrid.Rows[i].Clear;
rows.Add(tmp);
end;
rows.Sort(CompareStringGridRows);
for i:=thegrid.fixedrows to thegrid.RowCount -1 do
begin
//thegrid.Rows[i].Assign(rows[i-thegrid.fixedrows]);
for j:=0 to thegrid.ColCount-1 do
begin
thegrid.Cells[j,i]:=TStringlist(rows[i-thegrid.fixedrows]).Strings[j];
thegrid.Objects[j,i]:=TStringlist(rows[i-thegrid.fixedrows]).Objects[j];
end;
TStringlist(rows[i-thegrid.fixedrows]).free;
end;
rows.Free;
end;
Gruß, NetSonic