GUIOnEvent mit Parametern

  • Ich habe mir mal gedacht ich schreibe mal ein paar Funktionen, die es ermöglichen bei GUIOnEvent und GUICtrlOnEvent Parameter mitzugeben.

    Die Funktionen "GUICtrlSetOnEventEx" und "GUISetOnEventEx" welche fast genauso wie die Funktionen GUICtrlSetOnEvent und GUISetOnEvent funktionieren nur, dass sie einen weiteren Parameter haben in den ein Array mit Parametern für die aufzurufende Funktion reinkommt.

    Das Array muss so aufgebaut sein:

    Array[0] = Erster Parameter
    Array[1] = Zweiter Parameter
    Array[2] = Dritter Parameter
    usw...

    Die Funktionen werden so aufgerufen:

    [autoit]


    GUISetOnEventEx(ID,"Funktion",$aParameter)

    [/autoit]


    oder

    [autoit]


    GUICtrlSetOnEventEx(ID,"Funktion",$aParameter)

    [/autoit]

    Bei der Funktion GUISetOnEventEx fehlt noch das Winhandle, aber dass kommt später, denn ich werde eine ganze weile kein Internet mehr haben und dachte mir ich stelle die Funktion noch rein bevor ich morgen wegfahre, meistens brauch man eh nur ein Fenster und wie oft muss man bei Systembuttons Parameter mitgeben. :rolleyes:

    Bevor ich es vergesse, hier noch die Funktionen:

    Spoiler anzeigen
    [autoit]


    Global $oOnEventDict = ObjCreate("Scripting.Dictionary")

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

    ; #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)
    If $Function <> Default Then
    Local $Data[2]
    If $aParameter = Default Then
    $Data[1] = ""
    Else
    ReDim $aParameter[Ubound($aParameter)+1]
    For $i = Ubound($aParameter)-2 to 0 step -1
    $aParameter[$i+1] = $aParameter[$i]
    Next
    $aParameter[0] = "CallArgArray"
    $Data[1] = $aParameter
    EndIf
    $Data[0] = $Function
    If $oOnEventDict.Contains (String($controlID)) Then $oOnEventDict.remove (String($controlID))
    $oOnEventDict.add (String($controlID),$Data)
    GUICtrlSetOnEvent($controlID,"GUICtrlSetOnEventBuffer")
    Else
    If $oOnEventDict.Contains (String($controlID)) Then $oOnEventDict.remove (String($controlID))
    EndIf
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: GUICtrlSetOnEventEx
    ; Description ...: Ruft eine benutzerdefinierte Funktion mit Parametern auf, wenn ein Systembutton geklickt wurde.
    ; Syntax.........: GUICtrlSetOnEventEx($controlID,[$Function,[$aParameter]])
    ; Parameters ....: $controlID - ID des Systembuttons
    ; $Function - Der Name der Funktion als String
    ; $aParameter - Die Parameter als eindimensionales Array
    ; Author ........: Zeitriss
    ; ===============================================================================================================================
    Func GUISetOnEventEx($controlID,$Function = Default,$aParameter = Default)
    If $Function <> Default Then
    Local $Data[2]
    If $aParameter = Default Then
    $Data[1] = ""
    Else
    ReDim $aParameter[Ubound($aParameter)+1]
    For $i = Ubound($aParameter)-2 to 0 step -1
    $aParameter[$i+1] = $aParameter[$i]
    Next
    $aParameter[0] = "CallArgArray"
    $Data[1] = $aParameter
    EndIf
    $Data[0] = $Function
    If $oOnEventDict.Exists (String($controlID)) Then $oOnEventDict.remove (String($controlID))
    $oOnEventDict.add (String($controlID),$Data)
    GUISetOnEvent($controlID,"GUICtrlSetOnEventBuffer")
    Else
    If $oOnEventDict.Exists (String($controlID)) Then $oOnEventDict.remove (String($controlID))
    EndIf
    EndFunc

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

    Func GUICtrlSetOnEventBuffer()
    If Not $oOnEventDict.Exists(String(@GUI_CtrlId)) Then Return
    Local $Data = $oOnEventDict(String(@GUI_CtrlId))
    Call($Data[0],$Data[1])
    EndFunc

    [/autoit]

    [Edit:] Und das Beispiel welches ich ganz vergessen hatte gestern :D

    Beispiel
    [autoit]


    #include<GUICtrlSetOnEvent.au3>
    Opt("GUIOnEventMode", 1)

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

    $hGUI = GUICreate("GUI",500,500,-1,-1)
    For $i = 1 to 3
    Local $Parameter[1] = [$i]
    GUICtrlSetOnEventEx(GUICtrlCreateButton("Button "&$i,10+100*$i,100,50,22),"ButtonKlick",$Parameter)
    Next
    Local $Parameter[2]
    $Parameter[0] = 16
    $Parameter[1] = "Fenster wurde geschlossen!"
    GUISetOnEventEx(-3,"Fenster_Schliessen",$Parameter)
    GUISetState(1,$hGUI)
    While 1
    sleep(2000)
    WEnd

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

    Func ButtonKlick($ButtonId)
    msgbox(0,"","Button "&$ButtonId&" wurde gedrückt")
    EndFunc
    Func Fenster_Schliessen($flag,$sString)
    msgbox($flag,"",$sString)
    exit
    EndFunc

    [/autoit]

    Sinn macht es aber eigentlich nur bei vielen Buttons, welche ähnliche Funktionen haben, dann brauch man nicht für jeden eine eigene Funktion.

    Ich hoffe die Funktionen gibt es noch nicht irgendwo in einer UDF versteckt. :P

    mfg Zeitriss

    2 Mal editiert, zuletzt von Zeitriss (9. Januar 2011 um 12:13)