Edit - Zeichenlimit für jede Zeile

  • Ich will für GUICtrlCreateEdit für jede Zeile ein Limit von z.B. 20 Zeichen setzen.
    In der GUIEdit.au3 hab ich nichts gefunden, gibt es eine andere Lösung?

    Einmal editiert, zuletzt von mipez (26. Juni 2010 um 23:13)

  • GUICtrlSetLimit setzt nur die maximale Gesamtanzahl fest. Du musst schon selber was schreiben.


    Spoiler anzeigen
    [autoit]

    $lineLimit = 10

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

    GUICreate("")

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

    $edit = GUICtrlCreateEdit("", 0, 0, 400, 400)

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

    AdlibRegister("CheckLimit", 250)

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

    GUISetState()

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

    Do
    Until GUIGetMsg()=-3

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

    Func CheckLimit()
    Local $lines = StringSplit(GUICtrlRead($edit), @CRLF, 1)
    Local $text = ""
    Local $change = False
    For $i=1 To $lines[0]
    If StringLen($lines[$i]) > $lineLimit Then
    $lines[$i] = StringLeft($lines[$i], $lineLimit)
    $change = True
    EndIf
    $text&=$lines[$i]
    If $i<$lines[0] Then
    $text&=@CRLF
    EndIf
    Next
    If $change Then GUICtrlSetData($edit, $text)
    EndFunc

    [/autoit]


    Hierbei wird die Zeile gekürzt, wenn sie zu lang ist. Es kann Probleme geben, wenn der Text im Edit viele Zeilen enthält.

  • Hab daraus mal ne UDF gemacht.
    Das Grundgerüst stammt von MrCreatoR
    http://www.autoitscript.com/forum/index.php?showtopic=56930

    Example Script
    [autoit]

    #include <_GUICtrlEdit_SetLineLimit.au3>
    $hGUI = GUICreate("")
    $cEdit = GUICtrlCreateEdit("",20,20,200,200)
    _GUICtrlEdit_SetLineLimit($cEdit,20)
    GUISetState()

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

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

    [/autoit]
    UDF
    [autoit]

    #include-once
    #include <GuiConstants.au3>

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

    If Not IsDeclared("WM_COMMAND") Then Global Const $WM_COMMAND = 0x0111
    If Not IsDeclared("WM_MOVE") Then Global Const $WM_MOVE = 0x0003
    If Not IsDeclared("WM_LBUTTONDOWN") Then Global Const $WM_LBUTTONDOWN = 0x0201
    If Not IsDeclared("WM_RBUTTONDOWN") Then Global Const $WM_RBUTTONDOWN = 0x0204

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

    Global $sToolTip_Text[2] = ["You can only type a certain number of chars per line.", "Unacceptable Char-count:"]
    Global $sInputs_Array[1][2]

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

    GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
    GUIRegisterMsg($WM_MOVE, "WM_CLEAR_TOOLTIP")
    GUIRegisterMsg($WM_LBUTTONDOWN, "WM_CLEAR_TOOLTIP")
    GUIRegisterMsg($WM_RBUTTONDOWN, "WM_CLEAR_TOOLTIP")

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

    ; $CtrlId must be an ID value, -1 can not be used!
    Func _GUICtrlEdit_SetLineLimit($CtrlId, $iLimit)
    Local $iUbound = UBound($sInputs_Array)
    ReDim $sInputs_Array[$iUbound+1][2]
    $sInputs_Array[$iUbound][0] = $CtrlId
    $sInputs_Array[$iUbound][1] = $iLimit
    EndFunc

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

    Func _Input_Changed($hWnd, $CtrlId, $iLimit)
    ToolTip("")
    Local $Read_Input = GUICtrlRead($CtrlId)
    If StringRegExp($Read_Input, '(?m)^[^\v]{'&$iLimit&',}$') Then
    GUICtrlSetData($CtrlId, StringRegExpReplace($Read_Input, '(?m)^([^\v]{'&$iLimit&'})[^\v]+$', '\1'))

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

    Local $Gui_Get_Pos = WinGetPos($hWnd)
    Local $Ctrl_Get_Pos = ControlGetPos($hWnd, "", $CtrlId)

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

    Local Const $SM_CYCAPTION = 4 ;Titelbar heigth
    Local Const $SM_CXFIXEDFRAME = 7 ;Window border size

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

    Local $X_Pos = $Gui_Get_Pos[0] + $Ctrl_Get_Pos[0] + $Ctrl_Get_Pos[2] + GetSystemMetrics($SM_CXFIXEDFRAME)
    Local $Y_Pos = $Gui_Get_Pos[1] + $Ctrl_Get_Pos[1] + $Ctrl_Get_Pos[3] + GetSystemMetrics($SM_CYCAPTION)

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

    ToolTip($sToolTip_Text[0], $X_Pos, $Y_Pos, $sToolTip_Text[1], 3, 1+4)
    DllCall("user32.dll", "int", "MessageBeep", "int", 0x0)
    EndIf
    EndFunc

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

    Func WM_CLEAR_TOOLTIP($hWnd, $iMsg, $wParam, $lParam)
    ToolTip("")
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    If $hWnd = 0 Or Not WinExists($hWnd) Then Return $GUI_RUNDEFMSG

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

    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)
    Local Const $EN_CHANGE = 0x300
    Local Const $EN_UPDATE = 0x400
    Local Const $EN_SETFOCUS = 0x100
    Local Const $EN_KILLFOCUS = 0x200

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

    For $i = 1 To UBound($sInputs_Array)-1
    If $nID = $sInputs_Array[$i][0] Then
    Switch $nNotifyCode
    Case $EN_UPDATE ;$EN_CHANGE
    _Input_Changed($hWnd, $sInputs_Array[$i][0], $sInputs_Array[$i][1])
    Case $EN_SETFOCUS, $EN_KILLFOCUS
    ToolTip("")
    EndSwitch
    ExitLoop
    EndIf
    Next

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

    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func GetSystemMetrics($Flag)
    Local $iRet = DllCall('user32.dll', 'int', 'GetSystemMetrics', 'int', $Flag)
    Return $iRet[0]
    EndFunc

    [/autoit]


    //EDIT:
    Natürlich kann man das auch in das Beispiel von Marthog einbauen, falls du nicht die komplette UDF einbinden willst

    Spoiler anzeigen
    [autoit]


    GUICreate("")
    $edit = GUICtrlCreateEdit("", 0, 0, 400, 400)
    AdllbRegister("CheckLimit", 250)
    GUISetState()

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

    Do
    Until GUIGetMsg() = -3

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

    Func CheckLimit()
    Local $iLimit = 20 ; <- anpassen
    Local $cInput = $edit ; <- anpassen

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

    Local $sInp = GUICtrlRead($cInput)
    If StringRegExp($sInp , '(?m)^[^\v]{' & $iLimit & ',}$') Then
    GUICtrlSetData($cInput , StringRegExpReplace($sInp , '(?m)^([^\v]{' & $iLimit & '})[^\v]+$', '\1'))
    EndIf
    EndFunc ;==>CheckLimit

    [/autoit]

    LG

  • Hm werd mal beides ausprobieren.

    EDIT:
    Anscheinend akzeptierts die Funktionen der UDF nich....

    EDIT2:
    War nurn Anzeigefehler xDDD

    2 Mal editiert, zuletzt von mipez (27. Juni 2010 um 11:31)