Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.06.2008, 01:06
FireBreezy вне форума Посмотреть профиль Отправить личное сообщение для FireBreezy Найти все сообщения от FireBreezy
  № 11  
Ответить с цитированием
FireBreezy

Регистрация: May 2008
Сообщений: 25
IYAKOV

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

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

Старый 28.06.2008, 02:58
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 12  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Цитата:
Сообщение от 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 нет возможности проверить.

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


Последний раз редактировалось alexcon314; 28.06.2008 в 03:13.
Старый 28.06.2008, 09:06
IYAKOV вне форума Посмотреть профиль Отправить личное сообщение для IYAKOV Найти все сообщения от IYAKOV
  № 13  
Ответить с цитированием
IYAKOV
 
Аватар для IYAKOV

Регистрация: Feb 2007
Адрес: RB
Сообщений: 87
Отправить сообщение для IYAKOV с помощью ICQ
Цитата:
Сообщение от alexcon314 Посмотреть сообщение
Именно. Общение идет "реквестами" (request) - это xml примерно такого вида...
В реквест можно запихать и Number и Array и Object.. в xml все будет разложено по полочкам-нодам. Осталось его распарсить и, используя конструкцию типа swich(){case...} вызвать нужную функцию в оболочке.

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

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

Старый 29.06.2008, 01:29
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 14  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Про каллбаки:
Код:
//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;
}

Старый 29.06.2008, 10:18
IYAKOV вне форума Посмотреть профиль Отправить личное сообщение для IYAKOV Найти все сообщения от IYAKOV
  № 15  
Ответить с цитированием
IYAKOV
 
Аватар для IYAKOV

Регистрация: Feb 2007
Адрес: RB
Сообщений: 87
Отправить сообщение для IYAKOV с помощью ICQ
Цитата:
Сообщение от alexcon314 Посмотреть сообщение
Про каллбаки:
Да, конечно, все уже работает. еще раз спасибо.
Цитата:
Сообщение от alexcon314 Посмотреть сообщение
По поводу GetVariable. Значение поля AS-класса я не пробовал вытаскивать, но переменная прикрепленная к клипу на сцене (свойство клипа) вытаскивается легко (в AS2): GetVariable("mc.my_varproperty"); На AS3 нет возможности проверить.
Дело в том, что я понятия не имею, где создается моя переменная, ведь когда я пытаюсь писать код на сцене - ошибки - это AS3. Или как еще можно занести переменную в клип?

Факт: Если запросить переменную из флеш-объекта - будет ошибка:
Код:
axShockwaveFlash1.GetVariable("a");
Но если сделать это вот так, то все будет хорошо:
Код:
axShockwaveFlash1.SetVariable("a",0xDEADBEEF);
axShockwaveFlash1.GetVariable("a");//returns 0xDEADBEEF
Значит функция работает и делает свое дело. А есть какой-нибудь способ вывести все переменные из флеш-объекта?


Последний раз редактировалось IYAKOV; 29.06.2008 в 10:24.
Старый 30.06.2008, 00:34
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 16  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
С классами все аналогично, если переменная-поле экземпляра класса инициализировалась - вы ее получите, по тому же синтаксису. (Проверял.)
Цитата:
Дело в том, что я понятия не имею, где создается моя переменная
Если вы не знаете где создается переменная, как вы ее собираетесь вытаскивать по адресу? Нонсенс. Если только возможные адреса "сканировать", но откуда скан запускать?
Пишите во флэше этакий "трэйс-снапшот" (for..in) всех переменых в формате "адрес-значение", вызывайте его и отдавайте в оболочку результат.
Цитата:
Факт: Если запросить переменную из флеш-объекта - будет ошибка:
А на момент гета она вообще существует во флэше? Если нет - что вы хотите? Ни флэш, ни оболочка ее не станут инициализировать, чтобы отдавать по запросу.


Последний раз редактировалось alexcon314; 30.06.2008 в 08:35.
Старый 04.07.2008, 17:25
IYAKOV вне форума Посмотреть профиль Отправить личное сообщение для IYAKOV Найти все сообщения от IYAKOV
  № 17  
Ответить с цитированием
IYAKOV
 
Аватар для IYAKOV

Регистрация: Feb 2007
Адрес: RB
Сообщений: 87
Отправить сообщение для IYAKOV с помощью ICQ
Цитата:
Сообщение от alexcon314 Посмотреть сообщение
С классами все аналогично, если переменная-поле экземпляра класса инициализировалась - вы ее получите, по тому же синтаксису. (Проверял.)
А на момент гета она вообще существует во флэше? Если нет - что вы хотите? Ни флэш, ни оболочка ее не станут инициализировать, чтобы отдавать по запросу.
Я вот про что: Экземпляр класса(главный) создается автоматически. В нем есть поля-переменные (делал разного типа, в смысле, модификаторов) - ни одна из них не вытаскивается..

Старый 10.07.2008, 01:17
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 18  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Действительно, в 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-запросов при работе оболочки с флэш-контролом.


Последний раз редактировалось alexcon314; 10.07.2008 в 09:00.
Старый 10.07.2008, 16:47
IYAKOV вне форума Посмотреть профиль Отправить личное сообщение для IYAKOV Найти все сообщения от IYAKOV
  № 19  
Ответить с цитированием
IYAKOV
 
Аватар для IYAKOV

Регистрация: Feb 2007
Адрес: RB
Сообщений: 87
Отправить сообщение для IYAKOV с помощью ICQ
Цитата:
Сообщение от alexcon314 Посмотреть сообщение
Действительно, в AS3 GetVariable не вытаскивает так просто переменные из полей классов. Причина, видимо, кроется в отсутствии рута. Впрочем, я сильно этот вопрос не пробивал.
Интересно, чем это им рут не угодил
Цитата:
Сообщение от alexcon314 Посмотреть сообщение
Нашел более логичный и естественный, на мой взгляд, способ.
Просто в классе (в любом, и в DocumentClass в т.ч.) делаются обычные get(set если хотите) методы. И их надо зарегить ExternalInterface.addCallback'ом, чтобы они были доступны со стороны оболочки. Модификаторы доступа, видимо, не имеют значения в этом случае. В частности, приват-метод будет все равно доступен из оболочки после регистрации его как Callback.
Но ведь из-за этого еще больше разрастется отработчик события FlashCall. Ну что ж, видимо больше ничего не попишешь.
Цитата:
Сообщение от alexcon314 Посмотреть сообщение
Добавлю, чтобы не изобретать велосипед качните архив примеров от адоба (~42Mb). В нем есть C#-проект с минимальным набором классов для сериализации/десериализации xml-запросов при работе оболочки с флэш-контролом.
Большое спасибо за ссылку.

Старый 10.07.2008, 17:00
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 20  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Цитата:
из-за этого еще больше разрастется отработчик события FlashCall.
ммм.. не думаю. Обработчик FlashCall в этой схеме выдергивания переменных ни причем. Вообще, на основе примера из упомянутого архива или же самостоятельно можно, думаю, организовать "прозрачное" общение между AS- и C#-классами. Т.е. как если бы вы юзали "ЕДИНЫЙ" набор классов во всем приложении.


Последний раз редактировалось alexcon314; 10.07.2008 в 17:03.
Создать новую тему Ответ Часовой пояс GMT +4, время: 12:58.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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