ورود

View Full Version : خارج کردن حافظه TabSheet



حمید محمودی
دوشنبه 04 مرداد 1389, 23:46 عصر
سلام،

مثلا ما چند TabSheet (در یک Pagecontrol) داریم. و در همه Tabsheetها هم یک باتن Exit هست.

راهی داره که مثلا وقتی روی همین باتن کلیک کنیم عناصری که در این Tabsheet استفاده کردیم رو از حافظه خارج کنه؟؟؟؟

آیا فقط دستور Tabsheet1.free میتونه اینکارو بکنه. در این حالت مثل اینه که اون تب شیت به همراه کلیه عناصر توش اصلاً ساخته نشده؟؟؟


و اینکه حالا چطور میشه وقتی تب شیت رو از حافظه خارج کردیم، دوباره وقتی گفتیم Pagecontrol1.ActivePageIndex:=1 ، تب شیت رو به همراه کلیه عناصر توش
رو نشون بده؟؟؟؟


میخام هر Tabsheet مثل یک Form عمل کنه. (یعنی با کلیک روی باتن Exit، تمام حافظه ای که بکار برد، رو خارج کنه و ما بتونیم دوباره هر تب شیت رو لود کنیم!!


تا یادم نرفته بپرسم. آیا لازمه که Tabsheetهایی که فعلا نیاز نداریم (یعنی نمیخایم باهاش کار کنیم) رو از حافظه خارج کنیم؟؟؟ یعنی وقتی کاربر روی
Tab مربوط به اون کلیک کرد اون تب شیت به همراه کلیه عناصرش ساخته میشن یا اینکه همون موقع که فرم (و Pagecontrol) ساخته شد، ساخته میشن؟؟؟

مرسی

mofrad
سه شنبه 05 مرداد 1389, 01:49 صبح
میخام هر Tabsheet مثل یک Form عمل کنه. (یعنی با کلیک روی باتن Exit، تمام حافظه ای که بکار برد، رو خارج کنه و ما بتونیم دوباره هر تب شیت رو لود کنیم!!

وقتی شما فرمی را close می کنید دلیل بر این نیست که حافظه آن free شده! در اصل فرم hide می شود. فرم هایی که در زمان طراحی ایجاد میشند در موقع اجرا تمام فرم ها بهشون حافظه اختصاص پیدا میکنه و اگه شما free کنید نمی تونید دوباره حافظه را برگردونید (این آخرش رو خیلی مطمئن نیستم!)

برای اختصاص دادن حافظه و free کردن آن میتونید Tabsheet ها رو در زمان اجرا ایجاد کنید که البته کار یکم سخت میشه!

SAASTN
سه شنبه 05 مرداد 1389, 02:47 صبح
اگه منظور hide کردن تب هاست با:

TabSheet1.TabVisible := False;

Felony
سه شنبه 05 مرداد 1389, 09:15 صبح
فرم هایی که در زمان طراحی ایجاد میشند در موقع اجرا تمام فرم ها بهشون حافظه اختصاص پیدا میکنه و اگه شما free کنید نمی تونید دوباره حافظه را برگردونید (این آخرش رو خیلی مطمئن نیستم!)
این زمانی صدق میکنه که اسم فرم شما در تنضیمات پروژه در بخش Auto Create Forms قرار داشته باشه ، در این صورت فرم هایی که اسمشون در این لیست هست در زمان اجرای برنامه به صورت خودکار ساخته میشن و فقط Visible اونها False هست ، اگر اسمشون در این لیست نباشه برای استفاده از اونها باید خودتون وقتی نیازشون دارید ایجادشون کنید ، در ضمن اگر فرم رو Free کنید به صورت زیر دوباره میتونید ایجادش کنید و مشکلی نیست :

Application.CreateForm(TForm1, Form1);
برای آزاد شدن فرم در زمان بسته شدن هم در رویداد OnClose فرم مورد نظر باید به Action مقدار بدید :

Action:= caFree;


در مورد TabSheet هم چون شما کنترل ها رو روی TabSheet قرار دادید پس مالکشون TabSheet شما هست و وقتی اون آزاد بشه تمام اشیائی که مالکشون هست رو آزاد میکنه .

حمید محمودی
سه شنبه 05 مرداد 1389, 12:03 عصر
وقتی شما فرمی را close می کنید دلیل بر این نیست که حافظه آن free شده! در اصل فرم hide می شود.

بله. یادم رفت بگم که Action:= caFree رو باید در Oncloseش بنویسیم. تا با بستن فرم تمام حافظه اش رو هم خارج کنه.




اگه منظور hide کردن تب هاست

حقیقتش نه. در پست اول عرض کردم که : " راهی داره که مثلا وقتی روی همین باتن کلیک کنیم عناصری که در این Tabsheet استفاده کردیم رو از حافظه خارج کنه؟؟؟؟""

هدف از ایجاد این تاپیک استفاده از Tabsheet به جای فرم ها بود!! (یعنی ما بیایم سربرگ Pagecontrol رو برداریم و با فراخوانی Pagecontrol1.ActivePageIndex:=1 یا هر ایندکس دیگه ای، یک صفحه رو به جای نمایش اون فرم به نمایش در بیاریم. نمیدونم اینکار چقدر اصولی هست؟ اصلا اینکار درسته یا نه؟ بعضی از نرم افزارها که اینطوری ساخته شدن.




در مورد TabSheet هم چون شما کنترل ها رو روی TabSheet قرار دادید پس مالکشون TabSheet شما هست و وقتی اون آزاد بشه تمام اشیائی که مالکشون هست رو آزاد میکنه .


مثال زیر رو در نظر بگیرید :

مثلا ما Tabsheet1 رو به نمایش در آوردیم، سپس وقتی کاربر کارش با این صفحه تموم شد باید حتما روی باتن Exit که ما در این صفحه قرار دادیم کلیک کنه. حالادر اینجا ضمن اینکه Tabsheet رو از حافظه خارج کردیم (با Tabsheet1.free) بیایم یک تبشیت دیگه رو فراخوانی کنیم. سپس اگه بخایم اینی که از حافظه خارج کردیم رو دوباره نشونش بدیدم (با Pagecontrol1.ActivePageIndex:=1 که مسلما نمیشه) چکار باید کرد؟؟



خوب اگه این مثال بالایی رو عملی کردیم، حالا مثل اینه که یک فرم داشتیم و اونو close کردیم؟؟! (البته با همون حالت Action:= caFree در Oncloseش)

Felony
سه شنبه 05 مرداد 1389, 16:24 عصر
حافظه خارج کردیم (با Tabsheet1.free) بیایم یک تبشیت دیگه رو فراخوانی کنیم. سپس اگه بخایم اینی که از حافظه خارج کردیم رو دوباره نشونش بدیدم (با Pagecontrol1.ActivePageIndex:=1 که مسلما نمیشه) چکار باید کرد؟؟
باید کنترل ها و موقعیتشون رو در یک فایل یا ... ذخیره کنید و موقع نیاز از فایل بخونید و بسازیدشون ، در کل بهتره این کار رو نکنید چون کار خودت رو سخت کردی .

SAASTN
سه شنبه 05 مرداد 1389, 16:44 عصر
اگه درست متوجه شده باشم شما باید از Frame استفاده کنید. به تعداد فرمهای مد نظرتون Frame های مختلف طراحی کنید و در مواقع لزوم نمونه ای از اونا رو Create و Destroy کنید.

حمید محمودی
سه شنبه 05 مرداد 1389, 17:34 عصر
باید کنترل ها و موقعیتشون رو در یک فایل یا ... ذخیره کنید و موقع نیاز از فایل بخونید و بسازیدشون ، در کل بهتره این کار رو نکنید چون کار خودت رو سخت کردی .
اگه تنها راهش همینی باشه که شما گفتی، پس این روش رو باید بیخیال بشم چون تعداد کنترلها زیاده! و اینکار وافعا سخت میشه!



اگه درست متوجه شده باشم شما باید از Frame استفاده کنید. به تعداد فرمهای مد نظرتون Frame های مختلف طراحی کنید و در مواقع لزوم نمونه ای از اونا رو Create و Destroy کنید.

منظورتون رو متوجه نشدم؟؟؟
البته لازم به ذکر هست که الان در تموم Tabsheetها یه ScrollBox قرار داده شده، که کاربر ازش استفاده مینونه بکنه! نمیدونم میشه به جای Free کردن تبشیت، این اسکرول باکس رو Free کرد؟ و دوباره نمایشش داد؟؟


دوستان برای کار ذیل کسی راه حل بهتری سراغ نداره؟



هدف از ایجاد این تاپیک استفاده از Tabsheet به جای فرم ها بود!! (یعنی ما بیایم سربرگ Pagecontrol رو برداریم و با فراخوانی Pagecontrol1.ActivePageIndex:=1 یا هر ایندکس دیگه ای، یک صفحه رو به جای نمایش اون فرم به نمایش در بیاریم. نمیدونم اینکار چقدر اصولی هست؟ اصلا اینکار درسته یا نه؟ بعضی از نرم افزارها که اینطوری ساخته شدن.
مرسی

vcldeveloper
سه شنبه 05 مرداد 1389, 18:41 عصر
راهی داره که مثلا وقتی روی همین باتن کلیک کنیم عناصری که در این Tabsheet استفاده کردیم رو از حافظه خارج کنه؟؟؟؟

آیا فقط دستور Tabsheet1.free میتونه اینکارو بکنه. در این حالت مثل اینه که اون تب شیت به همراه کلیه عناصر توش اصلاً ساخته نشده؟؟؟
شما TabSheet1.Free هم اگر استفاده کنید، عناصر موجود در آن Free نمیشند، چون عناصری که در زمان طراحی فرم روی TabSheet قرار میدید، Owner شون خودِ Form هست، و TabSheet فقط Parent اونها هست. پس یا باید تک تک اون کنترل ها را خودتان Free کنید، یا اینکه Owner همه آنها را به TabSheet تغییر بدید (با استفاده از InsertControl و RemoveControl).

در هر حال، بعد از Free شدن اون کنترل ها، نمی تونید بدون Create مجدد فرم اونها رو برگردونید، مگه اینکه Owner همه شون رو به TabSheet تغییر بدید، و سپس TabSheet رو قبل از Free شدن، در یک Stream ذخیره کنید. در اون صورت، می تونید با استفاده از متد ReadComponent مربوط به Stream، اون TabSheet رو با متعلقاتش بازیابی کنید.

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

bootshow
سه شنبه 05 مرداد 1389, 23:56 عصر
من خودم چنین کاری را در برنامه ام انجام داده ام.برنامه یک فرم اصلی داره و بقیه فرمها در این فرم ظاهر میشوند.
میتونی بصورت معمولی برنامتو بنویسی.در آخر کار یک صفحه اصلی طراحی کنی و یک نوار ابزار مثلا در بالای فرم بزاری.یک NoteBook روی فرم بزار.روی هر دکمه که روی نوار ابزار کلیک میکنی چنین کدی بنویس.البته خودم نمیدونم راه حل معقولی باشه ولی این کار ظاهر برنامه را قشنگ میکنه.در رویداد close هر فرم کد Action:= caFree را بزار


BeforForm:Tform;
procedure TfrmMain.ButChartClick( Sender: TObject );
var
page: TPage;
begin
BeforForm.Close;
if frmChart = nil then
Application.CreateForm( TfrmChart, frmChart );
BeforForm:=frmChart;
aNotebook.ActivePage := 'NoteChart';
with aNotebook do
page := TPage( Pages.Objects[ PageIndex ] );
try
frmChart.Parent := page;
frmChart.BorderStyle := bsNone;
frmChart.Top := 0;
frmChart.Width := page.Width;
frmChart.Height := page.Height;
frmChart.WindowState := wsMaximized;
frmChart.Show;
except
end;
end;

حمید محمودی
چهارشنبه 06 مرداد 1389, 00:39 صبح
اگه درست متوجه شده باشم شما باید از Frame استفاده کنید. به تعداد فرمهای مد نظرتون Frame های مختلف طراحی کنید و در مواقع لزوم نمونه ای از اونا رو Create و Destroy کنید.

درمورد فریم جستجو کردم ولی چیزی دست گیرم نشد. اصلا نمیدونم چکار باید بکنم!
میشه یکمی بیشتر در اینباره توضیح بدید؟؟

حمید محمودی
چهارشنبه 06 مرداد 1389, 00:56 صبح
من خودم چنین کاری را در برنامه ام انجام داده ام.برنامه یک فرم اصلی داره و بقیه فرمها در این فرم ظاهر میشوند.
میتونی بصورت معمولی برنامتو بنویسی.در آخر کار یک صفحه اصلی طراحی کنی و یک نوار ابزار مثلا در بالای فرم بزاری.یک NoteBook روی فرم بزار.روی هر دکمه که روی نوار ابزار کلیک میکنی چنین کدی بنویس.البته خودم نمیدونم راه حل معقولی باشه ولی این کار ظاهر برنامه را قشنگ میکنه.در رویداد close هر فرم کد Action:= caFree را بزار


نه. اینی که من گفتم تمام عناصر همه در یک فرم قرار دارن نه در چند فرم!

حالا اونی که شما گفتی منظورتون اینه؟؟ (مشکلش چیه؟؟ )

SAASTN
چهارشنبه 06 مرداد 1389, 12:18 عصر
برای ایجاد یه Frame:

File\New\Other...\Delphi Projects\Delphi Files\Frame
دقیقا مثل زمانی که یه فرم جدید به پروژتون اضافه می کنید، یه یونیت جدید ایجاد میشه و یه محیط Design هم داره و لی شیئ جدید یه Form نیست. مثلا TitleBar نداره و بیشتر شبیه به Panel هست. شما می تونی چند تا Frame برای پروژت طراحی کنی و برای استفاده در محل مورد نظر:

Frame1 := TFrame1.Create(TabSheet1);
Frame1.Parent := TabSheet1;

bootshow
پنج شنبه 07 مرداد 1389, 11:38 صبح
بهتره که هر دفعه فرم را از حافظه خارج نکنیم.
میتونی بیشتر فرمها را از لیست پروژه حذف کنی و تنها وقتی که برای دفعه اول به آن فرم احتیاج پیدا کردی آنرا ایجاد کنی و در حافظه باقی بماند.
نمیدونم چرا نتونستم توی این کد از FreeAndNill(Befform به درستی استفاده کنم!!:متفکر: