Inputbox nur Dezimalzahlen

  • Hallo Zusammen,

    gibt es ein Inputstil für Dezimalzahlen?

    Ich wollte, daß bei einer Inputbox nur Dezimalzahlen ( Währung? z.B. 34,56) erlaubt sind!
    Gefunden hab ich aber nur $ES_NUMBER das bringt mich aber nicht weiter!
    Oder muß ich da irre Abfragen konstruieren?

    :/

    • Offizieller Beitrag

    Oder muß ich da irre Abfragen konstruieren?


    Nicht sehr irre. :D

    Spoiler anzeigen
    [autoit]

    $hGui = GUICreate('Test')
    $cInput = GUICtrlCreateInput('', 20, 20, 150, 20)
    $hInput = GUICtrlGetHandle($cInput)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GuiRegisterMsg($WM_COMMAND, 'WM_COMMAND')

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $hWndEdit, $sRead, $iCode
    $iIDFrom = BitAND($iwParam, 0xFFFF)
    $iCode = BitShift($iwParam, 16)
    $hWndEdit = GUICtrlGetHandle($iIDFrom)
    If $hWndEdit = $hInput And $iCode = $EN_CHANGE Then
    $sRead = GUICtrlRead($iIDFrom)
    If Not StringRegExp($sRead, '^\d+,?(\d+)?$') Then
    GUICtrlSetData($iIDFrom, StringLeft($sRead, StringLen($sRead)-1))
    EndIf
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]


    Edit:
    Aber denk dran, dass man mit Komma in AutoIt nicht rechnen kann. Du kannst es in der Anzeige verwenden musst aber zum Rechnen in Punkt umwandeln. ;)

  • Auch wenn ich in dem Kommentar keine konkrete Frage rauslesen kann gehe ich einfach mal davon aus, dass du damit ein Problem hast, dass das Skriptbeispiel von BugFix nicht lauffähig ist.
    Der Grund ist einfach nur, dass ein paar Includes für die Konstanten nicht mit gepostet wurden.
    So würde das Beispiel vollständig lauten:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate('Test')
    $cInput = GUICtrlCreateInput('', 20, 20, 150, 20)
    $hInput = GUICtrlGetHandle($cInput)
    GUISetState()
    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $hWndEdit, $sRead, $iCode
    $iIDFrom = BitAND($iwParam, 0xFFFF)
    $iCode = BitShift($iwParam, 16)
    $hWndEdit = GUICtrlGetHandle($iIDFrom)
    If $hWndEdit = $hInput And $iCode = $EN_CHANGE Then
    $sRead = GUICtrlRead($iIDFrom)
    If Not StringRegExp($sRead, '^\d+,?(\d+)?$') Then
    GUICtrlSetData($iIDFrom, StringTrimRight($sRead, 1))
    EndIf
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]
  • Das funktioniert aber leider nicht richtig, wenn man nachträglich in die Box klickt, um etwas zu ändern, da dann immer das letzte zeichen gelöscht wird.
    Man könnte natürlich den RegExp nutzen, um das zu beheben... (da ich nicht so gut in regexp bin hab ich das etwas anders gelöst):

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>

    [/autoit] [autoit][/autoit] [autoit]

    global $oldInput
    $hGui = GUICreate('Test')
    $cInput = GUICtrlCreateInput('', 20, 20, 150, 20)
    $hInput = GUICtrlGetHandle($cInput)
    GUISetState()
    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $hWndEdit, $sRead, $iCode
    $iIDFrom = BitAND($iwParam, 0xFFFF)
    $iCode = BitShift($iwParam, 16)
    $hWndEdit = GUICtrlGetHandle($iIDFrom)
    If $hWndEdit = $hInput And $iCode = $EN_CHANGE Then
    $sRead = GUICtrlRead($iIDFrom)
    If Not StringRegExp($sRead, '^\d+,?(\d+)?$') Then
    GUICtrlSetData($iIDFrom, $oldInput)
    else
    $oldInput=$sRead
    EndIf
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]
  • Ich hab mir das mal angeschaut!
    Da ich eigentlich nur Makros programmiere, habe ich doch ein Verständnisproblem! :?:

    Wie wird eigentlich das Control übergeben? und wie funktioniert so was mit einem Array (Input)? Ich seh auch nicht was von der Funktion zurückgegeben wird! bzw woher er weiss in welches Control er GUICtrlSetData() setzen soll.

    Das Handbuch gibt hier nicht sehr viel her! man kann dort auch nicht suchen! ?(

    Hat jemand die Geduld mir das zu erklären.

    • Offizieller Beitrag

    Ich würde das noch etwas abändern:

    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate('Test')
    $cInput = GUICtrlCreateInput('', 20, 20, 150, 20)
    GUISetState()
    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $iCode, $iCurrentCol
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; hier wird die Control-ID übergeben (Lo-Word von $iwParam)
    $iCode = BitShift($iwParam, 16) ; die Windows-Message (Hi-Word von $iwParam)
    If $iIDFrom = $cInput And $iCode = $EN_CHANGE Then ; wenn die Control-ID mit der vom Input übereinstimmt und die Änderungsmessage vorhanden ist, dann...
    $iCurrentCol = ControlCommand($hGui, '', $cInput, 'GetCurrentCol', '') ; Momentane Cursor-Position holen
    GUICtrlSetData($iIDFrom, StringRegExpReplace(GUICtrlRead($iIDFrom), '[^\d,]', '')) ; alle Zeichen, die keine Zahlen oder das Komma sind, löschen
    _SendMessage(GUICtrlGetHandle($iIDFrom), $EM_SETSEL, $iCurrentCol - 1, $iCurrentCol - 1) ; den Cursor wieder auf die alte Position setzen
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]
  • Das Handbuch gibt hier nicht sehr viel her! man kann dort auch nicht suchen!

    Doch, man kann....

    Hat jemand die Geduld mir das zu erklären.

    Abber sischääär :D
    In der deutschen Hilfe findest du alles nötige, incl. lauffähiger Beispielscripte.

    In Scite den Cursor auf den Suchbegriff stellen und F1 drücken lädt die Hilfe mit dem entsprechenden Eintrag!
    Innerhalb der Hilfe gibt es den Reiter "Suchen".
    Wenn du den genauen Suchbegriff bzw. Funktionsnamen kennst, einfach ins Suchfeld eingeben.
    Unter der Themenliste die entsprechenden Häkchen setzen, damit kann man die Ergebnisse einschränken.
    Wenn man "unscharf" suchen möchte, vor und hinter den Suchbeggriff ein Sternchen * eingeben!
    Also *call* findet dann ALLE Wörter mit CALL in jedem Hilfethema! Mit den Häkchen unter der Themenliste kann man dann entsprechend einschränken/erweitern.

    Innerhalb des Scriptes gibt es ausreichende Debugging-Funktionen, im Link in meiner Signatur ist Debugging ausführlichst beschrieben.
    In Scite im Reiter "Extras" sind Debug-Kurzwahlen enthalten.
    Cursor auf die Variable, deren Inhalt du wissen willst, ALT-d oder CTRL-SHIFT-d schreibt dann entweder eine Console- oder Msgbox-Debug-Zeile ins Script.

  • Ich glaube, ich habe jetzt eine recht gute Lösung gefunden. Ich hab mir gedacht, es wird geprüft, ob der String richtig ist. Wenn nicht wird das zuletzt eingegebene Zeichen entfernt. Dadurch funktioniert es bei mir jetzt perfekt. Egal, wo der Cursor sich befindet, etc. . Dadurch wird noch optimiert, dass nicht mehrere Kommas erlaubt sind (s. Oscar).
    Auf die idee kam ich durch die Cursorposition bei Oscar :)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate('Test')
    $cInput = GUICtrlCreateInput('', 20, 20, 150, 20)
    $hInput = GUICtrlGetHandle($cInput)
    GUISetState()
    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $hWndEdit, $sRead, $iCode
    $iIDFrom = BitAND($iwParam, 0xFFFF)
    $iCode = BitShift($iwParam, 16)
    $hWndEdit = GUICtrlGetHandle($iIDFrom)
    If $hWndEdit = $hInput And $iCode = $EN_CHANGE Then
    $sRead = GUICtrlRead($iIDFrom)
    If Not StringRegExp($sRead, '^\d+,?(\d+)?$') Then
    $iCurrentCol = ControlCommand($hGui, '', $cInput, 'GetCurrentCol', '')
    $sReadL=StringMid($sRead,1,$iCurrentCol-2)
    $sReadR=StringMid($sRead,$iCurrentCol)
    GUICtrlSetData($iIDFrom, $sReadL&$sReadR)
    _SendMessage(GUICtrlGetHandle($iIDFrom), $EM_SETSEL, $iCurrentCol-2, $iCurrentCol-2)
    EndIf
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]
    • Offizieller Beitrag

    Ok, dann aber noch fehlerbereinigt (lokale Variablen deklariert) und Anpassung an "$hWnd = Handle vom Fenster" und "$ilParam = Handle vom Edit-Control":

    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate('Test')
    $cInput = GUICtrlCreateInput('', 20, 20, 150, 20)
    GUISetState()
    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $iCode, $iCurrentCol, $sRead, $sReadL, $sReadR
    $iIDFrom = BitAND($iwParam, 0xFFFF)
    $iCode = BitShift($iwParam, 16)
    If $iIDFrom = $cInput And $iCode = $EN_CHANGE Then
    $sRead = GUICtrlRead($iIDFrom)
    If Not StringRegExp($sRead, '^\d*,?(\d+)?$') Then
    $iCurrentCol = ControlCommand($hWnd, '', $iIDFrom, 'GetCurrentCol', '')
    $sReadL = StringLeft($sRead, $iCurrentCol - 2)
    $sReadR = StringMid($sRead, $iCurrentCol)
    GUICtrlSetData($iIDFrom, $sReadL & $sReadR)
    _SendMessage($ilParam, $EM_SETSEL, $iCurrentCol - 2, $iCurrentCol - 2)
    EndIf
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]