Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Как реализовать выбор-подстановку как у Гугла? (http://www.flasher.ru/forum/showthread.php?t=148032)

Astraport 20.12.2010 10:13

Как реализовать выбор-подстановку как у Гугла?
 
У Гула переводчика (http://translate.google.ru) на днях появилась новая фича - можно кликнуть по слову в переводе и откроется список из вариантов, кликнув по которому производится замена слова.

У меня совсем другое, но нужно реализовать что-то подобное. Имеется несколько массивов из первых элементов которых формируется фраза, например "Хорошо в деревне летом", т. е. каждое слово - это первый элемент каждого массива. Мне нужно, чтобы при наведении на каждое слово оно превращалось в элемент DropDownList с элементами соответствующего массива и по клику это слово заменялось. Например, кликнув по "Хорошо" появляется список из вариантов из первого массива: "Хорошо", "Плохо", "Скучно", "Весело". Кликнули по "Весело" - получилась фраза "Весело в деревне летом". Ну и так с каждым словом.

Вот как подобное лучше реализовать? Думал над ItemRenderom, но ума не приложу как его можно вставить например в Label.

GBee 20.12.2010 10:47

Жмакаете по слову,
находите его размеры и местоположение,
сверху комбобоксик подгоняете, у которого датапровайдер у вас уже есть

Или сразу создаете толпу комбобоксов задаете им стиль, чтоб сливался с окружающей средой.

Astraport 20.12.2010 10:51

Ну вот допустим первоначальная фраза у меня в Label. И как можно найти размеры и местоположение отдельно взятого слова?

GBee 20.12.2010 11:57

Тут я не помогу, вроде есть какие-то методы getBounds или measureText. Лучше в хелпе поискать или дождаться кого-нить, кто знает.

Добавлено через 4 минуты
Вот вариант getCharBoundaries() у textField, правда textField протектная поляна, наследуйтесь, исследуйте.

Astraport 20.12.2010 12:33

GBee, спасибо, посмотрю.
Может быть проще создать HBox и туда вставлять объекты label при наведении на которые они становятся невидимыми, но появляется comboBox с данными массива и при выборе итема, значение его передается в этот label.
Проблема только в том, что у меня места для этого HBox мало, всего 250 пикселей, а фраза может состоять и из 10 слов.
Сейчас буду пробывать.

Silicium 20.12.2010 12:46

А если с состояниями поколдовать? Одним компонентом обойтись.

Astraport 20.12.2010 13:58

Цитата:

А если с состояниями поколдовать? Одним компонентом обойтись.
Даже не представляю как можно обойтись одним компонентом?

PikseL 21.12.2010 08:01

Что-то типа:
Код AS3:

var s:String = yourLabel.text;
var m:TextLineMetrics = yourLabel.measureText(s);
trace(m.width + ':' + m.height);


Astraport 21.12.2010 10:10

Цитата:

Что-то типа:
Для flash это да, тоже смотрел, а для flex вполне Hgroup нормально расставляет label.

Что-то я разучился как элементы создавать. Пробую так как в коде ниже, пишет, что объекта с именем например combo1 не существует (null), хотя его создание трейсится.

Код AS3:

        <fx:Script>
                <![CDATA[
                        import mx.collections.IList;
 
                        import spark.components.ComboBox;
                        import spark.components.Label;
 
                        private var newLabel:Label;
                        private var newCombo:ComboBox;
                        private var myArray1:Array = ['Хорошо','Плохо','Весело','Скучно'];
                        private var myArray2:Array = [' в',' на',' у',' под'];
                        private var myArray3:Array = [' деревне',' городе',' селе',' море'];
                        private var myArray4:Array = [' летом.',' зимой.',' всегда.',' никогда.'];
 
                        protected function button1_clickHandler(event:MouseEvent):void
                        {
                                var tempArray:Array = new Array();
                                        tempArray.push(myArray1[0]);
                                        tempArray.push(myArray2[0]);
                                        tempArray.push(myArray3[0]);
                                        tempArray.push(myArray4[0]);
                                for (var i:int =0; i<tempArray.length; i++){
                                        newLabel = new Label();
                                        newLabel.text = tempArray[i];
                                        newLabel.name = 'name' + i;
                                        labelG.addElement(newLabel);
                                        newCombo = new ComboBox();
                                        newCombo.x = newLabel.x;
                                        newCombo.visible = false;
                                        newCombo.name = 'combo' + i;
                                        newCombo.dataProvider = myArray1 as IList;
                                        labelG.addElement(newCombo);
                                        newLabel.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
                                        newLabel.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
                                }
                        }
 
                        protected function onMouseOver(event:MouseEvent):void
                        {
                                event.currentTarget.visible = false;
                                var currName:String = event.currentTarget.name;
                                trace ('currName ' + currName.charAt(4));
                                var currCombo:ComboBox = this.getChildByName('combo'+currName.charAt(4)) as ComboBox;
                                currCombo.visible = true;
                        }
                        protected function onMouseOut(event:MouseEvent):void
                        {
 
                        }
 
                ]]>
        </fx:Script>
 
        <fx:Declarations>
 
        </fx:Declarations>
        <s:HGroup x="32" y="92" width="670" height="27" id="labelG">
        </s:HGroup>
        <s:Button x="32" y="157" label="Сформировать фразу" click="button1_clickHandler(event)"/>

И ещё вопрос параллельно. Как можно обратиться к переменной по имени? Чтобы вот эту конструкцию заменить на цикл перебирая: myArray1, myArray2 и т. д.:

Код AS3:

tempArray.push(myArray1[0]);
tempArray.push(myArray2[0]);
tempArray.push(myArray3[0]);
tempArray.push(myArray4[0])

;

alatar 21.12.2010 12:09

Что-бы что-то достать, надо сначала это что-то положить. У вас ComboBox никуда не добавляется.
Цитата:

Чтобы вот эту конструкцию заменить на цикл перебирая: myArray1, myArray2 и т. д.:
Сложить их в массив.

Astraport 21.12.2010 17:11

Цитата:

У вас ComboBox никуда не добавляется.
А разве этого мало? labelG.addElement(newCombo);

Цитата:

Сложить их в массив.
Так не интересно, а можно ли как-то обращаться к переменным по имени?
Типа:
getVariableByName('myArray'+i);

alatar 21.12.2010 17:22

Ну если вы любитель таких путей...
Код AS3:

this['myArray' + i];

Добавлено через 17 минут
Цитата:

А разве этого мало? labelG.addElement(newCombo);
С учетом того, что вы пытаетесь получить комбобокс не у labelG? Да мало.
Цитата:

Код AS3:

this.getChildByName('combo'+currName.charAt(4))



Astraport 21.12.2010 17:45

Цитата:

Ну если вы любитель таких путей...
Да, точно! Спасибо.
Цитата:

С учетом того, что вы пытаетесь получить комбобокс не у labelG? Да мало.
Извиняюсь, что-то с утра плохо соображал, спасибо.

alatar 21.12.2010 17:52

Цитата:

Да, точно! Спасибо.
Не за что. Удачи при дебаге.

Astraport 21.12.2010 18:02

Цитата:

Не за что. Удачи при дебаге.
Ну да:( То есть никак.

alatar 21.12.2010 18:06

Что значит никак? Эта фраза относилась к отсутствию типизации и ошибкам при опечатках.
Сделайте поля публичными.

Astraport 21.12.2010 19:51

Да, я решил проблему, спасибо. Просто сначала пытался так:
Код AS3:

var tempArray:Array = new Array();
for (var j:int = 1; j<5; j++){
tempArray.push(this['myArray'+j+'[0]']);
                                }

Естественно это не сработало, но временный массив помог:)

Silicium 23.12.2010 01:12

И все ровно в одном компоненте с двумя состояниями было бы легче все это сделать... я думаю.

GBee 23.12.2010 11:14

А я бы делал текстареа + комбобокс сверху один.

alatar 23.12.2010 11:42

По-большому счету тут и комбобокс лишний, хватило бы и списка.

GBee 23.12.2010 12:12

Цитата:

По-большому счету тут и комбобокс лишний, хватило бы и списка.
Согласен


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

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