Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Checkbox Quadrat setzen (https://www.delphipraxis.net/192732-checkbox-quadrat-setzen.html)

SneakyBagels 15. Mai 2017 13:49

Checkbox Quadrat setzen
 
Ich habe eine Stelle im Code an der ich per Hand den Haken in eine Checkbox setze
Delphi-Quellcode:
var
 Item: TTVItem;
begin
 Item.hItem := Node.ItemId;
 Item.Mask := TVIF_STATE;
 Item.StateMask := TVIS_STATEIMAGEMASK;

 Item.State := $2000; // checken
 // bzw
 Item.State := $2000 shr 1; // un-checken
end;
Welcher Wert ist denn für ein Quadrat zuständig? $2000 ist ja der Tick. Aber ich finde keine Informationen wo geschrieben steht welchen Wert das Quadrat hat.

Daniel 15. Mai 2017 13:56

AW: Checkox Quadrat setzen
 
Eine klassische TCheckBox bringt alles mit, was sie braucht.
Du hingegen möchtest im Rahmen einer anderen Komponente eine Checkbox anzeigen. Mutmaßlich in einem TreeView. Beschreib doch mal im Ganzen, was Du möchtest.

//edit: Wenn es denn ein TreeView ist, könnte folgender Thread helfen:
http://stackoverflow.com/questions/3...kbox-behaviour

SneakyBagels 15. Mai 2017 14:32

AW: Checkbox Quadrat setzen
 
Danke für die Antwort. Das hilft leider nicht.
Meine CheckBoxen werden bereits alle korrekt angezeigt. Es handelt sich hierbei um eine abgeleitete Form des TShellTreeView nur mit CheckBoxen.
Durch obigen Code wird der Haken gesetzt oder entfernt. Dafür ist $2000 verantwortlich. Nur kenne ich den Wert von diesem soliden Quadrat nicht welches man anstatt eines Hakens verwenden kann.

Uwe Raabe 15. Mai 2017 15:59

AW: Checkbox Quadrat setzen
 
In den oberen 4 Bits des State-Felds wird der Index der Bitmap in der unter StateImages verlinkten ImageList angegeben. Je nachdem wie die aufgebaut ist, musst du dir den passenden Index halt aussuchen. Also probier doch mal Werte wie $1000, $2000, $3000 usw. aus.

Das entspricht übrigens direkt dem Property StateIndex eines TTreeNode.

SneakyBagels 15. Mai 2017 16:51

AW: Checkbox Quadrat setzen
 
Das mit der StateImageList war eine gute Idee funktioniert nur leider nicht.
Egal was ich an Werten teste, ich bekomme nicht da Quadrat. StateImages ist übrigens nicht gesetzt und dann ergibt $2000 den Haken.

Uwe Raabe 15. Mai 2017 20:36

AW: Checkbox Quadrat setzen
 
Zitat:

Zitat von SneakyBagels (Beitrag 1371504)
Das mit der StateImageList war eine gute Idee funktioniert nur leider nicht.
Egal was ich an Werten teste, ich bekomme nicht da Quadrat. StateImages ist übrigens nicht gesetzt und dann ergibt $2000 den Haken.

Und warum versuchst du es dann nicht mit einer Zuweisung an StateImages? Dafür ist es ja schließlich da.

SneakyBagels 15. Mai 2017 21:18

AW: Checkbox Quadrat setzen
 
Ich habe StateImages doch zum Test eine Imagelist zugewiesen ;)

Uwe Raabe 15. Mai 2017 22:03

AW: Checkbox Quadrat setzen
 
Zitat:

Zitat von SneakyBagels (Beitrag 1371530)
Ich habe StateImages doch zum Test eine Imagelist zugewiesen ;)

Und in dieser ImageList waren wie viele Images? Wurden die entsprechend angezeigt?

Bei einem simplen TreeView funktioniert das immerhin, wenn ich den Nodes bei StateImage einen Wert größer 0 zuweise.

SneakyBagels 15. Mai 2017 22:20

AW: Checkbox Quadrat setzen
 
Das war eine bereits existierende ImageList mit 20 oder mehr Icons drin.
Ich probier es später einfach nochmal.

Uwe Raabe 15. Mai 2017 22:24

AW: Checkbox Quadrat setzen
 
Es wäre auch interessant zu erfahren, wie die Ableitung von TShellTreeView erfolgt. Vielleicht kann man ja auch da ansetzen.

BrightAngel 20. Mai 2017 09:51

AW: Checkbox Quadrat setzen
 
Hey :)

Ich kenne mich zwar nicht in der Tiefe mit der Checkboximplementierung aus, aber ich weiß, dass es bei Windows ja ein sogenanntes Three-StateCheckbox Control gibt.

Zu finden, wie das mit den Stateübergängen gedacht ist findet man in diesem Eintrag über Button States. Es kann sein, dass man dazu die Controlerzeugung ersetzen/verändern müsste: Checkboxen sind ja eigentlich Buttons für Windows intern und die verschiedenen Button Styles findet man hier. Auf der verlinkten Seite ist vermutlich besonders gleich der allererste Eintrag "BS_3STATE" von Interesse. Über die Nachrichten BM_SETCHECK und BM_GETCHECK lässt sich dann der Zustand setzen und auslesen.

Wie gesagt, ich bin da leider kein Fachmann für die Delphi interne Implementierung und vermutlich habt ihr die entsprechenden Seiten auch schon gefunden. Ich wollte das nur noch kurz der Vollständigkeit halber hier noch dranhängen, auf dass es doch noch den ein oder anderen Suchenden bereichern möge :)

[Edit]
Hatte da noch irgendwas im Hinterkopf und habe hier noch die folgende Designintension gefunden:
Zitat:

Don't use the mixed state to represent a third state. The mixed state is used to indicate that an option is set for some, but not all, child objects. Users shouldn't be able to set a mixed state directly—rather the mixed state is a reflection of the child objects. The mixed state isn't used as a third state for an individual item. To represent a third state, use radio buttons or a drop-down list instead.
Das ist eigentlich recht lustig: Das Control selbst hat drei Zustände und heißt deshalb intern "3STATE"-Control, aber auf Anwenderebene dann "Mixed-State"-Control, weil es semantisch eine (gemischte) Unschärfe in das normale Checkbox-Control einführt. Es soll aber kein semantisch dritter Zustand damit ausgedrückt werden :D:D
[/Edit]

Brighty


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz