PDA

View Full Version : مشکل با بستن Acrobat Reader



ehsane
جمعه 25 اسفند 1385, 22:27 عصر
pdf1 := Tpdf.Create(Self);
pdf1.Parent := panel1;
pdf1.Align := alClient;
pdf1.Visible:=true;

pdf1.LoadFile(ExtractFilePath(application.ExeName) +'data\temp\11.pdf');

با سلام به همه دوستان
از طریق کد ذیل یک فایل را در فرم باز کرده و نمایش میدهم حال می خواهم هنگام بستن فرم فایل بسته و آکروبات نیز از حافظه خارج شود. با دستور زیر هم اینکار را انجام میدهم ولی پس از چند بار باز و بسته کردن حافظه کلی اشغال می شود و بعضی اوقات هم فایهای اشتباه نمایش داده میشوند مثلا اگر یک فایلی 200 صحفه باشد دیگر از حافظه خارج نشده و همواره آنرا نمایش میدهد و باید یکبار از برنامه خارج شد تا اصلاح شود. بنظر شما اشکال در کجاست؟
این بستن فایل:

pdf1 := nil;
pdf1.Free;

ghabil
جمعه 25 اسفند 1385, 23:50 عصر
pdf1 := Tpdf.Create(Self);
pdf1.Parent := panel1;
pdf1.Align := alClient;
pdf1.Visible:=true;

pdf1.LoadFile(ExtractFilePath(application.ExeName) +'data\temp\11.pdf');

pdf1 := nil;
pdf1.Free;

مگه داری دات نت کد مینویسی که پوینترت رو Nil میکنی؟!
وقتی میزنی PDF := nil حافظه ای که PDF گرفته که Free نمیشه که ، فقط پوینتری که به PDFی که ساختی از بین میره و بصورت یک گاربج تو حافظه باقی میمونه ، و کد PDf1.Free هم چون بعدش اجرا میشه دیگه نمیتونه حافظه رو آزاد کنه چون دیگه nil شده.
خلاصه که اول Close کن، بعد Free کن بعد اگه خواستی Nil کن ، نکردی هم نکردی.

ehsane
شنبه 26 اسفند 1385, 08:41 صبح
مگه داری دات نت کد مینویسی که پوینترت رو Nil میکنی؟!
وقتی میزنی PDF := nil حافظه ای که PDF گرفته که Free نمیشه که ، فقط پوینتری که به PDFی که ساختی از بین میره و بصورت یک گاربج تو حافظه باقی میمونه ، و کد PDf1.Free هم چون بعدش اجرا میشه دیگه نمیتونه حافظه رو آزاد کنه چون دیگه nil شده.
خلاصه که اول Close کن، بعد Free کن بعد اگه خواستی Nil کن ، نکردی هم نکردی.

دوست عزیز با تشکر از شما - با استفاده از روش که شما گفتید می توان تا زمانی که در داخل برنامه هستی از آن براحتی استفاده کرد ولی پس از خروج از برنامه آکروبات همچنان در حافظه باقی می ماند و اگر کاربر چند بار برنامه را اجرا کند مشکل کمبود حافظه دوباره شروع می شود.
در ضمن pdf1 هم close ندارد یا من نتونستم پیدا کنم.

ghabil
شنبه 26 اسفند 1385, 13:15 عصر
در مورد " بعد از خروج از برنامه آکروبات همچنان در حافظه باقی میماند میشه بیشتر توضیح بدین، یعنی چجوری شد به این نتیجه رسیدین ؟
احتمالی که من میدم اینه که شاید هر دفعه که لود میکنید بعد از پایان کار حافظه رو خالی نمیکنید ، یعنی مثلا وقتی یک فایل جدید رو لود میکنید فایلی که قبلا لود بوده رو حافظش رو آزاد نمیکنید و مثلا فقط در آخر کار حافظه گرفته شده برای آخرین کد رو آزاد میکنید...

ehsane
شنبه 26 اسفند 1385, 18:44 عصر
در مورد " بعد از خروج از برنامه آکروبات همچنان در حافظه باقی میماند میشه بیشتر توضیح بدین، یعنی چجوری شد به این نتیجه رسیدین ؟
احتمالی که من میدم اینه که شاید هر دفعه که لود میکنید بعد از پایان کار حافظه رو خالی نمیکنید ، یعنی مثلا وقتی یک فایل جدید رو لود میکنید فایلی که قبلا لود بوده رو حافظش رو آزاد نمیکنید و مثلا فقط در آخر کار حافظه گرفته شده برای آخرین کد رو آزاد میکنید...

