PDA

نسخه کامل مشاهده نسخه کامل : مشکل در this.RightToLeft



Msba
13-12-2010, 21:33
سلام.
من یه جا گیر افتادم بد فرم سر یک فرم! قضیه اینه:
1- فرم اصلی من راست به چپش فعال می شه.
2-زمانی که با یک کلید روی فرم اصلی فرم دوم را باز می کنم،فرم اول رو Enable فالس می کنم.
3-توو رویداد خروج فرم دوم فعال سازی فرم اصلی رو نوشتم.
4-برنامه سالم کار می کنه تا زمانی که RTL فرم اصلی فعال نیست،(مورد اول نباشه) همین که فعال می شه تو بستن فرم دوم پیغام می ده که نمی تونه فرم رو پیدا کنه. یه foreach هم از OpenForm ها گرفتم که معلوم شد اصلا فرم رو پیدا نمی کنه.


اینم یکسری کد ها:
در فرم اصلی:


this.Enabled = false;
about ab = new about();
ab.Show();



در فرم دوم رویداد خروج :

(Application.OpenForms["MainForm"] as MainForm).Enabled = true;


خیلی وقت گذاشتم فهمیدم سر اون RTL فرمه. :18:
خلاصه کمک کنید!!!!!!!!!!!!!!!
RTL فرم در زمان راه اندازی فرم توسط کد تغییر می کنه.
ShowDialog هم امتحان کردم نشده.

عــــلی
14-12-2010, 10:45
سلام.
من امتحان کردم مشکلی نداشت!!!
مطمعنی کدت همینه؟
میشه یه نمونه کوچیک بسازی آپ کنی ببینیم؟

Msba
14-12-2010, 12:19
من دوباره امتحان کردمولی نشد شاید یه باگه که توو ورژنی که شما دارید درست شده.
اینم یه کد . قبل از اینکه سلوشن رو باز کنید برید exe رو باز کنید اونوقت ارور رو خوب می بینید.:19:
ریش و قیچی دست شما!
:biggrin:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

عــــلی
14-12-2010, 12:34
سلام.
جالبه:blink:
راستش من اول exe رو اجرا کردم و بعد پروژه رو exe درست بود ولی پروژه نه.:31:
اون خط Right To Left رو هم برداشتم ولی بازم خطا داد.
وقتی شما Enable فرم رو برابر False قرار میدین Form از حالت Active خارج میشه و به حالت معلق در میاد.
شما یه Property به صورت زیر در فرم اصلی بسازید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد زیر را هم در قسمت public Form1() اضافه کنید که This مقدار دهی شود:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حالا در کد فرم دوم به این شکل بنویسید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

موفق باشید.

Msba
14-12-2010, 18:32
نکته ریزی بود.
روشی که شما گفتید ریزتر! (خیلی حال داد)


حل شد.

_H2_
15-12-2010, 00:27
سلام
اگر میخواهید در زمان نمایش فرم دوم کاربر نتواند با فرم اول تعامل داشته باشد، نیازی به تغییر Enabled نیست!!!!
در وضعیت دو فرم، این حالت به مدال معروف است.
برای مودال کردم در فرم کافی است به جای دستور Show از ShowDialog استفاده کنید.
با مدال کردن فرم دوم، خود سیستم عامل تا فرم مدال بسته نشود، اجازه کار با فرم پایه را نمیدهد.
مشخص ترین و پر کاربرد ترین فرم مودال موجود همین MessageBox است که تا بسته نشود فرم اولیه از دسترس خارج میشود.



ShowDialog هم امتحان کردم نشده
چه نشد؟ اینکه از فرم دوم چیزی در فرم اولرا تغییر دهید؟ یا ...؟

البته بنظر با کد دوستمان عزیزمان hamishebahar مشکلتان حل شده است، بحرحال اگر خواستید این مسئله را طور دیگری (بدون متغییر static) حل کنید، حتماً امکان دارد.
موفق باشید.

عــــلی
18-12-2010, 09:21
اگر میخواهید در زمان نمایش فرم دوم کاربر نتواند با فرم اول تعامل داشته باشد، نیازی به تغییر Enabled نیست!!!!
در وضعیت دو فرم، این حالت به مدال معروف است.
برای مودال کردم در فرم کافی است به جای دستور Show از ShowDialog استفاده کنید.
با مدال کردن فرم دوم، خود سیستم عامل تا فرم مدال بسته نشود، اجازه کار با فرم پایه را نمیدهد.
مشخص ترین و پر کاربرد ترین فرم مودال موجود همین MessageBox است که تا بسته نشود فرم اولیه از دسترس خارج میشود.
سلام داداش حسن ممنونم.
من یه مدتی در مورد این مدال ها تحقیق کردم ولی یه سوالی توی ذهنم موند که نتونستم به جواب برسم و اونم این بود که چطوری این ShowDialog کار میکنه؟منظورم اینه که وقتی ShowDialog میشه کدهای بعدی تا زمانی که فرم بسته نشه اجرا نمیشن و این همون دال کردنه و من میخوام بدونم که چطوری میتونم یه تابع توی فرمم درست کنم که همین کار رو انجام بده؟بعنی کدهای بعدی اجرا نشه تا خودم با کد بگم.در اصل منظور اینه که یه جای کد Pause کنم و بعد Play کنم. البته میدونم با Thread و Event ها هم میشه.خواستم بدونم روش دیگه ای هم داره؟
مرسی:11:.

