افزونه 1 مشکل جدیدی با فرستادن و گرفتن اطلاعات در native windows ادوب ایر

r.miri19

Member
با سلام
من یک فایل دریت کردم
که در روت آن 3 تا دکمه هست و یک تکست باکس به نام test1
2 تا مووی کلیپ به نامهای pan1 و pan2 که در هر کدام از این ها نیز 3 دکمه و یک تکست باکس موجود است (فایل اتچ شده است)

در روت دکمه بالایی وظیفه درست کردن صفحه جدید از مووی کلیپ pan1 را دارد
####دکمه شماره 2 و 3 وظیفه مقدار دادن به تکست باکس موجود در pane1 و pane2 را دارد که هر کاری کردم نشد

####در pan1 دکمه شماره 1 وظیفه مقدار دادن به تکست باکس موجود در روت را دارد که هر کاری کردم نشد
در pan1 دکمه شماره 2 وظیفه درست کردن پنجره جدید از pane2 را دارد که درست کار می کند.
####در pan1 دکمه شماره 3 وظیفه مقدار دادن به تکست باکس موجود در pane2 را دارد که هر کاری کردم نشد

####در pan2 دکمه شماره 1 وظیفه مقدار دادن به تکست باکس موجود در روت را دارد که هر کاری کردم نشد
در pan2 دکمه شماره 2 وظیفه درست کردن پنجره جدید دارد که کار می کند.
####در pan2 دکمه شماره 3 وظیفه مقدار دادن به تکست باکس موجود در pane1 را دارد که هر کاری کردم نشد

فایل فلش رو نگاه کنید کامنت گذاشتم.

جلوی عباراتی که #### وجود دارد من مشکل دارم.

در حالت کلی نمی شه ارتباطی بین پنجره های در ادوب ایر به وجود آمده اند برقرار کرد مثلا از پنجره دوم مقدار تکست باکس موجود در روت و برعکس رو انجام داد.چطور می شه ارتباط داد؟
 

پیوست ها

  • 01.rar
    946.2 کیلوبایت · بازدیدها: 32

spryboy

کاربر فعال
سلام

مشکل شما ربط چندانی به پنجره ها نداره.
1
شما باید برنامه تون رو طوری بنویسید که قسمت های مختلف کدتون در صورت لزوم در دسترس (دید) بخشهای دیگه باشه. مثلا در کد موجود در روت، اگر تعریف متغیر page رو به بیرون فانکشن open_win منتقل کنید، در ایونت لیسنر btn_UP2، میتونید به سادگی با استفاده از page.test1.text مقدار تکست پن1 رو تغییر بدید.
یعنی به جای
[JSS]
function open_win(ev:MouseEvent):void {
.
.
.
var page:MovieClip = new pan1();//تعریف متغیر در داخل فانکشن
.
.
}
[/JSS]
کدتون رو به این شکل بنویسید
[JSS]
var page:MovieClip;//تعریف متغیر رو به بیرون فانکشن منتقل کردیم
function open_win(ev:MouseEvent):void {
.
.
.
page = new pan1();
.
.
}[/JSS]

برای دسترسی به روت از داخل پن1، میتونید یک متغیر، مثلا به اسم refToRoot، با دیتاتایپ MovieClip تعریف کنید و اون رو در کد روت مقدار دهی کنید.
[JSS]
var refToRoot:MovieClip;//این متغیر رو در کد موجود در پن1 تعریف میکنیم
[/JSS]
[JSS]
var page:MovieClip;
function open_win(ev:MouseEvent):void {
.
.
.
page = new pan1();
page.refToRoot = this;//یک ارجاع به روت رو در متغیر ذخیره میکنیم
.
.
}[/JSS]

بعد میتونید در پن1 از طریق این متغیر به پراپرتی های روت دسترسی داشته باشید. مثلا:
[JSS]
refToRoot.test1.text = 'Changed by PAN1';
[/JSS]
برای ارتباط بین پن1 و پن2 هم میتونید به همین روش عمل کنید.

