Default-Wert mit Enter übernehmen

  • Servus

    Vielleicht habe ich an anderer Stelle ([ offen ] Vorgaben in Input-Felder mit Enter übernehmen) zu speziell gefragt (Sackgasse?), aber weil ich nicht glauben kann, dass es dafür keine einfache ;) Lösung geben soll, hier nochmal allgemeiner gefragt:

    In einem GUI sollen Daten eingegeben/erfasst werden. Allerdings nicht in einer bestimmten Reihenfolge, sondern wie sie grad anfallen. Und vielfach gibt es Default-Werte - sei es auf Grund von Wahrscheinlichkeiten (ist zu 98% immer "xyz") oder weil sie sich von anderen Werten ableiten lassen (und es gibt Ausnahmen).

    Das Eintragen der Default-Werte ginge ja mit GUICtrlSetData und mit GUICtrlSetState($xyz, $GUI_FOCUS) könnte man den Focus setzen.
    Aber gibt es auch eine (andere s.o. ?) Möglichkeit, die Vorgabewerte einfach durch drücken der ENTERtaste zu übernehmen?
    (auch wenn AutoIt keine ausgewachsene Programmiersprache ist - die Vorgabe, ein Programm zB. in "C:\Programme" zu installieren könnte man ja dann auch nicht einfach mit ENTER "durchwinken").
    Sollte so eine Möglichkeit tatsächlich fehlen?
    Außerdem würde ich (programmtechnisch) gern erkennen, in welches Feld Daten übernommen wurden um davon abhängig weitere Funktionen anzustoßen - zB. prüfen, ob sich durch die Eingabe weitere Vorgabewerte ergeben, weiterreichen des Focus, etc.?

    Übrigens - es gibt noch keinen Code.
    Da ich noch Anfänger bin, trage ich erst die Umsetzungsmöglichkeiten zusammen. Hätte ja nicht viel Sinn, wild drauf los zu coden um am Ende feststellen zu müssen, dass einige Bausteine fehlen (etwa der obige).
    Und (weil ich schon an anderer Stelle gefragt wurde) nein, nicht das Schreiben des Programms ist gefragt, das Aufzeigen von Lösungsmöglichkeiten für dieses spezielle Problem reicht ;)

    Schöne Grüße
    entsel

    Falls es interessiert, was es am Ende werden sollte - eine kleine Projektverwaltung mit Baustellenadressen, Kontaktpersonen, Lieferadressen, Überwachung von Terminen etc.

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Ich schätze du hast da etwas an der Grund-Logik die bei den meisten Programmen mit Auto-Vervollständigung 'dahinter steckt' nicht verstanden... In deinem Programm brauchst du irgend eine Stelle, an der die Auto-Vervollständigung ausgelöst/aktiviert werden soll. Das heißt, das Script wartet bis, um bei deinem Beispiel zu bleiben, die Enter-Taste gedrückt wird und dann wird eine Funktion aufgerufen, die dann die Inhalte von Feldern vergleicht/anpasst/ergänzt usw... Das Script kann ja schließlich nicht von alleine wissen wann beziehungsweise was in welche Felder geschrieben werden soll usw. Deshalb muss diesen Teil, fast immer Programm spezifisch durchdacht und einprogrammiert werden. ;)

    LG
    Christoph :)

  • In einer GUI kann ja immer nur eine Aktion mit der ENTER-Taste passieren !

    Wen aber in den Eingabefelder alles mit korrekten Werten bereits gefüllt ist, könntest Du einen Button mit dem "Style" $BS_DEFPUSHBUTTON belegen. Dieser Button wird dann zum Default-Button, der mit ENTER ausgelöst werden kann.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    • Offizieller Beitrag

    Ich hatte dir in dem angesprochenen Thread eine Lösungsvariante gepostet. (deine letzte Frage dort hatte ich aber nicht mitbekommen ;))
    Aber diese stellt sich auch gar nicht, da den Inputs ja konkret Felder zugeordnet sind. In der WM_COMMAND wird erkannt welches Control den Fokus hat (verwaltet in einem Array), während ENTER betätigt wird. Dein Problem ist also bereits gelöst.

    EDIT:

    Ich habe dir die Lösung inklusive "Anschieben" weiteren Codes im Original-Thread gepostet.
    Bitte beachten: In Funktionen, die mit GuiRegisterMsg registriert werden, sollten keine Funktionen gestartet werden, die einen undefinierten Zeitablauf haben. (z.B. MsgBox enthalten oder Warten auf Usereingabe etc.)!
    Deshalb schalte ich in diesen Fällen boolsche Variablen als Trigger, über deren Status dann in der Hauptprogrammschleife die weiteren Funktionen aktiviert werden können.

  • Vielleicht noch ein Beispiel zur Klarstellung wie ich mir das vorstelle (es geht nicht um AutoVervollständigung)
    Es soll ein Name erfasst werden - zB. Müller Gerd:
    - Ich starte das Programm, gebe die Projektnummer ins entsprechende Feld - ENTER.
    - Aus einer INI-Datei werden die bereits vorhandenen Daten gelesen und an entsprechender Stelle eingetragen.
    - Ich klicke nun ins betreffende Eingabefeld und trag den NachNamen ein - Enter.
    - Jetzt wird geprüft, obs den Namen schon gibt (INI-Datei) und wenn er nur einmal vorkommt, wird "Gerd" ins entsprechende Eingabefeld geschrieben und der Focus dorthin weitergereicht. *)
    - Ein ENTER würde dann den Vornamen bestätigen (bewirkt aber rein gar nix, warum das nicht eingebaut ist, ist mir unverständlich), weitere Vorgabemöglichkeiten prüfen, und den Focus weiterreichen.
    Aber weils ja auch der Müller Thomas sein könnte, müsste man die Vorgabe auch überschreiben können.
    - Nun könnte weiter dessen Dienststelle vorgeschlagen werden - ENTER - die Adresse - ENTER -, usw..
    - Mit OK werden die Daten in die INI geschrieben und das Programm beendet.


    *) Idealerweise würde ich mehrere (für diesen Nachnamen) vorhandene Vornamen in einem Combofeld zur Auswahl angebieten, wobei man einen weiteren über dessen Edit-Feld hinzufügen können sollte. Dort kann ich zwar was reinschreiben, aber ein ENTER bewirkt auch da rein gar nix. (aber das hab ich auch an anderer Stelle bereits angesprochen)

    BugFix
    Nachdem ich meinen Text verfasst habe (stelle ihn jetzt trotzdem rein) sehe ich grad Deine Ergänzung - werd mal schauen, ob mein bescheidener Horizont dafür ausreicht.

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Hallo BugFix

    Mit Deinem Code kann ich jetzt meine Vorstellungen verwirklichen, auch wenn mir die Funktion WM_COMMAND nach wie vor unverständlich ist - genauso, wie die Tatsache, dass sowas AutoIt nicht eingebaut hat. 
    (In AutoLisp/DCL-(DialogControlLanguage) reicht dafür ein "allow_accept=true")

    Vielleicht magst Du noch dazu beitragen, dass etwas mehr Licht in meine trübe Birne kommt.

    [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)

    [/autoit]


    Nach meinem Verständis müßte die Funktion mit den 4 Parametern aufgerufen werden (?), es gibt aber nur mehr die Zeile

    [autoit]

    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

    [/autoit]


    in der "WM_COMMAND" vorkommt - und keine Parameter!?

    Deshalb ist es mir ein Rätsel, woher die Variablen $hWnd, $iMsg, $iwParam, $ilParam ihre Werte haben, ebenso wie die daraus resultierenden Variablen -
    z.B.

    [autoit]

    $iCode = BitShift($iwParam, 16) ; Hi Word.

    [/autoit]


    Ebenso bekommt $GUI_RUNDEFMSG nie einen Wert zugewiesen? Soll aber wohl nur eine Meldung raus/rückgeben?

    Auf das setzen des Focus mit

    [autoit]

    ControlFocus($hGUI, '', $aInput[$iNext][0])

    [/autoit]


    könnte ich wohl verzichten, weil ich das ja abhängig von der jeweiligen Eingabe mit

    [autoit]

    GUICtrlSetState($input3, $GUI_FOCUS)

    [/autoit]


    erledige - richtig?

    Die Spalte 1 im Array $aInput beginnt mit 3 (und nicht mit 0 oder 1) - Zufall ?
    und es gäbe noch weitere Fragen, aber das soll ja hier nicht in einem Lehrgang enden ...

    Vielleicht kannst mir die eine oder andere Frage noch beantworten, ansonsten nehm' ich's als gegeben ...


    Ja, und natürlich ein großes DANKESCHÖN für Deinen Code.
    Danke auch an Christoph und Micha.

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

    • Offizieller Beitrag

    Also zur Erklärung:
    GUIRegisterMsg registriert ein Callback Funktion. In Abhängigkeit von den verwendeten Windows-Nachrichten enthalten wParam und lParam Werte.
    Wenn du dich da informieren möchtest, lies am besten bei MSDN nach. Hier z.B. die Infos für WM_COMMAND
    $GUI_RUNDEFMSG braucht keinen Wert extra bekommen - ist eine Konstante. ;)
    Mit dem Fokus kannst du das natürlich ganz nach Bedarf händeln.