Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Alphabetisch sortieren (https://www.delphipraxis.net/86710-alphabetisch-sortieren.html)

Crazymodder 18. Feb 2007 12:09


Alphabetisch sortieren
 
Hallo ale zusammen bräuchte mal wieder ne kleine Hilfe, da ich folgendes Problem habe. Ich habe ein StringGrid und möchte, diese inhalte alpahbetisch sortieren lassen. Sortiert werden soll nur die 1.Spalte ab der zweiten Zeile. Und dann soll ebend beim sortieren die ganze zeile verschoben werden also alle werte die da drinn sind. Ich hab noch mal ne kleine Verständnis Skizze gemacht.

http://img412.imageshack.us/img412/8...benanntyh3.png

Hansa 18. Feb 2007 12:29

Re: Alphabetisch sortieren
 
Wo kommen die Daten denn her ? Wenn die Daten unsortiert sind, dann würde ich sie vor der Anzeige eben sortieren. :mrgreen: Wie ? Schreibe sie in Datenbank und fertig. Jede Zeile ist ein Datensatz und jede Spalte ein Feld. Sortieren und Anzeigen wäre dann recht einfach : SELECT * FROM TABLE ORDER BY FELD. Wäre mit TDataSet schnell gemacht.

Jens Schumann 18. Feb 2007 12:34

Re: Alphabetisch sortieren
 
Hallo,
das habe ich 1997 irgendwo in den Borland Newsgroups gefunden
Delphi-Quellcode:
Procedure SortStringgrid( Grid: TStringGrid; byColumn: LongInt;
                          ascending: Boolean );
  Procedure ExchangeGridRows( i, j: Integer );
  Var
    k: Integer;
  Begin
    With Grid Do
      For k:= 0 To ColCount-1 Do
        Cols[k].Exchange(i,j);
  End;

  procedure QuickSort(L, R: Integer);
  var
    I, J: Integer;
    P: String;
  begin
    repeat
      I := L;
      J := R;
      P := Grid.Cells[byColumn, (L + R) shr 1];
      repeat
        while CompareStr(Grid.Cells[byColumn, I], P) < 0 do Inc(I);
        while CompareStr(Grid.Cells[byColumn, J], P) > 0 do Dec(J);
        if I <= J then
        begin
          If I <> J Then
            ExchangeGridRows( I, J );
          Inc(I);
          Dec(J);
        end;
      until I > J;
      if L < J then QuickSort(L, J);
      L := I;
    until I >= R;
  end;
 Procedure InvertGrid;
   Var
     i, j: Integer;
   Begin
     i:= Grid.Fixedrows;
     j:= Grid.Rowcount-1;
     While i < j Do Begin
       ExchangeGridRows( I, J );
       Inc( i );
       Dec( j );
     End; { While }
   End;
Begin
  Screen.Cursor := crHourglass;
  Grid.Perform( WM_SETREDRAW, 0, 0 );
  try
    QuickSort( Grid.FixedRows, Grid.Rowcount-1 );
    If not ascending Then
      InvertGrid;
  finally
    Grid.Perform( WM_SETREDRAW, 1, 0 );
    Grid.Refresh;
    Screen.Cursor := crDefault;
  end;
End;

Procedure SortStringGridByFloatCol( Grid: TStringGrid; byColumn: LongInt;
                                   ascending: Boolean );
  Procedure ExchangeGridRows( i, j: Integer );
  Var
    k: Integer;
  Begin
    With Grid Do
      For k:= 0 To ColCount-1 Do
        Cols[k].Exchange(i,j);
  End;

  function DeleteChar(const aStr : String; aChar : Char) : String;
  begin
    Result:=aStr;
    While Pos(aChar,Result)>0 do
      System.Delete(Result,Pos(aChar,Result),1);
  end;

  procedure QuickSort(L, R: Integer);
  var
    I, J: Integer;
    P: String;
  begin
    repeat
      I := L;
      J := R;
      P := Grid.Cells[byColumn, (L + R) shr 1];
      repeat
        while StrToFloat(DeleteChar(Grid.Cells[byColumn, I],'.')) < StrToFloat(DeleteChar(P,'.')) do Inc(I);
        while StrToFloat(DeleteChar(Grid.Cells[byColumn, J],'.')) > StrToFloat(DeleteChar(P,'.')) do Dec(J);
        if I <= J then
        begin
          If I <> J Then
            ExchangeGridRows( I, J );
          Inc(I);
          Dec(J);
        end;
      until I > J;
      if L < J then QuickSort(L, J);
      L := I;
    until I >= R;
  end;
 Procedure InvertGrid;
   Var
     i, j: Integer;
   Begin
     i:= Grid.Fixedrows;
     j:= Grid.Rowcount-1;
     While i < j Do Begin
       ExchangeGridRows( I, J );
       Inc( i );
       Dec( j );
     End; { While }
   End;
Begin
  Screen.Cursor := crHourglass;
  Grid.Perform( WM_SETREDRAW, 0, 0 );
  try
    QuickSort( Grid.FixedRows, Grid.Rowcount-1 );
    If not ascending Then
      InvertGrid;
  finally
    Grid.Perform( WM_SETREDRAW, 1, 0 );
    Grid.Refresh;
    Screen.Cursor := crDefault;
  end;
End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 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