_H2_
20-12-2010, 21:58
سلام


چطوری این ShowDialog کار میکنه؟منظورم اینه که وقتی ShowDialog میشه کدهای بعدی تا زمانی که فرم بسته نشه اجرا نمیشن و این همون دال کردنه و من میخوام بدونم که چطوری میتونم یه تابع توی فرمم درست کنم که همین کار رو انجام بده؟بعنی کدهای بعدی اجرا نشه تا خودم با کد بگم.در اصل منظور اینه که یه جای کد Pause کنم و بعد Play کنم. البته میدونم با Thread و Event ها هم میشه.خواستم بدونم روش دیگه ای هم داره؟

این قبیل موارد به مسائل چند ریسمانی باز میگردد.
چه در حالت مودال و چه در حالت معمول ریسمان برنامه شما فقط همان یکی (که خود ویندوز با دبل کلیک ایجاد کرده) میماند و ریسمانی اضافه نمیشود.
در هر دو حالت هم همین یک یسمان مسئول مدیریت (رسم و جواب به کاربر و...) کلیه فرم های شما را بر عهده دارد.
ولی در حالت مودال ویندوز پاسخ دهی به صف پیام های فرم های زیرین را متوقف میکند.

=====

اگر شما در برنامه تان حس کنید به چیزی احتیاج دارید که کد را تا زمان مقرر خاصی متوقف کند، مشکلی وجود ندارد برای حالات و شرایط مختلف روش ها بسیار جالبی و دقیقی در دات نت داریم
ولی ...
گاهی درک صحیح مسائل چند ریسمانی برای افراد کمی مشکل خواهد بود و در شرایط خوب موجب کاهش بازدهی و بی تاثیر کردن چند ریسمانی و در شرایط بد میتواند موجب هنگ کردن برنامه را هم فرا هم کند.

این را باید بدانید که توقف ریسمان (و به قول شما Pause) فقط در شرایطی منطقی و ممکن است که برنامه شما چند ریسمانی باشد و این بلا را تا حد ممکن سر ریسمان اصلی در نیاورید.
مثلاً اگر شما بدون درک صحیحی بیایید و همان یک ریسمان برنامه تان را برای اتفاق خاصی بلوک کنید، تنها ریسمان برنامه را بلوکه کردید، یعنی همان ریسمانی که باید ان اتفاق خاص را هم انجام میداد!!! نتیجتاً هیچ وقت ان اتفاق رخ نداده و اجرا نمیشود و برنامه شما تا ابد بلوکه شده و منتظر خواهد ماند!!!

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

مثلاً گاهاً بنظر میرسد که افراد فکر میکنند چند ریسمانی همینطوری و در هر شرایطی معجزه میکند و حالا هرطور که اجرا کنند مهم نیست!!!! مهم ان است چند ریسمانی باشد!!!!
ریسمان جدیدی را ایجاد و ان را به کاری میگمارند و چون تفکرات صحیح پردازش همزمان و چند ریسمانی ندارند، باز هم میخواهند کار را به همان روال سابق انجام دهند.
مثلاً فرد ریسمانی میسازد تا فایلی را کپی/دانلود و... کند یا کار دیگری انجام دهد، بعد چون به جواب ان نیاز دارد، ریسمان اصلی را میخواهد متوقف کند تا ان ریسمان کارش را انجام دهد و بعد که تمام شد ریسمان اصلی بقیه کار را انجام دهد!!!!!!!!!!!!!!!!!!!!!!!!!!!
(نمونه مشابه همین بحث را در انجمن وب در مورد Ajax داشتیم که فرد اصلاً چند ریسمانی را درک نمیکرد ...)

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

=====

نتیجتاً باید دوستان موارد این تیپی را درک کنند و مطمئن شوند که کاری که انجام میدهند منطق و اصول صحیح دارد.
استفاده بد از چند ریسمانی به مراتب بدتر از برنامه تک ریسمانی است.

مطمئن شوید که لقمه را نمیچرخوانید و استفاده تان صحیح و بجا و منطقی است، سپس برای توقف ریسمان از متد Thread.Join یا کلاس WaitHandle استفاده کنید.
موفق باشید.

Msba
25-12-2010, 23:19
بسیار عالی، هم روش استفاده صحیح از ShowDialog دستم اومد هم متغیر Static .
اینم می گذارم شاید به درد یه کی بخوره:
تو فرم اول:

this.enable=false;
Form f2=new Form();
if(f2.showDialog()==dialogResult.Cancel)
this.enable=true;

همین هیچ احتیاجی هم به کاری روی فرم دوم ندارد.
در ضمن می تونستیم Enable رو هم دست نزنیم.(ننویسیم بهتره) اونوقت اصلا شرط هم نمی خواهد.مگر اینکه بخواهیم کار دیگری غیر از Enbale سر فرم بیاوریم.
اینا رو همه رو با هم گفتم تا خلاصه شه کسی دنبالش نگرده فقط همین. (من از خودتون یاد گرفتم)

با تشکر از همه علما