For-Schleife funktioniert nicht

  • Steht doch im ersten Satz drin! Hab mir das Skript jetzt vom anderen Rechner gemailt. Mal eben rüberlaufen ist bei dem Rechner nicht, der steht 100km weg in einem alarmgesicherten Gebäude! :thumbdown:

    Hab inzwischen alles selber gelöst. Freigabe und Sperrung des Buttons funktionieren tadellos, gespeichert wird erst nach If-Abfrage ob in den Comboboxen was drin steht.
    Checkbox wurde integriert und die Löschung erfolgt nur wenn nicht im Input und der dritten Combobox der gleiche Inhalt steht. Zusätzlich wird auch nur gelöscht, wenn die Datei überhaupt existiert. Es gibt zwar keine Fehlermeldung beim löschen einer nicht vorhandenen Datei, aber ich finde das so sauberer gecodet.
    Ich könnte den Button auch nach dem anklicken wieder disablen bis man die Comboboxen verändert hat... wär zusätzlich auch eine Überlegung wert.

    Dafür hab ich ein neues Problem eingebaut. Ich hätte das Input Feld gerne READONLY.
    Wenn ich dem Feld diese Eigenschaft zuweise (SetStyle... $E$_READONLY) fängt die komplette GUI an wild zu flackern, es legt sich beim berühren des Input-Feldes mit der Maus ein großer grauer Kasten über die GUI, der vorrübergehend und nur teilweise verschwindet, wenn man in den Comboboxen was auswählt. Die Checkbox verschwindet im grau und taucht auch nicht wieder auf.
    Werd am Montag das ganze erstmal mit der neuesten Beta probieren. Scheint mir ein Bug zu sein.
    Oder hängt das mit dem Aufbau oder dem Aufruf der GUI im Skript zusammen?

    Das funktionierende Skript ohne Geflacker sieht nun so aus:

    Wie man an der auskommentierten Zeile sieht hab ich zuerst den Input disabled. Das sieht allerdings doof aus. Gräuliche Schrift auf grauem Grund. Wenn das Feld readonly ist dann ist es zwar auch grau aber die Schrift bleibt wenigstens schwarz und ist gut lesbar.

    Wenn das geschafft ist fehlt nur noch eine Beschriftung bei den Comboboxen auf der GUI. Muss mich mal einlesen, wie man nen Text auf die GUI frickelt. Kann so schwer ja nicht sein. In den Comboboxen selbst möchte ich das nicht drinstehen haben, das sieht wieder doof aus.

    • Offizieller Beitrag

    Das mit dem flackern liegt sicherlich daran, dass Du die Höhe der Control-Elemente weglässt.
    Das ist zwar zulässig, aber nicht immer zuverlässig. ;)
    Und ganz besonders dann nicht, wenn man dem Control-Element ein Style (z.B. $ES_READONLY) verpasst und dabei vergisst, dass da die Höhenangabe fehlt.
    Dann wird nämlich der Wert von $ES_READONLY als Höhenangabe interpretiert.

    Außerdem kann man ein READONLY-Input durchaus auch einen weißen Hintergrund zuweisen:

    AutoIt
    $iInputValue = GUICtrlCreateInput("", 10, 40, 380, 20, $ES_READONLY)
    GUICtrlSetBkColor(-1, 0xFFFFFF)

    Und Text auf die GUI bekommt man mit GUICtrlCreateLabel.

    Edit: Die folgende Zeile wird vermutlich anders interpretiert als Du das willst:

    AutoIt
    If Not GUICtrlRead($iInputValue) <> GUICtrlRead($iComboXYZ) Then

    Hier wird als erstes "Not GUICtrlRead($iInputValue)" ausgewertet, weil NOT die höchste Priorität unter den Operatoren besitzt. Dabei kommt TRUE/FALSE raus (je nachdem, ob etwas im Input steht oder nicht) und das wird dann mit dem Inhalt von $iComboXYZ verglichen.
    Ich denke mal das ist anders gemeint, oder?
    Wenn ja, dann entsprechend Klammern setzen oder gleich das NOT weglassen und "=" anstelle von "<>" benutzen.

  • Danke für die Erleuchtung. Hab eben nicht alles nachgeprüft, was der Kollege mir vorgekaut hat. Die GUI hab ich ja nicht selbst entwickelt. Hätte aber vielleicht den gleichen Fehler gemacht, wenn in der Hilfe nichts darüber steht welche Angaben zwingend vorhanden sein müssen.
    Die If Not-Abfrage ist zwar tatsächlich anders gemeint, aber im Endeffekt kommt es aufs gleiche raus (oder etwa nicht?). Zumindest klappt das meinen bisherigen Tests zufolge tadellos. Ich hatte am Anfang ein Gleichheitszeichen drin, das hat aber nicht funktioniert (wohl wegen der Priorität von Not).
    Kanashius hat mich dann mit seinem Code-Beispiel auf die Idee mit <> gebracht.
    Wie kann ich denn das Not weglassen? Es soll doch die Datei nur dann gelöscht werden, wenn im Input und der Combobox unterschiedliche Angaben stehen (also NICHT das gleiche). So wie es dasteht hat es so funktioniert wie ich es haben wollte.

    Hmmm... nur so als kleines Gedankenspiel: wenn ich den Input disable statt auf readonly zu setzen und die Hintergrundfarbe als weiß setzte sofern das geht, würde dann ohne die zusätzlichen Angaben auch wieder die GUI rumflackern oder würde es funktionieren? :D

  • Nach weiterem frohen basteln ist nun folgendes daraus entstanden:

    Die Befüllung der dritten Combobox habe ich abgeändert, da die Funktion

    AutoIt
    _GUICtrlComboBox_AddDir($iComboXYZ, @ScriptDir & "\" & "*.xyz")


    nach dem hinzufügen der Styles plötzlich nicht mehr funktioniert hat.

    Hier noch ein kleines Skript, um Daten zu erzeugen, die das obige Skript dann einlesen kann. Zuerst das hier starten und danach das große Skript oben. Dann kann das Ding in vollem Umfang getestet werden, falls jemand genügend Langeweile hat. :P

    Einmal editiert, zuletzt von fred08155 (16. Juli 2015 um 09:08)

  • Es funktioniert fast perfekt, doch bei einer Datei verweigert das Programm die Löschung standhaft. Eine der Dateien enthält im Namen einen Bindestrich. Wenn ich diese auswähle und die Checkbox abhake wird die Datei nicht gelöscht, bei allen anderen Dateien funktioniert es problemlos.
    Ich dachte ich hätte noch irgendwo nen Fehler im Skript und habe die Funktionen der Cases $iCheckbox und $iButtonSave umformuliert (mal mit GUICtrlRead oder mit GUICtrl_GetState) aber daran scheint es nicht zu liegen.
    Ist das irgendein bekannter Bug? Wenn ja - gibt es die Möglichkeit den zu umgehen?

    [EDIT]
    Hat sich erledigt. Hab nochmal in der Hilfe nachgeschlagen und dann diese spezielle hartnäckige Datei geprüft und dabei festgestellt, dass genau diese eine Datei das Attribut "schreibgeschützt" hat. :rofl:
    Werde also das Skript noch derart abändern, dass automatisch der Schreibschutz vor dem löschen entfernt wird.
    Eine If-Verschachtelung mehr und das sollte das Problem dann beheben. :thumbup:

    Einmal editiert, zuletzt von fred08155 (18. Juli 2015 um 08:06)