Stringgrid hat ja die Property "ExtendedSelect", die das Markieren von mehreren nicht-zusammenhängenden Zellen zur Laufzeit erlaubt. Es gibt auch eine Property "SelectRangeCount" und eine Liste von "SelectedRange", die jeweils eine Range enthält.
Jetzt würde ich für ein Programm gerne eine Funktion "Auswahl invertieren" realisieren und müsste dafürSchreibzugriff auf die oben genannten Properties erlangen - das scheint aber nicht vorgesehen zu sein. Übersehe ich da was? Gibt es Umwege?
Es grüßt aus Aachen,
thaden.
Stringgrid: Mehrere Zeilen markieren?
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Stringgrid: Mehrere Zeilen markieren?
Hallo!
Soweit ich die Internas des TStringGrid überblicke, wird das nix.
Beispiel :
Du hast 10 x10 columns/rows.
Nun machst Du einen RangeSelect auf col 2..4 und row 3..5
Wenn Du nun diese Selection invertieren möchtest, dann hast Du:
Alle selectiert minus das Zellen rect (2,3,4,5)
Im StringGrid muss aber alles selektierte immer ein Rect sein - Rect1 minus Rect2 gibt es nicht.
Bis das Grid das kann, musst Du sehr viel schnitzen.
Vorschlag zu grobem Workaround:
Du führtst die private Variable
ein.
Wenn die false ist, ist alles wie sonst.
Wenn die true ist, stellst Du erstmal alle Farben um, damit Du weisst, in welchem Zustand es ist.
Und zweitens musst Du dann alle Fragen auf
mit NOT negieren.
Keine zufriedenstellende Lösung, aber ohne heftige Gewerkel am TStringGrid fällt mir nix Besseres ein.
Winni
Soweit ich die Internas des TStringGrid überblicke, wird das nix.
Beispiel :
Du hast 10 x10 columns/rows.
Nun machst Du einen RangeSelect auf col 2..4 und row 3..5
Wenn Du nun diese Selection invertieren möchtest, dann hast Du:
Alle selectiert minus das Zellen rect (2,3,4,5)
Im StringGrid muss aber alles selektierte immer ein Rect sein - Rect1 minus Rect2 gibt es nicht.
Bis das Grid das kann, musst Du sehr viel schnitzen.
Vorschlag zu grobem Workaround:
Du führtst die private Variable
Code: Alles auswählen
GridIsInverted : boolean;
Wenn die false ist, ist alles wie sonst.
Wenn die true ist, stellst Du erstmal alle Farben um, damit Du weisst, in welchem Zustand es ist.
Und zweitens musst Du dann alle Fragen auf
Code: Alles auswählen
StringGrid.IsCellSelected[c,r]
Keine zufriedenstellende Lösung, aber ohne heftige Gewerkel am TStringGrid fällt mir nix Besseres ein.
Winni
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Stringgrid: Mehrere Zeilen markieren?
Soweit ich aus dem Quelltext schlau geworden bin, kannst du die Selektion mit "ClearSelection" löschen.
Neue (Teil-)Selektionen werden über die Methode "AddSelectedRange" zu SelectedRange[] hinzugefügt.
Die Methode wird ausschließlich in TCustomGrid.MouseDown aufgerufen.
Das Vorgehen ist wohl, dass du zuerst die "aktuelle" Selektion änderst (Property Selection) und dann "AddSelectedRange" aufrufst. Die Methode "AddSelectedRange" ist aber als protected deklariert, sodass du hier nicht um eine abgeleitete Klasse oder einen Class Helper herumkommst.
Neue (Teil-)Selektionen werden über die Methode "AddSelectedRange" zu SelectedRange[] hinzugefügt.
Die Methode wird ausschließlich in TCustomGrid.MouseDown aufgerufen.
Das Vorgehen ist wohl, dass du zuerst die "aktuelle" Selektion änderst (Property Selection) und dann "AddSelectedRange" aufrufst. Die Methode "AddSelectedRange" ist aber als protected deklariert, sodass du hier nicht um eine abgeleitete Klasse oder einen Class Helper herumkommst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Stringgrid: Mehrere Zeilen markieren?
Hi!
Ja, soweit war ich auch schon vorgedrungen,
Aber dann muss man zwischenzeitlich noch den Zustand speichern in einem dynamischen
Dann die gesamte Selection löschen.
Und dann die ganze selection wieder aufbauen.
Auf die doofe Art: Zelle für Zelle.
Oder vorher feststellen wie groß der jewilige Range ist.
Irgendwie ist das TStringGrid für diese Idee nicht vorbereitet.
Winni
Ja, soweit war ich auch schon vorgedrungen,
Aber dann muss man zwischenzeitlich noch den Zustand speichern in einem dynamischen
Code: Alles auswählen
Tmp : array[colcount -1,rowCount-1] of boolean;
Und dann die ganze selection wieder aufbauen.
Auf die doofe Art: Zelle für Zelle.
Oder vorher feststellen wie groß der jewilige Range ist.
Irgendwie ist das TStringGrid für diese Idee nicht vorbereitet.
Winni
-
- Beiträge: 16
- Registriert: Mi 15. Aug 2012, 10:14
- OS, Lazarus, FPC: Debian unstable, Lazarus 2.0.8+dfsg-1, fpc-3.0.4
- CPU-Target: AMD64
- Wohnort: Aachen
Re: Stringgrid: Mehrere Zeilen markieren?
Danke für den vielfältigen Input. Es ist immer wieder erstaunlich, wie einfach manches geht (fest eingebautes alphabetisches Sortieren im Stringgrid z.B.), aber auch wie schwierig manches scheinbar Einfache dann doch ist.
Hinzu kommt noch, dass beim Scrollen des Stringgrid mit der Tastatur die Auswahl verloren geht, dass ein erneutes Strg-Click die Auswahl nicht aufhebt ...ich werde wohl auf eine Auswahl-Spalte mit Checkboxen umsatteln. Das soll ja angeblich auch wieder einfach sein.
Hinzu kommt noch, dass beim Scrollen des Stringgrid mit der Tastatur die Auswahl verloren geht, dass ein erneutes Strg-Click die Auswahl nicht aufhebt ...ich werde wohl auf eine Auswahl-Spalte mit Checkboxen umsatteln. Das soll ja angeblich auch wieder einfach sein.