OrganizeIncludes zeigt nicht alle Includes an

  • Hallo

    ich habe mir mal OrganzizeIncludes zugelegt, was bei mir nur Teilweise sauber arbeitet.
    Habe zwei Skripts, das erste für die GUI:

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <extern.au3>

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

    Opt("GUIOnEventMode", 1)

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

    GUICreate("Fenster Test", 500, 300, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUICtrlCreateButton("Knopf", 10, 10, 100, 40)
    GUICtrlSetOnEvent(-1, "_Knopf")
    GUICtrlCreateButton("Konnektor", 10, 60, 100, 40)
    GUICtrlSetOnEvent(-1, "_exFunktionA")
    $Input1 = GUICtrlCreateInput("Input", 10, 110, 100, 20)

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

    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

    [/autoit]

    Das zweite beinhaltet die Funktionen für die Buttons

    [autoit]


    $exText = "bla bla"

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _Knopf()
    MsgBox(64, "Text", "Lääääuft " & GUICtrlRead($Input1) & $exText)
    EndFunc

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

    Func _exFunktionA()
    MsgBox(64, "ExFunk", "Erfolgreich")
    EndFunc

    [/autoit]

    Wenn ich nun OI drüber laufen lasse, zeigt es mir im Skript mit der GUI an, das ich "#include <extern.au3>"
    nicht brauche...

    Jemand eine Idee ?

  • Zeig mir mal, wo dein Script eine der FUNKTIONEN AUFRUFT :P
    Diese Funktionen werden nirgends aufgerufen, sie sind ein TEXT innerhalb einer weiteren Funktion.
    Alles klar jetzt? :rolleyes:

  • oh, sorry - falsche version kopiert:

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <extern.au3>

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

    Opt("GUIOnEventMode", 1)

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

    GUICreate("Fenster Test", 500, 300, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUICtrlCreateButton("Knopf", 10, 10, 100, 40)
    GUICtrlSetOnEvent(-1, "_Knopf")
    GUICtrlCreateButton("Konnektor", 10, 60, 100, 40)
    GUICtrlSetOnEvent(-1, "_exFunktionB")
    $Input1 = GUICtrlCreateInput("Input", 10, 110, 100, 20)

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

    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

    [/autoit]


    [autoit]


    #include <FF.au3>

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

    $exText = "bla bla"

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _Knopf()
    MsgBox(64, "Text", "Lääääuft " & GUICtrlRead($Input1) & $exText)
    EndFunc

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

    Func _exFunktionA()
    MsgBox(64, "ExFunk", "Erfolgreich")
    EndFunc

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

    Func _exFunktionB()
    _FFConnect()
    If _FFIsConnected() Then
    _FFOpenURL("www.web.de")
    EndIf
    EndFunc

    [/autoit]
  • unerheblich...

    Frage: WO WIRD IN DEINEM SCRIPT EINE FUNKTION AUFGERUFEN?
    Antwort: ES WIRD KEINE FUNKTION AUFGERUFEN!

    Ergo, wenn OI keine Funktion(en) in deinem Hauptscript findet, kann es auch diese Funktionen in den Scripten in den angegebenen Verzeichnissen nicht suchen!

  • für mein Verständnis:
    OI kann also nur direkte aufrufe von Funktionen erkennen. Wenn diese durch ein Ereignis wie z.b. das drücken eines Buttons ausgelöst werden, werden diese nicht berücksichtigt?!

  • Nur fürs Verständnis, OI erkennt keine Funktionen innerhalb eines TEXTES!

    In deinem Script existieren keine Funktionen.
    Beispiel:

    [autoit]

    dim $a[1] = [1234]

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

    $b = "_ArrayDisplay($a)" ;das ist ein Text, keine Funktion

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

    msgbox(0,0,$b)

    [/autoit][autoit]


    dim $a[1] = [1234]

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

    $b = _ArrayDisplay($a) ;das ist eine Funktion, wird von OI gefunden

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

    msgbox(0,0,$b)

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (21. Dezember 2014 um 09:45)

  • Ich glaube ihr redet gerade aneinander vorbei.
    Ich verstehe stiffn so:
    Er will in dem 1. Skript OI durchlaufen lassen. Dabei wird die extern.au3 als unnötig angesehen.
    Du solltest diese Datei im includes-Ordner ablegen, dann wird diese auch korrekt erkannt.
    Wenn diese Datei im gleichen Ordner wie das Hauptskript liegt bin ich mir nicht sicher, ob sie erkannt wird.

  • Wenn diese Datei im gleichen Ordner wie das Hauptskript liegt bin ich mir nicht sicher, ob sie erkannt wird.

    Die Datei wird deshalb nicht eingelesen, weil die in dieser Datei enthaltenen Funktionen NICHT im Hauptscript enthalten sind!
    Ich warte immer noch auf die Antwort auf meine Frage, WO IM HAUPTSCRIPT die Funktionen stehen!

  • @ Andy:
    hab es nicht als frage aufgefasst sondern eher ein wenig wie eine anmache...

    bin halt noch sehr neu in autoit.

    für mich ist der Button Konnektor mit einer Funktion belegt.

    [autoit]


    GUICtrlCreateButton("Konnektor", 10, 60, 100, 40)
    GUICtrlSetOnEvent(-1, "_exFunktionB")

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

    Einmal editiert, zuletzt von stiffn (21. Dezember 2014 um 18:33)

  • Ich glaube ihr redet gerade aneinander vorbei.
    Ich verstehe stiffn so:
    Er will in dem 1. Skript OI durchlaufen lassen. Dabei wird die extern.au3 als unnötig angesehen.
    Du solltest diese Datei im includes-Ordner ablegen, dann wird diese auch korrekt erkannt.
    Wenn diese Datei im gleichen Ordner wie das Hauptskript liegt bin ich mir nicht sicher, ob sie erkannt wird.

    danke, werde ich testen

    Edit: nein - Andy hat schon recht, nur hab ich es mit meinem derzeitigen Kenntnissen nicht ganz verstanden.
    Wenn ich _exFunktionB() alleine in eine Zeile schreibe wird das auch von OI richtig erkannt und die extern.au3 als Notwendigen Include vermerkt.

    Verstehe nur noch nicht ganz wieso

    [autoit]


    GUICtrlCreateButton("Konnektor", 10, 60, 100, 40)
    GUICtrlSetOnEvent(-1, "_exFunktionB")

    [/autoit]

    keine "echter" aufrufe der Funktion ist, sondern nur Text, wiederum das ganze dann doch funktioniert wenn ich den Button klicke?!

    Einmal editiert, zuletzt von stiffn (21. Dezember 2014 um 18:42)

  • @stiffn,
    nein, das war keine Anmache! :D
    Anmache von mir sieht anders aus, glaubs mir....

    Wenn ich _exFunktionB() alleine in eine Zeile schreibe wird das auch von OI richtig erkannt und die extern.au3 als Notwendigen Include vermerkt.


    Genau so siehts aus.

    Verstehe nur noch nicht ganz wieso

    AutoIt-Quellcode

    GUICtrlCreateButton("Konnektor", 10, 60, 100, 40)
    GUICtrlSetOnEvent(-1, "_exFunktionB")


    keine "echter" aufrufe der Funktion ist, sondern nur Text, wiederum das ganze dann doch funktioniert wenn ich den Button klicke?!

    Das kommt daher, weil der AutoIt-Interpreter den "Text" innerhalb der Funktion GUICtrlSetOnEvent() als Funktion interpretiert, aber OrganizeInclude das NICHT macht!
    Du könntest OrganizeIncudes dahingehend erweitern bzw. abändern, allerdings würde das etwas aufwendig für einen Anfänger.

    Ich setze mich mal dran, habe OI sowieso schon mehrmals auf meine Belange angepasst....

  • Schön, dass es nun klappt.
    Als Tipp.
    Ich habe früher auch OrganizeIncludes verwendet.
    Allerdings verwende ich seit einiger Zeit dieses hier.
    Funktioniert meine ich besser. Ihr könnt es ja mal testen.

    Z. B. wird bei GUICtrlSetOnEvent auch die Funktion erkannt und das include korrekt eingefügt.

  • 2 Zeilen hinzugefügt, dann klappts auch mit OI

    Funktion ersetzen:

    Spoiler anzeigen
    [autoit]

    Func _getFunctionCallsFromSource(ByRef $source)
    Local $usedFunctions_A, $call_A, $GUIRegisterMsg_A
    Local $usedFunctions_B
    ;~ $usedFunctions_A = StringRegExp($source, '(?i)(?<!\.)\b(\w+)[ ]*\(\h*[\(\)|\w|\$]', 3) ;best
    ;~ $usedFunctions_A = StringRegExp($source, '(?i)(?<!\.|\\|\$|Func\s*)\b(\w+?)[ \t]*\(', 3) ; test
    ;~ $usedFunctions_A = StringRegExp($source, '(?<!\.|\\)\b(\w+)[ \t]*\(.*?\)', 3) ; geht auch
    $usedFunctions_A = StringRegExp($source, '(?<!\.|\\|\$)\b(\w+?)[ \t]*\(', 3) ; test

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

    $usedFunctions_B = StringRegExp($source, '(?i)GUI(?:|Ctrl)SetOnEvent\s*\([^,]+,\W*([\w_]+)\W*\)',3) ;by Andy
    _ArrayConcatenate ($usedFunctions_A,$usedFunctions_B) ;by Andy

    If StringInStr($source, 'call', 2) Then
    $call_A = StringRegExp($source, '(?i)call\s*\(\s*[\x22\x27](\w+)', 3) ; ggf. umstellen auf Stringfunktionen
    If IsArray($call_A) Then _ArrayConcatenate($usedFunctions_A, $call_A)
    EndIf

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

    If StringInStr($source, 'GUIRegisterMsg', 2) Then
    $GUIRegisterMsg_A = StringRegExp($source, '(?i)GUIRegisterMsg\s*\(\s*\$\w+\s*,\s*[\x22\x27](\w+)', 3) ; ggf. umstellen auf Stringfunktionen
    If IsArray($GUIRegisterMsg_A) Then _ArrayConcatenate($usedFunctions_A, $GUIRegisterMsg_A)
    EndIf
    If IsArray($usedFunctions_A) Then Return $usedFunctions_A
    Return -1
    EndFunc ;==>_getFunctionCallsFromSource

    [/autoit]