Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   TextArea, ScrollEvent.SCROLL и вообще про события во Flex (http://www.flasher.ru/forum/showthread.php?t=93156)

lephik 15.03.2007 06:29

Смайлы в TextArea
 
Подскажите плз. почему когда листенишь ScrollEvent.SCROLL у TextArea то verticalScrollPosition показывает значение предыдущщего скроллинга, и какое событие нужно листенить чтобы после скролла получить реально значение verticalScrollPosition и других свойств
TextArea.
спасибо

etc 15.03.2007 13:16

Кажется, там нужен validateNow выполнить. Не смотрел.

lephik 15.03.2007 13:31

да, слышал про такую штуку :)
validateNow называется,
пробовал - не помогает.

etc 15.03.2007 13:51

Собери нерабочий пример.

lephik 15.03.2007 14:54

не буду приводить код полностью но в целом проблема сводится вот к такой:
Код:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.events.ScrollEvent;
private function ta_scroll(e:ScrollEvent) {
        ta.validateNow();
        trace("verticalScrollPosition: " + ta.verticalScrollPosition);
        //trace(e.position);
}
]]>
</mx:Script>
<mx:TextArea id="ta" text="kykykykykykkyykykkykykykykykykykykykykykkykykyky"
        width="100" height="50" scroll="ta_scroll(event);" >       
</mx:TextArea>
</mx:Application>

ну так вот в этом примере ta.verticalScrollPosition выдаёт неправильное значене.

etc 15.03.2007 15:37

Заглянул в сорцы TextArea и увидел там любопытные строчки:

Код:

    override protected function scrollHandler(event:Event):void
    {
                // TextField.scroll bubbles so you might see it here
                if (event is ScrollEvent)
                {
                        if (!liveScrolling &&
                                ScrollEvent(event).detail == ScrollEventDetail.THUMB_TRACK)
                        {
                                return;
                        }

                        super.scrollHandler(event);

                        textField.scrollH = horizontalScrollPosition;
                        textField.scrollV = verticalScrollPosition + 1;

                        _vScrollPosition = textField.scrollV - 1;
                        _hScrollPosition = textField.scrollH;
                }
    }

А внутри ScrollControlBase:

Код:

        protected function scrollHandler(event:Event):void
        {
                // TextField.scroll bubbles so you might see it here
                if (event is ScrollEvent)
                {
                        var scrollBar:ScrollBar = ScrollBar(event.target);

                        var pos:Number = scrollBar.scrollPosition;

                        var prop:QName;
                        if (scrollBar == verticalScrollBar)
                                prop = new QName(mx_internal, "_verticalScrollPosition");
                        else if (scrollBar == horizontalScrollBar)
                                prop = new QName(mx_internal, "_horizontalScrollPosition");

                        dispatchEvent(event);

                        if (prop)
                                this[prop] = pos;
                }
        }

Т.е. событие для скролла вызывается до того, как свойство изменилось в самом TextArea. Как это обходить, я не знаю, жди спецов по флексу.

Кстати, event.position выдает верное значение. Что мешает его использовать?

lephik 16.03.2007 07:42

Дело в том что я пытаюсь добавить смайлы в этот самый TextArea,
для этого экстендю TextArea, и делаю внутренний TextField публичным.
У TextField есть метод - getCharBoundaries, который возвращает Rectangle в котором находится определённая буква ( в моём случае - смайл ).
Так вот после скролла этот метод getCharBoundaries внетреннегно текстфилда тоже выдаёт неправильное значение :(
Спасибо большое за ответ, думаю теперь я разберусь.

etc 16.03.2007 12:14

Тебе нужно отложить выполнение до следующего кадра хотя бы. Или на некоторое кол-во миллисекунд. Или переписать scrollHandler.

john 16.03.2007 12:56

удобно таком случае пользоваться callLater -

Код:

callLater(function():void
{
  ....
});


etc 16.03.2007 13:00

Примерчик заодно:
http://livedocs.macromedia.com/flex/.../00001438.html

Хотя, раз наследуемся от TextArea, то можно и переписать scrollHandler. Не знаю, правда, может это к глюкам каким-нибудь привести или нет…


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

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