Intermediate State für TreeView

  • VB.NET

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von Kababär.

    Kababär schrieb:

    Zwar stimmt auch da schon der SII, allerdings will er ihn nicht setzen.
    jetzt hab ich auch rumprobiert, und man kann den StateImageIndex durchaus setzen, aber das hat keine Auswirkung auf die Anzeige.
    Scheint ein weiterer Bug im Treeview zu sein.

    Wieso das nicht gefixt wird? Weil MS will Wpf verkaufen - an WinForms machen die nix mehr :thumbdown:
    Genau, gesetzt wird es, sorry. Mein Fehler. Nur anzeigt wird das Icon nicht. Wieso auch immer.. aber es muss eine Lösung geben, denn es gibt ja viele Code Samples, die das auch schon umgesetzt haben. Vielleicht gucke ich mir da noch mal den ein oder anderen Code an.

    WPF? Dieses Kürzel kenne ich nur beiläufig aus VS12.. noch nie damit hantiert und weiß nicht mal was das ist. WinForms finde ich eigentlich ganz praktisch und einfach, mir fällt jedenfalls kein Grund ein, dieses Feature einzustellen.
    Ich habe gerade ein Code-Sample gefunden, der das wohl auch macht. Da steht was mit SendMessage(Me.Handle, ..., ....). Da übergibt er noch zwei Integerwerte, die für die ImageList gedacht sind.
    Über diesen Hack will ich es auch mal gerne probieren, wenn du mir da etwas unter die Arme greifen könntest.
    Denke ja nicht, dass ich dazu was finden werde im Netz..

    Meine andere Idee ist dagegen schwachsinnig, was sie ohnehin ist. Aber ich wollte den Bug ausnutzen, von dem ich dir erzählt hab. Also habe ich eine Methode geschrieben, die einen Doppelklick simuliert. Einziges Problem: ich kann nicht rausfinden, ob der User auf die Checkbox geklickt hat, da man die nicht einzeln ansprechen kann.
    für den bug mit dem doppelklick gibts das:

    VB.NET-Quellcode

    1. Class MyTreeView
    2. Inherits TreeView
    3. <DebuggerHidden()>
    4. Protected Overrides Sub WndProc(ByRef m As Message)
    5. ' Filter WM_LBUTTONDBLCLK
    6. If m.Msg <> &H203 Then
    7. MyBase.WndProc(m)
    8. End If
    9. End Sub
    10. End Class

    Bei mir ist momentan noch alles in einer Klasse.. ich hab einfach alles in die Form1-Klasse geschmissen.. aber das dürfte ja nicht das Problem sein.
    Wenn ich ein Projekt habe, kann ich eine Form anlegen, die ein Treeview beinhaltet und eine zweite Klasse und eine zweite Klasse, die die Logik und Ändern der Images handelt?
    Und das funktioniert, wenn ich einfach Inherit Treeview nach der Klassendefinition schreibe?
    Jetzt weiß ich auch, warum Mybase nicht funktioniert, sondern warum ich Me nehmen muss.. :D MyBase.WndProc() funktioniert allerdings..

    Gestern Nacht bin ich nochmal mit dem Debugger durch und es scheint, als ob die Konstante

    Quellcode

    1. Const WM_Paint As Integer = 15


    Nie erreicht wird. Werte, die ich wahrgenommen habe: 26, 121, 131 und dann sprint er raus aus WndProc, wobei er nochmal Mybase.WndProc(m) aufruft, aber er springt dann direkt zu End Sub.

    Ich war gestern Nacht nochmal so frei und habe deinen Code der Klasse

    Quellcode

    1. Public Class ThreeStateTreeview

    in meinen Code geschmissen. Vielleicht habe ich da etwas falsch verknüpft oder so..
    WM_Paint wird erreicht. Zumindest in mein 3STV
    Ansonsten wirfst du grad alles durcheinander, und wirst dich noch wundern, was die Schlüsselworte Inherits, Mybase etc. noch alles bewirken, warum Mybase.WndProc() mal geht und mal nicht, ob und unter welchen Umständen eine zweite Klasse die Logik managen kann, usw.

    Wie gesagt: Es ist nicht trivial, und deinen Äußerungen entnehme ich, dass dir die OOP-Grundlagen fehlen.
    dieses Buch lesen (hingegen das Galileio-Openbook ist Mist)
    Das Buch werde ich mir mal zu Herzen nehmen, danke. Ich kenne zwar die Worte Inherits, Mybase, Me, etc
    Aber die genaue Funktion weiß ich nicht mehr. Hab im Sommer letzten Jahres das Galileo-Openbook gelesen..

    Sobald ich fertig bin mit dem Treeview, werde ich mich da mal durchlesen.

    Kababär schrieb:

    Sobald ich fertig bin mit dem Treeview, werde ich mich da mal durchlesen.
    Das ist genau die falsche Reihenfolge!

    Erstmal dauert das mit deim Treeview dadurch 3mal so lange als es bräuchte, wenn du die Grundlagen hättest, und dann ist das Ergebnis mit Sicherheit ein Code-Horror. Sodass - wenn du Ansprüche an dein Proggen hast - du es eh nochmal neu und richtig coden wirst.

    Was ich dir übrigens auch empfehle, mal anzugugge: Visual-Studio richtig nutzen - ist bestimmt iwas dabei, was du noch nicht kanntest.
    Achte besonders, wie zB das Schlüsselwort Select Case recherchiert ist - gleichartig kannst du ebenfalls (zwar unsystematisch, aber dafür kontext-nah) die Syntax und Logik von vb.net recherchieren.
    Das Treeview hat derzeit aber die höchste Priorität und muss fertig werden.
    Die Zeit um nochmal alles durchzulesen, habe ich nicht. Aber danach werde ich mir das nochmal durchlesen.

    Im Vordergrund steht erstmal, dass es funktioniert, später kann ich es immer noch designtechnisch anpassen bzw. neu schreiben, was ein Klacks wird, wenn ich erstmal hinbekommen habe.

    edit: Irre ich mich oder kommst du aus Süd-West-Deutschland? :D Hab mir mal dein Video angeguckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kababär“ ()

    ErfinderDesRades schrieb:

    ich finde dadurch keine Veränderung des Bugs - hast du das ausprobiert?
    Ups!
    Jetzt nochmal probiert, und es entfernt den Bug doch! :thumbsup:
    Keine Ahnung, was ich zuvor probiert hab.

    Zwar ist vmtl. nun die Doppelclick-Funktionalität beim Deibel, aber die ist eh nicht ganz einfach.
    ah- ausserdem kriegt mans mit einem Hittest vlt. doch noch komplett hin, sodass der Bug ganzngar gefixt ist :)

    Tatsache - sieht aus wie voller Erfolg:

    VB.NET-Quellcode

    1. Protected Overrides Sub WndProc(ByRef m As Message)
    2. Const WM_Paint As Integer = 15
    3. Const WM_LBUTTONDBLCLK As Integer = &H203
    4. If m.Msg = WM_LBUTTONDBLCLK Then
    5. Dim pt As Point = Me.PointToClient(Control.MousePosition)
    6. If Me.HitTest(pt).Location = TreeViewHitTestLocations.StateImage Then Return
    7. End If
    8. MyBase.WndProc(m)
    9. If m.Msg = WM_Paint Then
    10. ' at that point the built-in drawing is completed - and I quickly paint over the indeterminated Checkboxes
    11. For Each nd As TreeNode In _indeterminateds
    12. _graphics.DrawImage(_imgIndeterminate, GetCheckRect(nd).Location)
    13. Next
    14. _indeterminateds.Clear()
    15. End If
    16. End Sub
    Also die Zeilen 4-7 fixen den Doppelklick-Bug, der ja nur auftritt, wenn man auf die Checkbox doppelklickst

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Super! :)

    Allerdings bin ich noch damit beschäftigt, deinen Treeview in ein Projekt zu importieren. Zwar kann ich hingehen, dein Projekt laden, ausführen, das neue Treeview aus der Toolbox benutzen, aber nur in diesem Projekt. In ein anderes Projekt bekomme ich es nicht rein.
    Hab auch schon versucht, die .dll in die Toolbox zu laden und zu benutzen.

    Tatsache, funktioniert wirklich.
    Allerdings: Startet man die Solution, ist alles unchecked. Klickt man auf eine Checkbox, ändert sich zuerst nichts. Man muss am Anfang zwei Mal klicken, bevor sich der Status sichtbar ändert.
    Betrifft Koten 0,1 und 2.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kababär“ ()