![]() |
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 |
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? |
Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
Hi Alex,
Google hilft dir: ![]() du musst nur noch ermitteln, welche Spalte im Kopf angecklickt wurde:
Delphi-Quellcode:
mfgVar 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; BrunoT |
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 |
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? |
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 |
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. |
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:
[Quelle: unbekannt]
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; Grüße Klaus |
Re: Klick auf Kopfzeile von StringGrid -> sortieren lasse
Überlege erst mal was überhaupt wo wie ist. :mrgreen:
Zitat:
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. |
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 19:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz