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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.11.2007, 00:25
Mnilionic вне форума Посмотреть профиль Отправить личное сообщение для Mnilionic Найти все сообщения от Mnilionic
  № 1  
Ответить с цитированием
Mnilionic
 
Аватар для Mnilionic

Регистрация: Aug 2005
Адрес: я из Ленинграда
Сообщений: 1,082
Отправить сообщение для Mnilionic с помощью ICQ
По умолчанию видимость переменных в классе

при выполнении метода не видны переменные:
Код:
class my extends MovieClip{
	var b = "done";
	var btn:Button;
	
	function my(){
		trace("конструктор: " + b)
		btn.onPress = func;
	}
	 
	function func(){
		trace("метод: " + b);
		trace(btn._x)
	}
}

Старый 05.11.2007, 00:28
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 2  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Delegate используйте

Старый 05.11.2007, 01:07
Mnilionic вне форума Посмотреть профиль Отправить личное сообщение для Mnilionic Найти все сообщения от Mnilionic
  № 3  
Ответить с цитированием
Mnilionic
 
Аватар для Mnilionic

Регистрация: Aug 2005
Адрес: я из Ленинграда
Сообщений: 1,082
Отправить сообщение для Mnilionic с помощью ICQ
используя хелп и метод подбора получилось "увидеть" переменые.
только eventObj не передаётся
Код:
import mx.utils.Delegate;
class my extends MovieClip{
	var b = "done";
	var btn:Button;
	//var dat;
	
	function my(){
		trace("конструктор: " + b)
		btn.onPress = Delegate.create(this, func);
	}
	 
	function func(eventObj:Object){
		trace(eventObj.target + ": " + eventObj.type);
		trace("метод: " + b);
		trace(btn._x)
	}
}

Старый 05.11.2007, 01:16
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 4  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Если дописать пару строчек в Delegate, то можно параметры передавать
Код:
class MyDelegate 
{
	static function create(obj:Object, func:Function):Function
	{
		var f = function ()
		{
			var target = arguments.callee.target;
			var func = arguments.callee.func;
			var arg = arguments.callee.arg;
			return func.apply(target, arg);
		};
		f.arg = arguments.slice(2);
		f.target = obj;
		f.func = func;
		return f;
	}
}
Код:
class my extends MovieClip{
	var b = "done";
	var btn:Button;
	//var dat;
	
	function my(){
		trace("конструктор: " + b)
		btn.onPress = MyDelegate.create(this, func, {type:"Lyayaya", target: this});
	}
	 
	function func(eventObj:Object){
		trace(eventObj.target + ": " + eventObj.type);
		trace("метод: " + b);
		trace(btn._x)
	}
}

Старый 05.11.2007, 02:31
Mnilionic вне форума Посмотреть профиль Отправить личное сообщение для Mnilionic Найти все сообщения от Mnilionic
  № 5  
Ответить с цитированием
Mnilionic
 
Аватар для Mnilionic

Регистрация: Aug 2005
Адрес: я из Ленинграда
Сообщений: 1,082
Отправить сообщение для Mnilionic с помощью ICQ
какие полезные штуки оказывается .callee и .apply
Спасибо, суть делегэйта я понял.
Единственное место, которое я не могу понять это
Код:
f.arg = arguments.slice(2);
f.target = obj;
f.func = func;
по отношению к функции.


попробовал сделать так:
Код:
class My_Delegate {
	static function create(target:Object, func:Function):Function {
		return function(){ func.apply(target, arguments.slice(2)) };
	}
}
делегейт работает, но 3 параметр не передаётся.

up

Разобрался... функция статичная, надо было сохранить параметры просто
сделал так и вроде работает:
Код:
class My_Delegate {
	static function create(target:Object, func:Function):Function {
		var t = target;
		var f = func;
		var a = arguments.slice(2);
		var back = function(){ f.apply(t, a) };
		return back;
	}
}

class my extends MovieClip{
	var b = "done";
	var btn:Button;
	
	function my(){
		trace("конструктор: " + b)
		btn.onPress = My_Delegate.create(this, func, btn);
	}
	 
	function func(caller){
		trace(caller);
		trace("метод: " + b);
		caller._x+=10;
	}
}
udaaff, спасибо!


Последний раз редактировалось Mnilionic; 05.11.2007 в 02:54.
Старый 05.11.2007, 12:36
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 6  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
попробовал сделать так:
Код:
class My_Delegate {
static function create(target:Object, func:Function):Function {
return function(){ func.apply(target, arguments.slice(2)) };
}
}
делегейт работает, но 3 параметр не передаётся.
Потому что нужно было ссылку на массив записать в локальную переменную, так как функция которая была определена в нутри другой функции может использовать локальные переменные и параметры той функции в которой она была определана, даже после ее отработки. Т.е. сохраняется объект активации create и функция, которую мы вернули может продолжать дальше использовать ее локальные переменные.

имхо более правильно было бы значения локальных переменных и ссылку на массив параметров переписать в функцию, которую будет возвращать create.

Старый 05.11.2007, 13:33
Mnilionic вне форума Посмотреть профиль Отправить личное сообщение для Mnilionic Найти все сообщения от Mnilionic
  № 7  
Ответить с цитированием
Mnilionic
 
Аватар для Mnilionic

Регистрация: Aug 2005
Адрес: я из Ленинграда
Сообщений: 1,082
Отправить сообщение для Mnilionic с помощью ICQ
а почему если на параметр обращаться по имени, а не через массив аргументов, тоне работает?
Код:
class My_Delegate {
	static function create(target:Object, func:Function, evtobj:MovieClip):Function {
		var f = function () {
			var target = arguments.callee.target;
			var func = arguments.callee.func;
			var arg = arguments.callee.arg;
				trace("видна ведь: " + arg);
			return func.apply(target, arg);
		};
		f.target = target;
		f.func = func;
		f.arg = evtobj;
		return f;
	}
}

Старый 05.11.2007, 13:53
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 8  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Потому что вторым параметром в apply идет массив
Код:
return func.apply(target, [arg]);

Старый 05.11.2007, 13:56
CrazyFlasher вне форума Посмотреть профиль Отправить личное сообщение для CrazyFlasher Найти все сообщения от CrazyFlasher
  № 9  
Ответить с цитированием
CrazyFlasher
 
Аватар для CrazyFlasher

Регистрация: May 2003
Адрес: Tallinn
Сообщений: 3,181
Код:
import mx.utils.Delegate;

class Anton{
     private var target:MovieClip;

     public function Anton(target:MovieClip){
          this.target = target;
          this.target.onEnterFrame = Delegate.create(this, function(){
                 myFunc(target.param1, target.param2, target.param3);
          });
     }

     private function myFunc(p1:Number, p2:Number, p3:Number){
            trace(arguments);
     }
}
всё идеально передаётся
__________________
Flash Developer
Папа TDP4 Team Battle

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

Регистрация: Aug 2005
Адрес: я из Ленинграда
Сообщений: 1,082
Отправить сообщение для Mnilionic с помощью ICQ
сглупил... стыдно.
спасибо.

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:54.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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