AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Stringgrid sortieren

Ein Thema von bl3nder · begonnen am 28. Aug 2008 · letzter Beitrag vom 28. Aug 2008
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Stringgrid sortieren

  Alt 28. Aug 2008, 14:50
Hier liegt doch gerade der Riesenvorteil des Funktionszeigers. Definiere Dir 2 Sortierfunktionen (auf- und absteigend) und rufe die jeweils passende auf.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#12

Re: Stringgrid sortieren

  Alt 28. Aug 2008, 15:11
Irgendwie versteh ich diese Funktion ueberhaupt nicht und das mit den Zeigern hab ich auch nicht verstanden..

Hab es jetzt eine naive und unflexible Notlösung.. :

Delphi-Quellcode:
//globale variable
mode := 'asc';



// sort descending
function StringListSortCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := AnsiCompareText(List[Index2], List[Index1]); // ka was hier passiert aber anscheinend der richtige Rückgabeparameter
end;


procedure TForm1.SortStringGrid(var GenStrGrid: TStringGrid; mode: String; 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
      if (mode='asc') then
      begin
        Mylist.Sort;
        mode := 'desc';
      end
      else
      begin
        Mylist.CustomSort(StringListSortCompare);
        mode := 'asc';
      end;

      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.GridMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  i,breite,spalte:Integer;
begin
if y<=Grid.RowHeights[0] then
begin
  breite:=0;
  For i:=0 To Grid.ColCount-1 Do
  Begin
    breite:=breite+Grid.ColWidths[i];
    if breite>x Then
    Begin
      spalte:=i;
      Break;
    end;
  end;
  SortStringGrid(Grid, mode,spalte);
end;
end;

Falls das mir einer nochmal erklaeren würde wie das automaitsch richtig sortiert wär ich froh
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: Stringgrid sortieren

  Alt 28. Aug 2008, 15:18
Schau doch mal in der Hilfe nach, was AnsiCompareText macht. Um anders herum zu sortieren, musst Du doch nur das Vorzeichen umdrehen.Result := -AnsiCompareText(List[Index2], List[Index1]);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#14

Re: Stringgrid sortieren

  Alt 28. Aug 2008, 15:30
Hmm ok aber da ich ja immer nur

Mylist.CustomSort(StringListSortCompare); aufrufe muss die Fallunterscheidung ja innerhalb der Funktion "StringListSortCompare" geschehen.

Wie stellt aber diese Funktion jetzt fest, ob sie jetzt zuletzt asc oder desc sortiert hat ?

Der Debugger liefert mir ja auch keine Werte wo ich feststellen könnte was der Funktionsaufruf

Mylist.CustomSort(StringListSortCompare);

eigentlich für Parameter übergibt und was die Funktion zurückliefert..

:/ *auf der Leitung steh*
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: Stringgrid sortieren

  Alt 28. Aug 2008, 15:33
Delphi-Quellcode:
if asc then
  Mylist.CustomSort(StringListSortCompareAsc)
else
  Mylist.CustomSort(StringListSortCompareDesc);
Nun klarer?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#16

Re: Stringgrid sortieren

  Alt 28. Aug 2008, 15:34
Nur mal so am Rande bemerkt:

Es reicht völlig aus, den Sort immer nur aufsteigend erfolgen zu lassen! Je nach gewünschter Sortierichtung wird das Grid nach dem Sort mit auf-/oder absteigendem Listenindex gefüllt
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Stringgrid sortieren

  Alt 28. Aug 2008, 15:37
Das ist natürlich vollkommen richtig, aber mir geht es jetzt ums Prinzip
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#18

Re: Stringgrid sortieren

  Alt 28. Aug 2008, 15:50
Das habe ich schon vermutet,
deshalb mein zaghaftes "Nur mal so am Rande bemerkt"
Ralph
  Mit Zitat antworten Zitat
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#19

Re: Stringgrid sortieren

  Alt 28. Aug 2008, 16:02
Also habs jetzt so gelöst:

Delphi-Quellcode:
//global
NextTimeSort := 'asc';
SpalteZuletzt := 0;

// sort ascending
function StringListSortCompareAsc(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := -AnsiCompareText(List[Index2], List[Index1]);

end;


// sort descending
function StringListSortCompareDesc(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := AnsiCompareText(List[Index2], List[Index1]);

end;


procedure TForm1.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
      if (spalteZuletzt <> ThatCol) OR ((spalteZuletzt = ThatCol) AND (NextTimeSort = 'asc')) then
      begin
        Mylist.CustomSort(StringListSortCompareAsc);
        NextTimeSort := 'desc';
      end
      else if ((spalteZuletzt = ThatCol) AND (NextTimeSort = 'desc')) then
      begin
        Mylist.CustomSort(StringListSortCompareDesc);
        NextTimeSort := 'asc';
      end;



      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;

  spalteZuletzt := ThatCol;
end;


procedure TForm1.GridMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  i,breite,spalte:Integer;
begin
if y<=Grid.RowHeights[0] then
begin
  breite:=0;
  For i:=0 To Grid.ColCount-1 Do
  Begin
    breite:=breite+Grid.ColWidths[i];
    if breite>x Then
    Begin
      spalte:=i;
      Break;
    end;
  end;
  SortStringGrid(Grid, spalte);
end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: Stringgrid sortieren

  Alt 28. Aug 2008, 16:08
Jetzt hast Du mich anscheinend verstanden
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 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