PDA

View Full Version : ميخوام با بسته شدن فرم اصلي برنامه بسته بشه



شفیعی
یک شنبه 15 خرداد 1384, 18:07 عصر
سلام
در برنامه چند فرم داریم که در فرم اصلی برنامه از کاربر اسم و رمز ورودی را دریافت می کنیم(فرم شماره یک ) پس از ورود فرم شماره 2 باز می شود که در آن منو برنامه قرار دارد در منو یک آیتم به نام خروج داریم می خواهیم وقتی روی این آیتم کلیک می کنیم برنامه بسته شود ولی وقتی در فرم شماره 2 دستور FORM1.CLOSE را می دهیم فرم شماره 2 بسته می شود ولی فرم شماره یک بسته نمی شود علت چیست

Delphi_Developer
یک شنبه 15 خرداد 1384, 19:19 عصر
چون که شما برای خارج شدن از کل برنامه باید این طوری بنویسید :


Mainform.Close;

به جای Mainform نام فرمی رو باید قرار بدید که توی پروژه به عنوان فرم اصلی انتخابش کردید .
موفق باشی

Touska
یک شنبه 15 خرداد 1384, 19:53 عصر
یا کلا پروژه را terminate نمایید.

که کار جالبی نیست.


Application.Terminate;

موفق باشید :flower:

Delphi Skyline
یک شنبه 15 خرداد 1384, 20:35 عصر
یا دستور halt

vcldeveloper
دوشنبه 16 خرداد 1384, 02:35 صبح
یا دستور halt
دستور halt برنامه رو بصورت طبیعی نمی بنده و روالهای کنترلی برنامه شما بدرستی اجرا نمی شند (برای مثال، در یک ساختار try..finally در صورت استفاده از halt، برنامه بدون اجرای بلوک finally خاتمه پیدا میکنه.
در نتیجه هیچ وقت از halt برای پایان دادن به برنامه استفاده نکنید!

brians2000
دوشنبه 16 خرداد 1384, 04:12 صبح
الان توی کافی نت هستم دلم نیومد جواب ندم!
شما برای بستن یک برنامه حتما باید از APPLICATION.TERMINATE استفاده کنی... لستفاده از هالت خاص برنامه های داس و یا در ویندوز برنامه ای که از وی سی ال و یا چیز مشابهی استفاده نکنه به چندین دلیل مهم :
1- هندل های اشغال شده و بسیاری از ریسورس های اشغال شده می توانند باقی بمانند و سیستم را کند و یا بتدریج غیر قابل استفاده کنند (ری استارت تنها راه حل! )
2- باید اینکار رو بکنید. زمانی که فلاگ ترمینیتد رو چک کنید باید از حلقه های سایر ترید ها هم خارج شید! این مقدار باید چک بشه! بخصوص زمانی که چندین ترید در حال کار هستند...
3-این دستور تمامی فرم هارو خود بخود و دونه بدونه می بنده. ایونت های لازمه رو برای تخلیه حافظه و منابع اجرا می کنه. و استاندارد است! بستن فرم اصلی یک راه حل خیلی عجیبه!

vcldeveloper
دوشنبه 16 خرداد 1384, 10:54 صبح
بستن فرم اصلی یک راه حل خیلی عجیبه!
دوست عزیز، بستن فرم اصلی نهایتا به فراخوانی Application.Terminate منجر میشه، در نتیجه اصلا راه حل عجیبی نیست!

mahdi939
دوشنبه 16 خرداد 1384, 12:23 عصر
با سلام

همانطور که آقای کشاورز فرمودند با بستن فرم اصلی برنامه بسته شده و نیاز به Application.Terminate نمی باشد .

موفق باشید .

brians2000
دوشنبه 06 تیر 1384, 09:17 صبح
اینرو هرکسی می دونه که با بستن فرم اصلی برنامه بسته خواهد شد! ولی از نظر تکنیکی این کار (درتی ورک است! )‌ و صحیح ترین و منطقی ترین استفاده از دستور استاندارد می باشد!‌...

vcldeveloper
دوشنبه 06 تیر 1384, 20:30 عصر
ولی از نظر تکنیکی این کار (درتی ورک است! )‌
:گیج: این کار اصلا (به قول شما) درتی ورک محسوب نمیشه.
بد نیست نگاهی به کد TCustomForm.Close بیاندازید:



procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;



procedure TCustomForm.WMClose(var Message: TWMClose);
begin
Close;
end;

brians2000
سه شنبه 07 تیر 1384, 12:35 عصر
دقیقا خود درتی ورک است! اگر می خواهید برنامه را ببندید بهترین راه حل همان اپلیکیشن ترمینیت است! البته تاکید می کنم اپلیکیشن نه چیز دیگر... و اگر می خواهی اجازه ندهی که فرم بسته شود مثلا یک سوال بکند کنسل کنم یا ادامه بدهم یا ذخیره کنم یا ذخیره نکنم بهتر است که رویداد مربوط به کلوز فرم رو پر کنی با کدی که می خواهی..توی آن کلوز Action: TCloseAction); اکشن رو می تونی

caNone The form is not allowed to close, so nothing happens.
caHide The form is not closed, but just hidden. Your application can still access a hidden form.
caFree The form is closed and all allocated memory for the form is freed.
caMinimize The form is minimized, rather than closed.

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

نکته: حتی الامکان سعی کنید از فرامین استاندارد استفاده کنید که ویرایش کد راحتتر باشد... ! بستن فرم اصلی یک روش است ولی استفاده از استاندارد بهترین راه حل است!

vcldeveloper
سه شنبه 07 تیر 1384, 12:53 عصر
والله دوست عزیز...هیچ جا Application.Terminate رو استاندارد معرفی نکردند - غیر اینکه شما معرفی کنی.
در ضمن اگه قصد حفظ ساختیافتگی یا کلاس بندی یا هر چیز دیگه ایی رو داری...Form.Close بیشتر بهت کمک می کنه. Application.Terminate رویداد OnClose رو دور میزنه و عملا کد این رویداد هیچوقت اجرا نمیشه!
:موفق:

brians2000
سه شنبه 07 تیر 1384, 13:28 عصر
بله دلیل شمارو قبول دارم... ...