Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Array и Object при передаче через ExternalInterface (http://www.flasher.ru/forum/showthread.php?t=119750)

lebeg 29.12.2008 17:13

Array и Object при передаче через ExternalInterface
 
Добрый день,

у меня возникла проблема с передачей аргументов типа array и object из с++ приложения во флеш на AS3.

Код AS3:

public function xHandler(... args):void
                {
                        output.appendText("Somthing Recieved!!!! \n");
                        for (var i:uint = 0; i < args.length; i++) {
                                output.appendText("Argument N" + i + ": " + args[i] + "\n");
                        }
                }

При передаче простой строки все нормально, а вот если передается массив или объект, то начинается строгий мат.

Кстати, даже если передавать одну строку, то аргументов у функции становиться почему-то 3, первый и последний из которых undefined, а вот только 2ой тот который нужен.

Кто-нибудь сталкивался с такой проблемой? Как передать массив или объект во флеш?

Добавлено через 17 минут
Ошибка выдается следующая
Error #1086: The name method only works on lists containing one item.
at XMLList/http://adobe.com/AS3/2006/builtin::name()
at ()
at flash.external::ExternalInterface$/flash.external:ExternalInterface::_toAS()
at flash.external::ExternalInterface$/flash.external:ExternalInterface::_arrayToAS()
at flash.external::ExternalInterface$/flash.external:ExternalInterface::_toAS()
at flash.external::ExternalInterface$/flash.external:ExternalInterface::_argumentsToAS()
at flash.external::ExternalInterface$/flash.external:ExternalInterface::_callIn()
at ()

Obi 29.12.2008 17:35

Код AS3:

function myTrace(... args):void {
        for(var i:uint = 0; i < args.length; i++) {
                trace('args', args[i]);
        }
        trace('length:', args.length);
}
 
myTrace(new Array(1, 2, 3), {prop1:'pr1', prop2:'pr2', prop3:3.14}, 'hello', 'world', new Point(1, 10));

Собственно длину нормально показывает. Да и мата никакого не надблюдается...

lebeg 29.12.2008 17:57

Дело в том, что из с++ запросы приходят в виде:

<invoke name="functionName" returntype="xml">
<arguments>
... (individual argument values)
</arguments>
</invoke>

который по идее разбирается средствами ExternalInterface...

Добавлено через 5 минут
Код AS3:

if (ExternalInterface.available) {
  ExternalInterface.addCallback("x", xHandler);
}
public function xHandler(... args):void
{
  output.appendText("Somthing Recieved!!!!\n");
  for (var i:uint = 0; i < args.length; i++) {
    output.appendText("Argument N" + i + ": " + args[i] + "\n");
  }
}

в CallFunction передается
Код:

<invoke name="x" returnType="xml" >
 <arguments>
  <array>
  <property id="0" >
    <string>sdfsdf</string>
  </property>
  <property id="1" >
    <string>sadfsdfgsdfg</string>
  </property>
  </array>
 </arguments>
</invoke>


wvxvw 29.12.2008 18:38

Похоже что вы сами пытаетесь создать этот ХМЛ? Я прав? Если да, то ошибка вам говорит о следующем:
вы неправильно составили ХMLList, и в нем не должно быть больше 1 топ элемента.
Т.е.:
Код AS3:

var foo:XMLList = 
<a/> +
<b/>;
trace(foo[0].name());

Если вы уберете [0] то получите ту же ошибку.

lebeg 30.12.2008 12:18

Большое спасибо за предыдущий совет! Он открыл мне глаза на то, что действительно происходило - дело в сторонней библиотеке (Qt), которая неправильно передает параметры в контейнер. Даже баг уже такой на оф.сайте занесен... )

litebox 26.01.2009 18:19

возникла аналогичная проблема, но при попытке передачи из C++ во флэш данных в виде XML.
Получается (если верить lebeg), что при передаче во флэш, данные приводятся к такому формату:
Код:

<invoke name="functionName" returntype="xml">
  <arguments>
    <data_xml></data_xml>
  </arguments>
</invoke>

так?


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

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