Entwickler-Ecke

Sonstiges (Delphi) - Sortieralgorythmus für StringGrid???


Barret - Mi 09.02.05 11:54
Titel: Sortieralgorythmus für StringGrid???
Hi!
Ich hab einen Sortieralgor. hir im forum gefunden und auf meine Bedürfnisse angepasst.

Jetzt siht der so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TForm1.StringGridsortieren1(Feld: TStringGrid);
var
  i, j, aRow, iSortKey: integer;
  TempRows: TStrings;

begin
  TempRows := TStringList.Create;

  with Feld do
    begin
      for aRow := 2 to ZugGrid.RowCount - 1 do 
        begin
          iSortKey := StrToDate(ZugGrid.Cells[5, aRow]);
          i := aRow - 1;
          while (i > 0and (StrToInt(Cells[5, i]) > iSortKey) do 
            begin
              for j := 0 to ColCount - 1 do
                TempRows.Add(Cells[j, i + 1]);
              
              Rows[i + 1] := Rows[i];
              [i] := TempRows;
              TempRows.Clear;
              dec(i);
            end;
        end;
    end;
  TempRows.Free;
end;


Der Algor. sortiert alle Zeilen (von Row = 1) bis zum Ende nach der Spalte 5 (Col = 5) aufsteigend. Das Heist, die kleinste Zahl steht oben und die größte unten.
Ich möchte das gern genau anders herum machen, hab aber nich so sehr viel ahnung von Algorythmen und steig da noch nich richtig durch. Desweiteren soll er die Erste Spalte nicht mitsortieren. Auch hirbei seh ich nicht an welcher Stelle ich den Integer einen höher setzen soll. :(

Kann mir da jemand behilflich sein???

mfg


uall@ogc - Mi 09.02.05 12:09

StrToInt(Cells[5, i]) > iSortKey

einfach nen < aus dem > machen dann sollte es gehen

aber änder mal auf das StrToDate in StrToInt ab, das kommt mir irgendwie komisch vor ;>


Barret - Mi 09.02.05 12:14

Danke.
Mit dem StrToDate muss ich vorhin wohl vergessen haben abzuändern (frei im Forum gemacht).

Wenn mir jetzt noch einer das mit der ersten Spalte sagen könnte wär ich wunschlos glücklich.


CenBells - Mi 09.02.05 12:29

hi,

schreib halt mal überall ne 1 hin, wo jetzt ne 5 steht.

Gruß
Ken


Barret - Mi 09.02.05 12:41

Nur nachmal so wie der Code richtig sein muss ohne Fehler:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TFFVWMSimulieren.StringGridsortieren(Feld: TStringGrid);
var
  i, j, aRow, iSortKey: integer;
  TempRows: TStrings;

begin
  TempRows := TStringList.Create;

  with Feld do
    begin
      for aRow := 2 to RowCount - 1 do
        begin
          iSortKey := StrToInt(Cells[5, aRow]);
          i := aRow - 1;
          while (i > 0and (StrToInt(Cells[5, i]) < iSortKey) do
            begin
              for j := 0 to ColCount - 1 do
                TempRows.Add(Cells[j, i + 1]);

              Rows[i + 1] := Rows[i];
              Rows[i] := TempRows;
              TempRows.Clear;
              dec(i);
            end;
        end;
    end;
  TempRows.Free;
end;


Wenn ich statt der 5 eine 1 hin schreib sortiert er das Grid doch nach der ersten Spallte und genau dass soll er ja nicht machen. Das er nach Spalte 5 sortieren lassen soll ist schon richtig. Er soll die erste Spalte des Grids aber ausen vor lassen und den "nicht" mitsortieren.

Oder muss ich den Inhalt der in den jeweiligen Cells[x, y] stehen soll neu (selber) schreiben lassen


Delete - Mi 09.02.05 13:08

Dein Code sortiert doch immer eine ganze Row. Meiner Meinung nach musst du da komplett etwas ändern, wenn du eine Spalte nicht mitsortieren möchtest.
Du könntest vorher die Spalte in einer Stringliste temporär speichern und hinterher wieder einfügen..


Barret - Mi 09.02.05 13:13

@ OneOfTen: Da muss ich dir follkommen zustimmen.

Den Algo. hab ich jetzt auch verstanden. :wink: Wegen dem "aRow" geht das nich aber dem hab ich auch schon abhilfe verschaffen.