PDA

View Full Version : منتظر ماندن برنامه برای وقوع یک رویداد



hamed jalili
چهارشنبه 22 اسفند 1386, 22:26 عصر
سلام دوستان
من یه برنامه به این شکل دارم :

تابع A در خط اول خود تابع A1 و در خط دوم خود تابع A2 را صدا می زند .
تابع A1 یک عکس را نمایش می دهد که باید X و Y مکان کلیک شده توسط کاربر بر روی عکس ، به تابع B ارسال شود و تابع B نیز عملیاتی را انجام می دهد که پس از اتمام عملیات باید تابع A2 صدا زده شود ،یعنی اینکه وقتی تابع B کار خود راتمام کرد ، کنترل به تابع A1 باز می گردد ، تابع A1 نیز به پایان می رسد و کنترل به تابع A باز می گردد ( به خط مربوط به فراخوانی A1 ) و سپس خط بعد اجرا شده و A2 فراخوانی می شود .

حالا مشکل اینجاست :
وقتی تایع A1 عکس را نمایش داد ، دیگر منتظر کلیک شدن بر روی عکس نمی ماند بلکه تابع A1 پایان یافته و تابع A2 فراخوانی می شود !!!!

کسی می تونه به من در حل این مشکل کمک کنه ؟!

ممنون .











.

net.میلاد(منجی)
چهارشنبه 22 اسفند 1386, 23:03 عصر
while(رویداد مورد نظر);
فکر کنم ساده ترین راه باشه!

hamed jalili
پنج شنبه 23 اسفند 1386, 06:02 صبح
متاسفانه من بلد نیستم که رویداد MouseClick رو در داخل این حلقه بزارم ، به دلیل وجود دو آرگومان داخلی او ، میشه لطفا راهنمایی کنید که چه طوری می تونم این رویداد رو در داخل While بگذارم ؟




MouseClick(object sender, MouseEventArgs e)











.

sinpin
پنج شنبه 23 اسفند 1386, 11:59 صبح
تابع A در خط اول خود تابع A1 و در خط دوم خود تابع A2 را صدا می زند .
تابع A1 یک عکس را نمایش می دهد که باید X و Y مکان کلیک شده توسط کاربر بر روی عکس ، به تابع B ارسال شود و تابع B نیز عملیاتی را انجام می دهد که پس از اتمام عملیات باید تابع A2 صدا زده شود ،یعنی اینکه وقتی تابع B کار خود راتمام کرد ، کنترل به تابع A1 باز می گردد ، تابع A1 نیز به پایان می رسد و کنترل به تابع A باز می گردد ( به خط مربوط به فراخوانی A1 ) و سپس خط بعد اجرا شده و A2 فراخوانی می شود .
حالا مشکل اینجاست :
وقتی تایع A1 عکس را نمایش داد ، دیگر منتظر کلیک شدن بر روی عکس نمی ماند بلکه تابع A1 پایان یافته و تابع A2 فراخوانی می شود !!!!

مساله رو خیلی مبهم مطرح کردید!
و ایکاش اسم واقعی متودها رو میزاشتید تا بشه نسبت به صورت مساله دید واقعی پیدا کرد. باور کنید که A1, َA2, B, ... فقط باعث میشن که شما دیرتر پاسخ بگیرید.

یا اینکه بفرمایید که دقیقا میخواین چه کاری انجام بدید :
مثلا Select کردن یک ناحیه از تصویر و یا ... ؟

در هر صورت من فکر میکنم به کمک یک متغیر بولین مثل IsClicked (قبل از صدا زدن تابع مورد نظرتون) مشکل شما برطرف بشه.

sinpin
پنج شنبه 23 اسفند 1386, 12:07 عصر
متاسفانه من بلد نیستم که رویداد MouseClick رو در داخل این حلقه بزارم ، به دلیل وجود دو آرگومان داخلی او ، میشه لطفا راهنمایی کنید که چه طوری می تونم این رویداد رو در داخل While بگذارم ؟
این کار صحیح نیست.
میتونید متودی داشته باشید که هم درون OnMouseClick صدا زده بشه و هم درون حلقه. هرچند که من دلیل حلقه رو متوجه نشدم.

hamed jalili
پنج شنبه 23 اسفند 1386, 15:55 عصر
دوست عزیز Sinpin جان
فرمایش شما صحیحه ولی مشکل اینجاست که این توابع بسیار پچیده هستند ، من برای اینکه وقت شما دوستان رو در مورد خوندن توضیحات این توابع تلف نکنم اونارو به شکل ساده شده بیان کردم .
این توابع مربوط به یک برنامه شطرنج و Engine اون هستند که دارم روش کار می کنم .
خلاصه شده این توابع به این صورته :

