ورود

View Full Version : حرفه ای: پروژم بعد از باز شدن بسته نمی شه ؟



majidmir
پنج شنبه 11 شهریور 1389, 08:00 صبح
سلام
یه پروژه نوشتم که حدود 35 تا فرم داره موقعی که فایل اجرایی رو که ایجاد کردم رو اجرا میکنم و می خوام ببندمش در لیست پروسس های ویندوز باقی می مونه (یعنی بسته نمیشه )؟ نمی دونم کجای برنامم مشکل داره ؟
کدی رو هم واسه بستن ازش استفاده میکنم اینه

frmlogin.close;
فرم frmlogin فرم اولیه که اجرا میشه ؟؟؟

pezhvakco
پنج شنبه 11 شهریور 1389, 08:37 صبح
من برای بستم کامل کل برنامه از کد زیر استفاده می کنم، یه امتحان کن :

Application.Terminate;

famarini
پنج شنبه 11 شهریور 1389, 09:40 صبح
سلام دوست من
لطفا بیشتر توضیح بده و اگر با راهی که دوست خوبمون pezhvakco (http://barnamenevis.org/forum/member.php?u=59994) عزیز گفتن مشکلتون حل شد یا خیر ؟

موفق باشید

nilidelphi
پنج شنبه 11 شهریور 1389, 10:45 صبح
در رویداد OnClose فرمت این کد رو بنویس:



Application.Terminate;

Felony
پنج شنبه 11 شهریور 1389, 13:14 عصر
احتمالا تو کدتون نشت حافظه دارید ، همه اشیائی که میسازید به طور کامل ازاد میکنید ؟ تو برنامه از شبکه استفاده نمیکنید ( مثل Indy ) ؟

hamid-nic
پنج شنبه 11 شهریور 1389, 17:06 عصر
یه پروژه نوشتم که حدود 35 تا فرم داره موقعی که فایل اجرایی رو که ایجاد کردم رو اجرا میکنم و می خوام ببندمش در لیست پروسس های ویندوز باقی می مونه (یعنی بسته نمیشه )؟ نمی دونم کجای برنامم مشکل داره ؟
کدی رو هم واسه بستن ازش استفاده میکنم اینه
سلام
اگه مقدور هستید فایل DPR پروژه تون را بگذارید .
از Splash Screen استفاده می کنید ؟

majidmir
یک شنبه 14 شهریور 1389, 06:10 صبح
من برای بستم کامل کل برنامه از کد زیر استفاده می کنم، یه امتحان کن :

Application.Terminate;


در رویداد OnClose فرمت این کد رو بنویس:



Application.Terminate;


دوست عزیز ممنون به درستی بسته میشه !!!!

احتمالا تو کدتون نشت حافظه دارید ، همه اشیائی که میسازید به طور کامل ازاد میکنید ؟ تو برنامه از شبکه استفاده نمیکنید ( مثل Indy ) ؟
نه استفاده نمیشه

سلام
اگه مقدور هستید فایل DPR پروژه تون را بگذارید .
از Splash Screen استفاده می کنید ؟
بفرمایید این هم فایل DPR پروژه

Delphi-Man
دوشنبه 15 شهریور 1389, 22:29 عصر
دوست عزیز اگه با application.terminateبسته میشه مشخصه که شما از فرم هاتون به عنوان page استفاده کردید. درسته؟ مثلا فرم اصلی رو مخفی میکنید و فرم دوم رو نمایش میدید. بعد که کاربر فرم دوم رو close میکنه حافظه آزاد نمیشه و برنامه بسته نمیشه. پیشنهاد میکنم در رویداد OnClose همه ی فرمها از این کد استفاده کنید:

var o,i:integer;
begin
o:=0;
for i:=0 to screen.formcount-1 do begin
if (screen.forms[i].visible) then o:=o+1;
end;
if (i<=1) then application.terminate
end;امیدوارم کمکی کرده باشم

pezhvakco
سه شنبه 16 شهریور 1389, 09:00 صبح
اگه با application.terminateبسته میشه مشخصه که شما از فرم هاتون به عنوان page استفاده کردید. درسته؟ مثلا فرم اصلی رو مخفی میکنید و فرم دوم رو نمایش میدید. بعد که کاربر فرم دوم رو close میکنه حافظه آزاد نمیشه و برنامه بسته نمیشه.

اون کد دستور برای پایان دادن به یک برنامه است و اینکه می گین " فرم ها Page است و ... "
ربطی به اون نداره .
اگه کاربر فرم دوم رو Close کنه فقط همون بسته میشه نه تمام برنامه چون فرم اصلی برنامه ، فرم1 تعریف شده است .

Felony
سه شنبه 16 شهریور 1389, 09:21 صبح
دوست عزیز اگه با application.terminateبسته میشه مشخصه که شما از فرم هاتون به عنوان page استفاده کردید. درسته؟ مثلا فرم اصلی رو مخفی میکنید و فرم دوم رو نمایش میدید. بعد که کاربر فرم دوم رو close میکنه حافظه آزاد نمیشه و برنامه بسته نمیشه. پیشنهاد میکنم در رویداد OnClose همه ی فرمها از این کد استفاده کنید:

var o,i:integer;
begin
o:=0;
for i:=0 to screen.formcount-1 do begin
if (screen.forms[i].visible) then o:=o+1;
end;
if (i<=1) then application.terminate
end;امیدوارم کمکی کرده باشم

کدتون مشکل داره ، در آخر باید O رو مقایسه کنید نه i ، اون begin و end هم اضافه هست :

var
o, i: Byte;
begin
o:= 0;
for i:=0 to screen.formcount-1 do
if (screen.forms[i].visible) then Inc(O);
if (o <=1) then application.terminate
end;

Felony
سه شنبه 16 شهریور 1389, 09:27 صبح
اون کد دستور برای پایان دادن به یک برنامه است و اینکه می گین " فرم ها Page است و ... "
ربطی به اون نداره .
اگه کاربر فرم دوم رو Close کنه فقط همون بسته میشه نه تمام برنامه چون فرم اصلی برنامه ، فرم1 تعریف شده است .

کدی که Delphi-Man قرار داده یک راه حل هست ؛ اگر مشکل برنامه از آزاد نشدن فرم ها باشه که من هم همینطور فکر میکنم این کد مشکل رو حل میکنه ( البته یه مشکل کوچیک داشت که من اصلاحش کردم ) ؛ این کد موقع بسته شدن هر فرم چک میکنه ببینه همه فرمهای برنامه بسته شدن یا نه ، اگر همه بسته شده باشن و فقط فرم جاری که کاربر در حال بستنش هست باز باشه یعنی برنامه داره به کلی بسته میشه و ایشون با این کد تمام حافظه اختصاصی رو آزاد کردن .

Delphi-Man
سه شنبه 16 شهریور 1389, 12:05 عصر
کدتون مشکل داره ، در آخر باید O رو مقایسه کنید نه i ، اون begin و end هم اضافه هست :

var
o, i: Byte;
begin
o:= 0;
for i:=0 to screen.formcount-1 do
if (screen.forms[i].visible) then Inc(O);
if (o <=1) then application.terminate
end;
سلام بله. درست میفرمایید :قلب: آخه عجله ای نوشتم از کدهاشم پیداست نظم نداره

majidmir
شنبه 20 شهریور 1389, 09:19 صبح
سلام
دوستان من كاري با فرم ها ندارم مي خوام پروژم بسته بشه كل پروژه كه قاعدتا با اين كد بايد حتما بسته بشه

application.terminate
يا اين كد (بستن فرم اول(اصلي))

form1.close;
ولي متاسفانه برنامه باز در ليست پروسس هاي باز قرار ميگيره و بسته نميشه البته اين نكته رو هم بايد بگم كه اين مشكل دقيقا بعد از استفاده از كنترل RAVE به وجود مياد

Mahmood_M
شنبه 20 شهریور 1389, 10:50 صبح
دوستان من كاري با فرم ها ندارم مي خوام پروژم بسته بشه كل پروژه كه قاعدتا با اين كد بايد حتما بسته بشه
برای بسته شدن برنامه یا باید مستقیما Application.Terminate رو فراخوانی کنید تا Terminated مربوط به Thread اصلی True بشه و برنامه بسته بشه ، یا اینکه فرم اصلی پروژه رو ببندید که البته در نهایت به Terminate شدن Thread اصلی ختم میشه ، فرم اصلی برنامه فرمی هست که در Unit اصلی پروژه ، یعنی در فایل DPR به عنوان اولین فرم بعد از Initialize شدن برنامه ساخته میشه ...

مشکل دیگه ای که ممکنه از بسته شدن برنامه جلوگیری کنه اینه که در برنامه خودتون یک Thread جدایی ساخته باشید که موقع خارج شدن از برنامه اون رو Terminate نمی کنید و به کارش ادامه میده ، در اینصورت برنامه بسته نمیشه ، تا زمانی که تمام Thread های یک Process کارشون تموم نشه و بسته نشن ، اون Process هم بسته نمیشه ، ممکنه از کامپوننتهایی استفاده کرده باشید که اونها در خودشون Thread هایی می سازن مثل Indy و در زمان پایان کار برنامه اونها رو آزاد نمی کنید ...

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

Application.Terminate رو چه زمانی فراخوانی می کنید ؟ ، کل کدهای مربوط به رویدادی که در اون Application.Terminate قرار داره رو اینجا قرار بدید ....

majidmir
شنبه 20 شهریور 1389, 13:15 عصر
ب

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

Application.Terminate رو چه زمانی فراخوانی می کنید ؟ ، کل کدهای مربوط به رویدادی که در اون Application.Terminate قرار داره رو اینجا قرار بدید ....
اين كد

procedure TFRMexit.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;

majidmir
یک شنبه 21 شهریور 1389, 11:09 صبح
يه نكته ديگه اي رو هم كه الان ديدم اينه كه فقط يه بار گزارشگيري ميكنه و براي بار دوم خطا ميده كه حافظه با اين ادرس در حال استفاده است يا در دسترس نيست ؟هر چي هست زير سر اين rave هستش؟

pezhvakco
یک شنبه 21 شهریور 1389, 12:14 عصر
يه نكته ديگه اي رو هم كه الان ديدم اينه كه فقط يه بار گزارشگيري ميكنه و براي بار دوم خطا ميده كه حافظه با اين ادرس در حال استفاده است يا در دسترس نيست ؟هر چي هست زير سر اين rave هستش؟

این پرسش در ادامه همون بسته نشدنه ؟

درست متوجه نشدم چی نوشتی و چی خطایی کی میده ؟

majidmir
یک شنبه 21 شهریور 1389, 16:54 عصر
این پرسش در ادامه همون بسته نشدنه ؟

درست متوجه نشدم چی نوشتی و چی خطایی کی میده ؟
اره !!!!
اصلا نميدونم اين برنامه مشكلش چيه ؟
هر چي هست زير سر اين كنترل RAVE هست .
فقط يك بار قايليت گزارشگيري رو داره !
روي يه سيستم ديگه نميتونم با ادرسي غير از ادرس داده شده گزارش بگيرم !
براي مثال يكي از پروسيجر ها كه بايد ازش گزارش بگيره به صورت زير هست كدش

RvDataSetConnection1.DataSet:=ADOStoredProc1;
RvProject1.Close;
RvProject1.ProjectFile:='D:\Pakhsh\REPORT\LIST_BAZ ARYAB.rav';
RvProject1.Execute;
حالا اگه ّرنامه در آدرس d:\pakhs\list.... نباشه بهم خطا ميده ؟‌
برنامه بسته نميشه !
بعضي اوقات گزارش نميگيره و خطاي زير رو ميده !

nilidelphi
یک شنبه 21 شهریور 1389, 17:22 عصر
دوست گرامی حالا که حدس می زنید از از RAVE باشه خوب تمام کامپوننت هایی که برای گزارشگیری از RAVE استفاده کردی پاک کن و ببین که پروژه بسته میشه یا نه؟؟؟

اگه بسته شد معلوم میشه که درست حدس زدی و اونموقع من پیشنهاد می کنم که از FastReport استفاده کنی.
و اگرم دوباره برنامت بسته نشه طبق گفته Mahmood_N (http://www.barnamenevis.org/forum/member.php?u=16833) از یک ترد تو برنامت استفاده شده که با بسته شدن برنامت بسته نمیشه!

majidmir
یک شنبه 21 شهریور 1389, 23:18 عصر
دوست گرامی حالا که حدس می زنید از از RAVE باشه خوب تمام کامپوننت هایی که برای گزارشگیری از RAVE استفاده کردی پاک کن و ببین که پروژه بسته میشه یا نه؟؟؟

اگه بسته شد معلوم میشه که درست حدس زدی و اونموقع من پیشنهاد می کنم که از FastReport استفاده کنی.
و اگرم دوباره برنامت بسته نشه طبق گفته Mahmood_N (http://www.barnamenevis.org/forum/member.php?u=16833) از یک ترد تو برنامت استفاده شده که با بسته شدن برنامت بسته نمیشه!
دوست عزيز امتحان ردم از كنترل RAVE هست اين اشكالات !
من با RAVE گزارش هامو طراحي كردم در نتيجه خيلي سخته كه بخوام دوباره بشينم با فست گزارش طراحي كنم ! در ضمن من اصلا از فست استفاده نكردم و فكر نكنم بتونم چند روزه باهش كار كنم !؟

nilidelphi
دوشنبه 22 شهریور 1389, 10:53 صبح
دوست عزيز امتحان ردم از كنترل RAVE هست اين اشكالات !
من با RAVE گزارش هامو طراحي كردم در نتيجه خيلي سخته كه بخوام دوباره بشينم با فست گزارش طراحي كنم ! در ضمن من اصلا از فست استفاده نكردم و فكر نكنم بتونم چند روزه باهش كار كنم !؟


عزیزم اگه از فست ریپورت استفاده کنی عاشقش میشی و دیگه رو RAVE خط میکشی.
در ضمن استفاده از فست خیلی راحته به ویژه ورژن 4 به بعدش خیلی امکانات داره.
در ضمن من یه آموزش ابتدایی برای فست ریپورت دارم اگه خواستی بگو بزارم برات.
اینم بگم که RAVE از فایل ها استفاده می کنه ولی تو فست ریپورت از فایل استفاده نمیشه پس از مسیر هم خبری نیست.

موفق باشی