Discussion:
TListview-Stress die zweite
(zu alt für eine Antwort)
Michael Landenberger
2019-12-20 12:55:23 UTC
Permalink
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
2019-12-23 12:42:41 UTC
Permalink
Hallo,
Post by Michael Landenberger
gegeben sei eine zur Laufzeit erzeugte TListView-Komponente, nach deren
Erstellung die Eigenschaften Checkboxes, OwnerData und OwnerDraw ebenfalls zur
Laufzeit auf True gesetzt werden.
[...]
Post by Michael Landenberger
Ä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).
Post by Michael Landenberger
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
2019-12-24 10:51:22 UTC
Permalink
Post by Achim Kalwa
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.
Post by Achim Kalwa
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$***@tota-refugium.de>. Die Lösung
funktioniert aber nur, wenn StateImages nicht nil und auch nicht leer ist.

Gruß

Michael

Loading...