Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Идиотизмы

Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Рейтинг: 5.00. Голосов: 2.

Идиотизмы: кто мой папа?

Запись от BlooDHounD размещена 07.06.2010 в 20:36

для понимания материала необходимы следующие знания:
flash.text.TextField
flash.display.SimpleButton


вспомни цепочку наследования класса TextField:
TextField ► InteractiveObject ► DisplayObject ► EventDispatcher ► Object

так вот это враньё.
на самом деле там пропущен DisplayObjectContainer.

рассмотрим на примере:
Код AS3:
package { 
 
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;
 
    public class test extends Sprite {
 
        public function test() {
            super();
            var t:TextField = new TextField();
            t.addEventListener( Event.ADDED, this.handler_addedToStage )
            t.width = 400;
            t.height = 200;
            t.htmlText = ' <' + 'img src="http://www.google.ru/logos/olympics10-hockey-hp.png" />';
            super.addChild( t );
        }
 
        private function handler_addedToStage(event:Event):void {
            if ( event.target == event.currentTarget ) return;
            trace( event.target );
        }
 
    }
 
}
в оutput мы увидим, как ни странно, следующие:
Код:
[object Loader]
[object Sprite]
возможно кто-то уже сталкивался с тем, что всплывают события от каких-то странных объектов.

что это даёт? как минимум 3 вещи:
  • можем делать прелоадеры для TextField, перехватывая появление в них объектов класса Loader.
  • можем пресекать появление securityError и ioError подписываясь на соответствующие события.
  • мы можем выдёргивать контент из текстового поля используя вот это хак

для себя я написал такой вот класс, для перехвата детей:
Код AS3:
package blooddy.patch.text {
 
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.text.TextField;
 
    /**
     * @author              BlooDHounD
     * @playerversion       Flash 9
     * @langversion         3.0
     */
    public class TextField extends flash.text.TextField {
 
        //--------------------------------------------------------------------------
        //
        //  Constructor
        //
        //--------------------------------------------------------------------------
 
        /**
         * Constructor
         */
        public function TextField() {
            super();
            super.addEventListener( Event.ADDED,   this.handler_added,   false, int.MAX_VALUE, true );
            super.addEventListener( Event.REMOVED, this.handler_remvoed, false, int.MAX_VALUE, true );
        }
 
        //--------------------------------------------------------------------------
        //
        //  Event handlers
        //
        //--------------------------------------------------------------------------
 
        /**
         * @private
         */
        private function handler_added(event:Event):void {
            if ( event.target !== this ) {
                // останавливаем расспостранение события
                // наши родители даже не догадываются о его существовании
                event.stopImmediatePropagation();
                // если пришёл Loader, то надо подписаться на всяческие ошибки
                if ( event.target is Loader ) {
                    // так как мы не собираемся контролировать объект, лучше подпишимся со слабыми ссылками
                    var loader:LoaderInfo = ( event.target as Loader ).contentLoaderInfo;
                    loader.addEventListener( Event.COMPLETE,        this.handler_complete, false, int.MAX_VALUE, true );
                    loader.addEventListener( IOErrorEvent.IO_ERROR, this.handler_complete, false, int.MAX_VALUE, true );
                }
            }
        }
 
        /**
         * @private
         */
        private function handler_remvoed(event:Event):void {
            if ( event.target !== this ) {
                // останавливаем расспостранение события
                // наши родители даже не догадываются о его существовании
                event.stopImmediatePropagation();
                // если пришёл Loader, то надо отписаться на всяческие ошибки
                if ( event.target is Loader ) {
                    // отписываемся
                    var loader:LoaderInfo = ( event.target as Loader ).contentLoaderInfo;
                    loader.removeEventListener( Event.COMPLETE,        this.handler_complete );
                    loader.removeEventListener( IOErrorEvent.IO_ERROR, this.handler_complete );
                }
            }
        }
 
        /**
         * @private
         */
        private function handler_complete(event:Event):void {
            var loader:LoaderInfo = event.target as LoaderInfo;
            loader.removeEventListener( Event.COMPLETE,        this.handler_complete );
            loader.removeEventListener( IOErrorEvent.IO_ERROR, this.handler_complete );
        }
 
    }
 
}
p.s: такое же поведение наблюдается и у SimpleButton
Всего комментариев 1

Комментарии

Старый 07.06.2010 21:05 dimarik вне форума
dimarik
 
Аватар для dimarik
Еще некоторые наблюдения. Текстовому полю устанавливалось htmlText = ' <img src="image.png" width="WIDTH" height="HEIGHT" />'

- При попытке удалить Loader путем Loader.parent.removeChild(Loader) или добавить дитя к Loader.parent 10 FP падал.
- При удалении Sprite, бордюр вокруг текстового поля становится светло-зеленым.
- Можно задавать координаты Loader'у, картинка будет смещаться по текстовому полю, обрезаясь на краях.
- Удалив Sprite (маска?) картинка показывается на краях полностью.
- Даже если самостоятельно задать некоторые координаты Loader'у, "пустое" место под картинку остается и выделение текста "обруливает" это место.
Обновил(-а) dimarik 07.06.2010 в 22:21
 

 


Часовой пояс GMT +4, время: 16:01.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.