View Full Version : سوال: نحوه نمایش Form2 بعد از اجرای Form1 و خارج کردن Form1 از حافظه؟
حمید محمودی
شنبه 18 دی 1389, 12:42 عصر
سلام،
فرض کنید توی پروژه، ما دوتا فرم داریم (فرم1 و فرم2).
Form1 برای ست کردن بعضی تنظیمات همون اول که برنامه رو اجرا میکنیم یک مقداری رو از یکجا (مثلا ریجستری) میخونه و بعد اگه لازم بود نمایش پیدا میکنه وگرنه یکسره باید فرم2 نمایش پیدا کنه.
در غیر این صورت(یعنی اگه مقداری که از ریجستری خوندیم نشون دهنده این بود که فرم1 هم باید نمایش پیدا کنه) بعد از اینکه کارمون توی Form1 تموم شد روی یک button (در همین فرم1) کلیک میکنیم و اینجا باید Form1 کاملا از حافظه خارج بشه(چون دیگه اصلا بهش نیازی نداریم) و سپس Form2 نمایش پیدا میکنه.
این در حالی هست که Form1 و Form2 هردو تاشون وقتی بارگزاری شدن، حافظه قابل توجهی میگیرن و نمیتونم از کلک Hide کردن فرم استفاده کنم. و یا اگه امکانش هست بهتره که هر دوتافرم و یا حداقل فرم1 در قسمت available forms باشه تا خودکار ساخته نشه و حافظه ای رو نگیره.(هرموقع لازم شد بسازیمش)
خلاصه مشکل اینجاست که نمدونم چطوری ابتدا فرم1 رو درصورت لزوم نمایش بدم و بعد اون رو از حافظه خارج کرده و فرم 2 رو نمایش بدم. (البته اون قسمت خوندن و نوشتن توی ریجستری مشکلی نیست.)
کدهای مختلف رو تست کردم اما جواب خوبی نگرفتم؛ دوستان به نظر شما چکار باید انجام بدم؟
vcldeveloper
شنبه 18 دی 1389, 12:55 عصر
قبلا دو سه بار کدی برای نمایش پنجره لاگین، قبل از ورود به فرم اصلی، و آزاد کردن آن را در همین سایت قرار دادم. می تونید از همون تکنیک استفاده شده در اون کد برای کار خودتان استفاده کنید.
حمید محمودی
شنبه 18 دی 1389, 16:49 عصر
قبلا دو سه بار کدی برای نمایش پنجره لاگین، قبل از ورود به فرم اصلی، و آزاد کردن آن را در همین سایت قرار دادم. می تونید از همون تکنیک استفاده شده در اون کد برای کار خودتان استفاده کنید. برنامه ای که ضمیمه کردم رو ببنید لطفا. در این نمونه برنامه متغییر بولی به نام SetConfigCompeleted رو فرضا از ریجستری میخونیم و اگه True بود form2 نمایش پیدا کنه و اگه مقدار اون متغییر False بود form1 نمایش پیدا کنه. ولی یکمی مورد داره و اونطوری که خواستم نشده. مشکلش چیه؟
vcldeveloper
یک شنبه 19 دی 1389, 01:09 صبح
ولی یکمی مورد داره و اونطوری که خواستم نشده. مشکلش چیه؟
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' { Form1 } ,
Unit2 in 'Unit2.pas' { Form2 } ;
{$R *.res}
function IsConfigCompleted: Boolean;
begin
{ TODO : Check registry key here, and return proper result. }
Result := False;
end;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
/// If registry key is not set, open config window.
if not IsConfigCompleted then
/// If result of config window is not confirmed, exit from the application.
if not TForm1.Execute then
Exit;
/// Otherwise, show the main window.
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
protected
// function ValidatePassword: Boolean; virtual;
public
{ Public declarations }
class function Execute: Boolean;
end;
implementation
{$R *.dfm}
class function TForm1.Execute: Boolean;
begin
with Self.Create(nil) do
try
Result := ShowModal = mrOK;
finally
Free;
end;
end;
end.
حمید محمودی
یک شنبه 19 دی 1389, 15:29 عصر
ضمن تشکر از آقای کشاورز، یه سوالی رو یادم رفت بپرسم، و اونم اینکه: فرض کنید یه button در Form1 جهت "خروج از این فرم و خارج کردن آن از حافظه و نمایش فرم2" قرار دادیم و کدهای پست قبلی (شماره 4) رو بدون تغییر در این پروژه استفاده کنیم، حالا در این باتن چه کدی بنوسیم که وقتی روش کلیک کردیم Form1 از حافظه کاملا خارج بشه و Form2 نمایش پیدا کنه؟
کد زیر که احتمالا برای این منظور درست نیست، نه؟
procedure TForm1.Button1Click(Sender: TObject);
begin
try
Form2:=TForm2.Create(nil);
Form2.Show;
finally
self.Release;
end;
end;
/// یه سوال دیگه و اونم اینکه بنده متاسفانه بحث های مربوط به کنترل و مدیریت حافظه و راههای جلوگیری از Memory Leak رو خوب یاد نگرفتم، کتاب خاصی رو میشناسید؟
vcldeveloper
یک شنبه 19 دی 1389, 15:42 عصر
یه سوالی رو یادم رفت بپرسم، و اونم اینکه: فرض کنید یه button در Form1 جهت "خروج از این فرم و خارج کردن آن از حافظه و نمایش فرم2" قرار دادیم و کدهای پست قبلی (شماره 4) رو بدون تغییر در این پروژه استفاده کنیم، حالا در این باتن چه کدی بنوسیم که وقتی روش کلیک کردیم Form1 از حافظه کاملا خارج بشه و Form2 نمایش پیدا کنه؟
هیچ کدی، فقط کافیه مقدار خصوصیت ModalResult اون دکمه را بر روی mrOK تنظیم کنید.
بحث های مربوط به کنترل و مدیریت حافظه و راههای جلوگیری از Memory Leak رو خوب یاد نگرفتم، کتاب خاصی رو میشناسید؟
کتابی که به طور اختصاصی به این موضوع بپردازه، نمی شناسم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.