expertenaustausch > comp.lang.* > comp.lang.delphi.misc

Michael Landenberger (20.12.2019, 14:55)
Hallo,

gegeben sei eine zur Laufzeit erzeugte TListView-Komponente, nach deren
Erstellung die Eigenschaften Checkboxes, OwnerData und OwnerDraw ebenfalls zur
Laufzeit auf True gesetzt werden.

Bei dieser Komponente habe ich nun folgendes, nervige Verhalten beobachtet:

Ändert man die Eigenschaft Checkboxes, wird gleichzeitig die Eigenschaft
StateImages auf nil gesetzt. Umgekehrt wird Checkboxes auf False gesetzt, wenn
man StateImages eine neue TImageList-Instanz zuweist. D. h. StateImages kann
nicht <> nil und gleichzeitig Checkboxes = True sein, jedenfalls nicht bei zur
Laufzeit erzeugten TListView-Komponenten. Man kann also entweder StateImages
mit Checkbox-Symbolen befüllen, die dann aber nutzlos sind, weil Checkboxes
dabei auf False gesetzt wird und die Symbole daher nicht angezeigt werden.
Oder man setzt Checkboxes auf True. Dann aber wird StateImages gelöscht, was
ebenfalls zur Folge hat, dass keine Checkboxen angezeigt werden. WTF?

Ich habe mir jetzt so beholfen, dass ich meiner Komponente eine Eigenschaft
StateImageList vom Typ HImageList hinzugefügt habe. Dieser kann ich mit Hilfe
der API-Funktion ListView_GetImageList (Handle,LVSIL_STATE) das Handle einer
ImageList mit Checkbox-Symbolen zuweisen, ohne dass sich dabei der Wert von
Checkboxes ändert. Im OwnerDraw-Handler des TListView zeichne ich dann die
Symbole mittels der API-Funktion ImageList_Draw () an die gewünschte Stelle.
Das ist zwar deutlich uneleganter als die ohnehin vorhandene
StateImages-Eigenschaft zu nutzen, funktioniert aber wenigstens wie gewünscht.

Gruß

Michael
Achim Kalwa (23.12.2019, 14:42)
Hallo,

Michael Landenberger schrieb:
> gegeben sei eine zur Laufzeit erzeugte TListView-Komponente, nach deren
> Erstellung die Eigenschaften Checkboxes, OwnerData und OwnerDraw ebenfalls zur
> Laufzeit auf True gesetzt werden. [...]
> Ändert man die Eigenschaft Checkboxes, wird gleichzeitig die Eigenschaft
> StateImages auf nil gesetzt. Umgekehrt wird Checkboxes auf False gesetzt, wenn
> man StateImages eine neue TImageList-Instanz zuweist. D. h. StateImages kann
> nicht <> nil und gleichzeitig Checkboxes = True sein, jedenfalls nicht bei zur
> Laufzeit erzeugten TListView-Komponenten.


Das geht auch *nicht* im FormDesigner (also zur Designtime).

> Man kann also entweder StateImages
> mit Checkbox-Symbolen befüllen, die dann aber nutzlos sind, weil Checkboxes
> dabei auf False gesetzt wird und die Symbole daher nicht angezeigt werden.
> Oder man setzt Checkboxes auf True. Dann aber wird StateImages gelöscht, was
> ebenfalls zur Folge hat, dass keine Checkboxen angezeigt werden. WTF?


Ich vermute mal ViewStyle = vsReport.
TListView zeigt entweder CheckBoxes an, oder aber StateImages. Beides
gleichzeitig ist nicht vorgesehen. Siehe Vcl.ComCtrls.pas;
procedure TCustomListView.SetCheckboxes.

Aber sobald OwnerDraw == True ist bist Du für das Zeichnen zuständig.
Egal ob CheckBoxes oder StateImages. Insofern ist Deine Behelfslösung
der korrekte Weg.

Was genau willst Du eigentlich erreichen?

Achim
Michael Landenberger (24.12.2019, 12:51)
"Achim Kalwa" schrieb am 23.12.2019 um 13:42:41:

> TListView zeigt entweder CheckBoxes an, oder aber StateImages. Beides
> gleichzeitig ist nicht vorgesehen. Siehe Vcl.ComCtrls.pas;
> procedure TCustomListView.SetCheckboxes.


StateImages enthält die Checkbox-Symbole. Mit nil-gesetzten oder leeren
StateImages sieht man keine Checkboxen. Blöd nur, dass StateImages gelöscht
wird, wenn man Checkboxes auf True setzt.

> Was genau willst Du eigentlich erreichen?


Ich will, dass Checkboxen auch in einem virtuellen Listview angezeigt werden
und funktionieren. Bei OwnerData = False (also einem nicht virtuellen
Listview) funktioniert das wie erwartet, man muss nur Checkboxes auf True
setzen. Bei OwnerData = True (also einem virtuellen Listview) funktioniert das
dagegen nicht, da werden auch bei Checkboxes = True keine Checkboxen angezeigt
(genauer: der Platz, in dem normalerweise die Checkboxen erscheinen, wird zwar
freigehalten, bleibt aber leer). Also muss man einen Workaround basteln, der
die Checkboxen auch bei virtuellen ListViews sichtbar macht. Wie ich das
gelöst habe, steht in <news:qso3ma$9o0$1>. Die Lösung
funktioniert aber nur, wenn StateImages nicht nil und auch nicht leer ist.

Gruß

Michael
Ähnliche Themen