Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   AS3 + GetVariable (http://www.flasher.ru/forum/showthread.php?t=110811)

me2 09.04.2008 16:12

AS3 + GetVariable
 
Вобщем не могу снять JS`ом переменные из ролика, явно что-то изменилось.
В ролике в корне лежит movieClip с именем test и своим собственным классом (TestClass) в котором:
Код:

class TestClass extends MovieClip{
  function TestClass(){
      this.testVar='testVar';
  }
}

А в JS`e:
var testVar=flashObject.GetVariable('test.testVar');
В этоге ругается - мол Unspecified Error

wvxvw 09.04.2008 16:35

А чем EhternalInterface не устроил?

me2 09.04.2008 16:46

а я не знал что это такое, вот теперь читаю. (eXternal)

wvxvw 09.04.2008 18:11

упс, сорри, транслит %)

IYAKOV 26.06.2008 13:02

А и все-таки: какой полный путь переменной в АS3?

Да, подскажите как мне быть:
Я вставил флеш объект в формочку(WinForms,c#) и мне нужно произвести некие манипуляции с данными находящимися во флешке. Дело в том, что сама флешка не знает, когда ей это потребуется. Как тогда поучить доступ в переменным если не через GetVariable?

И еще вопросик:
как вызвать из Флешки функцию находящуюсяя во внешнем приложении?(таже WinForm)
ExternalInterface почему-то не работает. Просто ничего не происходит...
А через fscommand писать не очень хочется. Есть только одна функция и вней куча ифоф не смотрится

о! нашел..
"Note: If you are publishing for Flash Player 8 or later, the ExternalInterface class provides better functionality for communication between ActionScript and VisualBasic, Visual C++, or other programs that can host ActiveX controls."
Но все равно не понял, почему не работает
Код:

package
{
        import flash.display.*;
        import flash.external.*;
        public class main extends Sprite
        {
                public function main():void
                {
                        ExternalInterface.call("AAA");
                        ...

Код:

        private void Form1_Load(object sender, System.EventArgs e)
        {
            axShockwaveFlash1.AllowScriptAccess = "Always";
            axShockwaveFlash1.LoadMovie(0, @"D:\_ngf\main.swf");
           
           
            axShockwaveFlash1.GetVariable("Полныйпуть_к_переменной");//это к первому вопросу
        }
        public void AAA()  //Не вызывается!!!
        {
            ...
        }

П.С.
вот еще было написано, что нужно flash.system.Security.allowDomain(sourceDomain) написать. Но у меня просто приложение! какой может быть домен?

etc 26.06.2008 15:41

Цитата:

Сообщение от IYAKOV (Сообщение 748026)
А и все-таки: какой полный путь переменной в АS3?

Никакой.

IYAKOV 26.06.2008 22:44

Цитата:

Сообщение от __etc (Сообщение 748096)
Никакой.

А как тогда мне получить значение переменной из флешки, если я просто указываю ее имя(в GetVariable) - возникает ошибка!

etc 26.06.2008 23:29

Цитата:

Сообщение от IYAKOV (Сообщение 748219)
А как тогда мне получить значение переменной из флешки, если я просто указываю ее имя(в GetVariable) - возникает ошибка!

В AS3 никак, используйте ExternalInterface. Судя по коду и логике, вы его совершенно неправильно пытаетесь использовать.

IYAKOV 27.06.2008 19:53

Цитата:

Сообщение от __etc (Сообщение 748224)
В AS3 никак, используйте ExternalInterface. Судя по коду и логике, вы его совершенно неправильно пытаетесь использовать.

А подскажите тогда, как его использовать?

у меня получается, что при Любом вызове ExternalInterface.call, приложение обрабатывает событие axShockwaveFlash1_FlashCall. Значит никак вызвать какую либо функцию из внешено приложения нельзя??? с использованием javascript все работает. А тут почему-то нет.

etc 27.06.2008 20:07

Не подскажу, я не писал таких вещей. Мануал точно есть по этому делу.

Опишите событие, обработайте его.

FireBreezy 28.06.2008 01:06

IYAKOV

Ща нет мануала под рукой но у ExternalInterface есть два метода:
1. call("myFunction","param") вызывает у яваскрита функчию myFunction("param");
2. чето типа setCallBack("NameInJS", Funcion ); После этого в JavaScript скрипте создаеться функция NameInJS.

Погугли про это в сети много чего написано. Ещё один маленький нюанс, необходимо разрешить использование ExternalInterface. Для этого в теге HTML swLifeConnect = true. Гугли в общем :) Что забавно у меня этот интерфейс работает только по сети...

alexcon314 28.06.2008 02:58

Цитата:

Сообщение от IYAKOV
у меня получается, что при Любом вызове ExternalInterface.call, приложение обрабатывает событие axShockwaveFlash1_FlashCall.

Именно. Общение идет "реквестами" (request) - это xml примерно такого вида
Код:

<invoke name="sayHello" returntype="xml"><arguments><string>browser</string></arguments></invoke>
Вызывающий код во флэше:
Код:

ExternalInterface.call("sayHello", "browser");
В реквест можно запихать и Number и Array и Object.. в xml все будет разложено по полочкам-нодам. Осталось его распарсить....
Код:

//C# - код
private void axShockwaveFlash1_FlashCall(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEvent e)
        {
           
            XmlDocument document = new XmlDocument();
            document.LoadXml(e.request);
            XmlNode invoke = document.FirstChild;
            string func = invoke.Attributes.GetNamedItem("name").Value;
            XmlNodeList list = document.GetElementsByTagName("arguments");
            string arg = list[0].FirstChild.InnerText;
            MessageBox.Show(e.request);
            textBox.Text = "Function invoked: "+ func + ", argument: " + arg;
           
        }

... и, используя конструкцию типа swich(){case...} вызвать нужную функцию в оболочке.
Цитата:

Сообщение от IYAKOV
Значит никак вызвать какую либо функцию из внешено приложения нельзя???

си-подобные языки, в т.ч. и C# не поддерживают такую фичу как вывзов функции по string-имени, получаемому из string-переменной. (динамическая типизация, кажется, это называется). Потому - вызов через свич. Можете придумать что-то поэлегантнее, если хочется.
Вызов каллбак-функции во флэше из оболочки тоже не представляет трудностей. Опять же, в качестве аргумента передавайте xml-request.
______________________________

По поводу GetVariable. Значение поля AS-класса я не пробовал вытаскивать, но переменная прикрепленная к клипу на сцене (свойство клипа) вытаскивается легко (в AS2): GetVariable("mc.my_varproperty"); На AS3 нет возможности проверить.

За безопасность не скажу, у меня все работало без дополнинтельных телодвижений. Просто впихивается флэш-контрол на форму и понеслось.

IYAKOV 28.06.2008 09:06

Цитата:

Сообщение от alexcon314 (Сообщение 748479)
Именно. Общение идет "реквестами" (request) - это xml примерно такого вида...
В реквест можно запихать и Number и Array и Object.. в xml все будет разложено по полочкам-нодам. Осталось его распарсить и, используя конструкцию типа swich(){case...} вызвать нужную функцию в оболочке.

си-подобные языки, в т.ч. и C# не поддерживают такую фичу как вывзов функции по string-имени, получаемому из string-переменной. (динамическая типизация, кажется, это называется). Потому - вызов через свич. Можете придумать что-то поэлегантнее, если хочется.
Вызов каллбак-функции во флэше из оболочки тоже не представляет трудностей. Опять же, в качестве аргумента передавайте xml-request.
_____
По поводу GetVariable. Значение поля AS-класса я не пробовал вытаскивать, но переменная прикрепленная к клипу на сцене (свойство клипа) вытаскивается легко (в AS2): GetVariable("mc.my_varproperty"); На AS3 нет возможности проверить.

За безопасность не скажу, у меня все работало без дополнинтельных телодвижений. Просто впихивается флэш-контрол на форму и понеслось.

О! Это то, что надо! Бооольшое спасибо.

alexcon314 29.06.2008 01:29

Про каллбаки:
Код:

//C# вызывающий код
axShockwaveFlash1.CallFunction("<invoke name=\"myFlashFunction\" returntype=\"xml\"><arguments><string>my_arg</string></arguments></invoke>");
//Flash принимающий код
import flash.external.*;
ExternalInterface.addCallback("myFlashFunction", null, myFunction);
function myFunction(arg) {
        out.text += newline + arg;
}


IYAKOV 29.06.2008 10:18

Цитата:

Сообщение от alexcon314 (Сообщение 748567)
Про каллбаки:

Да, конечно, все уже работает. еще раз спасибо.
Цитата:

Сообщение от alexcon314 (Сообщение 748567)
По поводу GetVariable. Значение поля AS-класса я не пробовал вытаскивать, но переменная прикрепленная к клипу на сцене (свойство клипа) вытаскивается легко (в AS2): GetVariable("mc.my_varproperty"); На AS3 нет возможности проверить.

Дело в том, что я понятия не имею, где создается моя переменная, ведь когда я пытаюсь писать код на сцене - ошибки - это AS3. Или как еще можно занести переменную в клип?

Факт: Если запросить переменную из флеш-объекта - будет ошибка:
Код:

axShockwaveFlash1.GetVariable("a");
Но если сделать это вот так, то все будет хорошо:
Код:

axShockwaveFlash1.SetVariable("a",0xDEADBEEF);
axShockwaveFlash1.GetVariable("a");//returns 0xDEADBEEF

Значит функция работает и делает свое дело. А есть какой-нибудь способ вывести все переменные из флеш-объекта?

alexcon314 30.06.2008 00:34

С классами все аналогично, если переменная-поле экземпляра класса инициализировалась - вы ее получите, по тому же синтаксису. (Проверял.)
Цитата:

Дело в том, что я понятия не имею, где создается моя переменная
Если вы не знаете где создается переменная, как вы ее собираетесь вытаскивать по адресу? Нонсенс. Если только возможные адреса "сканировать", но откуда скан запускать?
Пишите во флэше этакий "трэйс-снапшот" (for..in) всех переменых в формате "адрес-значение", вызывайте его и отдавайте в оболочку результат.
Цитата:

Факт: Если запросить переменную из флеш-объекта - будет ошибка:
А на момент гета она вообще существует во флэше? Если нет - что вы хотите? Ни флэш, ни оболочка ее не станут инициализировать, чтобы отдавать по запросу.

IYAKOV 04.07.2008 17:25

Цитата:

Сообщение от alexcon314 (Сообщение 748768)
С классами все аналогично, если переменная-поле экземпляра класса инициализировалась - вы ее получите, по тому же синтаксису. (Проверял.)
А на момент гета она вообще существует во флэше? Если нет - что вы хотите? Ни флэш, ни оболочка ее не станут инициализировать, чтобы отдавать по запросу.

Я вот про что: Экземпляр класса(главный) создается автоматически. В нем есть поля-переменные (делал разного типа, в смысле, модификаторов) - ни одна из них не вытаскивается..

alexcon314 10.07.2008 01:17

Действительно, в AS3 GetVariable не вытаскивает так просто переменные из полей классов. Причина, видимо, кроется в отсутствии рута. Впрочем, я сильно этот вопрос не пробивал. Нашел более логичный и естественный, на мой взгляд, способ.
Просто в классе (в любом, и в DocumentClass в т.ч.) делаются обычные get(set если хотите) методы. И их надо зарегить ExternalInterface.addCallback'ом, чтобы они были доступны со стороны оболочки. Модификаторы доступа, видимо, не имеют значения в этом случае. В частности, приват-метод будет все равно доступен из оболочки после регистрации его как Callback.
Код:

//AS3
package {
        import flash.display.Sprite;
        import flash.external.*;
       
        public class Main extends Sprite {
                public var testNum:Array;
               
                public function Main() {
                        this.testNum=[3,2];
                        ExternalInterface.addCallback("get_testNum", this.get_testNum);
                }
                private function get_testNum():Array {
                        return testNum;
                }
        }
}
//C#
string var = axShockwaveFlash1.CallFunction("<invoke name=\"get_testNum\" returntype=\"xml\"><arguments></arguments></invoke>");
//var получит значение '<array><property id="0"><number>3</number></property><property id="1"><number>2</number></property></array>'

Добавлю, чтобы не изобретать велосипед качните архив примеров от адоба (~42Mb). В нем есть C#-проект с минимальным набором классов для сериализации/десериализации xml-запросов при работе оболочки с флэш-контролом.

IYAKOV 10.07.2008 16:47

Цитата:

Сообщение от alexcon314 (Сообщение 751224)
Действительно, в AS3 GetVariable не вытаскивает так просто переменные из полей классов. Причина, видимо, кроется в отсутствии рута. Впрочем, я сильно этот вопрос не пробивал.

Интересно, чем это им рут не угодил
Цитата:

Сообщение от alexcon314 (Сообщение 751224)
Нашел более логичный и естественный, на мой взгляд, способ.
Просто в классе (в любом, и в DocumentClass в т.ч.) делаются обычные get(set если хотите) методы. И их надо зарегить ExternalInterface.addCallback'ом, чтобы они были доступны со стороны оболочки. Модификаторы доступа, видимо, не имеют значения в этом случае. В частности, приват-метод будет все равно доступен из оболочки после регистрации его как Callback.

Но ведь из-за этого еще больше разрастется отработчик события FlashCall. Ну что ж, видимо больше ничего не попишешь.
Цитата:

Сообщение от alexcon314 (Сообщение 751224)
Добавлю, чтобы не изобретать велосипед качните архив примеров от адоба (~42Mb). В нем есть C#-проект с минимальным набором классов для сериализации/десериализации xml-запросов при работе оболочки с флэш-контролом.

Большое спасибо за ссылку.

alexcon314 10.07.2008 17:00

Цитата:

из-за этого еще больше разрастется отработчик события FlashCall.
ммм.. не думаю. Обработчик FlashCall в этой схеме выдергивания переменных ни причем. Вообще, на основе примера из упомянутого архива или же самостоятельно можно, думаю, организовать "прозрачное" общение между AS- и C#-классами. Т.е. как если бы вы юзали "ЕДИНЫЙ" набор классов во всем приложении.

Owyn 13.12.2010 23:31

Цитата:

Действительно, в AS3 GetVariable не вытаскивает так просто переменные из полей классов. Причина, видимо, кроется в отсутствии рута. Впрочем, я сильно этот вопрос не пробивал.
Цитата:

Сообщение от wvxvw (Сообщение 784282)
Вопрос в другом, как вы собирались до переменной добираться в АС3? Где вы ее в АС3 так сможете объявить, чтобы GetVariable смог ее увидеть?

Интересует именно этот вопрос, GetVariable() же есть и должна как-то работать с AS3? все интернеты облазил - никто не знает, может тут кто додумался как достать из AS3 переменную из класса как в примере у автора темы без костылей вроде externalinterface? если кто знает, думаю он спасет весь интернет!

dimarik 14.12.2010 00:16

Мы не очень жалуем некропосты.
Пожалуйста, создавайте новые темы со ссылкой на существующие.

От себя: GetVariable() работает только AVM1. Если докажете обратное, то создайте тему со ссылкой на этот пост.


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

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