"Formularabfrage" oder "Array-Ausgabe lässt sich nicht verwenden"

  • Hallo Leute,

    bei der Abfrage eines Formulars bin ich auf ein Hindernis gestossen, das mich derbe aufhält. Dazu habe ich euch mal ein kleines Beispiel eingestellt:

    Spoiler anzeigen

    Das Programm stellt ein Formular dar, in welchem Menüpunkte angeklickt werden können. Nach dem Betätigen des Buttons (dazu bitte runterscrollen) sollen die ausgewählten Felder an das nächste Programm übergeben werden.
    Ein Hinweis zum Programmcode: dieser wird durch ein weiteres Programm on the fly generiert, daher bitte nicht so sehr auf das statische Aussehen konzentrieren.
    Das Problem liegt im Unterprogramm '_AskFormular()', ganz am Ende. Zuvor wird in '_CollectThemes()' ein eindimensionales Array '$atb_all' generiert, welches die Strings aller verwendeten Buttons beinhaltet (ist wieder aus einem Programm heraus geschehen, daher der simple Code, funktioniert aber...). Dieses Array wird hier zu Debugging-Zwecken kurz angezeigt. Bitte wieder schliessen, dann funktioniert auch das Formular. Wenn im Formular einige Punkte ausgewählt werden, sollen die restlichen Zeilen aus dem Array '$atb_all' gelöscht werden. Dafür ist das Unterprogramm '_AskFormular()' da. Theoretisch...
    Der Gedanke war der, das Array der Reihe nach mit GUICtrlRead abzufragen und immer wenn der Wert ungleich 1 ist (der Button also nicht aktiviert ist), diese Zeile mit _ArrayDelete zu löschen. Am Ende sollte das _ArrayDisplay ('Nur aktivierte Boxen?') dann nur die aktivierten Schalter zeigen. Leider ist es aber leer :(
    Soweit ich es analysieren konnte, liegt das Problem wohl am Ausdruck in den Klammern des GUICtrlRead. Dort wird nicht der Inhalt des Arrays dargestellt, sondern nur '-1', also 'nicht existend'.

    Was mache ich hier falsch?

    Gruß

    Albie

    • Offizieller Beitrag

    In Deinem Script befinden sich diverse Fehler!
    Als Erstes aber der Hinweis, dass Du für die Radio-Button gleich Arrays verwenden solltest, dann ersparst Du Dir eine Menge Code.

    Aber um bei Deinem Script zu bleiben:
    1. Du "addierst" Strings zu Deinem Array ($atb_all) und nicht den Wert (die Control-ID) der Variablen. Der wäre aber erforderlich, um den Status der Radiobuttons auszulesen.
    2. Beim "löschen" der Array-Einträge gehst Du vorwärts durch das Array, das führt aber zwangsläufig zum Abbruch des Scripts, weil der Array-Bereich überschritten wird.

    Ich habe mal ein paar Änderungen vorgenommen, sodass es wie gewünscht funktioniert (schöner wäre es gleich mit Arrays s.o. zu arbeiten):

  • Hallo Oscar,

    deine Antwort war ja schon rekordverdächtig schnell ;) Besten Dank!

    Deinen Tipp, das Fomular mit Arrays aufzubauen, werde ich mir noch zu Gemüte führen. In diesem Fall hier wird eine Konfigurationsdatei ausgelesen und daraus automatisch das passende Formular erstellt. Da das Formular dann eh vermutlich nur einmal benutzt wird, war mir der Umfang des endstehenden Codes erstmal zweitrangig. Außerdem drängt wie immer die Zeit... Für das nächste Mal habe ich nun ja wieder eine Anregung :)

    Du hast die While-Schleife durch eine For-Next-Schleife ersetzt. Diese hatte ich auch zunächst drin, bin aber aufgrund meines (fehlerhaften) Vorwärtsgehen beim Löschen aber auf Probleme gestossen, die ich versuchte zu umschiffen. Das mit dem BitAND muss ich erst noch durchdenken. Du hast hier nur einen Wert angegeben (GUICtrlRead($atb_all[$i]), $GUI_CHECKED), nicht aber zwei (oder mehr), wie im Manual angegeben. Das Ergebnis dieser Operation muss ich noch mal an Beispielen ausprobieren. Aber dies hier funktioniert ja prima.
    Auf 'ControlGetText' wäre ich übrigens nicht so ohne weiteres gekommen, weil mich hier der Hinweis auf eine Fensteroperation irritiert hätte. So habe ich aber wieder etwas dazu gelernt. Danke.

    Gruß

    Albie

    • Offizieller Beitrag

    Der Reihe nach:
    - Die For...Next-Schleife muss rückwärts (vom höchsten Wert nach Null) durchlaufen werden, damit beim löschen der Array-Einträge nicht alles "nach vorne rutscht" und dadurch einen Array-Fehler auslöst.
    - Die Abfrage der Buttons sollte immer mit BitAnd passieren, da so ein Button mehrere Status haben kann. Mit BitAnd wird eine logische Bit-Verknüpfung des Status mit $GUI_CHECKED durchgeführt. Als Ergebnis erhält man Null oder den Wert von $GUI_CHECKED. Genau genommen müsste man jetzt noch einen Vergleich mit $GUI_CHECKED machen, um TRUE oder FALSE zu erhalten. AutoIt interpretiert aber Null als FALSE und jeden anderen Wert als TRUE, weshalb man hier (If-Anweisung) das "= $GUI_CHECKED" weglassen kann.
    - Die Werte, die beim erstellen der Buttons zurückgeliefert werden, sind die Control-IDs der jeweiligen Buttons. Damit kann man dann Änderungen vornehmen oder den Status auslesen. Wenn Du aber den Text des Buttons auslesen willst, dann über ControlGetText.

  • Du kannst übrigens auch in deinem Script eine Datei einlesen und dazu passend die Controls erstellen.
    Dafür musst du nicht jedesmal ein neues Programm schreiben ;)

    Was du dafür brauchst:
    -Arrays
    -FileReadToArray (Oder je nachdem, wie die datei aufgebaut ist etwas anderes)

    Dann kannst du einfach mit Schleifen durchlaufen:
    Beispieldatei:

    Code
    name|Erste Umfrage
    combo|Dies|oder|das
    check|akzeptiert
    radio|radio1|radio2|radio3
    input|Name:|hier name


    Code:


    Das nur mal als Beispiel (kann sein, dass noch irgendwo tippfehler sind, bin auf linux und konnte deshalb nicht testen).
    So oder so ähnlich, je nachdem, wie deine Anforderungen sind, kann man das umsetzen.

    MfG Kanashius

  • Kanashius:
    ein paar kleine Fehler haben sich tatsächlich in dein Script eingeschlichen, aber das Prinzip ist klar. Die Ideen habe ich aufgenommen. Mittlerweile entdecke ich immer mehr tolle Befehle in Autoit, so dass ich mein Progrämmchen mittlerweile ganz anders aufbauen würde. Jetzt mache ich es aber erstmal so wie es ist fertig. Für Version 2.0 könnte ich mir dann aber schon ein paar grundlegende Anpassungen vorstellen. Aber so ist es ja immer...

    @ Oscar:
    besten Dank für die Infos. Wenn man es sieht, sind die Vorgehensweisen simpel und logisch, man muss nur erstmal dran denken. Nun habe ich wieder was gelernt.

    Kurz eine abschließende Frage:
    wo muss ich denn nachschauen, wenn ich ein Fenster mit erstellen möchte, in welchem zwei Arbeitsbereiche angelegt sind, welche ich innerhalb des Fensters in ihrer Größe verändern möchte? Also: z.B.: das Fenster der Autoit-Hilfe. Der linke Teil ist vom rechten senkrecht getrennt und diesen Bereich kann man verschieben. Gibt es dafür einen Befehl oder eine UDF?

    Gruß

    Albie