Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компонент ip address, есть такое?  
:(
    Опции темы
bel_nikita
  Дата 13.9.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: нет
Всего: 47



Как создать ip address компонент на базе mx:TextInput?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
AntonioBanderaz
Дата 13.9.2007, 21:20 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 18



Есть валидатор, есть маска ввода... ну и создай )


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
bel_nikita
Дата 14.9.2007, 14:08 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: нет
Всего: 47



regexp для ip может кто подскажет?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 14.9.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: нет
Всего: 47



Вот, что получилось:
Код

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*">
    <!-- IP address regression -->
    <mx:RegExpValidator
        id="RegIPAddr"
        source="{ip_input}"
        property="text"
        expression="\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)\{3\}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
        />
        <mx:FormItem label="IP address:" fontWeight="bold" x="10" y="36">
            <mx:TextInput id="ip_input"/>                
        </mx:FormItem>
</mx:Application>

Работает, но кривова-то, возможна следующая ситуация: 123.234.213.123.234


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
AntonioBanderaz
Дата 15.9.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 18



Попробуй следующее, для себя писал, для 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


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Flex | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.