Ein und dieselbe GUICtrlListView in mehreren GUIs verwenden

  • Hallo,

    kann mir jemand sagen, ob es möglich ist, eine GUICtrlLIstView oder ein beliebiges anderes Control-Element (z.B. Buttons) in mehreren GUIs zu verwenden? Ich hab in meinem Programm ein Hauptgui, das eine ListView enthält.
    Nun möchte ich noch eine zweite GUI erzeugen, die neben anderen Elementen ein und dieselbe ListView darstellt.
    D.h. wenn im Hauptgui was in der Listview verändert wird, wird diese Änderung auch im zweiten GUI "sichtbar".

    Geht sowas? Bin für jeden Tipp dankbar....

    Viele Grüße

    Daniel

  • Also ich hab mal was gebastelt, allerdings funktioniert das nicht ganz so wie es soll. Die Inhalte der listviews werden jeweils gecloned, auch der Status der Checkbox wird korrekt gecloned. Allerdings funktioniert das Cloning des ListviewItem Status noch nicht. Habe aber auch noch nie mit Listviews gearbeitet. Vielleicht hilft dir das Beispiel ja und du kannst den Fehler beheben:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #Include <Array.au3>

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

    Global $listviewitem[1]
    Global $listviewitemClone[1]
    $listviewitem[0]=0
    $listviewitemClone[0]=0

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

    #Region ### START Koda GUI section ### Form=

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

    ; GUI Main:

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

    $Form1 = GUICreate("Main GUI", 502, 200, 50, 124)
    $ListView1 = GUICtrlCreateListView("ListViewMain", 88, 32, 185, 113)
    $Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 336, 64, 105, 25)
    $Button1 = GUICtrlCreateButton("add ListView Value", 336, 32)
    GUISetState(@SW_SHOW)

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

    ; GUI Clone:

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

    $Form2 = GUICreate("Clone GUI", 502, 200, 600, 124)
    $ListView2 = GUICtrlCreateListView("ListViewClone", 88, 32, 185, 113)
    $Checkbox2 = GUICtrlCreateCheckbox("CheckboxClone", 336, 64, 105, 25)
    GUISetState(@SW_SHOW)

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

    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    addListViewItem()
    Case $ListView1 ; eigtl müsste statt der listviewcontrol das listviewitem als case abgefragt werden
    cloneListViewItemState($ListView1)
    Case $ListView2
    cloneListViewItemState($ListView2)
    Case $Checkbox1
    CloneCheckboxState($Checkbox1)
    Case $Checkbox2
    CloneCheckboxState($Checkbox2)

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

    EndSwitch
    WEnd

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

    Func addListViewItem()
    $add = InputBox("Inhalt zur ListView hinzufügen", "Gib was ein")
    $item = GUICtrlCreateListViewItem($add,$ListView1)
    $itemclone = GUICtrlCreateListViewItem($add,$ListView2)
    _ArrayAdd($listviewitem,$item)
    _ArrayAdd($listviewitemClone,$itemclone)
    $listviewitem[0]=$listviewitem[0] + 1
    $listviewitemClone[0]=$listviewitemClone[0] + 1
    EndFunc

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

    Func cloneListViewItemState($listview) ; funktioniert nicht

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

    if $listview = $ListView1 Then
    $counter = 1
    While $counter <= $listviewitem[0]
    If BitAnd(GUICtrlRead($listviewitem[$counter]),$GUI_CHECKED ) = $GUI_CHECKED Then
    GUICtrlSetState($listviewitemClone[$counter],$GUI_CHECKED )
    Else
    GUICtrlSetState($listviewitemClone[$counter],$GUI_UNCHECKED )
    EndIf
    $counter = $counter + 1
    WEnd
    EndIf

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

    if $listview = $ListView2 Then
    $counter = 1
    While $counter <= $listviewitemClone[0]
    If BitAnd(GUICtrlRead($listviewitemClone[$counter]),$GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($listviewitem[$counter],$GUI_CHECKED)
    Else
    GUICtrlSetState($listviewitem[$counter],$GUI_UNCHECKED)
    EndIf
    $counter = $counter + 1
    WEnd
    EndIf

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

    EndFunc

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

    Func CloneCheckboxState($check)

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

    if $check = $Checkbox1 Then
    If BitAnd(GUICtrlRead($Checkbox1),$GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($Checkbox2,$GUI_CHECKED)
    Else
    GUICtrlSetState($Checkbox2,$GUI_UNCHECKED)
    EndIf
    EndIf

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

    if $check = $Checkbox2 Then
    If BitAnd(GUICtrlRead($Checkbox2),$GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($Checkbox1,$GUI_CHECKED)
    Else
    GUICtrlSetState($Checkbox1,$GUI_UNCHECKED)
    EndIf
    EndIf

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

    EndFunc

    [/autoit]
  • Geht sowas? Bin für jeden Tipp dankbar....


    Klar, hier ist meine Version 2 GUI's uptodate zu halten:
    Habs zwar mit Labels gemacht, damits schnell geht (grad eben geskriptet) aber du kannst es ja für ListView erweitern.
    Darfst auch ein bisschen was machen :D

    Falls du es nicht hinbekommst, ich helfe gern weiter ;)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <array.au3>

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

    ;Main
    Opt("GUIOnEventMode", 1)
    Global $_DATA = 0
    Global $h_GUI = 0
    Global $LABEL_ALL_ID = 0

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

    _GUICreate()
    While 1
    Sleep(100)
    For $id in $LABEL_ALL_ID
    _LabelUpdate($id)
    Next
    WEnd

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

    ;Func
    Func _Exit()
    Exit
    EndFunc

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

    Func _Button()
    $_DATA += 1
    EndFunc

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

    Func _GUICreate()
    Global $h_GUI[2] = [ _
    GUICreate("GUI 1", Default, Default, 0, 0), _
    GUICreate("GUI 2", Default, Default, 500, 0) _
    ]
    Local $label_id = 0
    Dim $LABEL_ALL_ID[1] = [0]
    For $h in $h_GUI
    _GUIBuild($h, $label_id)
    _ArrayAdd($LABEL_ALL_ID, $label_id)
    Next
    _ArrayDelete($LABEL_ALL_ID, 0)
    EndFunc

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

    Func _GUIBuild($h, ByRef $l)
    GUISwitch($h)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    $b = GUICtrlCreateButton("Klick mich", "", "")
    GUICtrlSetOnEvent($b, "_Button")
    $l = GUICtrlCreateLabel($_DATA, 10, 50)
    GUISetState()
    EndFunc

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

    Func _LabelUpdate($id)
    If GUICtrlRead($id) = $_DATA Then Return
    GUICtrlSetData($id, $_DATA)
    EndFunc

    [/autoit]
  • So hab nochmal einiges geändert, funktioniert nun ;)

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #Include <Array.au3>

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

    Global $listviewitem[1]
    Global $listviewitemClone[1]
    $listviewitem[0]=0
    $listviewitemClone[0]=0

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

    #Region ### START Koda GUI section ### Form=

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

    ; GUI Main:

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

    $MainGUI = GUICreate("Main GUI", 502, 200, 50, 124)
    $ListView1 = GUICtrlCreateListView("ListViewMain", 88, 32, 185, 113,"",$LVS_EX_CHECKBOXES)
    $Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 336, 64, 105, 25)
    $Button1 = GUICtrlCreateButton("add ListView Value", 336, 32)
    GUISetState(@SW_SHOW)

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

    ; GUI Clone:

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

    $CloneGUI = GUICreate("Clone GUI", 502, 200, 600, 124)
    $ListView2 = GUICtrlCreateListView("ListViewClone", 88, 32, 185, 113,"",$LVS_EX_CHECKBOXES)
    $Checkbox2 = GUICtrlCreateCheckbox("CheckboxClone", 336, 64, 105, 25)
    GUISetState(@SW_SHOW)

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

    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    addListViewItem()
    Case $Checkbox1
    CloneCheckboxState()
    Case $Checkbox2
    CloneCheckboxState()
    EndSwitch

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

    cloneListViewItemState()

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

    WEnd

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

    Func addListViewItem()
    $add = InputBox("Inhalt zur ListView hinzufügen", "Gib was ein")
    $item = GUICtrlCreateListViewItem($add,$ListView1)
    $itemclone = GUICtrlCreateListViewItem($add,$ListView2)
    _ArrayAdd($listviewitem,$item)
    _ArrayAdd($listviewitemClone,$itemclone)
    $listviewitem[0]=$listviewitem[0] + 1
    $listviewitemClone[0]=$listviewitemClone[0] + 1
    EndFunc

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

    Func cloneListViewItemState()

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

    if WinActive ( $MainGUI ) Then
    $counter = 1
    While $counter <= $listviewitem[0]
    If BitAnd(GUICtrlRead($listviewitem[$counter],1),$GUI_CHECKED ) = $GUI_CHECKED Then
    GUICtrlSetState($listviewitemClone[$counter],$GUI_CHECKED )
    Else
    GUICtrlSetState($listviewitemClone[$counter],$GUI_UNCHECKED )
    EndIf
    $counter = $counter + 1
    WEnd
    EndIf

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

    if WinActive ( $CloneGUI ) Then
    $counter = 1
    While $counter <= $listviewitemClone[0]
    If BitAnd(GUICtrlRead($listviewitemClone[$counter],1),$GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($listviewitem[$counter],$GUI_CHECKED)
    Else
    GUICtrlSetState($listviewitem[$counter],$GUI_UNCHECKED)
    EndIf
    $counter = $counter + 1
    WEnd
    EndIf

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

    EndFunc

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

    Func CloneCheckboxState()

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

    if WinActive ( $MainGUI ) Then
    If BitAnd(GUICtrlRead($Checkbox1),$GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($Checkbox2,$GUI_CHECKED)
    Else
    GUICtrlSetState($Checkbox2,$GUI_UNCHECKED)
    EndIf
    EndIf

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

    if WinActive ( $CloneGUI ) Then
    If BitAnd(GUICtrlRead($Checkbox2),$GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($Checkbox1,$GUI_CHECKED)
    Else
    GUICtrlSetState($Checkbox1,$GUI_UNCHECKED)
    EndIf
    EndIf

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

    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (3. November 2010 um 17:38)

  • Hi,

    alles klar, super!
    Schon mal danke für eure Hilfe. Ich kuck mal, wie ich das für meinen Fall verwenden kann.

    Es grüßt

    Der Daniel