------------------------------------------------------
2
روش دوم و ساده تر، اینه که متغیرهای گلوبال تعریف کنید، و در موقعیت های مناسب درون برنامه تون، یک رفرنس به روت، پن1 و پن2 در این متغیرها ذخیره کنید. من یک نمونه براتون آماده کردم و چون روند کار مشخصه، دیگه توضیح نمیدم. در نمونه ای که من آماده کردم، در کدهای اولیه ی شما هیچ تغییری ندادم و فقط این متغیرها رو مقدار دهی یا از اونها استفاده کردم. از یک کامنت بشکل یونیفرم استفاده کردم تا کدهای من رو بتونید راحت تشخیص بدید. به وجود کلاس Refs در کنار فایل FLA هم دقت کنید.

------------------------------------------------------
3
تا اینجا ما کاری با APIهای مختص به ایر نداشتیم. اما اگر بخواید پیچش کارتون زیاد بشه، میتونید با استفاده از پراپرتی openedWindowsـــه آبجکت nativeApplication، به پنجره های باز برنامه دسترسی داشته باشید. این پراپرتی یک آرایه از آبجکتهای nativeWindowـــه پنجره های باز رو برمیگردونه و از طریق دسترسی به nativeWindowـــه یک پنجره، میتونید به stage اون پنجره دسترسی داشته باشید. مثلا میتونید برای دسترسی به stageـــه پنجره اصلی از این کد استفاده کنید.
[JSS]
NativeApplication.nativeApplication.openedWindows[0].stage
[/JSS]


------------------------------------------------------
من به سایر جنبه های کدهای شما کاری نداشتم و اشکالات موجود رو بر طرف نکردم.

موفق باشید
 

پیوست ها

  • first win_GlobalVars.zip
    493.8 کیلوبایت · بازدیدها: 3
آخرین ویرایش:

r.miri19

Member
با تشکر از آقای spryboy
می شه یه مثال عملی از

NativeApplication.nativeApplication.openedWindows[0].stage

بزنید.ممنونم
 

r.miri19

Member
هدفتون چی هست از این دستور ؟

آقا هادی می خوام باش بین native windows ها ارتباط برقرار کنم
آقای spryboy گفتن که میشه اما این چند روزه که تو فروم نیست منم یه خورده عجله دارم .
مثلا یک متغییر به نام hadi که در openedWindows[0] هست که همان پنجره اصلی هست را در پنجره های دیگر بخوانم (در openedWindows[1] یا openedWindows[2] )
یا مثلا متغییر به نام hadi که در openedWindows[1] هست را در پنجره های دیگر بخوانم (در openedWindows[0] یا openedWindows[2] )
 

r.miri19

Member
چرا از متغیر نوعی Static استفاده نمی کنید.برای این کار به امضام و استفاده از متغیر های استاتیک تشریف ببرید...
http://forum.majidonline.com/threads/205826-مشکل-در-فراخوانی-xml
اگه نتیجه نگرفتین بگید روش رو عوض کنیم...
ممنون که جواب دادید.اما این خیلی پیچیده میشه.
فرض کنید من 6 تا native windpws دارم که همش در ارتباط هستند و چیزهای مختلف به همدیگر میخوان پاس بدند.بهترین راه همان openedWindows هست که راحت بشه باش از ویندوز موزد نظر متغییر و تابع ها رو لود کرد و با خواند.
اما نمی دونم این دستور چرا هیچ کار نمیکنه .مگه این دستور

NativeApplication.nativeApplication.openedWindows[0].stage
نباید بعد از stage نام متغییر با تابع بیاید و کار کند؟
 

spryboy

کاربر فعال
سلام

ببینید، بهترین کار اینه که بجای نوشتن کدهاتون بصورت پراکنده، همه ی اونها رو در یک فریم یا یک سورس کد بنویسید، تا درگیر این مشکلات و پیچیدگیها نشید. من یک نمونه براتون آماده کردم و اسم فایلش رو All_In_One گذاشتم. همون کدهای خودتون رو آوردم داخل روت. همونطور که میبینید تمام آبجکتها و متغیرها بصورت خودجوش در دسترس هستند. من چیزی به کدها اضافه نکردم، فقط محل addEventListenerها رو تغییر دادم تا قبل از باز شدن پنجره ها، دکمه ها کار نکنند.

