Hallo Zusammen,
es gibt zwar schon viel zu dem Thema, wie man StringGrids sortieren kann, aber ich habe nichts gefunden, was ich verwenden kann und alleine bekomme ich es einfach nicht hin. Ich habe auf dem Bereich der Sortierung nicht viel Erfahrung, was die ganze Sache nicht einfacher macht. Ich verwende TurboDelphi...
Ich habe folgendes Problem:
Ich habe ein StringGrid mit folgenden Spalten:
Datum---Kunde---Bedarf---Fertigungsauftrag---Arbeitsgang
15.08.---------------------------------------100--------------------50
15.08.---------------------------------------123--------------------60
16.08.---------xy-------100
16.08.---------zz-------200
18.08.---------------------------------------119--------------------40
18.08.---------------------------------------125--------------------20
18.08.---------------------------------------124--------------------30
19.08.---------ab-------250
19.08.---------
df-------180
und so weiter
Aktuell wird mein StringGrid nach der ersten Spalte sortiert. Ich brauche aber eine Sortierung nach mehreren Spalten, denn ich möchte, dass wenn das Datum der Fertigungsaufträge gleich ist, dass dann der Fertigungsauftrag mit der höheren Arbeitsgangnummer oben steht. Nach der Sortierung sollte die Tabelle so aussehen:
Datum---Kunde---Bedarf---Fertigungsauftrag---Arbeitsgang
15.08.---------------------------------------123--------------------60
15.08.---------------------------------------100--------------------50
16.08.---------xy-------100
16.08.---------zz-------200
18.08.---------------------------------------119--------------------40
18.08.---------------------------------------124--------------------30
18.08.---------------------------------------125--------------------20
19.08.---------ab-------250
19.08.---------
df-------180
und so weiter
ich hatte in nachstehende Code gefunden. Aber der hat zum einen das Problem, dass er Zahlen als Text verarbeitet (also 100 sieht er als kleiner als 90, wegen der 1) und zum zweiten werden die Spalten alle vom kleinsten bis zum größten sortiert. Ich brauche aber etwas, was, wie oben beschrieben, beides kann.
Delphi-Quellcode:
type
TMoveSG = class(TCustomGrid); // reveals protected MoveRow procedure
{...}
procedure SortGridByCols(Grid: TStringGrid; ColOrder: array of Integer);
var
i, j: Integer;
Sorted: Boolean;
function Sort(Row1, Row2: Integer): Integer;
var
C: Integer;
begin
C := 0;
Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1], Grid.Cols[ColOrder[C]][Row2]);
if Result = 0 then
begin
Inc(C);
while (C <= High(ColOrder)) and (Result = 0) do
begin
Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1],
Grid.Cols[ColOrder[C]][Row2]);
Inc(C);
end;
end;
end;
begin
if SizeOf(ColOrder) div SizeOf(i) <> Grid.ColCount then Exit;
for i := 0 to High(ColOrder) do
if (ColOrder[i] < 0) or (ColOrder[i] >= Grid.ColCount) then Exit;
j := 0;
Sorted := False;
repeat
Inc(j);
with Grid do
for i := 0 to RowCount - 2 do
if Sort(i, i + 1) > 0 then
begin
TMoveSG(Grid).MoveRow(i + 1, i);
Sorted := False;
end;
until Sorted or (j = 1000);
Grid.Repaint;
end;
Hat jemand eine Idee, denn ich bekomme es selber nicht hin.
Vielen Dank
Ykcim