Eingabe in Inputboxen in Großbuchstaben wandeln

  • Hallo Leute, da ich von VBA komme, finde ich einiges in AutoIt schwieriger, oder bin nur zu doof.

    Gerade suche ich eine Möglichkeit, alle Eingaben/jeden Tastendruck sofort in Großbuchstaben zu wandeln.

    Habe bisher schon ControlSetText und GUICtrlSendMsg versucht, aber leider ohne Erfolg.

    Wie kann ich das Problem angeben, zumal es in AutoIt ja nur Messages gibt und keine zig Events pro Control (KeyPress, Click, Exit usw.).

    Bitte freundlich um Hilfe.

    • Offizieller Beitrag

    Du registrierst die Message, wertest die Eingabe aus und schreibst (bei Bedarf) die korrigierte Eingabe zurück:


    EDIT:

    Ich hatte schon viel zu kompliziert gedacht. StringUpper reagiert ja sowieso nur auf Buchstaben, eine vorherige Prüfung ist also sinnlos.

    C++
    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        Local $iIDFrom = BitAND($iwParam, 0xFFFF)           ; Low Word
        If $iIDFrom <> $cInput Then Return $GUI_RUNDEFMSG   ; Msg kommt nicht von zu kontrollierendem Input
        Local $sRead = GUICtrlRead($iIDFrom)                ; Inhalt Input lesen
        If StringLen($sRead) = 0 Then Return $GUI_RUNDEFMSG ; Input ist leer
        GUICtrlSetData($iIDFrom, StringUpper($sRead))       ; Text zurückschreiben in Inputfeld
        Return $GUI_RUNDEFMSG
    EndFunc  ;==>WM_COMMAND
  • Hi vielen Dank für die Antwort. Aber genau da liegt mein Unverständnis.

    Hier mal ein Auszug aus meinen Versuchen:

    Switch $nMsg

    Case $GUI_EVENT_CLOSE

    Exit

    case $txtKunde

    ;$txtKunde = StringUpper($txtKunde)

    controlsettext("",$txtkunde,$txtkunde,StringUpper($txtKunde))

    ;GUICtrlSendMsg($txtkunde,StringUpper($txtKunde),0,40)

    $txtKunde ist die Eingabebox (Textfeld)

    Leider alles ohne Erfolg, die Eingaben in Kleinbuchstaben bleiben klein.

  • Hallo BugFix,

    vielen Dank für deine Mühe. Doch leider klappt das zurückschreiben noch nicht. Außerdem reagiert die Umwandlung erst, wenn man die Inputbox wieder verläßt. Es muss aber jede Eingabe sofort in Großbuchstaben in der Box stehen. Beispiel, ich tippe ein "tkm" und in der Box erscheint "TKM"

    Hier noch mal der komplete Code, der nur ein Gerüst ist:

    • Offizieller Beitrag

    Es geht NUR mit GuiRegisterMsg($WM_COMMAND, 'WM_COMMAND')!

    Du kannst nicht auf die GUIMsg(Inputfeld) reagieren. Das hatte ich doch schon in meinem ersten Beitrag geschrieben. Hast du mein Bsp. überhaupt getestet?

    Ich habe deinen Code mal angepasst (und etwas schlanker gemacht):

  • Hi, super. Das funktioniert. Ist aber extrem aufwändig und ich überlege aus diesem Grund, AutoIt schnell wieder den Rücken zu kehren und mir eine logischere Programmiersprache zu suchen.

    Vielen Dank für deine Geduld und Mühe.

    • Offizieller Beitrag

    Ist aber extrem aufwändig und ich überlege aus diesem Grund, AutoIt schnell wieder den Rücken zu kehren und mir eine logischere Programmiersprache zu suchen.

    Das soll aufwändig sein? :rofl:

    Mit folgendem AutoIt-Code wird eine GUI mit Standardschaltflächen angezeigt und auf den Close-Button reagiert:

    C++
    GUICreate()
    GUISetState()
    Do
    Until GUIGetMsg() = -3

    Nur 4 Zeilen!!

    Nun mach dasselbe mal in C / C++. Würde so aussehen:

    Soviel zum Thema Aufwand.

    "logischere" ? - Was ist das denn für eine Wortschöpfung? Entweder logisch oder unlogisch. Und Programmiersprachen können per se niemals unlogisch sein - nicht mal Brainfuck. :P

  • Ok, 1:0 für dich.

    Aber in VBA brauche ich für mein Sache mit den Großbuchstaben trotzdem nur eine Zeile Code.

    z.B. so:

    Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    TextBox3.Value = UCase(TextBox3.Value)

    End Sub ===> für Eingaben die per Strg.+V reinkommen

    UND

    Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    KeyAscii = Asc(UCase$(Chr$(KeyAscii)))

    KeyAscii = keycheck(KeyAscii)

    End Sub ===> für normale Tastatureingaben mit Check auf erlaubte Zeichen

    • Offizieller Beitrag

    Man kann das auch in AutoIt noch verkleinern:

    Edit: Oder als Einzeiler:

    Das fördert aber nicht gerade die Lesbarkeit. :rolleyes:

  • Du kannst das in AutoIt auch eventbasiert lösen, aber AutoIt bietet halt nicht diese komfortable Eventregistrierung wie vba/.NET und co.

    Zudem reagiert es auch nur auf druck der Entertaste dabei, aber ansonsten ist es das selbe wie in vba.

  • Oder als Einzeiler:

    Das sind aber zwei Zeilen... :evil:

    Code
    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        Return BitAND($iwParam, 0xFFFF) = $cInput And BitShift($iwParam, 16) = $EN_CHANGE ? Not GUICtrlSetData($cInput, StringUpper(GUICtrlRead($cInput))) : $GUI_RUNDEFMSG
    EndFunc   ;==>WM_COMMAND
  • Ok, das sieht doch vielversprechend aus und ich gebe der Sprache noch eine Chance, smile.

    Ja, ich bin Eventbasiertes programmieren gewöhnt und muss hier total umdenken. Mein Tool ist unter Excel mit VBA komplett fertig und läuft seit über einem Jahr bei uns in der Firma und dient zum Ausdrucken von kommissionierten Artikeln samt Seriennummer und Etiketten für die Pakete (reine Kennzeichnung, bevor DHL Aufkleber drauf kommen).

    Grund ist, ich will und muss weg von dem Excelunterbau, hin zu was eigenständigem. VB.NET geht auf Grund von Lizenzen und Kosten nicht. Deshalb suche ich etwas, wo man schnell und einfach GUI's erstellen kann und dieser GUI schnell eine Logik verpassen kann.

    Viele Grüße, Frank