PDA

Просмотр полной версии : Интеграция Flash ролика в Delphi проект


MaxxSoft
19.09.2006, 10:00
Для работы с Flash в Delphi использую ActiveX (компонент TShockwaveFlash)
Передача данных в ролик осуществляется с помощью метода

procedure TShockWaveFlash.SetVariable(const: name: WideString; const value: WideString);

что является не совсем удобным в ряде случаев, так как после установки значения переменной необходимо выполнить какие-либо действия.
Для решения этой проблемы создаю дополнительный кадр, в котором вызываются нужные функции и, после установки значения переменной, этот кадр проигрываю, примерно так:

with swMovie do
begin
SetVariable('MenuVisible', '1');
GotoFrame(FrameNum);
Play;
end;

В кадре FrameNum:

Menu._visible = MenuVisible > 0;

Полученное решение крайне неудобное. В то же время у компонента TShockWaveFlash объявлен метод:

function TShockwaveFlash.CallFunction(const request: WideString): WideString;

который, судя по названию, должен вызывать пользовательскую функцию в ролике. Тем не менее эксперименты с использованием данного метода ни к чему не привели. При передаче любого параметра вылетает TOleException "Неопознанная ошибка".
Может быть кто-нибудь использовал данную функцию?

FourSide
19.09.2006, 11:20
В Delphi писал так:
flash.setVariable('varname', 'varvalue');

А во флэше на глобальную переменную вешал функцию отлова изменения значения методом watch.

MaxxSoft
19.09.2006, 12:19
А во флэше на глобальную переменную вешал функцию отлова изменения значения методом watch.

Спасибо за информацию, но что-то не получается с наскока разобраться в использовании watch.
В хелпе написано:

usage
myObject.watch( prop, callback [, userData] )
Parameters
prop A string indicating the name of the object property to watch.

callback The function to invoke when the watched property changes. This parameter is a function object, not a function name as a string. The form of callback is callback(prop, oldval, newval, userData).

userData An arbitrary piece of ActionScript data that is passed to the callback method. If the userData parameter is omitted, undefined is passed to the callback method. This parameter is optional.

Правильно ли я понял, вешать этот метод можно только на свойства созданного экземпляра какого-нибудь класса? Или на любую глобальную переменную? Также не совсем понял про второй параметр, вызываемую функцию... Это не имя функции, а сама функция?
Если не сложно напиши небольшой пример кода.

Arreke
30.01.2008, 01:11
Присоединяюсь к MaxxSoft.
Дырку в поиске протёр, но ответа не нашёл.
Опишите подробно как юзать setVariables() + watch.

Arreke
30.01.2008, 11:32
Задача наипростейшая, но именно на ней упёрся об стену.
Вообщем на флешке имееся ComboBox, содержимое которого надо загрузить из Delphi. Так понимаю, содержимое ComboBox - строковой массив - ComboBox.labels
Моё решение,

procedure TForm1.Button2Click(Sender: TObject);
var
i :integer;
begin
for i:= 1 to 3 do
ShockwaveFlash1.SetVariable('varComboBox.labels[' + inttostr(i) + ']', inttostr(i));
end;

Ничё не происходит, то есть не могу получить доступ к элементам массива флешки. Или может как сделать varComboBox.addItems() средствами Delphi ?

etc
30.01.2008, 12:58
Arreke, отредактируйте свой пост и оформите код тегами .

Arreke
30.01.2008, 15:49
Спс, __etc, разобрался.

Во флеш:

_root.st=""
_root.fun=null
_root.fun1=function(){
varComboBox.addItem(_root.st);
}
var cbFun=function(prop, oldVal, newVal){
_root[newVal]();
}
_root.watch("fun",cbFun);


В Delphi:

procedure TForm1.Button2Click(Sender: TObject);
var
i :integer;
begin
for i:= 1 to 3 do begin
ShockwaveFlash1.SetVariable('_root.st', inttostr(i));
ShockwaveFlash1.SetVariable('fun', 'fun1');
end;
end;


Работает.

Теперь другой, наивный вопрос, зависит ли компонент ShockwaveFlash на Delphi от флеш плеера установленного в системе, то есть будет ли работать мой exe-шник с swf-файлом на компе, где не установлен флешплеер и вообще нет выхода в инет???

etc
30.01.2008, 19:36
Arreke, я где-то написал «Создайте новый пост с отредактированным кодом»? Я просил отредактировать существующий пост, благо такая возможность есть. В следующий раз не забывайте оформлять код.