PDA

View Full Version : اشکال در اجرای دکمه no در message box



mnakhaei67
سه شنبه 19 مهر 1390, 12:58 عصر
باسلام.من میخوام وقی فرمم در زمان اجرا بسته میشه message box ای شامل دکمه yes و no ظاهربشه که تا اینجای کار رو انجام دادم ولی نمیدونم چرا وقتی روی no کلیک میشه که باید همان فرم را نشان دهد نه تنها این کار انجام نمیشه بلکه مانند yes عمل میکنه.میشه منو راهنمایی کنین.ممنونم.برنامه نوشته شده به صورت زیر میباشد:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
case Application.MessageBox('Are You Sure You Want To Close?', 'message',
MB_YESNO + MB_ICONWARNING) of
IDYES:
begin
application.Terminate;
end;
IDNO:
begin
form1.Show;
end;
end;
end;

soft-c
سه شنبه 19 مهر 1390, 13:07 عصر
برنامه را تست کردم . درست کار می کنه . مشکلی نداشت .

majidbestgame
سه شنبه 19 مهر 1390, 14:06 عصر
با استفاده از این کد مشگلت حل میشه....(باید Action:=Canone رو وقتی روی yes کلیک نمیشه بنویسی


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if messagebox(handle,'Do you want to close this form','Exit?',Mb_yesNo+Mb_IconWarning)=Id_Yes then
application.terminate
else
Action:=Canone;
End;


امیدوارم به دردتون بخوره

firststep
سه شنبه 19 مهر 1390, 15:51 عصر
سلام
اما از نظره من اصلی ترین راه حلش اینه که Wm_closed رو که پیامی هستش که ویندوز داره به برنامتون ارسال می کنه Handell کنین
زیاد کاره دشواری نیست یعنی اصلاً سخت نیست:لبخندساده:
کافی اون پروسیجری که رو که میخواین در زمانی که بر روی کلید close فرموتون کلیک کردین اجزا بشه رو توی کلاس tform تعریف می کنین کلمه ;Wm_closed رو بعد از گزاشتن ; بنویسید همین:لبخندساده:

majidbestgame
سه شنبه 19 مهر 1390, 16:52 عصر
سلام
اما از نظره من اصلی ترین راه حلش اینه که Wm_closed رو که پیامی هستش که ویندوز داره به برنامتون ارسال می کنه Handell کنین
زیاد کاره دشواری نیست یعنی اصلاً سخت نیست:لبخندساده:
کافی اون پروسیجری که رو که میخواین در زمانی که بر روی کلید close فرموتون کلیک کردین اجزا بشه رو توی کلاس tform تعریف می کنین کلمه ;Wm_closed رو بعد از گزاشتن ; بنویسید همین:لبخندساده:

سلام نظرتون محترم....چرا لقمه رو بچرخونم دور سرم بعد بخورم....
وقتی خیلی راحت میشه Action مربوط به رویداد Tform1.close رو با یک Action:=Canone; از بستن برنامه جلوگیری کرد چرا برم دنبال Wm_closed
که.........
-------------------------------------------
شاید بهلول خودشو دیوانه نشون داد چون که دیوانه همیشه راست میگه....کسی قصد رقابت و نارو زدن به اونو نداره....تو دیوانگی میشه حرف دلشو بزنه و از وضعیت دوران اون زمان شکایت بکنه و چون که دیوانه راست میگه مردم یشنون و بیدار شن

vcldeveloper
سه شنبه 19 مهر 1390, 17:25 عصر
ولی نمیدونم چرا وقتی روی no کلیک میشه که باید همان فرم را نشان دهد نه تنها این کار انجام نمیشه بلکه مانند yes عمل میکنه.
به این خاطر که دارید از رویداد OnClose استفاده می کنید. کاری که شما دارید انجام میدید این هست که برنامه میگید، اگر فرم اصلی من در حال بسته شدن هست، برنامه را ببند، اگر نه، فرم اصلی من رو دوباره نشون بده، و بعدش اون رو ببند! یعنی در هر دو حالت کار شما ختم میشه به بستن فرم، چون ویداد OnClose زمانی فراخوانی میشه که فرم در حال بسته شدن هست. اگر فرم اصلی برنامه باشه، با بسته شدن اون، برنامه هم بسته میشه (یعنی Application.Terminate به طور خودکار فراخوانی میشه). در حالی که شما باید به برنامه تون بگید، اگر کاربر Yes را انتخاب کرد، به کار خودت (یعنی بستن فرم اصلی برنامه) ادامه بده. اگر کاربر No را انتخاب کرد، دیگه به اون کار ادامه نده، و عملیات بستن فرم را متوقف کن، که شما در کدتان همچین مکانیزمی تعریف نکردید.

یک راه برای اینکه به فرم بفهمونید که عملیات بسته شدن را ادامه نده، استفاده از پارامتر Action رویداد OnClose هست که در پست شماره 3 بهش اشاره شد. راه حل بهتر این هست که از مکانیزمی که برای همین کار تعریف شده استفاده کنید، یعنی رویداد OnCloseQuery مربوط به فرم. رویداد OnCloseQuery قبل از رویداد OnClose فراخوانی میشه، و یک پارامتر داره با نام CanClose. اگر مقدار CanClose را False کنید، فرم بسته نخواهد شد، پس می تونید نتیجه جواب کاربر به سوال درباره بسته شدن فرم را به این پارامتر اختصاص بدید، تا فرم شما به درستی بسته بشه یا از بسته شدنش جلوگیری بشه:


procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := (MessageDlg('Are You Sure You Want To Close?',mtConfirmation,[mbYes,mbNo], 0) = IDYES);
end;


اما از نظره من اصلی ترین راه حلش اینه که Wm_closed رو که پیامی هستش که ویندوز داره به برنامتون ارسال می کنه Handell کنین
فراخوانی رویداد OnClose فرم حاصل Handle کردن WM_CLOSE هست، پس نیازی نیست که برنامه نویس خودش مستقیما WM_CLOSE را هندل کنه، بلکه پاسخگویی به OnClose خودش معادل هندل کردن WM_CLOSE هست (البته فقط در ویندوز، چون در FireMonkey پیامی ارسال نمیشه که برنامه نویس بخواد اون رو هندل کنه).