PDA

Просмотр полной версии : TextArea protected property textField


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

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

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


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


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 можно получить через

var myTextField:TextField = TextField(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 классе, объявляете свойство:

private var textFieldLink:TextField;
На событие Event.ADDED_TO_STAGE - textFieldLink = TextField(this.textField);

Потом пишите get-ер:
public function getTextFieldLink():TextField
{
return textFieldLink;
}

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

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

Equalazer
17.09.2009, 20:46
Спасибо большое!!!))