Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sortierung sortiert nicht richtig?! (https://www.delphipraxis.net/12664-sortierung-sortiert-nicht-richtig.html)

Delphi-Coder 2. Dez 2003 08:25


Sortierung sortiert nicht richtig?!
 
Hallo DP'ler,

ich hab mir vom swissdelphicenter einen Algorithmus zum Sortieren eines StringGrids nach Spalten geholt! Hier ist der Link!
Das funktioniert auch ganz gut. Er soll ein StringGrid nach einer Spalte sortieren, in der verschiedene Zahlen stehen (1-stellig bis 4-stellig). Komischerweise setzt er die 2-stelligen Zahlen an das Ende (also hinter die 4-stellugen) des StringGirds!

Woran könnte das liegen? bzw. Wie kann ich das ändern?

Vielen Dank im voraus!

MfG
Delphi-Coder

P.S.: ich hab doch nochmal den Code eingefügt!

Delphi-Quellcode:
procedure SortStringGrid(var GenStrGrid: TStringGrid; ThatCol: Integer);
const
  // Define the Separator
  TheSeparator = '@';
var
  CountItem, I, J, K, ThePosition: integer;
  MyList: TStringList;
  MyString, TempString: string;
begin
  // Give the number of rows in the StringGrid
  CountItem := GenStrGrid.RowCount;
  //Create the List
  MyList       := TStringList.Create;
  MyList.Sorted := False;
  try
    begin
      for I := 1 to (CountItem - 1) do
        MyList.Add(GenStrGrid.Rows[I].Strings[ThatCol] + TheSeparator + 
          GenStrGrid.Rows[I].Text);
      //Sort the List
      Mylist.Sort;

      for K := 1 to Mylist.Count do
      begin
        //Take the String of the line (K – 1)
        MyString := MyList.Strings[(K - 1)];
        //Find the position of the Separator in the String
        ThePosition := Pos(TheSeparator, MyString);
        TempString := '';
        {Eliminate the Text of the column on which we have sorted the StringGrid} 
        TempString := Copy(MyString, (ThePosition + 1), Length(MyString));
        MyList.Strings[(K - 1)] := '';
        MyList.Strings[(K - 1)] := TempString;
      end;

      // Refill the StringGrid
      for J := 1 to (CountItem - 1) do
        GenStrGrid.Rows[J].Text := MyList.Strings[(J - 1)];
    end;
  finally
    //Free the List
    MyList.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Sort the StringGrid1 on the second Column
  // StringGrid1 nach der 1. Spalte sortieren
  SortStringGrid(StringGrid1, 1);
end;

Tom 2. Dez 2003 08:36

Re: Sortierung sortiert nicht richtig?!
 
Zitat:

Zitat von Delphi-Coder
Er soll ein StringGrid nach einer Spalte sortieren, in der verschiedene Zahlen stehen (1-stellig bis 4-stellig).

Zahlen? Ein StringGrid kann nur Strings aufnehmen.

Zitat:

Komischerweise setzt er die 2-stelligen Zahlen an das Ende (also hinter die 4-stellugen) des StringGirds!
Wieso komisch?
Code:
1234
45
ist korrekt "alphabetisch" sortiert. Für Zahlen must Du wohl die Funktion umschreiben ...

Delphi-Coder 2. Dez 2003 08:54

Re: Sortierung sortiert nicht richtig?!
 
Die Zahlen stehen natürlich schon als Strings in diesem StringGrid! Und das er eigentlich korrekt sortiert ist mir auch klar, aber wie kann ich die Funktion umschreiben, so das er numerisch sortiert?

Luckie 2. Dez 2003 09:03

Re: Sortierung sortiert nicht richtig?!
 
Wandel die Zeichenketten in Zahlen um und sortier die Zahlen. :wink:

Tom 2. Dez 2003 09:06

Re: Sortierung sortiert nicht richtig?!
 
Zitat:

Zitat von Delphi-Coder
Die Zahlen stehen natürlich schon als Strings in diesem StringGrid!

Ist schon klar. Anders geht es ja auch nicht. Ich wollte Dir nur erklären, dass die Funktion wohl schon richtig sortiert.

Zitat:

Und das er eigentlich korrekt sortiert ist mir auch klar, aber wie kann ich die Funktion umschreiben, so das er numerisch sortiert?
Packe führende Nullen für die Sotierung an die einzelnen Zahlen.
Code:
0045
1234
wäre das Ergebnis.

Ach ja: Nur für die Sortierung, nicht in der Anzeige ...

himitsu 2. Dez 2003 09:16

Re: Sortierung sortiert nicht richtig?!
 
Ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif,

nach Zahlen sortieren => vorm/beim sortieren die Strings z.B. in Integer umwandeln.

Delphi-Quellcode:
Procedure SortStringGrid(SG: TStringGrid; SortCol: Byte; inclFixedCol: Boolean = True);
  Var FC, I, I2, I3, Z, Z2, C, C2: Integer;
    S: String;

  Begin
    If (SortCol >= SG.ColCount) or (inclFixedCol and (SortCol < SG.FixedCols)) Then Exit;
    If inclFixedCol Then FC := 0 Else FC := SG.FixedCols;
    For I := SG.FixedRows to SG.RowCount - 2 do
      For I2 := I + 1 to SG.RowCount - 1 do Begin
        Val(SG.Cells[SortCol, I], Z, C);
        Val(SG.Cells[SortCol, I2], Z2, C2);
        If ((C or C2 = 0) and (Z > Z2)) or
          ((C or C2 <> 0) and (SG.Cells[SortCol, I] > SG.Cells[SortCol, I2])) Then
          For I3 := FC to SG.ColCount - 1 do Begin
            S := SG.Cells[I3, I];
            SG.Cells[I3, I] := SG.Cells[I3, I2];
            SG.Cells[I3, I2] := S;
          End;
      End;
  End;
Delphi-Quellcode:
{inclusive der fixierten Spalten sortieren}
SortStringGrid(StringGrid1, Spalte);
SortStringGrid(StringGrid1, Spalte, True);

{fixierte Spalten nicht mit sortieren}
SortStringGrid(StringGrid1, Spalte, False);
wenn die Sortierreinfolge geändert werden soll - einfache die Vergleichsoperatoren austauschen (">", "<"):
Code:
[b]If[/b] ((C [b]or[/b] C2 = 0) [b]and[/b] (Z [color=red][b]>[/b][/color] Z2)) [b]or[/b]
  ((C [b]or[/b] C2 <> 0) [b]and[/b] (SG.Cells[SortCol, I] [color=red][b]>[/b][/color] SG.Cells...
[ADD]
Ach ja, diese Prozedur sortiert nicht die Überschrift (fixierte Zeilen) des StringGrids und wenn erwünscht auch nicht die fixierten Spalten.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Luckie 2. Dez 2003 09:20

Re: Sortierung sortiert nicht richtig?!
 
Zitat:

Zitat von Tom
Packe führende Nullen für die Sotierung an die einzelnen Zahlen.
Code:
0045
1234
wäre das Ergebnis.

Zeichenketten-Operationen sind mit das inperformanteste was es gibt in der Programmierung. :roll: Sprich, das dürfte wohl die schlechteste Lösung sein. :wink:

himitsu 2. Dez 2003 09:24

Re: Sortierung sortiert nicht richtig?!
 
[OT]
Ach Luckie, ich hab gelernt und meinen Code mal mit Val etwas optimiert. :mrgreen:

Ich weiß nicht ob es CodeLib-tauglich ist, daher habe ich auch noch schnell den deutsch/englisch-mischmasch entfernt. :wink:
[/OT]

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Delphi-Coder 2. Dez 2003 09:37

Re: Sortierung sortiert nicht richtig?!
 
Vielen Dank für eure Hilfe! Und sorry, wenn die Frage fast schon lächerlich war! Ich hab nur gerade keine Zeit um "das Rad neu zu erfinden" und dachte mir, dass schonmal jemand solch eine Prozedur geschrieben hat! :thuimb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz