Buttons klickbar machen

  • Danke noch mal,

    jo hab ich jetzt gesehen, die "

    aber auch mit

    Code
    GUICtrlCreateLabel("CUSTOMIZING" & _StringRepeat(" ", 185) & "Local DB-Server: " & $st, 10, 35, 980, 20)

    Error:Variable used without beeing declared

    Zum Mäusemelken

  • Die Fehlermeldung besagt du hast dein Variable benutzt ohne sie als Local bzw. Global zu definieren also:

    AutoIt
    Local $st

    Und den Beweis sehe ich hier:

    AutoIt
    Func _SQL()
      $SeviceName = "SQL Server (AUGIAS)" ;name of the service to test
      RunWait(@ComSpec & " /c net start > c:\temp\services.txt", "", @SW_HIDE);send a list of the services that are running to a file
      $FileText = FileRead("c:\temp\services.txt", FileGetSize("c:\temp\services.txt"));read that file
      If StringInStr($FileText, $SeviceName) Then;check for the service name
        $st = "RUNNING"
      Else
        $st = "OFF"
      EndIf
    EndFunc   ;==>_test

    $st wird nicht definiert und du übergibst den Wert auch nicht wieder!

    Das gleiche betrifft ggf. auch $ServiceName und $FileText. Richtig wäre nun so:

    Und der Aufruf wäre dann Sinnvoll so (wenn man True und False verwendet): if _SQL() then


    Das sind alles Sachen die der Gründlichkeit zu Grunde liegen und hier bereits angesprochen wurden.

    3 Mal editiert, zuletzt von Moombas (24. Januar 2022 um 08:10)

  • Hallo casi4712 (Chris),


    ich darf mich Oscar anschließen und darauf hinweisen das dein ganzes Skript benötigt wird, um zügig zu helfen bzw. ggf. auch andere Fehler gleich mit aufzudecken.
    Auch wenn du schreibst das du Foren durchsuchst (u.a. dieses hier) um nicht gleich fragen zu müssen und dir viel Mühe insgesamt machst, ist es wünschenswert wenn du mehr auf die Vorschläge der Helfenden hier eingehst.

    Zwei Beispiele:
    1. Dein Syntaxfehler bzw. das Nachfragen danach (Post #19) bei Velted siehst du wenn du die beiden Versionen vergleichst (bestenfalls über ein "Diff") wie bspw.:



    Oder du versuchst mehr auf die Consolenausgabe/den Output zu achten, dort wirst du auch darauf hingewiesen 🧐 .

    2. Bzgl. deines aktuellen Fehlers

    Zitat

    Error:Variable used without beeing declared

    Ohne das gesamte Skript, kann man dazu nicht viel sagen. Es ist also notwendig das du das Skript postest und bestenfalls den Output (Consolenausgabe), denn dort wird ebenfalls per Zeilennummer darauf hingewiesen, um welche Variable es sich handelt.

    Es liegt nahe, genau wie Moombas beschreibt, dass falls du den Code nicht diesbzgl. verändert hast, du auf den Variablenscope achten musst (siehe post #12, da dort folgendes hinzu kam und dort auch die fehlenden Scopes von mir definiert wurden):



    Dies bekommst du ebenfalls im Output gesagt - welche Stelle es betrifft.

    Fazit:
    Es soll dich nicht abschrecken weiter Fragen zu stellen, doch beschäftige dich bitte zunächst mit den Hilfestellungen die dir sowieso gegeben sind und wenn du dann nicht weiter kommst, poste die vollständigen Informationen, Danke.

    Viele Grüße

    Sven

  • Also erst einmal recht herzlichen Dank für die vielen Tips. Ich ziehe mir auch super gerne alle möglichen Schuhe an, aber ich versuche hier nun auch wirklich jeden Tip in die Tat um zu setzen. Das Script habe ich in meinem Anfangspostig bereits gepostet. Aber ich findes es schon angsteinflößend, dass man zig Zeilen Code benötigt um einen Dienststatus abzufragen und in eine Variable zu stecken, ich fand am Anfang ja PS schon kompliziert. Gibt es da wirklich keine kürzeren Ansätze?

    @Mombas: Deinen Code werde ich gleich mal ausprobieren.

    lieben Dank

    Gruss

    Chris

  • Also ich habs jetzt getestet; IST IMMER NOCH NICHT DECLARED. Ich habs jetzt mal auf das notwendigste heruntergekürzt, um die Übersichtlichkeit zu gewährleisten. Es gibt doch eine MöglichKeit via RUN und Hide einen Batchbefehl im Hintergrund laufen zu lassen, kann man von diesem keine Variable an Autoit übergeben?

    PS: Wo istz die Syntaxeinstellung im Forum zu finden?

    lg

    Chris

    Einmal editiert, zuletzt von Musashi (24. Januar 2022 um 11:50) aus folgendem Grund: Syntaxhervorhebung von C auf AutoIt geändert (Musashi)

  • GUICtrlCreateLabel("CUSTOMIZING" & _StringRepeat(" ", 185) & "Local DB-Server: " & $st, 10, 35, 980, 20)

    Die Variable $st taucht hier erstmalig auf. Sie wurde vorher nicht deklariert, kein Wert zugewiesen. Somit erscheint die Fehlermeldung.

    Es gibt doch eine MöglichKeit via RUN und Hide einen Batchbefehl im Hintergrund laufen zu lassen, kann man von diesem keine Variable an Autoit übergeben?

    Direkter Austausch ist nicht ohne Weiteres machbar. Aber warum überhaupt Batch? Erledige doch alles in AutoIt.

    PS: Wo istz die Syntaxeinstellung im Forum zu finden?

    </> klicken zum Code einfügen, auf den Text "Quellcode" klicken und im Menü auswählen.

  • Hi casi4712, hi BugFix,

    Direkter Austausch ist nicht ohne Weiteres machbar. Aber warum überhaupt Batch? Erledige doch alles in AutoIt.


    Genau das hatte ich dich bereits im post #10 gefragt Chris.



    Desweiteren schreibst du:

    Aber ich findes es schon angsteinflößend, dass man zig Zeilen Code benötigt um einen Dienststatus abzufragen und in eine Variable zu stecken, ich fand am Anfang ja PS schon kompliziert. Gibt es da wirklich keine kürzeren Ansätze?

    Die gibt es sehr wahrscheinlich, doch dazu solltest du dein Ziel erläutern.
    Denn ansonsten sehe ich die Konversation hier als ping-pong in gefühlter Endlosschleife 🙁 .

    Viele Grüße
    Sven

  • Das sollte ja auch langfristig das Ziel sein, das mit Batch embedded wäre ja auch nur ein Notnagel, aber irgendwie will er ja nicht die Variable deklarieren, ich ging wohl fäschlicherweise davon aus, dass diese in der Funktion deklariert wird. Wie muss es denn aussehen damit die Variable $st nun einen Wet annimmt. Wenn das schon so kompliziert ist einen DienstStuts anzuzeigen, wie kompliziert ist es erst einen Reg Wert entsprechend abzufragen. Das geht in Batch und PS definitif einfacher.

    Das Ziel war doch ganz einfach, ich möchte in der GUI angezeigt bekommen, ob ein entsprechender Dienst läuft oder nicht, dachte das hätte ich erwähnt.

  • Ganz einfach, du benutzt die Variable $st auch außerhalb dieser Funktion.

    Aber da ich nun sehe wo du sie einsetzt musst du Zeile 29 löschen und Zeile 31 ändern: GUICtrlCreateLabel("CUSTOMIZING" & _StringRepeat(" ", 185) & "Local DB-Server: " & _SQL(), 10, 35, 980, 20)

    Weiterhin gewöhne dir Formatierungen und Einrückungen an.

    Auch scheint einiges keinen Sinn zu ergeben. Deine CheckX Funktion z.B. da ist die Abfrage nach $cGui[4] keinen Sinn, da du den gleichen Befehl auch ohne diese Bedingung ausführst. Siehe neue Verschachtelung im Code unten. Mein Fehler

    4 Mal editiert, zuletzt von Moombas (24. Januar 2022 um 10:39)

  • Das Ziel war doch ganz einfach, ich möchte in der GUI angezeigt bekommen, ob ein entsprechender Dienst läuft oder nicht, dachte das hätte ich erwähnt.

    Hier mal eine UDF von mir, kannst du dazu nutzen (Sie ist noch unvollständig, aber GetInfo funzt):

    Bsp.:

    AutoIt
    #include 'Service.au3'
    
    $sService = 'wuauserv'
    $sInfo = _Service_GetInfo($sService, '.', True)
    ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $sInfo --> " & $sInfo & @LF)
    Code: Console Ausgabe
    @@_Debug_line        54   var: $sInfo --> Disabled, Stopped, OK
  • PS: Wo ist die Syntaxeinstellung im Forum zu finden?

    Wie BugFix bereits schrieb :

    Wenn Du AutoIt-Scriptcode einfügen möchtest, verwende </> aus der blauen Liste im Header.

    Dann erscheint :

    Dort AutoIt wählen und [Speichern].

    Du kannst das auch nachträglich noch umstellen.

    (ich habe in Deinen Beitrag #27 die Syntaxhervorhebung mal von C zu AutoIt geändert)

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • @Mombas: Bingo, jetzt haut es hin, das mit den 3 unterschiedlichen Variablentyopen hier, hatte ich noch nicht ganz auf den Schirm, werd ich mich noch mal genauer mit befassen, auch die Formnatierungen gewöhn ich mir an. Recht herzlichen Dank noch mal an alle


    lg


    Chris

  • Eigentlich gibt es nur zwei Variablentypen: Local und Global und zusätzlich gibt es die Möglichkeit aus einer Variable, eine Konstante (Const) zu machen.

    Btw.: Wegen deines Dienstes mit der services.au3, die ich oben gepostet habe, mache ich das vom Pinzip her so:

  • Und die Localen gelten nur innehalb einer FUnktion, denk ich mal. Das mit der UDF werde ich direkt mal ausprobieren, dann könnte man das Ding ja auch direkt für andere Services weiter verwenden, die Frage wäre nur wie das in meinem Fall, in meinem Label aufgerufen werden würde. Also nach meinem Dafürhalten müsste es so gehen:

    AutoIt
    GUICtrlCreateLabel("CUSTOMIZING" & _StringRepeat(" ", 185) & "Local SQL-Server: " & Request_Service(MSSQL), 10, 35, 980, 20)

    Tut es aber nicht.

    Eine andere Sache wäre noch die der Aktualisierung. In meinem alten räudigen Batch musste ich nur Return kloppen und, so fern sich ein Dienst aktualisiert hat, ist es aktualisiert worden. In AutoIt scheint es hierfür keine Lösung zu geben oder? Dass heisst GUI beenden und neu starten wäre angesagt?


    lg und schöne Restwoche


    Chris

    3 Mal editiert, zuletzt von casi4712 (25. Januar 2022 um 09:58)

  • Hi,

    richtig "Locale" geht nur in einer Funktion, ansonsten sind sie trotz "Locale" Definition Global.

    Zum Einen müsste dein MSSQL ein String sein, also mit Anführungsstrichen: "MSSQL".

    Zum Anderen musst du sicherstellen, das der Dienst auch so heißt (kannst du in den Diensten (services.msc) nachschauen).

    Zu deinem Return: Nein das kannst du auch über die normalen GUI abfragen realisieren (hab da eine Lösung im Kopf, damit aber noch nie selber gearbeitet).

    Daher würde ich hierbei das Zepter gerne jemandem überlassen, der in AutoIt mehr mit GUI arbeitet als ich :)

  • In AutoIt scheint es hierfür keine Lösung zu geben oder? Dass heisst GUI beenden und neu starten wäre angesagt?

    Dein Aufbau ist einfach nicht optimal.

    1. GUI erstellen - Label ohne Inhalt

    2. Funktion erstellen, die Werte (Dienst) abfragt und Ergebnis dem Label zuweist (GUICtrlSetData)

    3. Funktion aufrufen bei Anzeige GUI

    4. Entweder ein durch User ausgelöster erneuter Funktionsaufruf (Button) oder

    5. Pollen der Funktion im Hintergrund (AdlibRegister) - auf vernünftiges Intervall achten

    NB

    Dauernd motzt du, warum das nicht so einfach ist, wie du willst und in Batch oder Sontwas ist das doch so einfach...!

    Wenn du AutoIt nutzen möchtest (niemand zwingt dich dazu), dann musst du dich auch auf die Sprache einlassen und dir zuallererst ein Grundwissen aneignen. Das wird dir mit jeder Spache so gehen.

    Da du anscheinend von Batch kommst, solltest du dich zuallererst mit dem Konzept von Funktionen vertraut machen und die in deinem Hinterkopf schwirrende "GoTo-Anweisung" dahin werfen, wo sie hingehört: auf den Scheiterhaufen der unglücklichen Programmierung. 8o

  • Hi casi4712,

    abgesehen davon, dass ich absolut hinter den Ausführungen und Empfehlungen von BugFix stehe, möchte ich dich nochmal bitten deinen aktuellen und vollständigen Code-Stand zu posten. Auch deine Abhängigkeiten, bspw. "Services.au3" oder "Service.au3", je nach dem was du nun verwendest.

    Warum:
    Damit wir besser helfen können. Ich möchte mir nicht immer erst deinen vermeintlichen Code-Stand zusammensuchen müssen 😉 . Respekt an Moombas an dieser Stelle, der dies offensichtlich tut 😁 .

    Stelle bitte einfach alles bereit (die Abhängigkeiten einfach als Anhang) und dann bekommst du sicherlich noch mehr und zügige Hilfestellung. Danke.


    Viele Grüße

    Sven