Problem mit TreeView

  • Ich möchte quasi einen Liste erzeugen, die in zwei oder drei Teile geteilt ist und viele Unterpunkte hat ... ich denke dafür ist GUICtrlCreateTreeView() am besten geeignet!

    Ich hab schon ein kleines Programm geschrieben, nur bin ich auf unlösbare Probleme gestoßen...

    Hier mein Programm:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <TreeviewConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    $text = ""

    [/autoit] [autoit][/autoit] [autoit]

    ; GUI und TreeView definieren
    $gui = GUICreate("ControlTreeview test", 212, 198)
    $gui_empfaenger = GUICtrlCreateTreeView(6, 6, 200, 160, BitOR($TVS_HASBUTTONS,$TVS_HASLINES,$TVS_SHOWSELALWAYS,$TVS_CHECKBOXES),$WS_EX_CLIENTEDGE)
    $gui_empf_h = ControlGetHandle("", "", $gui_empfaenger)
    $button = GUICtrlCreateButton("Test", 6, 172, 200, 20)

    [/autoit] [autoit][/autoit] [autoit]

    ; Liste wird geladen
    Dim $liste_empf1[3] = ["Hans", "Karl", "Max"]
    Dim $liste_empf2[5] = ["Moritz", "Fritz", "Josef", "Günter", "Otto"]

    [/autoit] [autoit][/autoit] [autoit]

    ; TreeView
    $liste1 = GUICtrlCreateTreeViewItem("Liste1", $gui_empfaenger)
    Dim $empf1[Ubound($liste_empf1)]
    For $y=0 to Ubound($liste_empf1)-1
    $empf1[$y] = GUICtrlCreateTreeViewItem($liste_empf1[$y], $liste1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $liste2 = GUICtrlCreateTreeViewItem("Liste2", $gui_empfaenger)
    Dim $empf2[Ubound($liste_empf2)]
    For $y=0 to Ubound($liste_empf2)-1
    $empf2[$y] = GUICtrlCreateTreeViewItem($liste_empf2[$y], $liste2)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; GUI starten
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    ; Elemente definieren
    ControlTreeView("", "", $gui_empf_h, "Expand", "Liste1")
    ControlTreeView("", "", $gui_empf_h, "Expand", "Liste2")
    ControlTreeView("", "", $gui_empf_h, "Check", "Liste1|Hans")

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $button ; Beim klichen auf test
    For $y=0 to Ubound($empf1)-1
    $check = ControlTreeView("", "", $gui_empf_h, "IsChecked", "#0|#"&$y)
    If $check == 1 then
    $text = $text&$liste_empf1[$y]&@CRLF
    EndIf
    Next
    For $y=0 to Ubound($empf2)-1
    $check = ControlTreeView("", "", $gui_empf_h, "IsChecked", "Liste1|"&$liste_empf2[$y])
    If $check == 1 then
    $text = $text&$liste_empf2[$y]&@CRLF
    EndIf
    Next
    MsgBox(0, "Markierte Empänger", $text)
    EndSelect

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    • Ich möchte das die Punkte 'Liste1' und 'Liste2' keine Checkbox haben und am besten auch nicht anklickbar sind ...
    • Ich kann irgendwie nicht mehr auslesen, was angeklickt ist! Ich kann aber meinen Fehler nicht finden ...
      Ich habe auch zwei Methoden angewendet ... ein mal über die Namen der Liste|Empänger und einmal über deren Anordnung #0|#1
    • Schaff ich es nicht die Punkte "Liste1" und "Liste2" zusammen zu fassen, in ein mehrdimensionales array ... das gelingt mir nicht ...


    thx


    /edit:
    Noch ne Zusatzfrage:
    Bei den ganzen Controll..() Elementen (ControlTreeView, ControlHide, ...) sind die ersten beiden Parameter immer "Title" und "Name"! Ist es egal was ich das eingebe?
    Weil ich habe bisher keinen Unterschied festgestellt, ob ich da was richtiges oder nicht eingebe!
    Was ist eig. das richtige, was man dort eingeben sollte?

  • ch möchte quasi einen Liste erzeugen, die in zwei oder drei Teile geteilt ist und viele Unterpunkte hat ... ich denke dafür ist GUICtrlCreateTreeView() am besten geeignet!

    du hättest keine bessere Wahl treffen können

    Ich möchte das die Punkte 'Liste1' und 'Liste2' keine Checkbox haben und am besten auch nicht anklickbar sind ...

    dass einzelne Punkte keine CheckBox haben, andere aber schon ist meines Wissens nach nicht möglich. Dass einzelne Punkte nicht auswählbar sind, sollte zu schaffen sein ist aber meinen Erachtens nach unnötig. Sieh dir dazu TreeView-(Un)Checked-Example von Oscar an.

    Mir ist aufgefallen, dass du ControllTreeView verwendest. Die Funktionen in der GuiTreeView.au3 sind um einiges mächtiger. Versuche am besten das Skript von Oscar zu verstehen, schau dir die entsprechenden Befehle dazu in derHilfe an. Danach solltest du alle nötigen Befehle kennen um dein Problem zu lösen.

    mfg (Auto)Bert

  • dass einzelne Punkte keine CheckBox haben, andere aber schon ist meines Wissens nach nicht möglich. Dass einzelne Punkte nicht auswählbar sind, sollte zu schaffen sein ist aber meinen Erachtens nach unnötig.


    Ok, ist weiter nicht tragisch ... klar kann ich die Ergebnisse dieser Punkte einfach ignorieren ... es wäre optisch aber schöner, wenn man die Punkte gleich in vornherein nicht anklicken könnte ...

    Mir ist aufgefallen, dass du ControllTreeView verwendest. Die Funktionen in der GuiTreeView.au3 sind um einiges mächtiger. Versuche am besten das Skript von Oscar zu verstehen, schau dir die entsprechenden Befehle dazu in derHilfe an. Danach solltest du alle nötigen Befehle kennen um dein Problem zu lösen.


    Negativ, kein Problem wurde gelöst ... als versucht hab es danach umzuschreiben ist gar nichts mehr gegangen ... selbst nach 2h Fehlersuche geht nichts mehr!
    Deshalb bleib ich bei den schönen einfachen Grundbefehlen, die wenigstens zum teil funktionieren!


    Dennoch bleiben die wichtigsten Fragen noch offen:
    - Wie kann ich auslesen, ob die Checkbox eines Items an gehackt ist oder nicht!? In meinem Skript klappt es nicht ...
    - Die Frage wegen den Controll-Elementen (siehe oben im Edit) ist auch noch offen!
    - Und dann wüsste ich gerne, wie man es hin bekommt, dass das TreeView immer ab ganz oben angezeigt wird, auch wenn die Liste so lang wird, das es einen Scrollleiste gibt!?
    Das mit dem Mehrdimensionalen Array hat sich erledigt ...


    /edit:
    Naja, so musste es auch kommen ... ich hab mit dem Controll-Elementen, im speziellen mit dem Handel rum gespielt und schon geht das testen, ob ein Item angeklickt ist ...
    Die Letzte Frage ist aber immer noch offen ...

  • Hallo chrys,

    dafür kannst du

    [autoit]

    #include <GuiTreeView.au3>
    ;....dein Skript
    _GUICtrlTreeView_SelectItem($hTreeView, 0)

    [/autoit]

    nehmen,

    mfg (Auto)Bert

    • Offizieller Beitrag

    Ich habe Dein Skript mal etwas überarbeitet:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GuiTreeView.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; GUI und TreeView definieren
    $gui = GUICreate("ControlTreeview test", 212, 198)
    $gui_empfaenger = GUICtrlCreateTreeView(6, 6, 200, 160, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)
    $button = GUICtrlCreateButton("Test", 6, 172, 200, 20)

    [/autoit] [autoit][/autoit] [autoit]

    ; Liste wird geladen
    Dim $liste_empf1[3] = ["Hans", "Karl", "Max"]
    Dim $liste_empf2[5] = ["Moritz", "Fritz", "Josef", "Günter", "Otto"]

    [/autoit] [autoit][/autoit] [autoit]

    ; TreeView
    $liste1 = GUICtrlCreateTreeViewItem("Liste1", $gui_empfaenger)
    Dim $empf1[UBound($liste_empf1)]
    For $y = 0 To UBound($liste_empf1) - 1
    $empf1[$y] = GUICtrlCreateTreeViewItem($liste_empf1[$y], $liste1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $liste2 = GUICtrlCreateTreeViewItem("Liste2", $gui_empfaenger)
    Dim $empf2[UBound($liste_empf2)]
    For $y = 0 To UBound($liste_empf2) - 1
    $empf2[$y] = GUICtrlCreateTreeViewItem($liste_empf2[$y], $liste2)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; GUI starten
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    ; Elemente definieren
    ControlTreeView($gui, "", $gui_empfaenger, "Expand", "Liste1")
    ControlTreeView($gui, "", $gui_empfaenger, "Expand", "Liste2")

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $button ; Beim klicken auf test
    $text = ""
    For $y = 0 To Ubound($empf1)-1
    If BitAND(GUICtrlRead($empf1[$y]), $GUI_CHECKED) Then $text &= $liste_empf1[$y] & @CRLF
    Next
    For $y = 0 To Ubound($empf2)-1
    If BitAND(GUICtrlRead($empf2[$y]), $GUI_CHECKED) Then $text &= $liste_empf2[$y] & @CRLF
    Next
    MsgBox(0, "Markierte Empänger", $text)
    EndSelect
    WEnd

    [/autoit]
  • Wieso kannst du das nicht mehr auslesen? Da gibt es doch das:

    [autoit]


    $ListView = GUICtrlCreateListView("|Itemcolumn ", ;-,-,-,-)
    GUICtrlCreateListViewItem("|Item", $ListView) ;Items werden definiert

    [/autoit][autoit][/autoit][autoit]

    ;Dann vielleicht ne If Abfrage:
    If GUICtrlRead($ListView) = "Item" Then
    MsgBox(0,"","")
    EndIf

    [/autoit]

    Meine fertigen Projekte:
    VirtualCash
    Monopoly Digital

    Daran arbeite ich gerade:
    Einem Skript, womit man ohne Programmierkentisse eigene Programme machen kann (habe ich selber früher gesucht :D ) Stand: ||||||||||||||||||||||||| 6%