اما در مورد openedWindows
همونطور که در پست قبلیم گفتم، استفاده از این پراپرتی میتونه کارتون رو پیچیده کنه. دلیلش هم اینه که این آرایه، با باز و بسته شدن پنجره ها، آپدیت میشه. مثلا در مورد برنامه ی شما، اگر پنجره های روت، پن 1 و پن 2 به ترتیب باز بشن، به همون ترتیب هم، ایندکسهای آرایه رو به خودشون اختصاص میدن. حالا اگر بعد از باز شدن پن 2، پنجره ی پن 1 رو ببندیم، پن 2 از آیتم سوم(ایندکس [2] ) به آیتم دوم (ایندکس [1]) منتقل میشه. بنابراین نمیشه مستقیما بوسیله ی ایندکسهای آرایه از اونها استفاده کرد. از طرف دیگه پنجره ها مشخصه ی منحصر به فردی هم ندارند که بتونیم عناصر آرایه رو نسبت به اون مشخصه چک کنیم. به این دلایل معمولا از openedWindows فقط بر ارتباط با پنجره ی اصلی که در ایندکس [0] قرار میگیره استفاده میکنند. اما یک راه حلی که خودم هم از اون استفاده میکنم(البته خیلی به ندرت لازم میشه)، استفاده از title پنجره هاست. لازمه ی این روش هم، اینه که هر پنجره (حداقل پنجره هایی که میخوایم باهم در ارتباط باشن)، یک title منحصر به فرد داشته باشه تا بوسیله ی اون بتونیم آیتم مورد نظرمون رو تو آرایه پیدا کنیم. من یک نمونه از برنامه تون رو با این روش و با استفاده از یک کلاس خیلی ساده و کوچک بنام GetReference، آماده کردم. چون این کلاس بخشی از یک کلاس دیگه س که ما برای کارهای خودمون نوشتیم، خیلی جنرال نیست و شرایط مختلف رو پیاده سازی نکردیم. مثلا مشخص نکردیم که، اگر پنجره ای با title داده شده رو پیدا نکرد، چیکار کنه، بنابراین اگر میخواید ازش استفاده کنید، دقت کنید که titleها رو درست تایپ کنید. اسم فایل FLAـــه این نمونه رو first_win_openedWins گذاشتم. کلاس GetReference سه تا متد بنام های
getNativeWindow و getStage و getContent داره که به ترتیب آبجکتهای nativeWindow و stage و main_timelineـــه پنجره رو برمیگردونند. این متدها رو بصورت static تعریف کردیم تا همه جا به راحتی در دسترس باشن. برای استفاده از این متدها باید titleـــه پنجره ی مورد نظرتون رو بعنوان آرگومان این متدها وارد کنید. اگر آرگومانی وارد نکنید، بصورت پیش فرض آبجکتهای مربوط به پنجره ی اصلی رو بر میگردونند. توی فایل نمونه همه چیز مشخصه. البته توی این نمونه فقط از متد getContent استفاده کردم. دقت کنید که توی کدهای شما titleــــه پنجره های پن 1 و پن 2 رو تغییر دادم و بترتیب Pan1 و Pan2 گذاشتم.

موفق باشید
 

پیوست ها

  • first win_openedWins.zip
    494.1 کیلوبایت · بازدیدها: 3
  • All_In_One.zip
    492.4 کیلوبایت · بازدیدها: 4

r.miri19

Member
سلام

