خانه » ادوبی ایر » ایجاد دسترسی به stage و root در کلاس ها

ایجاد دسترسی به stage و root در کلاس ها

ایجاد دسترسی به stage و root در کلاس ها

همان طور که می دانید درون کلاس ها دسترسی مستقیم به stage و root وجود ندارد به طور مثال در یک کلاس که از یک MovieClip گشترش (extends) داده شده است ، شما نمی توانید stage.stageWidth را trace کنید و در واقع آن را دریافت کنید و مقداری که در زمان trace به شما نشان داده می شود null می باشد. در این مطلب ما به راه حل ساده ای برای این موضوع می پردازیم که توسط آن می توانید به راحتی به stage و root مربوطه به DisplayObject خود دسترسی داشته باشید.


دانلود سورس

ابتدا به یک مثال برای مواردی که دسترسی وجود ندارد می پردازیم تا در صورتی که تا به حال با این مورد رو به رو نشده اید ، موضوع بیشتر برای شما باز شود.

package
{
	import flash.events.Event;
	import flash.display.MovieClip;

	public class MyClass extends MovieClip
	{
	   public function MyClass()
		{

		trace(stage);//null
		//trace(stage.stageWidth);//TypeError

		}

	}
}

در مثال بالا شما نمی توانید به stage و stageWidth دسترسی داشته باشید.

حال به راه حل این موضوع می پردازیم ، در صورتی که بخواهیم همین مثال بالا به درستی امکان دسترسی به stage را داشته باشد می بایست ابتدا درون تابع constractor که همیشه هم نام کلاس می باشد (در این مثال MyClsss) ،رویداد (Event.ADDED_TO_STAGE)  را تعریف کرد و آن را به تابعی که در مثال ما added می باشد ارجاع داد ( Event.ADDED_TO_STAGE,added ). حال درون تابع added ما دسترسی کامل به stage داریم و می توانید به طور مثال stage.stageWidth را trace نماییم. در ضمن حال می توانید رویداد تعریف شده را حذف نماییم (removeEventListener).

به کد زیر دقت کنید:

package
{
	import flash.display.MovieClip;
	import flash.events.Event;

	public class MyClass extends MovieClip
	{
	   public function MyClass()
		{
			addEventListener(Event.ADDED_TO_STAGE,added);
		}

		public function added(e:Event):void{
			removeEventListener(Event.ADDED_TO_STAGE,added);
			trace(stage.stageWidth); //محتوای عددی

		}
	}
}

حال این کلاس را می توانیم برای root نیز بیشتر توسعه دهیم و تغییراتی در آن اعمال کنیم، در زیر نمونه کامل شده را مشاهده می کنید :

package {

	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.events.Event;

	public class MyClass extends MovieClip {

		public static var stage:Stage;
		public static var root:DisplayObject;

		public function MyClass() {
			if (this.stage){
				added();
			}else{
				addEventListener(Event.ADDED_TO_STAGE, added);
			}
			trace(stage); //null
			//trace(stage.width); //TypeError
		}

		private function added(e:Event = null):void {
			if (e){
				removeEventListener(Event.ADDED_TO_STAGE, added);
			}
			MyClass.stage = this.stage;
			MyClass.root = this;

			trace(MyClass.stage)
			trace(MyClass.root)
		}
	}
}

همان طور که در کد بالا مشاهده می کنید دو متغیر static ایجاد شده است که این امکان را به شما می دهد به مقدارهای stage در root بعد از مقدار دهی شدن به راحتی دسترسی داشته باشید.

اگر دوست داشته باشیم کدمان کمی از نمونه کنونی بهینه تر باشد می توانیم با تغییرات کوچکی این کار را انجام دهیم.

package {

	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.events.Event;

	public class MyClass extends MovieClip {

		public static var stage:Stage;
		public static var root:DisplayObject;

		public function MyClass() {
			if (this.stage){
				added();
			}else{
				addEventListener(Event.ADDED_TO_STAGE, added , false , 0 , true);
			}
			trace(stage); //null
			//trace(stage.width); //TypeError
		}

		private function added(e:Event = null):void {
			if (e){
				removeEventListener(Event.ADDED_TO_STAGE, added);
			}
			MyClass.stage = this.stage;
			MyClass.root = this;

			trace(MyClass.stage)
			trace(MyClass.root)
		}
	}
}

حال شاید این سوال در ذهن شما ایجاد شود که چگونه می توان از این کلاس استفاده نمود ، برای استفاده نیز در زیر به مثالی بسیار ساده می پردازیم.

import MyClass;
var myClass:MyClass = new MyClass();
addChild(myClass);
trace("myClass.stage.stageWidth:"+myClass.stage.stageWidth)


دانلود سورس

Print Friendly
تگ ها :
پیوند مطلب قبلی
پیوند مطلب بعدی

درباره بهروز پولادرگ

متولد : ۵ مرداد سال ۱۳۶۷ ، حرفه : ادوبی فلش ، برنامه نویسی و طراحی وب ، طراحی گرافیک ، مالتی مدیا ، نرم افزار های تحت وب

6 نظر

  1. سلام بهروز جان!
    خیلی وقت بود سر نزده بودم بهت!
    :دی
    سایت “اندیشمند ایرانی” که لینک کردی فعلا غ فعاله! گفتم بگم که DeadLink نداشته باشی!
    😉
    موفق باشی…
    … مثل همیشه

  2. سلام دوست من
    فرق stage , با root چیه ؟
    راستی میشه اسلاید شو هایی که با جی کوئری در وب سایت های استفاده میشن در فلش هم استفاده کرده مثل فراخوانی توابع جاوا اسکریپت در فلش همچین چیزی انکان داره ؟ ممنون پادشاه

    • سلام
      در اکشن اسکریپت سه این دو تفاوت زیادی دارند stage مربوطه به لایه ای از داده ها هست که شما می توانید توسط آن دسترسی های به محیط کاری طول و عرض صفحه و… و… داشته باشید و root در واقع شاخه اصلی هست که اگر در یک داکیومنت باشید همان this آن داکیومنت به آن اشاره می کند و می توانید توسط آن به اشیاء موجود دسترسی داشته باشید
      موفق و پیروز باشید

  3. سلام.من پزشکم.میخوام الگوریتم یا اپروچ برای تشخیص بیماریها درست کنم.فلش بدردم میخوره.کمکم کن اگر وقت داری.مرسی

ارسال جواب

آدرس رایانامه شما منتشر نخواهد شد.فیلد های اجباری علامت گزاری شده اند *

*

رفتن به بالای صفحه