Script zu lang und unübersichtlich => Auslagerung in UDF

  • Hallo,

    so heute ist der Tag, wo ich den Überblick verloren habe :(

    Bisher hatte ich immer ein Script gemacht, wo ich unten die Funktionen hinterlegt habe. Bei knapp 1000 Zeilen wird das jedoch etwas unübersichtlich. Da ich diverse Funktionen immer wieder verwende, wollte ich mal anfangen, eine "MyUDF.au3" zu erstelllen, dort die Funktionen auszulagern und diese dann als include zu integrieren.

    Von daher habe ich ein paar Fragen.

    1. Muss ich bei einer privaten UDF auch mit dem ganzen Header Gedöns arbeiten, oder reicht da auch nur die eigentliche Funktion, sprich wird eine UDF ohne Header im Hauptscript erkannt ?
    2. Es passt was nicht mit meinen Rückgabewerten. Am besten mal als Beispiel

    So geht es:

    So war die Funktion ursprünglich im Hauptscript
    [autoit]


    Func _CheckDPI()
    $DPI = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "AppliedDPI")
    If $DPI = 96 Then
    $DPI = 1
    Else
    $DPI = 96 / $DPI
    EndIf
    ConsoleWrite("DPI in der Funktion _CheckDPI ist: " & $DPI & @CRLF)
    EndFunc ;==>_DPI

    [/autoit]


    Die Variable $DPI wurde mit DIM $DPI deklariert
    Der Aufruf erfolgt dann so:

    alter Hauptaufruf
    [autoit]


    Func MeineGUI()
    _CheckDPI()
    $MainGUI = GUICreate("MeineGUI - Version " & $Version, $GUIWidth, $GUIHeight, Default, Default); Starte HauptGUI
    ConsoleWrite("DPI außerhalb der Funktion _CheckDPI ist: " & $DPI & @CRLF)
    GUISetFont(8.5 * $DPI, 400, -1, ""); Schriftgröße
    ;..... noch ein wenig Code
    EndFunc

    [/autoit]


    Die Ausgabe in der Console zeigt folgendes:

    Code
    DPI in der Funktion _CheckDPI ist: 1
    DPI außerhalb der Funktion _CheckDPI ist: 1


    Die GUI baut sich mit normaler Schriftgröße auf.

    So geht es nicht:

    Die Funktion liegt jetzt in der MyUDF.au3
    [autoit]


    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_Run_Tidy=y
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    Func _CheckDPI()
    Local $iDPI = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "AppliedDPI")
    If $iDPI = 96 Then
    $iDPI = 1
    Else
    $iDPI = 96 / $iDPI
    EndIf
    ConsoleWrite("iDPI in der Funktion _CheckDPI ist: " & $iDPI & @CRLF)
    Return $iDPI; hier bin ich mir nicht sicher, ob ich es richtig mache
    EndFunc ;==>_CheckDPI

    [/autoit]


    Die MyUDF.au3 habe ich in den Default Include Ordner kopiert und mit

    [autoit]


    #include <MyUDF.au3>

    [/autoit]


    ins Hauptscript included.
    Der Aufruf erfolgt jetzt so:

    der neue Aufruf
    [autoit]


    Func MeineGUI()
    Local $iDPI; deklariere ich Local, da diese Variable ja auch lokal in der MyUDF.au3 liegt und hier somit nicht bekannt ist. Richtig ?
    _CheckDPI(); Funktion wird aus der MyUDF.au3 aufgerufen
    $MainGUI = GUICreate("MeineGUI - Version " & $Version, $GUIWidth, $GUIHeight, Default, Default); Starte HauptGUI
    ConsoleWrite("iDPI außerhalb der Funktion _CheckDPI ist: " & $iDPI & @CRLF)
    GUISetFont(8.5 * $iDPI, 400, -1, ""); Schriftgröße
    ;...... wieder etwas Code
    EndFunc

    [/autoit]


    Das neue Ergebnis der Consolenausgabe ist:

    Code
    iDPI in der Funktion _CheckDPI ist: 1
    iDPI außerhalb der Funktion _CheckDPI ist:


    das heißt ich mache noch was falsch bei den Übergabe der Werte.
    Meine GUI hat jetzt ein stark vergrößertes Schriftbild :(
    Wo "denke" ich hier falsch, bzw. wie und wo sollte man die Variablen deklarieren, das Sie sauber übergeben werden.

    Danke für die Hilfe

    Einmal editiert, zuletzt von HassanMullah (26. Juni 2013 um 15:31) aus folgendem Grund: Ich hoffe das geht jetzt in meinen Dickschädel endlich rein.

  • Versuch doch mal so:

    Spoiler anzeigen
    [autoit]

    Func MeineGUI()
    $MainGUI = GUICreate("MeineGUI - Version " & $Version, $GUIWidth, $GUIHeight, Default, Default); Starte HauptGUI
    ConsoleWrite("DPI außerhalb der Funktion _CheckDPI ist: " & _CheckDPI() & @CRLF)
    GUISetFont(8.5 * $DPI, 400, -1, ""); Schriftgröße
    ;..... noch ein wenig Code
    EndFunc

    [/autoit]


    Der Returnwert ist doch nur Local. Also musst du doch dort bei der Verwendung der Funktion, den Wert in eine Variable schreiben oder wie in meiner Berichtigung direkt verwenden.
    Dim am besten nicht verwenden, nur Local und Global.

    Warum sollte eine UDF ohne Header nicht erkannt werden??
    Der Header ist doch auch nur ein Kommentar. ist in deinem Hauptscript alles kommentiert oder nicht?
    Und wenn nicht, ist er am meckern?

  • Eigentlich ist es ganz einfach.
    Dein Return passt so wie er ist.

    [autoit]

    Return $iDPI

    [/autoit]

    Was du aber in deinem Hauptscript machen musst ist den Return Wert auch in eine Variable speichern:

    [autoit]

    Func MeineGUI()
    Local $iDPI
    $DPI = _CheckDPI(); Funktion wird aus der MyUDF.au3 aufgerufen
    ;......
    EndFunc

    [/autoit]


    Variablen innerhalb einer Funktion würde ich immer als Local definieren.
    Als Variablennamen auserhalb der Funktion kannst du auch einen ganz anderen verwenden als in deiner Funktion.
    Durch Return wird nur der Wert übergeben