• Ich brauche öffterst die Func das der Button ein Overrollefeckt hat, also das das Pic anders wird oder so was, wenn man mit der Maus drüberfährt! Also dachte ich mir doch mal das ich dafür eine UDF schreiben könnte, und hab es dann auch getahen. Ich hoffe es gefällt euch.

    mfg. Jam00

    2 Mal editiert, zuletzt von Jam00 (29. Januar 2009 um 14:58)

    • Offizieller Beitrag

    Achte mal darauf das du innerhalb der Func die Variablen deklarierst, so beugst du Fehlern vor. Wenn du innerhalb einer Func auf Variablen zugreifst, die du nicht Local definiert hast ,werden Werte aus der im Hauptscript definierten Variablen des selben Namens geändert . Und das Script benutzt auch die Werte aus den Global definierten Variablen des gleichen Namens . Es wird niemand nachsehen welche Variablennamen du innerhalb deiner Function benutzt .Außerdem setzt du innerhalb deiner Func voraus, das die Variable $Objektstatus bereits definiert ist . Das ist kein guter Programmierstil .Desweiteren rufst du aus deiner Func _Overroll weitere Func´s auf die aber Benutzerspezifisch und nicht allgemeingültig sind . Im Augenblick ist das ganze nichts weiter als eine Func in einem Script und keine UDF.

    Edit : Gewöhne dir am besten an Opt("MustDeclareVars", 1) in deinen Scripten zu verwenden, da wirst du dir viele Fehlersuchen ersparen. Ich weiß wovon ich rede, hab am Anfang auch den Fehler gemacht Variablen nicht zu deklarieren und dann Stundenlang nach Fehlern gesucht .

    • Offizieller Beitrag

    Ja, kanst du mir das mal sagen wie das geht?

    Auf was bezieht sich die Frage jetzt ? Was genau willst du wissen ?

    • Offizieller Beitrag

    Was mir auch aufgefallen ist: _Overroll($fGui,$fObjekt,$fTitel,$fFunc)
    Warum soll der Titel übergeben werden, das ist überflüssig, da du schon $fGui übergibst und dieses ebenso als Titel verwendet werden kann.
    Übrigens machst du dir viel zu viel Arbeit :D - warum die Mausposition mit der Controlposition vergleichen? Hast du dir schon mal angeschaut, was GUIGetCursorInfo() zurückgibt? ...$array[4] = ID of the control that the mouse cursor is hovering over
    Du brauchst also nur die Ctrl-ID mit $array[4] vergleichen. ;)

    P.S. Nicht verzagen, wenn wir hier dein Skript zerlegen. Das ist positive Kritik und hilft dir beim Lernen. :thumbup:

    Edit Falls du schon mitten im Skript steckst und nachträglich die Variablen deklarieren möchtest, ist dieses eine kleine Hilfe: Variablendeklaration automatisiert - Opt("MustDeclareVars", 1)

  • Stimmt ^^ Das mit dem array[4] hab ich fergessen! Dann schreib ich es mal um! Kann ich den $fGui auch als titel für Controgetpos nehmen?, ds ist doch nicht nur für guis die ich mich autoit mache!

    EDIT: Oki, hab es geändert (Dateianhang Post1). Was mache ich bei dem Local falsch? Ich glaub das ist doch das was Raupi meinte oder?

    mfg. Jam00

    Einmal editiert, zuletzt von Jam00 (29. Januar 2009 um 14:58)

    • Offizieller Beitrag

    Also hier mal ein Beispiel :

    [autoit]

    Func _Overroll($fGui,$fObjekt,$fFunc)
    Local $fPos = GUIGetCursorInfo ($fGui)
    If $fPos[4] = $fObjekt Then
    If $Objektstatus = False Then
    Call ($fFunc,"1")
    $Objektstatus = True
    EndIf
    Else
    If $Objektstatus = True Then
    Call ($fFunc,"2")
    $Objektstatus = False
    EndIf
    EndIf
    If $Objektstatus <> False And $Objektstatus <> True Then $Objektstatus = False
    EndFunc

    [/autoit]


    Also die Variable $fPos solltest du als Local deklarieren . So wird es keine Komplikationen mit einer Variable geben die unter dem gleichen Namen Global deklariert ist .
    Wenn ich später Zeit habe werde ich dein Script mal so anpassen , das du nicht innerhalb der Function auf außerhalb der Funktion deklarierte Variablen zugreifen mußt. Hab jetzt keine Zeit dazu , bin auf den Sprung.

    Edit :
    Dein Beispielscript

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Overroll.au3>
    Opt("MustDeclareVars", 1)
    Global $Titel
    Dim $file[2]
    $file[0] = @ScriptDir & "\Test.gif"
    $file[1] = @ScriptDir & "\Test_O.gif"
    $Titel = "Test"
    #Region ### START Koda GUI section ### Form=
    Global $Form2 = GUICreate($Titel, 212, 120, 515, 423)
    Global $Pic1 = GUICtrlCreatePic($file[0], 72, 39, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    Local $nMsg
    _Test(_Overroll($Form2, $Pic1))
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Pic1
    MsgBox(0, "Test", "Pic1 wurde angeklickt!")
    EndSwitch
    WEnd
    Func _Test($bState)
    If $bState Then ;Ist Rückgabe von _Overroll = True (Könnte man auch so Schreiben :If $bState = True Then )
    GUICtrlSetImage($Pic1, $file[1])
    Else
    GUICtrlSetImage($Pic1, $file[0])
    EndIf
    EndFunc ;==>_Test

    [/autoit]


    Deine Overroll.au3

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.0.0
    Author: Jam00

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

    Script Function:_Overroll ermittelt ob sich die Maus über dem Control befindet .
    Parameter 1 = $fGui = Controlhandle der Gui
    Parameter 2 = $fObjekt = ControlID des abzfragenden Controls
    --------------------------------------------------------------------------------
    Rückgabewerte: True wenn sich die Maus über dem Control befindet
    False wenn sich die Maus nicht über dem Control befindet
    #ce ----------------------------------------------------------------------------

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

    Func _Overroll($fGui,$fObjekt) ; Die Varnamen der Parameter mußt du nicht in der Funktion deklarieren, da sie automatisch nur Local existieren .Innerhalb der Funktion werden auch nur auf die Parameter zugegriffen, auch wenn es eine Globale Variable mit der gleichen Bezeichnung gibt
    Local $fPos = GUIGetCursorInfo ($fGui); $fPos sollte Local deklariert werden , da es ja auch eine Globale Variable unter der gleichen Bezeichnung geben könnte .
    If $fPos[4] = $fObjekt Then
    Return True
    Else
    Return False
    EndIf
    EndFunc

    [/autoit]


    Schau dir das ganze mal an . Wenn du noch Fragen hast , dann kannst du mir auch eine PN schicken .

  • Also ich farg jetzt mal hier:
    Also wenn ich eine $ mit Local mache wird sie nur in dieser Func benuzt, oder wie?
    Und Return gibt einen Rückgabewert, den man erhält wenn man die Func ausführt oder wie, das hab ich noch nie kapiert^^

    EDIT: Ach und bei deinem Setzt er das Bild jedes mal neu!

    mfg. Jam00

    • Offizieller Beitrag

    Local heißt , das die Variable nur innerhalb der Func existiert und nach dem verlassen der Func nicht mehr .Return ist der Rückgabewert der Func. Du kannst eigentlich alle Variablentypen für die Rückgabe benutzen . Würdest du z.B. in deiner _Overroll Funktion Return $fPos schreiben, dann würde das das Ergebnis deines GUIGetCursorInfo ($fGui) zurückgeben. Das mit dem neusetzen des Bildes haste recht. Man kann auch noch abfragen ob des aktuelle Pic das anzuzeigende Pic ist .Ich wollte dir nur ein Beispiel für eine Universell einsetzbare Func geben. Deine Func _Overroll kann man auch ohne irgendwelche vorher definierte Variablen oder Funktionen nutzen .

    Edit: Normalerweise kann man auch im Hauptscript Variablen Local definieren , auf diese kann man dann nicht innerhalb von Funktionen zugreifen. Eigentlich sollte das so sein, aber Autoit hat da eine Bug. Alle Local deklarierte Variablen werden im Hauptscript als Global deklariert .
    Folgendes Beispiel sollte eigentlich in der Messagebox gar nicht´s ausgeben ,macht es aber. En Bug halt .

    Spoiler anzeigen
    [autoit]

    Local $Test
    $Test = "Test"
    test()
    Func Test()
    MsgBox(0,"Inhalt der Variable $Test ",$Test)
    EndFunc

    [/autoit]
  • Return und Local (hach bin ich genial :D):

    [autoit]


    $bla = test();Logisch
    MsgBox(0, "", $bla);Auch

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

    Func test()
    Local $var; Nur für diese Funktion gültig
    $var = 1
    Return $var;Damit gibt die Funktion werte zurück, dann kann man sie so aufrufen wie oben
    EndFunc

    [/autoit]

    Padmak