Deklarationsproblem bei Parameter / Variable

  • AutoIt: 3.3.6.1
    Scite: 1.79

    Hey Leude!
    Hab hier ein Deklarationsproblem,
    hier ein Beispiel:

    [autoit]


    ;####### Problem 1 #######
    ;~ If Not IsDeclared($a) Then $a = "anything wonderfull"
    ;#########################

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

    ;#### Supergeniale Funktion ####
    Func test($a = 2)
    If $a = 0 Then MsgBox(0, "test", "a = " & $a)
    If $a = 1 Then MsgBox(0, "test", "a = " & $a)
    If $a = 2 Then MsgBox(0, "test", "a = " & $a)
    EndFunc ;==>test
    ;###############################

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

    test(1) ; <-- so funktionierts
    test(2) ; <-- so auch
    test(0) ; <-- so auch
    test() ; <-- so auch

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

    GUICreate("SchrottGUI", 500, 200)
    GUISetState()

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

    ;###### Problem 2 #########
    GUICtrlCreateButton("SuperButton", 50, 50) ; <-- so funktionierts NICHT mehr
    GUICtrlSetOnEvent(-1, "test")
    Opt("GUIOneventmode", 1)
    ;##########################

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

    While 1
    Sleep(100)
    WEnd

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

    Das "Variable used without being declared" - Problem hat man aber nur per "GUICtrlSetOnEvent" oder per "IsDeclared".

    Jemand ne Idee??
    Ich hab zwar eine eine 3-Zeilige Problem-Umgehung, ist aber eigentlich nicht schön...
    Vielen Dank im Vorraus!!

    ... wasweisichdennschon...

    2 Mal editiert, zuletzt von Chrischn (8. Januar 2011 um 17:25)

  • $a ist in dem Fall nur für die Funktion deklariert (lokal deklariert), da sie ein Parameter der Funktion ist. Bei IsDeclared darfst du die Variable nicht einfach so angeben, hättest du in die Hilfe geguckt, wüsstest du das.
    €dit: Habs etwas falsch verstanden. Bei GUICtrlSetOnEvent werden bei dem Funktionsaufruf afaik alle Parameter ignoriert --> $a is also nichtmehr deklariert.

  • So gehts: (Bei mir jedenfalls)

    Öffne mich
    [autoit]

    Global $a
    Opt("GUIOneventmode", 1)

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

    ;####### Problem 1 #######
    If Not IsDeclared($a) Then $a = "anything wonderfull"
    ;#########################

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

    ;#### Supergeniale Funktion ####
    Func test($a = 2)
    If $a = 0 Then MsgBox(0, "test", "a = " & $a)
    If $a = 1 Then MsgBox(0, "test", "a = " & $a)
    If $a = 2 Then MsgBox(0, "test", "a = " & $a)
    EndFunc ;==>test
    ;###############################

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

    test(1) ; <-- so funktionierts
    test(2) ; <-- so auch
    test(0) ; <-- so auch
    test() ; <-- so auch

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

    GUICreate("SchrottGUI", 500, 200)
    GUISetState()

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

    ;###### Problem 2 #########
    GUICtrlCreateButton("SuperButton", 50, 50) ; <-- so funktionierts NICHT mehr
    GUICtrlSetOnEvent(-1, "test")
    ;##########################

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

    While 1
    Sleep(100)
    WEnd

    [/autoit]

  • $a ist in dem Fall nur für die Funktion deklariert (lokal deklariert), da sie ein Parameter der Funktion ist. Bei IsDeclared darfst du die Variable nicht einfach so angeben, hättest du in die Hilfe geguckt, wüsstest du das.
    €dit: Habs etwas falsch verstanden. Bei GUICtrlSetOnEvent werden bei dem Funktionsaufruf afaik alle Parameter ignoriert --> $a is also nichtmehr deklariert.


    Was soll ich dann deiner Meinung nach mit einer Funktion anfangen, die prüft, ob eine Variable deklariert wurde, WENN ich die vorher unbedingt deklarieren MUSS?
    Leuchtet mir nicht so ein.
    Ich hatte mir Problem1 als Lösung für Problem 2 vorgestellt.

    ... wasweisichdennschon...

  • $a ist in dem Fall nur für die Funktion deklariert (lokal deklariert), da sie ein Parameter der Funktion ist. Bei IsDeclared darfst du die Variable nicht einfach so angeben, hättest du in die Hilfe geguckt, wüsstest du das.
    €dit: Habs etwas falsch verstanden. Bei GUICtrlSetOnEvent werden bei dem Funktionsaufruf afaik alle Parameter ignoriert --> $a is also nichtmehr deklariert.


    UND was ist mit Problem2? Problem1 ist ja mal wirklich Schrott!

    ... wasweisichdennschon...

  • Bei IsDeclared gibt man keine Variable an, sondern den Variablennamen als String:

    [autoit]

    If Not IsDeclared('a') Then Global $a ; oder: Global $a = 42

    [/autoit]


    vielen herzlichen dank!

    Das hatte ich übersehen. Nun kann ich mit dem Wissen über Parameter (werden bei GUICtrlSetOnEvent ignoriert) und IsDeclared ( als String übergeben )
    was vernünftiges basteln.

    DANKE!

    ... wasweisichdennschon...

  • Eins vorweg: Ich denke mir nur das es so ist wie ich es gleich begründe, weiß (!) allerdings nicht ob diese Erklärung richtig ist.
    Im Normalfall werden Funktionen aufgerufen und für ihre Aufrufparameter ein Stack (Speicherbereich) bereitgestellt.
    Bei Event-Funktionen gibt es keine Parameter so dass der EventHandler, welcher die Funktionen aufruft keinen Speicher dafür erstellt sondern einfach nur direkt den Befehlszeiger auf den Funktionsanfang setzt.
    Die Funktion kann also auch keinen Standardwert für den Parameter erstellen weil es keinen Platz gibt wo der Parameter gespeichert werden sollte.
    Daher muss man die Funktion wieder normal vom AutoIt-Interpreter aufrufen lassen statt vom Event-Handler.
    Das geht z.B. über eine Wrapperfunktion:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    Opt("GUIOneventmode", 1)

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

    ;#### Supergeniale Funktion ####
    Func test($a = 2)
    If $a = 0 Then MsgBox(0, "test", "a = " & $a)
    If $a = 1 Then MsgBox(0, "test", "a = " & $a)
    If $a = 2 Then MsgBox(0, "test", "a = " & $a)
    EndFunc ;==>test
    ;###############################

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

    GUICreate("SchrottGUI", 500, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, "raus")

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

    ;###### Problem 2 #########
    GUICtrlCreateButton("SuperButton", 50, 50) ; <-- so funktionierts NICHT mehr
    GUICtrlSetOnEvent(-1, "_event_Click")

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

    GUISetState(@SW_SHOW)
    ;##########################

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

    While 1
    Sleep(100)
    WEnd

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

    Func _event_Click()
    test()
    EndFunc

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

    Func raus()
    Exit
    EndFunc

    [/autoit]

    Wenn dir das zu viele Funktionen werden kannst du das auch z.B. so etwas zusammenfassen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    Opt("GUIOneventmode", 1)

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

    ;#### Supergeniale Funktion ####
    Func test($a = 2)
    If $a = 0 Then MsgBox(0, "test", "a = " & $a)
    If $a = 1 Then MsgBox(0, "test", "a = " & $a)
    If $a = 2 Then MsgBox(0, "test", "a = " & $a)
    EndFunc ;==>test
    ;###############################

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

    GUICreate("SchrottGUI", 500, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_events")

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

    ;###### Problem 2 #########
    $gui_Button = GUICtrlCreateButton("SuperButton", 50, 50) ; <-- so funktionierts NICHT mehr
    GUICtrlSetOnEvent(-1, "_events")

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

    GUISetState(@SW_SHOW)
    ;##########################

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

    While 1
    Sleep(100)
    WEnd

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

    Func _events()
    Switch @GUI_CtrlId
    Case $GUI_EVENT_CLOSE
    Exit
    Case $gui_Button
    test()
    EndSwitch
    EndFunc ;==>_events

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (8. Januar 2011 um 17:32)

  • so hab ich´s auch schon gemacht... das war quasi mein workaround..

    Danke!

    ... wasweisichdennschon...