delphi 窗体的创建和释放

Delphi中的窗体分为模式窗体和无模式窗体。二者的区别在于,用户可以在无模式窗体和其他窗体之间切换。这样,用户就可以同时工作于一个应用程序的几个部分。Delphi中窗体的初始化有两种情况,动态创建,和自动创建。通过show显示一个无模式窗体,ShowModal显示一个模式窗体。窗体有创建对应的也要考虑释放问题。当关闭一个窗体时,窗体并没有真正从内存中释放掉,它仍然存在于内存中,除非关闭了主窗体。因为模式窗体于无模式窗体的不同,所以二者的释放处理也有不同。

模式窗体的创建与释放

因为模式窗体可以判断什么时候关闭窗体,可以用一下代码来创建和释放窗体。

begin
  ModalForm := TModalForm.Create(Application);//动态创建窗体
  try
    ModalForm.ShowModal;//显示模式窗体
  finally
    ModalForm.Free; //释放窗体实例
    //ShowMessage(BoolToStr(ModalForm = nil));
    ModalForm := nil; //把窗体变量设为nil
    //ShowMessage(BoolToStr(ModalForm = nil));
  end;
end;

非模式窗体的创建与释放

begin
  Form1 := TForm1.Create(Application);
  Form1.show;
end;

用上述代码会导致每次都创建窗体实例,从而消耗了大量的内存。我们可以考虑让窗体只创建一次,同时在窗体关闭的时候将释放掉。

begin
  if not Assigned(ModalLessForm) then //确保只创建一个窗口
  begin
    ModalLessForm := TModalLessForm.Create(Application);
  end;
  ModalLessForm.Show;
end;

以上代码就是一个单例模式,确保只创建一次。当关闭窗体后,如果希望在内存中释放掉,就要处理器onClose事件,吧Action设为caFree,同时还要在onDestroy事件中将窗体变量指向nil。

procedure TModalLessForm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  action := caFree; //当关闭窗口时释放窗体
end;

procedure TModalLessForm.FomDestroy(Sender: TObject);
begin
  ModalLessForm := nil; //在窗口销毁时,把modalLessForm变量设为nil
end;
时间: 2024-08-01 10:41:32

delphi 窗体的创建和释放的相关文章

深入VCL源码研究DELPHI窗体的创建和关闭

一.窗体的建立 在DELPHI中,我们通常使用Application.CreateForm(TForm2, Form2)和TForm.create来创建窗体,我们几乎无法区别这两种方法差异,更何况,我们更多的时候都是在使用TForm.create来生成子窗体. 不过,仔细观察VCL源码,你会发现,其实两者区别很大. procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference); var Insta

在窗体上创建自己的光标并输入文字

我们知道在文本框等可以接收输入的组件中,我们可以看到闪烁的光标,并可以输入文字,如果我们在,比如窗体上时,因为不支持输入,也无法显示闪烁的光标,那我们 有办法做自己的输入吗?当然可以,下面我们演示在Form上来输入文字. 用到的API函数如下 GetTextMetrics:获取程序当前的字体信息,存放到TEXTMETRIC结构中 CreateCaret:为系统插入标记创建一个新的形状,并且将插入标记的属主关系指定给特定的窗口.插入标记的形状.可以是线.块或位图 ShowCaret:显示光标 Se

delphi 多线程 动态创建ADO

delphi 在多线程中动态连接ADO控件 异常:exception class EOleSysError with message '尚未调用CoInitialize' 如果是使用多线程的话那就在 Execute事件的开头加上 CoInitialize(nil); 结尾加上CoUninitialize() unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fo

类的内部创建内部释放

C++在使用对象指针时经常要考虑这样一样问题:指针的初始化,对象何时创建,何时释放.这无疑给程序员加重了负担,程序员不仅要考虑业务逻辑,还要时时刻刻刻指针在何时创建和释放.那有没有什么办法可以解决这个问题呢?答案是肯定的,下面就通过一个例子来讲解这种模式.       假设现在要仿真模拟一艘航空母舰.广义的航空母舰是指"航空母舰战斗群",假设一支航空母舰战斗群(AVSG)由1艘航母(AircraftCarrier),1艘补给舰 (DepotShip),2艘防空导弹驱逐舰(Destroy

delphi 窗体只显示控件

procedure TForm1.FormCreate(Sender: TObject);begin    BorderStyle := bsNone;    Brush.Style := bsClear;end; delphi 窗体只显示控件,布布扣,bubuko.com

C++中new和delete来创建和释放动态数组

在C++编程中,使用new创建数组然后用delete来释放. 一.创建并释放一维数组 #include<iostream> using namespace std; int main() { int n; cin>>n; //分配动态一维数组 int *arr=new int[n]; for(int i=0;i<n;i++) cin>>arr[i]; for(int i=0;i<n;i++) cout<<arr[i]<<"

不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 对象的动态创建和释放 对象的赋值和复制 静态属性和静态函数 类模板 示例1.CppEmployee 类CppEmployee.h #pragma once #include <string> using namespace std; namespace NativeDll { class CppEmployee { int Number; // 默认为 private private: // 以下都是

delphi 窗体添加背景图片

var   Bmp: TBitmap; procedure TForm1.FormCreate(Sender: TObject); begin   Bmp := TBitmap.Create;   Bmp.LoadFromFile('D:\test.bmp');   Brush.Bitmap := Bmp; end; procedure TForm1.FormDestroy(Sender: TObject); begin   Bmp.Free; end; delphi 窗体添加背景图片

delphi 窗体透明

TransparentColor:=true;    TransparentColorValue:=clFuchsia;    Color:= TransparentColorValue;    BorderStyle:=bsNone; delphi 窗体透明http://hi.baidu.com/duduppp/item/f347df3a16dbb9607c034bd5 来自为知笔记(Wiz) delphi 窗体透明