Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Klick auf Kopfzeile von StringGrid -> sortieren lassen (https://www.delphipraxis.net/48625-klick-auf-kopfzeile-von-stringgrid-sortieren-lassen.html)

Alex_ITA01 28. Jun 2005 07:40


Klick auf Kopfzeile von StringGrid -> sortieren lassen
 
Hallo erstmal,
ich habe ein Problem mit einem StringGrid. Ich habe da eine feste Kopfzeile (FixRow = 1) und möchte, wenn ich auf eine Spalte dieser Kopfzeile klicke so eine "Aufwärtssortierung" bzw "Abwärtssortierung" machen. Wie zum Beispiel bei Windows wenn ich nach Datum sortiere oder nach Name usw. Geht das mit einem StringGrid überhaupt?

Wäre euch sehr dankbar...
MFG Alex

Peppi999 28. Jun 2005 08:26

Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
 
hi,

ich weiß, dass man eine ListView sortieren lassen kann.
Dafür benötigt man die beiden Funktionen

OnColumnClick
OnCompare

Diese beiden Funktionen gibt es beim StringGrid nicht.
...muss ja nicht heissen dass es damit nicht geht, aber ich wüßte jetzt nicht wie...

Bei der ListView gehts wie gesagt auf jeden Fall...kannst du die nicht verwenden?

BrunoT 28. Jun 2005 08:27

Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
 
Hi Alex,

Google hilft dir:

Stringgrid sortieren

du musst nur noch ermitteln, welche Spalte im Kopf angecklickt wurde:

Delphi-Quellcode:

Var
 Spalte:Integer;

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var
  i,breite:Integer;
begin
if y<=StringGrid1.RowHeights[0] then
begin
  breite:=0;
  For i:=0 To StringGrid1.ColCount-1 Do
  Begin
    breite:=breite+StringGrid1.ColWidths[i];
    if breite>x Then
    Begin
      spalte:=i;
      Break;
    end;
  end;
   Label1.Caption:=IntToStr(Spalte);
   // Hier Soriter-algo
end;
end;
mfg

BrunoT

Alex_ITA01 28. Jun 2005 09:20

Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
 
Danke für den Link ins SwissCenter. Das hat mir super geholfen. Danke...
ListView kann ich leider nicht nehmen aber danke nochmals für die Tips.

MFG Alex

PPaB 8. Jan 2010 16:05

Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
 
Hätte nochmal zu dem sortieren eine Frage:
Bei mir passt die Tabelle nicht auf den Bildschirm und man muss scrollen, um den anderen Teil zu sehen.
Ich möchte aber trotzdem sortieren, weiß aber nicht genau, was ich tun muss, damit das Programm automatisch erkennt, wie weit die Scrollbar verschoben wurde bzw welche Zelle ausgewählt wurde. Hat da jemand eine Idee?

Klaus01 8. Jan 2010 16:35

Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
 
Hallo,

so weit ich das überschaue, wird die gesamte Spalte sortiert
und nicht nur der Teil der gerade sichtbar ist.

Grüße
Klaus

PPaB 8. Jan 2010 17:26

Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
 
Da hab ich mich falsch ausgedrückt. Ich meinte:
Meine Zeilen sind so viele, dass diese rechts aus dem Bildschirm gehen und somit durch eine Horizontale Scrollbar erst sichbar gemacht werden können. Da ja bei der obrigen Lösung das Programm nicht weiß, wie weit man jetzt gescrollt hat, sortiert es eine falsche Spalte.

Klaus01 8. Jan 2010 18:19

Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
 
Hallo,

ja da habe ich es falsch verstanden.

Mit folgendem Code habe ich in einem Projekt das StringGrid sortieren lassen.
Die Methode hat auch funktoniert wenn das StringGird horizontal gescrollt war.
Die SpaltenNummern der Spalteköpfe ändert sich ja durch das scrollen nicht.

Delphi-Quellcode:
procedure TForm1.SortStringGrid(GenStrGrid: TStringGrid; ThatCol: Array of 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[0]] + 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;
[Quelle: unbekannt]

Grüße
Klaus

Hansa 8. Jan 2010 18:34

Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
 
Überlege erst mal was überhaupt wo wie ist. :mrgreen:

Zitat:

Zitat von PPaB
Meine Zeilen sind so viele, dass diese rechts aus dem Bildschirm gehen und somit durch eine Horizontale Scrollbar..

Bei zuvielen Zeilen kommt eine vertikale Scrollbar. Wo kommt aber eine horizontale her ? Oder gehts um zu viele Spalten ? :gruebel:

Jedenfalls ist das Problem zweigeteilt :

1. Spalte ermitteln, auf die geklickt wird.
2. danach sortieren.

Müsste das mal suchen, wie ich das genau mache. Aber erst, wenn klar ist, wo überhaupt das Problem liegt.

P.S.: die schweizer Lösung hatte ich auch gesehen, die schied aber wegen zu wenig Flexibilität aus. Kernpunkt der Sache stellt eine TObjectList dar. Also bei mir.

P.S.2 : das Letzte kommt auch von den Schweizern. Das Gesagte gilt auch hierfür.

PPaB 8. Jan 2010 20:07

Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
 
Mein Problem ist beim ermitteln der Spalte.

Ok habe das falsch beschrieben.
Ich habe zu viele Spalten, so dass diese nicht ganz angezeigt werden > somit eine Horizontale Scrollbar.

Das sortieren klappt ja ohne Probleme, da man ja dort dann einfach die Zahl der Spalte angibt.
Aber bei der Lösung der Spaltenermittlung ist halt das Problem, dass man vom Bildschirm ausgeht und somit nicht beachtet, dass sich die Position der einzelnen Spalten ändern kann (durch die Scrollbar)!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:12 Uhr.
Seite 1 von 2  1 2      

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