ببینید، بهترین کار اینه که بجای نوشتن کدهاتون بصورت پراکنده، همه ی اونها رو در یک فریم یا یک سورس کد بنویسید، تا درگیر این مشکلات و پیچیدگیها نشید. من یک نمونه براتون آماده کردم و اسم فایلش رو All_In_One گذاشتم. همون کدهای خودتون رو آوردم داخل روت. همونطور که میبینید تمام آبجکتها و متغیرها بصورت خودجوش در دسترس هستند. من چیزی به کدها اضافه نکردم، فقط محل addEventListenerها رو تغییر دادم تا قبل از باز شدن پنجره ها، دکمه ها کار نکنند.

اما در مورد openedWindows
همونطور که در پست قبلیم گفتم، استفاده از این پراپرتی میتونه کارتون رو پیچیده کنه. دلیلش هم اینه که این آرایه، با باز و بسته شدن پنجره ها، آپدیت میشه. مثلا در مورد برنامه ی شما، اگر پنجره های روت، پن 1 و پن 2 به ترتیب باز بشن، به همون ترتیب هم، ایندکسهای آرایه رو به خودشون اختصاص میدن. حالا اگر بعد از باز شدن پن 2، پنجره ی پن 1 رو ببندیم، پن 2 از آیتم سوم(ایندکس [2] ) به آیتم دوم (ایندکس [1]) منتقل میشه. بنابراین نمیشه مستقیما بوسیله ی ایندکسهای آرایه از اونها استفاده کرد. از طرف دیگه پنجره ها مشخصه ی منحصر به فردی هم ندارند که بتونیم عناصر آرایه رو نسبت به اون مشخصه چک کنیم. به این دلایل معمولا از openedWindows فقط بر ارتباط با پنجره ی اصلی که در ایندکس [0] قرار میگیره استفاده میکنند. اما یک راه حلی که خودم هم از اون استفاده میکنم(البته خیلی به ندرت لازم میشه)، استفاده از title پنجره هاست. لازمه ی این روش هم، اینه که هر پنجره (حداقل پنجره هایی که میخوایم باهم در ارتباط باشن)، یک title منحصر به فرد داشته باشه تا بوسیله ی اون بتونیم آیتم مورد نظرمون رو تو آرایه پیدا کنیم. من یک نمونه از برنامه تون رو با این روش و با استفاده از یک کلاس خیلی ساده و کوچک بنام GetReference، آماده کردم. چون این کلاس بخشی از یک کلاس دیگه س که ما برای کارهای خودمون نوشتیم، خیلی جنرال نیست و شرایط مختلف رو پیاده سازی نکردیم. مثلا مشخص نکردیم که، اگر پنجره ای با title داده شده رو پیدا نکرد، چیکار کنه، بنابراین اگر میخواید ازش استفاده کنید، دقت کنید که titleها رو درست تایپ کنید. اسم فایل FLAـــه این نمونه رو first_win_openedWins گذاشتم. کلاس GetReference سه تا متد بنام های
getNativeWindow و getStage و getContent داره که به ترتیب آبجکتهای nativeWindow و stage و main_timelineـــه پنجره رو برمیگردونند. این متدها رو بصورت static تعریف کردیم تا همه جا به راحتی در دسترس باشن. برای استفاده از این متدها باید titleـــه پنجره ی مورد نظرتون رو بعنوان آرگومان این متدها وارد کنید. اگر آرگومانی وارد نکنید، بصورت پیش فرض آبجکتهای مربوط به پنجره ی اصلی رو بر میگردونند. توی فایل نمونه همه چیز مشخصه. البته توی این نمونه فقط از متد getContent استفاده کردم. دقت کنید که توی کدهای شما titleــــه پنجره های پن 1 و پن 2 رو تغییر دادم و بترتیب Pan1 و Pan2 گذاشتم.

موفق باشید

تشکرررررررررررررررررررررر .:oops::rose:
خیلی لطف کردید که کمک کردید و وقت گذاشتید .من این یک ماه دنبال این کد بودم و خیلی ذهنم رو مشغول کرده بود.ممنونم که یادم دادید.:rose:
از اقا هادی هم ممنونم که پیگیر بود و ما رو به حال خودم ول نکرد.آقا هادی بازم می گم یه دونه ایی :rose::green:
 

جدیدترین ارسال ها

بالا