تابعی با نام MouseClick با دریافت X,Y مکان کلیک شده بر روی board شطرنج نمایش داده شده ، انتخاب مهره ای را تایید می کند ، سپس با کلیک دوم و ارسال X,Y جدید به تابع MouseClick ؛ این پیام به تابع داده می شود که مثلا حرکت d5 باید انجام شود . تابع MouseClick این درخواست را به تابع ValidMove ارسال می کند ، این تابع بررسی می کند که آیا این حرکت صحیح است یا نه ؟
- اگر حرکت صحیح بود ،تابع ValidMove ، مقدار True را در جواب ارسال می کند به این ترتیب تابع MouseClick با صدا زدن تابع DoMove حرکت مورد نظر را انجام می ده و نوبت به Engine واگذار می شود .

اگر تابع ValidMove در جریان بررسی با این نتیجه رسید که سرباز به خانه ی انتهایی رسیده است و باید ارتقا یابد ، منوی مربوط به ارتقا سرباز را نمایش می دهد . با کلیک شدن در هر قسمت از این منو ، ارتقا مورد نظر انتخاب شده و در تابع
privatevoid WhiteUpgrade_MouseClick(object sender, MouseEventArgs e)
تابع
publicvoid doUpgrade(int eDX, int eDY)
برای انجام ارتقا مورد نظر فراخوانی شده و پس از انجام این فرایند ها موتور باید صدا زده شود که این گونه نیست .

کد را به صورت خلاصه و ساده شده براتون اینجا می گذارم ، امیدوارم تونسته باشم منظورمو رسونده باشم .





publicvoid MouseClick()
{
if(ValidMove(Move) == true)
{
DoMove(Move);
Engine();
}
}
publicbool ValidMove(int CMove)
{
// checking proccess Code
if (newX == 7)
doUpgrade();
return CheckResult;
}
publicvoid doUpgrade()
{
// Shows a picture for pawn upgrades
WhiteUpgrade.Visible = true;
Refresh();
}
privatevoid WhiteUpgrade_MouseClick(object sender, MouseEventArgs e)
{
UpgradePawn();
}

hamed jalili
پنج شنبه 23 اسفند 1386, 15:57 عصر
:متفکر::متفکر::متفکر:

فکر کنم با همون A و B راحت تر بودین ، نه ؟ :لبخند:






.

sinpin
پنج شنبه 23 اسفند 1386, 20:46 عصر
فکر کنم با همون A و B راحت تر بودین ، نه ؟
نه اتفاقا؛ فکر میکنم همه شطرنج بلد باشند. (حداقل من شطرنج بازی خوبی هستم! :دی)
هرچند که من دقیق نفهمیدم مشکل کجاست و هنوز فکر میکنم که با یک متغیر بولین مشکلتون حل میشه. مثلا :


while (!IsClicked)
{
//Do Nothing;
}
Call MyMethod;
__________________________________
اما حقیقت رو بخواین میشد طراحی خیلی بهتری داشت.
فرضا :
میتونستید یک کلاس Abstract واسه همه ی مهره ها داشته باشید، با خواصی مثل :
Color، امتیاز مهره(Score)، موقعیت مکانی و رفتارهایی مثل Move، Draw, Kill, Capture و ... و ایونتهایی مثل : OnThreat و ...

حال کلاسهایی میومدند و از اون به ارث میرفتن مثل : Pawn, Knife ,Bishop ... که هرکدام برخی از خواص و رفتار پدرشون رو مثل Move و یا Score رو به نوعی تحریف (Override) میکردند.
و ...

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

Xcalivorse
جمعه 24 اسفند 1386, 15:15 عصر
به جای نمایش عکس یک فرم رو به صورت ShowDialog در تابع A1 باز کن. و عکست رو در اون نشون بده. بدین صورت تا بسته نشدن فرمت، تابع A1 به پایان نمی رسه.

hamed jalili
جمعه 24 اسفند 1386, 20:59 عصر
while (!IsClicked)
{
//Do Nothing;
}
Call MyMethod;



دوست عزیز این روش رو من قبلا امتحان کردم ، ولی متاسفانه برنامه در حین اجرا در همون While می مونه به عبارتی در یه حلقه ی بینهایت می افته و ازش بیرون نمی آید .

راستی ، این برنامه تقریبا تموم شده و دارم رو حرص آلفا - بتا برای بهینه کردن بازی Engine کار می کنم و دیگه نمی تونم توابع به کار رفته رو عوض کنم .

ظاهرا متاسفانه من نتونستم با توجه به وقت کم ، روش به کار رفته رو براتون خوب توضیح بدم ، روشی که استفاده کردم خیلی سریع و اصولی کار می کنه ، اشکال زداییش خیلی راحته از طرفی Trace کردنش برای بهینه کردن سرعت برنامه خیلی ساده است ؛ حداقل خودم خیلی راحتم .
از راهنمایی شما هم ممنونم .
اگه نظر دیگه ای در این مورد داشته باشین خوشحال میشم بشنوم .





به جای نمایش عکس یک فرم رو به صورت ShowDialog در تابع A1 باز کن. و عکست رو در اون نشون بده. بدین صورت تا بسته نشدن فرمت، تابع A1 به پایان نمی رسه.


دوست عزیز ،
در این صورت حداقل یه دکمه OK باید داشته باشم ، ولی به نظر من وجود یه همچین دکمه ای چیز زیاد جالبی نیست .







.