Попробуй следующее, для себя писал, для IP чутка подправил... Это ввод в инпут по маске | Код | package com.avelichko.ui.input { import flash.events.Event; import flash.events.FocusEvent; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.events.TextEvent; import flash.ui.Keyboard;
import mx.controls.TextInput;
[Event(name="inputMaskEnd")] public class MaskedInput extends TextInput { public function MaskedInput() { super(); // Инитим обработчики событий addEventListener(TextEvent.TEXT_INPUT,interceptChar,true,0); addEventListener(MouseEvent.CLICK,reposition,true); addEventListener(KeyboardEvent.KEY_DOWN,interceptKey,true); addEventListener(FocusEvent.FOCUS_IN,interceptFocus,false); } public static var EVENT_MASK_END:String = "inputMaskEnd"; protected var _working:Array = []; protected var _position:Number = 0; protected var bWorkingUpdated:Boolean = false; protected var bMaskUpdated:Boolean = false; protected var bTextUpdated:Boolean = false; protected var _blankChar:String = "_"; public function get blankChar():String { return _blankChar; } public function set blankChar(s:String):void { if( s.length == 0 ) return; _blankChar = s.charAt(0); invalidateDisplayList(); } protected var _defaultChar:String = "_"; public function set defaultChar(s:String):void { _defaultChar = s; } public function get defaultChar():String { return _defaultChar; } protected var _inputMask:String; public function get inputMask():String { return _inputMask; } public function set inputMask(s:String):void { _inputMask = s; bMaskUpdated = true; invalidateDisplayList(); } protected var _text:String = ""; override public function get text():String { var result:String = ""; for(var i:Number=0; i < _working.length; i++) { var c:String = _working[i]; if( _inputMask.charAt(i) == c ) continue; if( c == _blankChar ) c = " "; result += c; } return result; } override public function set text(value:String):void { _text = value; bTextUpdated = true; invalidateDisplayList(); } public function get actualText() : String { var result:String = ""; for(var i:Number=0; i < _working.length; i++) { var c:String = _working[i]; if( c == _blankChar ) c = _defaultChar; result += c; } return result; } /** * обрабатывает смену позиции */ private function reposition(event:MouseEvent):void { var p:Number = this.selectionBeginIndex; _position = p; } /** * Проверка нажатой клавиши */ private function interceptKey(event:KeyboardEvent) : void { if( event.keyCode == Keyboard.BACKSPACE ) { _position = selectionBeginIndex; retreatPosition(); allowChar(_blankChar); } else if( event.keyCode == Keyboard.SPACE ) { allowChar(_defaultChar); advancePosition(); } else if( event.keyCode == Keyboard.DELETE ) { if( _position < _inputMask.length ) { allowChar(_blankChar); advancePosition(true); } } else if( event.keyCode == Keyboard.LEFT ) { _position = this.selectionBeginIndex; retreatPosition(); event.preventDefault(); } else if( event.keyCode == Keyboard.RIGHT ) { advancePosition(true); event.preventDefault(); } else if( event.keyCode == Keyboard.END ) { _position = _working.length; event.preventDefault(); } else if( event.keyCode == Keyboard.HOME ) { _position = -1; advancePosition(true); } bWorkingUpdated = true; invalidateDisplayList(); } /** * При появлении фокуса ставит курсор в место вставки по маске */ private function interceptFocus(event:FocusEvent):void { var start:Number = selectionBeginIndex; if( event.relatedObject != null ) start = 0; setSelection( start, start ); _position = start - 1; advancePosition(); } /** * Проверка вводимого символа */ private function interceptChar(event:TextEvent):void{ var input:String = event.text; if( _inputMask.length <= _position ) { event.preventDefault(); dispatchEvent(new Event(EVENT_MASK_END)); return; } var c:String = input.charAt(0); var m:String = _inputMask.charAt(_position); var bAdvance:Boolean = true; switch(m) { case "#": if(isDigit(c)) { allowChar(c); } else { event.preventDefault(); bAdvance = false; } break; case "C": if(isDigit(c)) { event.preventDefault(); bAdvance = false; } else { allowChar(c.toUpperCase()); } break; case "c": if(isDigit(c)) { event.preventDefault(); bAdvance = false; } else { allowChar(c.toLowerCase()); } break; case "A","a": allowChar(c.toLowerCase()); break; default: break; } if(bAdvance) { advancePosition(); } bWorkingUpdated = true; invalidateDisplayList(); } /** * Перемещаем к следующему вводимому символу */ protected function advancePosition(byArrow:Boolean=false):void { var p:Number = _position; while( (++p) < _inputMask.length && !isMask(_inputMask.charAt(p)) ) ; _position = p; if( p >= _inputMask.length && !byArrow ) { dispatchEvent(new Event(EVENT_MASK_END)); } setSelection(_position,_position); } /** * Перемещаем к предыдущему вводимому символу */ protected function retreatPosition():void { var p:Number = _position; while( (--p) > 0 && !isMask(_inputMask.charAt(p)) ) ; _position = p; setSelection(_position,_position); } /** * Проверка что символ в маске относится к маске */ protected function isMask(c:String):Boolean { return /[#AC]/i.test(c); } /** * проверка что символ это число */ protected function isDigit( c:String ):Boolean { return /[\d]/.test(c); } /** * Вставляет символ в валидную строку */ private function allowChar(c:String):void { _working[_position] = c; } /** * Изменяем в зависимости от то что у нас поменялось * Маска или текст, если текст то вписываем его в маску, если * маска то меняем представление * */ override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { if( bMaskUpdated ) { bMaskUpdated = false; _working = []; var s:String = _inputMask; for(var i:int=0; i < s.length; i++) { var c:String = s.charAt(i); if( isMask(c) ) { c = _blankChar; } _working.push(c); } bWorkingUpdated = true; } if( bTextUpdated ) { bTextUpdated = false; var t:Number = 0; var value:String = _text; for(var j:Number=0; j < _inputMask.length; j++) { var m:String = _inputMask.charAt(j); if( isMask(m) ) { if( t >= value.length ) _working[j] = _blankChar; else _working[j] = value.charAt(t); t += 1; } else { _working[j] = m; } } bWorkingUpdated = true; } if( bWorkingUpdated ) { super.text = _working.join(""); bWorkingUpdated = false; } super.updateDisplayList( unscaledWidth, unscaledHeight ); } } }
|
Это как раз твой компонент, ввода IP адреса | Код | package com.avelichko.ui.input { public class IpInput extends MaskedInput { public function IpInput() { super(); inputMask = "###.###.###.###"; defaultChar = " "; blankChar = " "; } override protected function advancePosition(byArrow:Boolean=false):void { checkAtPosition(); super.advancePosition(byArrow); } private function setError():void { setStyle("borderColor", 0xFF0101); setStyle("backgroundColor", 0xF68989); } private function clearError():void { setStyle("borderColor", 0xFFFFFF); setStyle("backgroundColor", 0xFFFFFF); } private function checkAtPosition():void { if(_position == 2 || _position == 6 || _position == 10 || _position == 14) { var str:String = actualText.substr(_position - 2, 3); if(_position != 14) { validateBlock(str); } else { validateBlock(str, 255); } } } private function validateBlock(str:String, max:int = 256):void { if(!(parseInt(str, 10) > 0 && parseInt(str, 10) < max)) { setError(); } else { clearError(); } } } }
|
Вот так он используется | Код | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:avUI="com.avelichko.ui.input.*"> <avUI:IpInput x="66" y="187"/> </mx:Application>
|
Правда есть не очень удобная штука с пробелами, когда 2 символа в блоке IP, но я думаю тут уже совсем не сложно поправить.... Это сообщение отредактировал(а) AntonioBanderaz - 15.9.2007, 17:22
--------------------
ГЫ...
|