PDA

View Full Version : شناسایی فرمی که فعال است و اجازه خروج را نمی دهد .



hamid-nic
پنج شنبه 06 اسفند 1388, 15:56 عصر
سلام دوستان وقتتان بخیر
از دلفی 7 استفاده می کنم . در یک پروژه حدود 15 فرم دارم . هنگام خروج از صفحه ی اصلی برنامه باز هم در حافظه مانده و خروج کامل نمی شود .
از کجا باید متوجه بشوم که الان کدوم فرم باز است و اجازه ی خروج را نمی دهد ؟
موقعی که خروج را می زنم هیچ فرمی روی صفحه وجود ندارد ولی با این حال باز هم برنامه در حافظه مانده و خروج نمی شود .
دوستان راهنمایی کنید که چکار کنم ؟

BORHAN TEC
پنج شنبه 06 اسفند 1388, 16:19 عصر
در رويداد onClose همه فرم ها از كد زير استفاده كن، احتمالاً مشكلت حل ميشه.

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

arshia_
پنج شنبه 06 اسفند 1388, 16:30 عصر
از فرمان زیر استفاده کن تا برنامه تحت هر شرایطی بسته بشه
گرچه این روش رو توصیه نمی کنم و پیشنهاد می کنم نظارت مناسبی روی فرمها داشته باشی و اونها رو کنترل کنی
application.terminate;

BORHAN TEC
پنج شنبه 06 اسفند 1388, 17:24 عصر
از فرمان زیر استفاده کن تا برنامه تحت هر شرایطی بسته بشه
گرچه این روش رو توصیه نمی کنم و پیشنهاد می کنم نظارت مناسبی روی فرمها داشته باشی و اونها رو کنترل کنی
application.terminate;

حرف شما متين،اين براي شرايطي هست كه بخواهيم فضاي كل برنامه آزاد بشه نه يك فرم!!!

hamid-nic
پنج شنبه 06 اسفند 1388, 17:48 عصر
از فرمان زیر استفاده کن تا برنامه تحت هر شرایطی بسته بشه
گرچه این روش رو توصیه نمی کنم و پیشنهاد می کنم نظارت مناسبی روی فرمها داشته باشی و اونها رو کنترل کنی
application.terminate;

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

hamid-nic
پنج شنبه 06 اسفند 1388, 17:51 عصر
در رويداد onClose همه فرم ها از كد زير استفاده كن، احتمالاً مشكلت حل ميشه.

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

دوست عزیز من اصلا هیچ فرمی را نمایش نمی دهم فقط در فایل پروژه برای اولین بار که اجرا میشه فرم ها ساخته می شوند . یعنی از طریق فرم اصلی هیچ فرمی را نمایش نمی دهم که بخواهم روی رویداد onClose اون چیزی را اجرا کنم .
برنامه که اجرا میشه فرم اصلی که نمایش داده می شه من برنامه را می بندم ولی بسته نمیشه . من این کد را امتحان نکردم اون را امتحان می کنم و نتیجه را می گذارم .
ممنون .

hamid-nic
پنج شنبه 06 اسفند 1388, 18:18 عصر
دستورتون را به تمام فرم ها اضافه کردم .
مشکل که حل نشد هیچ تازه هر فرم را وقتی بخوای چند بار (بیش از یک بار) استفاده کنی خطا میده . یعنی یک فرم را یک بار که باز کردی و بستی و خواستی دوباره باز کنی خطا می ده .
موقع خروج هم مشکل قبلی را داشتم .

AliReza Vafakhah
پنج شنبه 06 اسفند 1388, 18:31 عصر
باید فرم اصلی برنامه (MainForm) را فرمی قرار دهید که از آن برای خروج از برنامه استفاده می کنید .

به سورس ها در فایل پروژه بروید (dpr.*) و سپس اولین فرمی که ساخته می شود را فرم اصلی قرار دهید .

البته از منو Project هم می توانید

Mahmood_M
پنج شنبه 06 اسفند 1388, 18:36 عصر
در حالت معمول با بستن فرم اصلی ، برنامه باید بسته بشه ، اگه بسته نمیشه چند امکان وجود داره :
اول اینکه ممکنه در جایی از برنامه فرم اصلی رو تغیر دادید ، مثلا فرض کنید که یک فرم رو به عنوان Splash Screen در برنامه قرار دادید و در یونیت اصلی پروژه اون رو به عنوان اولین فرم Create می کنید ، در این صورت برنامه خودش اولین فرمی که Create میشه رو به عنوان فرم اصلی قرار میده ، یعنی فرم Splash میشه فرم اصلی و با بستن فرمهای دیگه هم برنامه بسته نمیشه ...
دوم اینکه اگر از یک Thread در برنامه استفاده کرده باشید باید اون رو هم Terminate کنید با برنامه کاملا بسته بشه ، وقتی فرم اصلی برنامه رو می ندید فقط Thread اصلی برنامه بسته می شه و سایر Thread ها به کارشون ادامه می دن و تا وقتی هم که تمام Thread های برنامه بسته نشدن برنامه به کارش خاتمه نمیده ...

