Stringgrid: Mehrere Zeilen markieren?

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
thaden
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

Stringgrid: Mehrere Zeilen markieren?

Beitrag von thaden »

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.

Benutzeravatar
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?

Beitrag von Winni »

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

Code: Alles auswählen

GridIsInverted : boolean;
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

Code: Alles auswählen

StringGrid.IsCellSelected[c,r]
mit NOT negieren.

Keine zufriedenstellende Lösung, aber ohne heftige Gewerkel am TStringGrid fällt mir nix Besseres ein.

Winni

Socke
Lazarusforum e. V.
Beiträge: 3158
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?

Beitrag von Socke »

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.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
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?

Beitrag von Winni »

Hi!

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;
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

thaden
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?

Beitrag von thaden »

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.

Antworten