Michael Landenberger
2019-12-20 12:55:23 UTC
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
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