دستور Application.Terminate هم به Thread اصلی برنامه ( Application ) اطلاع میده که باید کارش خاتمه پیدا کنه و کار خاص دیگه ای انجام نمی ده ...

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

موفق باشید ...

hamid-nic
پنج شنبه 06 اسفند 1388, 18:51 عصر
در حالت معمول با بستن فرم اصلی ، برنامه باید بسته بشه ، اگه بسته نمیشه چند امکان وجود داره :
اول اینکه ممکنه در جایی از برنامه فرم اصلی رو تغیر دادید ، مثلا فرض کنید که یک فرم رو به عنوان Splash Screen در برنامه قرار دادید و در یونیت اصلی پروژه اون رو به عنوان اولین فرم Create می کنید ، در این صورت برنامه خودش اولین فرمی که Create میشه رو به عنوان فرم اصلی قرار میده ، یعنی فرم Splash میشه فرم اصلی و با بستن فرمهای دیگه هم برنامه بسته نمیشه ...
دوم اینکه اگر از یک Thread در برنامه استفاده کرده باشید باید اون رو هم Terminate کنید با برنامه کاملا بسته بشه ، وقتی فرم اصلی برنامه رو می ندید فقط Thread اصلی برنامه بسته می شه و سایر Thread ها به کارشون ادامه می دن و تا وقتی هم که تمام Thread های برنامه بسته نشدن برنامه به کارش خاتمه نمیده ...

دستور Application.Terminate هم به Thread اصلی برنامه ( Application ) اطلاع میده که باید کارش خاتمه پیدا کنه و کار خاص دیگه ای انجام نمی ده ...

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

موفق باشید ...

ممنون از اینکه کامل توضیح دادید .
بله من از یک Splash Screen استفاده کرد . کد فایل پروژه هم در زیر آوردم :


uses
Forms,
Windows,
Login in 'Login.pas' {loginFrm},
.
.
.
.
QprintfishDate in 'QprintfishDate.pas' {QprintfishDateFrm};

{$R *.res}

begin
SplashScreen := TSplashScreen.Create(Application);
try
SplashScreen.Show;
Application.Initialize;
SplashScreen.Update;
Sleep(1000); // Or a delay command.
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TloginFrm, loginFrm);
.
.
.
.
.
Application.CreateForm(TQprintfishDateFrm, QprintfishDateFrm);

SplashScreen.Hide ;
finally
SplashScreen.Free;
end;
Application.Run;
end.

فکر کنم SplashScreen هنگام خروج مزاحم باشه .
نظر شما چیه ؟

hamid-nic
پنج شنبه 06 اسفند 1388, 18:53 عصر
باید فرم اصلی برنامه (MainForm) را فرمی قرار دهید که از آن برای خروج از برنامه استفاده می کنید .

به سورس ها در فایل پروژه بروید (dpr.*) و سپس اولین فرمی که ساخته می شود را فرم اصلی قرار دهید .

البته از منو Project هم می توانید
نه دوست عزیز مشکل از این نیست چون فرم اصلی مشخص کردم . البته از splash screen هم استفاده کردم .

Mahmood_M
پنج شنبه 06 اسفند 1388, 18:55 عصر
فکر کنم SplashScreen هنگام خروج مزاحم باشه .
نظر شما چیه ؟
چون اولین فرمی که Create میشه SplashScreen هست ، پس برنامه فرم اصلی رو SplashScreen قرار میده ، باید جوری عمل کنید که SplashScreen فرم اصلی نشه ، یعنی مثلا ابتدا فرم اصلی رو Create کنید و بعد از Create شدن اون رو Hide کنید و بعد SplashScreen رو Create کنید و نمایش بدید و بعد از اون فرمهای دیگه رو در آخر هم SplashScreen رو ببندید ...

در این صورت فرم اصلیتون تغییر نمی کنه و با بستن فرم اصلی برنامه ، برنامه هم بسته میشه ...

موفق باشید ...

hamid-nic
پنج شنبه 06 اسفند 1388, 19:01 عصر
یعنی میشه بگید کد فایل پروژه به چه شکلی میشه . البته به طور خلاصه .

Mahmood_M
پنج شنبه 06 اسفند 1388, 19:13 عصر
یعنی میشه بگید کد فایل پروژه به چه شکلی میشه . البته به طور خلاصه .
چیزی شبیه به کد زیر :
begin
Application.Initialize;
Application.CreateForm(TMainFrm, MainFrm);
Application.CreateForm(TSplashFrm, SplashFrm);
SplashFrm.Show;
...
SplashFrm.Close;
Application.Run;
end.
...

hamid-nic
پنج شنبه 06 اسفند 1388, 19:15 عصر
البته من کد پروژه را به این صورت تغییر دادم و جواب داد :
{$R *.res}

begin
Application.CreateForm(TMainForm, MainForm);
//MainForm.Hide ;
try
SplashScreen := TSplashScreen.Create(Application);
SplashScreen.Show;
Application.Initialize;
SplashScreen.Update;
Sleep(1000); // Or a delay command.
Application.CreateForm(TloginFrm, loginFrm);