Exitloop wird nicht ausgeführt...

  • Moinsen

    Ich komme mit einem Script leider nicht weiter. Auf 2 Rechnern wird der loop ordnungsgemäß verlassen und auf einigen anderen nicht. :/

    Alle Rechner laufen mit Win7. Es geht um die 2. Bedingung. Die 1. und die 3. werden auf allen Rechnern ordnungsgemäß verlassen.

    (Sorry, bin noch Autoit-Anfänger, der nun etwas ratlos ist.^^)

    Hier der elementare Teil des Scriptes:

    • Offizieller Beitrag

    Oui, oui, oui :huh:

    bevor ich irgendwie näher auf dein Problem eingehe: Schau dir bitte mal die Bsp. zu GuiCreate etc. an.

    Du erstellst in einer Schleife immer wieder GUI und Controls! Das macht man einmalig vor dem Mainloop.

    Alle anderen Probleme resultieren mit Sicherheit daraus.

    Was soll übrigens dein While 1, While 2, ... bedeuten? Ich vermute dir ist die Funktion der Schleifen nicht ganz klar. Du brauchst nur eine einzige Schleife in der du alle Ereignisse auswertest.

  • Thx BugFix für deine Aufmerksamkeit. Mir ist schon bewust, dass mein Konstrukt nicht optimal ist. Dafür werkelt das schon seit 12/2016 zuverlässig jeden Werktag auf 2 Rechnern. Nun soll ein weiterer Rechner dazu und genau auf dem geht es nicht....warum auch immer.

    Mit der einen Schleife verstehe ich (logischerweise) nicht. Ich muß doch bei jedem Eingabefeld auf den input warten um dann zum nächsten Eingabefeld zu springen, oder? Wie kann ich das mit einer Schleife erledigen?

    • Offizieller Beitrag

    Hier mal ein Skript aus meiner Sammlung, zum Wechseln von Ctrl zu Ctrl mittels ENTER.

    Das Skript arbeitet im OnEventMode. Da kannst du deine Aläufe entsprechend anpassen und integrieren.

  • Mir ist schon bewusst, dass mein Konstrukt nicht optimal ist. Dafür werkelt das schon seit 12/2016 zuverlässig jeden Werktag auf 2 Rechnern.

    Die Qualität des 'Konstruktes' lasse ich auch erst mal außen vor :P.

    Möglicherweise bin ich gerade etwas begriffsstutzig, aber was genau werkelt da vor sich hin ?

    - Du hast drei Eingabefelder, die Du nach gewissen Regeln prüfts (also EAN=13 Stellen usw.)

    - entspricht die Eingabe nicht der jeweiligen Regel, dann wird das Feld auf 'leer' gesetzt.

    So weit, so gut - aber was passiert dann mit den Werten ?

    Zur Zeit kann man das Skript lediglich per $GUI_EVENT_CLOSE ([X]) verlassen.

    (Nebenbei : handelt es sich um das komplette Skript, oder um eine verkürzte Testvariante ?)

    Auf 2 Rechnern wird der loop ordnungsgemäß verlassen und auf einigen anderen nicht.

    Irgendwelche (Fehler-)meldungen ?

    Gruß Musashi

    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."

  • BugFix

    Boa, da werde ich mich reichlich nachschulen müssen, um dein Script-Vorschlag zu verstehen, aber ich werde es versuchen. (darf ich ja in der Arbeitszeit)

    Musashi

    ja ja, kloppt ruhig auf mich ein. 8o Ich bin halt noch echt am Anfang. Im Dez. 2016 hab ich ein Script "gepopelt", was bis heute in unserem Betrieb extrem wichtig ist.

    Die Aufgabe des kompletten Scriptes ist folgende:

    Von einem Sack mit z.B. Zucker werden folgende Strichcodes genommen:

    --> EAN (GTIN) für die Endverbraucherpackung

    --> Charge für die Rückverfolgbarkeit

    --> Menge der zu druckenden Etiketten

    (In meinem verkürzten Testscript habe ich nur mein akutes Problem eingekreist.)

    Die Werte werden an eine Warenwirtschaft übergeben und dann "on the fly" die Artikeletiketten gedruckt. Das machen wir seit Jahren und mein "Super-Script" arbeitet

    vllt. schmutzig, aber sehr effektiv. Ein Hoch auf AutoIt! :klatschen:

    Die Prüfung der Werte ist natürlich notwendig, dass keine falschen Eingaben möglich sind. Fehlermeldungen gibt es, auch bei den nicht funktionierenden Rechnern, nicht.

    Es bleibt einfach bei dem Feld Charge, liest ein, Cursor am Ende der Charge und das war es.

    Edit:

    Die Loops bei EAN und Menge werden ausgeführt.

    Einmal editiert, zuletzt von kyloe (14. August 2019 um 10:38)

  • Musashi

    ja ja, kloppt ruhig auf mich ein. 8o Ich bin halt noch echt am Anfang. Im Dez. 2016 hab ich ein Script "gepopelt", was bis heute in unserem Betrieb extrem wichtig ist.

    Niemand 'kloppt' auf Dich ein :P.

    Dass es sich um ein verkürztes Testskript handelt und dass es um das Einlesen von Barcodes ging, hatte ich mir bereits gedacht - lag ja auch nahe.

    Ein Lesegerät sendet die Inputs wahrscheinlich an die GUI als wären es Tastatureingaben.

    Funktioniert das auch mit dem Testskript (bei den PC's wo es generell läuft) ? Falls ja, könnte man diesen Teil optimieren und später in das 'echte' Skript übernehmen.

    Gibt es ein identisches Fehlverhalten auf den Problem-PC's ?

    Wie unterscheiden sich die Problem-PC's bzgl. Betriebssystem, 32-Bit/64-Bit, Treiber(Lesegerät) usw. von den anderen ? Möglicherweise liegt ja auch hier der Hund begraben.

    Gruß Musashi

    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."

  • Diie Analyse von:

    lässt nur 2 Schlüsse zu:

    1. Die Eingabe erfolgt nicht in $Input2 (unwarscheinlich, da es in den beiden anderen Inputs ja klappt)
    2. Der StringRegExp löst einen Error aus (auch unwarscheinlich, da es an 2 anderen Arbeitsplätzen klappt)

    Um das Geheimnis zu lüften kannst du zu Debugzwecken MsgBoxen einbauen:

    mfg (auto)Bert

  • Musashi

    Lasse ich das Testscript auf den 2 "guten" Rechnern laufen - tut ... auf den Problem-PC stoppt es immer bei "Charge".

    PCs sind alle Win7 64bit, aber die Lesegeräte (Scanner) sind unterschiedlich. Ich hab dann mal einen Scanner vom Gut-PC an einen Problem-PC gehangen und....

    ...es tut!

    Im Notepad++ hab ich gesehen, dass der eine "gute" Scanner mit "TAB" terminiert, der andere mit "CR LF". (meine Verwirrung wächst^^)

    Genau das "CR LF" machen auch meine anderen Scanner, aber mit denen funktioniert es nicht. Leider lassen die sich nicht zu einem Termination-String "single TAB" überreden.

    Die Tage bekomme ich 2 weitere Scanner, die ich dann hoffentlich zu einer brauchbaren Zusammenarbeit überreden kann.

  • autoBert

    Ich hab das mal so übernommen, aber auf den Problem-PCs stellt sich das wie im screen dar. Es erfolgt einfach kein exitloop.

    (NB: nehme ich als "Charge" ein falsches Format, greift der regex wie er soll.)

  • Versuche doch mal nachzusehen wie $Charge aussieht, also nach der Zeile $Charge = GuiCtrlRead($Input2)

    einfach mal eine Mesagebox einfügen Msgbox(0, "Input2", $Charge,3)

    Wenn hier dein erwartetes Ergebnis rauskommt, aber evtl zweizeilig ist oder sonst irgendein Zeichen zuviel dranhängt,

    könntest du dir damit behelfen, nach der Zeile $Charge = GuiCtrlRead... folgende Zeile einzufügen

    $Charge = StringLeft($Charge,8), denn deinem Script nach zu urteilen sollte $Charge immer 8 Zeichen lang sein, dann sollte es

    auch mit dem schlechten Scanner funktionieren.

  • Dann ändere einmal zu:

    Außerdem noch die beiden aderen sleeps etfernen, da unnötig.

    Falls die MsgBox EXITLOOP erscheint sich aber trotzdem nichts tut einfach die letzte Zeile aktivieren. ContrrolClick verwendest du ja auch um in das Input für Charge zu wechseln.

    mfg (auto)Bert

    Einmal editiert, zuletzt von autoBert (14. August 2019 um 16:47)

  • Im Notepad++ hab ich gesehen, dass der eine "gute" Scanner mit "TAB" terminiert, der andere mit "CR LF". (meine Verwirrung wächst^^)

    Genau so etwas hatte ich erwartet, also ein vom jeweiligen Lesegerät abhängiges Verhalten.

    Hier Dein Originalcode mit einigen Konsolenausgaben des Editors (also im Editor starten F5) :

    Ich bin mir aber nicht sicher, ob Binary(GuiCtrlRead($Input1) die Terminierungssequenz anzeigt :/.

    Alternativ könntest Du auch einfach auf die passenden Scanner warten, aber das wäre aus Sicht eines Programmierers natürlich Ketzerei :D-

    Gruß Musashi

    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."

  • Musashi

    schon mal vorab das debug:

    @@ Debug : $ean = <4250615119604>

    @@ Debug : $ean Binary = <0x34323530363135313139363034>

    @@ Debug : $charge = <143291HU>

    @@ Debug : $charge Binary = <0x3134333239314855>

    @@ Debug : $menge = <1>

    @@ Debug : $menge Binary = <0x31>

  • Bin mir mittlerweile sicher das du Menge so wie Charge (dort macht du es) vorbereiten solltest:

    Code
        ControlClick("Eti-Scan", "", "[CLASS:Edit; INSTANCE:3]")
        ControlSetText("Eti-Scan", "", "[CLASS:Edit; INSTANCE:3]", "")

    Der ControlClick setzt den Eingabecursor, das leere Eingabefeld scheint erwünscht.

    mfg (auto)Bert

  • autoBert

    Hab ich gemacht, aber der Effekt ist der Gleiche: Der Loop wird nicht beendet. :(

    Was funktioniert, aber wirklich ganz, ganz schmutzig ist (ich trau mich kaum und will das nicht wirklich :| )

    (Da wird der Loop nach dem "else" beendet)

    Dann ändere einmal zu:

    Außerdem noch die beiden aderen sleeps etfernen, da unnötig.

    Falls die MsgBox EXITLOOP erscheint sich aber trotzdem nichts tut einfach die letzte Zeile aktivieren. ContrrolClick verwendest du ja auch um in das Input für Charge zu wechseln.

    mfg (auto)Bert

  • schon mal vorab das debug:

    OK, Danke - so geht es also schon mal nicht :( (blöd wenn man kein Referenzgerät zum Testen hat).

    Gruß Musashi

    EDIT : BugFix - Wäre dieser Thread ggf. nicht besser in H&U aufgehoben ?

    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."

    Einmal editiert, zuletzt von Musashi (14. August 2019 um 17:08)

  • Danke, hatte ich schon mal gemacht - alles gut. Es sind ja die Steuerzeichen, die vermutlich Probleme machen.

    Was ich immer noch nicht verstehe: Warum geht es mit dem exitloop nach dem else bei den Inputs "EAN" und "Menge", aber nicht bei Charge?

  • Was ich immer noch nicht verstehe: Warum geht es mit dem exitloop nach dem else bei den Inputs "EAN" und "Menge", aber nicht bei Charge?

    Nach EAN wird der Cursor mit CotrolClick auf das Chargen-Input gesetzt

    Nach Menge wird die GUI gelöscht und neu aufgebaut, Cursor ist daher in EAN.

    Wenn du nach Charge den Cursor mit ControlClick auf Menge setzt funktioniert auch das.

    mfg (auto)Bert

  • So, thx @ all - Mein 3. Rechner läuft als Arbeitsplatz zum Etikettendruck zumindest aus Bedienersicht einwandfrei. ;)

    Sorry nochmal an BugFix für meinen abartigen Code (sehe ich auch so) ... ich hoffe, ich darf wiederkommen. ^^

    Musashi thx für die Anregung für den binär-Code aus dem Scanner. Da werde ich mich näher mit beschäftigen (müssen).

    lg