دوست عزیز در برنامه من ممکن است کاربر به دفعات فایلهای مورد نظر را باز یا بسته کند در هر مرحله به گفته دوستمان با (خلاصه که اول Close کن، بعد Free کن بعد اگه خواستی Nil کن ، نکردی هم نکردی) این روش آنرا می بندم ، حال وقتی کاربر از برنامه خارج میشود و کلا برنامه را می بندد با مشاهده task manager میتوان در حافظه بودن آکروبات را مشاهده کرد. و وقتی برای بار بعدی کاربر وارد برنامه میشود و مجددا یک فایل را باز می کند دوباره یک آکروبات دیگر در حافظه قرار می گیرد.
بنظرم دستور free نمی تواند آنرا از حافظه اصلی ویندوز خارج کند. نظر شما چیه؟

ghabil
شنبه 26 اسفند 1385, 21:31 عصر
بنظرم دستور free نمی تواند آنرا از حافظه اصلی ویندوز خارج کند. نظر شما چیه؟

بنظر من همون که دوستمون گفته کافیه (طبیعتا) . به شرطی که آبجکت آکروباتی دیگه ای درست نکرده باشی. یعنی فقط یک TPDF ساخته باشی (ضمنا این TPDF رو از کجا آوری ؟ اینترفیس خود Acrobat رو Import کردی یا داری از کامپوننت استفاده میکنی؟).
چون با توجه به اینکه Owner آبجکتهارو هم Self میدی ، با بسته شدن نرم افزار حتی اگر خودت هم این کدها رو دستی نبندی خود برنامه حافظشون رو خالی میکنه.
خلاصه که نگاه کن ببین از اول Agent آکروبات بالا نیست ، یعنی قبل از اینکه برنامت رو اجرا کنی تو حافظه یک آکروبات نیست؟ اگر نبود ، دیگه تنها راهی که به ذهنم میرسه اینه که کدی که باهاش PDF رو میسازی و Free میکنی رو بزاری اینجا نگاش کنیم.

Hamid_PaK
شنبه 26 اسفند 1385, 22:20 عصر
پس از خروج از برنامه آکروبات همچنان در حافظه باقی می ماند
در قسمت onClose فرم task مربوط به acrobat را EndProcess کنید ...
در مورد حذف پروسه ها هم جستجو کنید ، مطالب مورد نظر را می یابید.

یا حق ...

ghabil
شنبه 26 اسفند 1385, 23:29 عصر
در قسمت onClose فرم task مربوط به acrobat را EndProcess کنید ...
در مورد حذف پروسه ها هم جستجو کنید ، مطالب مورد نظر را می یابید.


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

حرفه ای
دوشنبه 28 اسفند 1385, 08:03 صبح
دوست خوبم

فرمی را که در اون OCX ادوب اکروبات رو داری می بایست فری کنی و مجدد بسازی

زمان نمایش


Application.CreateForm(TForm3, Form3);
Form3.AcroPDF1.setShowToolbar(True);
Form3.AcroPDF1.LoadFile(_Path+'Documents\'+Sender) ;
Form3.ShowModal


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


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


راستی یادت نره باید اول بری از منوی project گزینه Options رو انتخاب کنی و فرم مذکور رو در قسمت Availble Form اضاقه کنی تا در زمان نمایش اولیه پیغام خطا نده

ghabil
دوشنبه 28 اسفند 1385, 12:47 عصر
ولی پس از خروج از برنامه آکروبات همچنان در حافظه باقی می ماند و اگر کاربر چند بار برنامه را اجرا کند مشکل کمبود حافظه دوباره شروع می شود.



دوست خوبم

فرمی را که در اون OCX ادوب اکروبات رو داری می بایست فری کنی و مجدد بسازی



با بستن برنامه تمام فرمها اتوماتیک Free میشوند. و مشکل ایشون با بستن برنامه همچنان باقیست. پس مشکل این نیست.

ehsane
دوشنبه 28 اسفند 1385, 23:25 عصر
با بستن برنامه تمام فرمها اتوماتیک Free میشوند. و مشکل ایشون با بستن برنامه همچنان باقیست. پس مشکل این نیست.

دقیقا همین اتفاق می افتد ، یعنی اصلا کل فرمهای برنامه در زمان اجرا ایجاد میشوند و با بستن هر فرم هم free میشوند ولی این هیچ ربطی به خارج کردن آکروبات از حافظه ندارد. یادم هست زمانی که از ورد استفاده می کردم با یک دستور میتوانستم آنرا از حافظه نیز خارج کنم wordapp.close فکر کنم این بود. بنظرم باید دستوری برای خارج کردن برنامه آکروبات نیز وجود داشته باشد که شما بتوانید با زدن یک کلید آنرا احضار و با زدن کلید دیگر آنرا از حافظه خارج کنید برای دیدن موضوع نیز میتوان task manager را احظار و عین عملی که اتفاق می افتد را مشاهده کرد.
هنوز به جواب نرسیدم