Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   TextArea protected property textField (http://www.flasher.ru/forum/showthread.php?t=129641)

Equalazer 07.09.2009 11:13

TextArea protected property textField
 
Здравствуйте!!! я создал компонент: http://www.valar.ru/gallery/0909/untitled2_copy.jpg.
мне нужно сделать выделение текста по щелчку в TextArea и вставить выделенное в TextInput. в TextField позволяет это сделать с кучей свойств, и как я понимаю у TextArea есть свойство TextField... подскажите как все это лучше реализовать???
заранее спасибо.

Касеал 14.09.2009 14:31

Если нужно реализовать просто выделение текста, то это можно сделать так:
Код AS3:

myTextArea.text = "My text";
myTextArea.setSelection(0, myTextArea.text.length);

А если нужно больше функциональности, то лучше всего пронаследовать компонент TextArea и работать с protected свойством textField напрямую.

Код AS3:

public class MyTextArea extends TextArea
{
    public function MyTextArea
    {
        addEventListener(Event.ADDED_TO_STAGE, eventAddedToStage);
    }
 
    private function eventAddedToStage(e:Event):void
    {
        textField.text = "My text";
        textField.setFocus();
        textField.setSelection(0, textField.length);
    }
 
}

Так же protected-свойство textField компонента TextArea можно получить через
Код AS3:

var myTextField:TextFieldTextField(myTextArea.getChildAt(2));


Equalazer 16.09.2009 19:16

Видете ли TextArea показавыет только сплошной текст в виде Mazda /n Mitsubishi
и как мне повесить ивент по щелчку на конкретное слово?... результат должен получиться как в гугле... набираешь ма, он предлогает мазда - щелкаешь => вставляется мазда в инпут и директит.

Касеал 16.09.2009 19:36

Дело в том, что если я правильно понял, что Вы хотите, то для этой цели в Google используется совсем другой компонент, похожий на компонент ListBox. Немного непонятно, зачем использовать TextArea. Но всё же если очень хочется, то подобный алгоритм можно было бы организовать и в TextArea, только это будет не совсем тривиальная задача.
У компонента textField есть свойство getCharIndexAtPoint, которое может вернуть позицию каретки в textField в том месте, где находится курсор мышки. Например на событие MouseEvent.MOUSE_MOVE возвращаете позицию каретки в текстовом поле. После чего, "собираете" относительно этой позиции слово до разделителей "\r", слева и справа, делать это можно, например с помощью регулярных выражений. После чего у вас будут индексы левой и правой границы слова. Вызываете textField.setSelection(begIndex, endIndex) и слово будет выделено. Само слово можно хранить, например в строке и при событии MouseEvent.CLICK присваивать эту строку в поле ввода.
Но для Вашей цели делать это всё не очень умно, можно использовать ListBox, там для этого уже всё есть.
P.S. Если конечно я правильно понял постановку задачи.

Equalazer 17.09.2009 16:49

Спасибо большое за совет) почему то захотелось использовать TextArea, но вы правы удобнее использовать листбокс))
Но хотелось бы узнать все таки: TextArea добавляется компонентом через <mx:>, - Могу ли я испозьзуя компонент TextArea достучаться до свойств textfield, не добовляя TextField на экран addChild'ом? Допустим если мне нужен метод getCharIndexAtPoint использовать для TextArea.

Касеал 17.09.2009 18:49

Компонент TextArea собран из нескольких элементов. Один из этих элементов - IUITextField. У этого элемента есть все необходимые Вам свойства. Т.к. этот элемент объявлен как protected, достучаться к нему просто так не получится.
Самый лучший способ для Вас это пронаследовать компонент TextArea, как указано в моём первом посте. После этого, Вы сможете из главного файла его подключить так:

Код:

<mx:MyTextArea id="myTextAreaLink"> </mx:MyTextArea>
После этого Вы сможете обращаться ко всем свойствам TextArea через id. Одна проблема, textField вы через id не увидите с этого файла. Получить ссылку на textField можно таким способом:

В Вашем пронаследованном от TextArea классе, объявляете свойство:

Код AS3:

private var textFieldLink:TextField;

На событие Event.ADDED_TO_STAGE -
Код AS3:

textFieldLink = TextField(this.textField);

Потом пишите get-ер:
Код AS3:

public function getTextFieldLink():TextField
{
    return textFieldLink;
}

После всех этих манипуляций, в Вашем главном классе, Вы сможете через id, получить ссылку на textField компонента TextArea и делать с ним всё, что Вам нужно.

Код AS3:

var tf:TextField = myTextAreaLink.getTextFieldLink();
var carretPos:uint = tf.getTextFieldLink(mouseX, mouseY);


Equalazer 17.09.2009 20:46

Спасибо большое!!!))


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

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