Einzelnen Beitrag anzeigen

Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#1

StringGrid nach Spalten aufsteigend und absteigend sortieren

  Alt 9. Aug 2011, 11:35
Delphi-Version: 5
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
Patrick

Geändert von Ykcim ( 9. Aug 2011 um 12:13 Uhr)
  Mit Zitat antworten Zitat