نمایش نتایج 1 تا 20 از 20

نام تاپیک: Free کردن یک فرم بعد از بستن آن

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #20

    نقل قول: Free کردن یک فرم بعد از بستن آن

    با جستجو برای یک راه دیگه موافقم اما اصرار روی موارد بالا بحث رو به جایی نمی رسونه
    بد هم نیست ادامه بدیم تا یه راهکار نهایی استفاده کنیم هممون، که توسعه دهندرو اتوماتیک از خطا دور کنه، من خودم اینجا به کنستراکتور رسیدم فکر کنم اگه جواب بده خوبه هرچند بازم باید حتما متغییر رو پاس بدیم که میتونیم overload کنیم کانستراکتور رو.
    این میشه یک راه دیگه که البته کمی کار داره
    مثلا به صورت زیر :
    بازنویسی کلاس TForm2 :

    type
    TForm2 = class(TForm)
    Label1: TLabel;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    private
    FrmVar : ^TForm;
    { Private declarations }
    public
    constructor Create(AOwner : TComponent; var MyFrm : TForm); reintroduce;
    end;

    var
    Form2: TForm2;

    implementation

    {$R *.dfm}

    constructor TForm2.Create(AOwner : TComponent; var MyFrm : TForm);
    begin
    inherited Create(AOwner);

    FrmVar := @MyFrm;
    end;


    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    FrmVar^ := nil;

    Action := caFree;
    end;


    ساخت و نمایش فرم :

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if not Assigned(frm) then
    begin
    frm := TForm2.Create(nil, TForm(frm));
    frm.Show;
    end
    end;


    Create رو بازنویسی کردیم و به صورت ارجاعی متغیر اشاره گر به فرم رو گرفتیم ( MyFrm ) و درون یک اشاره گر دیگه ( FrmVar ) قرار دادیم
    در OnClose هم فضای آدرس اشاره گر FrmVar که ما رو به frm می رسونه رو برابر nil قرار دادیم

    فرض کنیم از متغیر استفاده کنیم و توی یه فرم بخایم ۵۰ تا فرم دیگرو باز کنیم... اسم متغییرا، تعداد و ...
    برای نمایش یک فرم درگیر شدن توی مباحث اشاره گرها احتمال خطا رو بالا می بره
    استفاده از مثال بالا برای نمایش چند باره فرم هم نمی تونه زیاد مفید باشه چون متغیر frm به صورت عمومی تعریف شده، یعنی برای هر نمونه از فرم باید یک متغیر درنظر گرفته بشه، درواقع همه نمونه های ایجاد شده، در پایان کارشون یک اشاره گر واحد رو می خوان برابر nil قرار بدن
    اصولا وقتی شما میخواید چند نمونه از یک فرم رو بسازید دیگه نیاز به بررسی مقدار frm ندارید که نیاز باشه اون رو nil کنید و به نظرم انجام روشهایی مثل مثال بالا کار اضافه ای محسوب میشه
    امکان nil کردن اشاره گر از داخل خود کلاس یک مزیت محسوب نمیشه و اگر این امکان وجود نداره هم یک ضعف نیست و به نظر خیلی منطقی هم نمیاد که وجود داشته باشه

    به این نکته هم توجه کنید که برابر nil قرار دادن با Free کردن تفاوت داره، وقتی یک Object رو Create می کنید، در پایان کارش فضای درنظر گرفته شده برای اون Object باید Free بشه تا حافظه اضافی مصرف نشه، اما nil کردن "اشاره گر اون فضا" ( در اینجا frm ) اجباری نیست، با هر بار ساخت نمونه از کلاس، اشاره گر مقدار جدیدی می گیره و nil نکردن اون باعث ایجاد Memory Leak نمیشه

    به هر حال، سوال پرسیده شده در مورد نمایش یک فرم در صورت عدم وجودش بود و برای رسیدن به این هدف هم به نظرم روشهای قبلی نسبت به مثال بالا ساده تر و منطقی تر هستند
    مثلا چک کردن فرم های Screen :)
    آخرین ویرایش به وسیله Mahmood_M : جمعه 07 خرداد 1395 در 12:14 عصر

تاپیک های مشابه

  1. رها کردن کامل منابع بعد از بستن فرم
    نوشته شده توسط FreeMagic در بخش C#‎‎
    پاسخ: 27
    آخرین پست: یک شنبه 25 اسفند 1392, 12:35 عصر
  2. بستن یک فرم بعد از باز کردن فرم دو
    نوشته شده توسط Raha323 در بخش C#‎‎
    پاسخ: 10
    آخرین پست: شنبه 08 مهر 1391, 18:02 عصر
  3. پاسخ: 7
    آخرین پست: شنبه 04 اسفند 1386, 13:27 عصر
  4. فیلتر کردن اطلاعات فرم بعد از لود، از طریق فرم دیگر
    نوشته شده توسط arman007 در بخش برنامه نویسی در 6 VB
    پاسخ: 3
    آخرین پست: دوشنبه 14 آبان 1386, 10:25 صبح
  5. اضافه کردن یک ستون بعد از یک ستون دیگر
    نوشته شده توسط golnari در بخش SQL Server
    پاسخ: 2
    آخرین پست: پنج شنبه 05 آذر 1383, 21:54 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •