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?
Edit - Zeichenlimit für jede Zeile
-
- [ gelöst ]
-
mipez -
26. Juni 2010 um 22:19 -
Geschlossen -
Erledigt
-
-
[autoit]
GUICtrlSetLimit()
[/autoit] -
Aber gilt das nicht dann für alle Zeichen vom gesamten Edit?
-
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
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg()=-3Func CheckLimit()
[/autoit]
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
Hierbei wird die Zeile gekürzt, wenn sie zu lang ist. Es kann Probleme geben, wenn der Text im Edit viele Zeilen enthält. -
Danke, das hilft mir schon viel^^
-
Hab daraus mal ne UDF gemacht.
Das Grundgerüst stammt von MrCreatoR
http://www.autoitscript.com/forum/index.php?showtopic=56930Example Script
[autoit]#include <_GUICtrlEdit_SetLineLimit.au3>
[/autoit] [autoit][/autoit] [autoit]
$hGUI = GUICreate("")
$cEdit = GUICtrlCreateEdit("",20,20,200,200)
_GUICtrlEdit_SetLineLimit($cEdit,20)
GUISetState()While 1
[/autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
EndSwitch
WEndUDF
[autoit]#include-once
[/autoit] [autoit][/autoit] [autoit]
#include <GuiConstants.au3>If Not IsDeclared("WM_COMMAND") Then Global Const $WM_COMMAND = 0x0111
[/autoit] [autoit][/autoit] [autoit]
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 = 0x0204Global $sToolTip_Text[2] = ["You can only type a certain number of chars per line.", "Unacceptable Char-count:"]
[/autoit] [autoit][/autoit] [autoit]
Global $sInputs_Array[1][2]GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_MOVE, "WM_CLEAR_TOOLTIP")
GUIRegisterMsg($WM_LBUTTONDOWN, "WM_CLEAR_TOOLTIP")
GUIRegisterMsg($WM_RBUTTONDOWN, "WM_CLEAR_TOOLTIP"); $CtrlId must be an ID value, -1 can not be used!
[/autoit] [autoit][/autoit] [autoit]
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
EndFuncFunc _Input_Changed($hWnd, $CtrlId, $iLimit)
[/autoit] [autoit][/autoit] [autoit]
ToolTip("")
Local $Read_Input = GUICtrlRead($CtrlId)
If StringRegExp($Read_Input, '(?m)^[^\v]{'&$iLimit&',}$') Then
GUICtrlSetData($CtrlId, StringRegExpReplace($Read_Input, '(?m)^([^\v]{'&$iLimit&'})[^\v]+$', '\1'))Local $Gui_Get_Pos = WinGetPos($hWnd)
[/autoit] [autoit][/autoit] [autoit]
Local $Ctrl_Get_Pos = ControlGetPos($hWnd, "", $CtrlId)Local Const $SM_CYCAPTION = 4 ;Titelbar heigth
[/autoit] [autoit][/autoit] [autoit]
Local Const $SM_CXFIXEDFRAME = 7 ;Window border sizeLocal $X_Pos = $Gui_Get_Pos[0] + $Ctrl_Get_Pos[0] + $Ctrl_Get_Pos[2] + GetSystemMetrics($SM_CXFIXEDFRAME)
[/autoit] [autoit][/autoit] [autoit]
Local $Y_Pos = $Gui_Get_Pos[1] + $Ctrl_Get_Pos[1] + $Ctrl_Get_Pos[3] + GetSystemMetrics($SM_CYCAPTION)ToolTip($sToolTip_Text[0], $X_Pos, $Y_Pos, $sToolTip_Text[1], 3, 1+4)
[/autoit] [autoit][/autoit] [autoit]
DllCall("user32.dll", "int", "MessageBeep", "int", 0x0)
EndIf
EndFuncFunc WM_CLEAR_TOOLTIP($hWnd, $iMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
ToolTip("")
Return $GUI_RUNDEFMSG
EndFuncFunc MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
If $hWnd = 0 Or Not WinExists($hWnd) Then Return $GUI_RUNDEFMSGLocal $nNotifyCode = BitShift($wParam, 16)
[/autoit] [autoit][/autoit] [autoit]
Local $nID = BitAND($wParam, 0xFFFF)
Local Const $EN_CHANGE = 0x300
Local Const $EN_UPDATE = 0x400
Local Const $EN_SETFOCUS = 0x100
Local Const $EN_KILLFOCUS = 0x200For $i = 1 To UBound($sInputs_Array)-1
[/autoit] [autoit][/autoit] [autoit]
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
NextReturn $GUI_RUNDEFMSG
[/autoit] [autoit][/autoit] [autoit]
EndFuncFunc GetSystemMetrics($Flag)
[/autoit]
Local $iRet = DllCall('user32.dll', 'int', 'GetSystemMetrics', 'int', $Flag)
Return $iRet[0]
EndFunc//EDIT:
Natürlich kann man das auch in das Beispiel von Marthog einbauen, falls du nicht die komplette UDF einbinden willstSpoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
GUICreate("")
$edit = GUICtrlCreateEdit("", 0, 0, 400, 400)
AdllbRegister("CheckLimit", 250)
GUISetState()Do
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3Func CheckLimit()
[/autoit] [autoit][/autoit] [autoit]
Local $iLimit = 20 ; <- anpassen
Local $cInput = $edit ; <- anpassenLocal $sInp = GUICtrlRead($cInput)
[/autoit]
If StringRegExp($sInp , '(?m)^[^\v]{' & $iLimit & ',}$') Then
GUICtrlSetData($cInput , StringRegExpReplace($sInp , '(?m)^([^\v]{' & $iLimit & '})[^\v]+$', '\1'))
EndIf
EndFunc ;==>CheckLimitLG
-
Hm werd mal beides ausprobieren.
EDIT:
Anscheinend akzeptierts die Funktionen der UDF nich....EDIT2:
War nurn Anzeigefehler xDDD