Hi,
ich hab mal einen Auszug aus meinem Projekt gemacht um das Problem anschaulich zu machen:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <String.au3>
Opt("GUIOnEventMode", 1) ; enable OnEvent functions notifications
Global $oOnEventDict = ObjCreate("Scripting.Dictionary")
Example()
[/autoit][autoit][/autoit][autoit]Func Example()
Local $WimData = ObjCreate("Scripting.Dictionary")
Local $comDict = ObjCreate("Scripting.Dictionary")
Local $aArray = [$comDict, $WimData]
; Create a GUI with various controls.
Local $hGUI = GUICreate("Example")
Local $iOK = GUICtrlCreateButton("OK", 310, 370, 85, 25)
Local $iset = GUICtrlCreateButton("Set", 210, 370, 85, 25)
Local $ishow = GUICtrlCreateButton("Show", 110, 370, 85, 25)
; set on event
GUICtrlSetOnEventEx($iOK, "SetComDict", $comDict)
GUICtrlSetOnEventEx($iset, "SetWimData", $aArray, 1)
GUICtrlSetOnEventEx($ishow, "_ArrayListDisplay", $WimData)
; Display the GUI.
GUISetState(@SW_SHOW, $hGUI)
; Loop until the user exits.
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
; Delete the previous GUI and all controls.
GUIDelete($hGUI)
EndFunc ;==>Example
Func SetWimData(ByRef $comDict, ByRef $WimData)
_ArrayListDisplay($comDict)
_ArrayListDisplay($WimData)
;~ $WimData = $comDict ; Warum funktioniert das so nicht?
For $k in $comDict.Keys
$WimData.add($k, $comDict($k)) ; Warum funktioniert es so?
Next
_ArrayListDisplay($WimData)
EndFunc
Func SetComDict(ByRef $comDict)
$comDict.add("1", "Hier1")
$comDict.add("2", "Hier2")
Local $newDict = ObjCreate("Scripting.Dictionary")
$newDict.add("10", "test10")
$newDict.add("11", "test11")
$comDict.add("Dict", $newDict)
EndFunc
; helper function for debug
Func _ArrayListDisplay(ByRef $ArrayList, $isDict = 0, $hParent = 0)
If Not IsObj($ArrayList) Then Return MsgBox(64, "Object Error", "No object to process.") ; verify object
If $isDict = 1 And Not IsArray($ArrayList.Keys) Then Return MsgBox(64, "Dictionary Error", "Dictionary is empty.") ; verify keys
Local $Opt_OnEventMode, $counter = 1
If $hParent Then
$Opt_OnEventMode = Opt("GUIOnEventMode", 1)
Else
$Opt_OnEventMode = Opt("GUIOnEventMode", 0)
EndIf
Opt("GUICoordMode", 1) ; absolute position
Local $GUI = GUICreate("ArrayList", 572, 536, -1, -1, -1, -1, $hParent)
Local $ListView = GUICtrlCreateListView("ID|Element", 8, 8, 553, 536-8*2)
; if object is a dict, read elements and values
If $isDict = 1 And $hParent Then
_GUICtrlListView_AddColumn($ListView, "Value")
ControlMove($GUI, "", $ListView, 8, 8, 553, 481)
Local $showBtn = GUICtrlCreateButton("Display", 8, 536-30-8, 60, 30)
Local $test = [$ArrayList, $ListView, $GUI]
GUICtrlSetOnEventEx($showBtn, "_DataDisplay", $test, 1)
For $key In $ArrayList.Keys
Local $val = $ArrayList($key) ; value
GUICtrlCreateListViewItem($counter & '|' & $key & '|' & $val, $ListView)
$counter += 1
Next
; if object is list, read elements only
Else
For $e In $ArrayList
GUICtrlCreateListViewItem($counter & '|' & $e, $ListView)
$counter += 1
Next
EndIf
GUISetState(@SW_SHOW)
If Not $hParent Then
Do
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
Until 0
GUIDelete($GUI)
EndIf
Opt("GUIOnEventMode", $Opt_OnEventMode) ; undo changes
EndFunc
; #FUNCTION# ====================================================================================================================
; Name...........: GUICtrlSetOnEventEx
; Description ...: Ruft eine benutzerdefinierte Funktion mit Parametern auf, wenn das GUI-Control angeklickt wurde.
; Syntax.........: GUICtrlSetOnEventEx($controlID,[$Function,[$aParameter]])
; Parameters ....: $controlID - ID des Controls
; $Function - Der Name der Funktion als String
; $aParameter - Die Parameter als eindimensionales Array
; Author ........: Zeitriss
; ===============================================================================================================================
Func GUICtrlSetOnEventEx($controlID, $Function = Default, $aParameter = Default, $AssignFlag = 0)
If $Function <> Default Then
Local $Data = ObjCreate("Scripting.Dictionary")
If $aParameter = Default Then
GUICtrlSetOnEvent($controlID, $Function)
Else
$Data.add("Parameter", $aParameter)
EndIf
$Data.add("Function", $Function)
$Data.add("AssignFlag", $AssignFlag)
If $oOnEventDict.Exists(String($controlID)) Then $oOnEventDict.remove(String($controlID))
$oOnEventDict.add(String($controlID), $Data)
Local $DataDict = $oOnEventDict(String($controlID))
GUICtrlSetOnEvent($controlID, "GUICtrlSetOnEventBuffer")
Else
If $oOnEventDict.Exists(String($controlID)) Then $oOnEventDict.remove(String($controlID))
EndIf
EndFunc
Func GUICtrlSetOnEventBuffer()
If Not $oOnEventDict.Exists(String(@GUI_CtrlId)) Then Return
Local $Data = $oOnEventDict(String(@GUI_CtrlId))
Local $params = $Data("Parameter")
If $Data("AssignFlag") = 1 Then
If IsArray($params) Then _ArrayInsert($params, 0, "CallArgArray")
If IsObj($params) Then $params.Insert(0, "CallArgArray")
EndIf
Call($Data("Function"), $params)
EndFunc
Die Funktion _ArrayListDisplay könnt ihr ignorieren, die funktioniert wie _ArrayDisplay nur mit Objekten!
Ich verknüpfe mit GUICtrlSetOnEventEx (Wie GUICtrlSetOnEvent, nur das ich hier mehrere Parameter übergeben kann) die Buttons mit bestimmten Funktionen und übergebe bei der Funktion "SetWimData" das leere Dictionary $WimData. Das möchte ich dann in einer anderen Funktion die ich auch mit einem Button verknüpft habe mit Daten füllen um es dann bei der letzten Funktion (GUICtrlSetOnEventEx($ishow, "_ArrayListDisplay", $WimData)) darzustellen.
Hat jemand eine Idee warum ich in der "SetWimData" Funktion nicht einfach
[autoit]$WimData = $comDict
[/autoit]schreiben kann sondern das machen muss damit es klappt??
[autoit]For $k in $comDict.Keys
$WimData.add($k, $comDict($k)) ; Warum funktioniert es so?
Next
Danke schonmal!