hatte das gleiche Problem für eine "FileMerge"-Programm, da der Open-Dialog bzw. DragNDrop die zuletzt ausgewählte Datei immer als erste übermittelt statt die Sortierung zu behalten.
Wie auch immer - ich habe
- die Schleife in der Sort-Routine entfernt (da man das 1-zeilig machen kann),
- die Sort-Spalte als Integer-Übergabe geändert (warum war das ein Array ?!)
- den Separator auf beliebige Länge erweitert (@ könnte ja auch im Text vorkommen)
- das ganze um einen Wechsel "aufsteigend" / "absteigend" erweitert
Code:
{--------------------------------------------------------------------------}
procedure SortStringGrid(GenStrGrid: TStringGrid; ThatCol: Integer);
{--------------------------------------------------------------------------}
const
TheSeparator = '@#@#@';
var
I,X: integer;
MyList: TStringList;
begin
MyList := TStringList.Create;
MyList.Sorted := false;
for I := 1 to (GenStrGrid.RowCount - 1) do MyList.Add(GenStrGrid.Rows[I].Strings[ThatCol] + TheSeparator + GenStrGrid.Rows[I].Text);
Mylist.Sort;
X := MyList.Count;
if GenStrGrid.Tag <> ThatCol
then begin {ascending}
for I := 1 to X do GenStrGrid.Rows[I].Text := RightStr(MyList.Strings[(I-1)], Length(MyList.Strings[(I-1)]) - Pos(TheSeparator, MyList.Strings[(I-1)]) - Length(TheSeparator) + 1);
GenStrGrid.Tag := ThatCol; {COL merken}
end
else begin {descending}
for I := 1 to X do GenStrGrid.Rows[I].Text := RightStr(MyList.Strings[(X-I)], Length(MyList.Strings[(X-I)]) - Pos(TheSeparator, MyList.Strings[(X-I)]) - Length(TheSeparator) + 1);
GenStrGrid.Tag := MaxInt; {COL merken}
end;
MyList.Free;
end;