关于动态产生Form的问题

ukyozhou 2001-11-02 11:54:14
动态产生一Form,到底用show()还是showmodal()?
如果用showmodal(),则产生的Form永远位于最上层并一直是当前窗口。
如果用show(),则show()之后不可立即写delete Form。但在产生的Form的close时写action=caFree;我不知道是否把此Form完全销毁,会不会造成内存丢失???
...全文
181 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
doudou536 2001-11-24
  • 打赏
  • 举报
回复
本来还想回答的,大家都说的这么好!我也进步了。
gxgxfish0813 2001-11-24
  • 打赏
  • 举报
回复
不会不会的,因为空间放了
ggyy 2001-11-24
  • 打赏
  • 举报
回复
TForm应用技巧

一、让窗口总是在最前面

Form 的FormStyle属性设置为fsStayOnTop值。

二、动态调用窗体Form

在缺省情况下,由File/New Form生成添加入项目文件中的窗体都具有"Auto Create"(自动创建)的特性。即只要程序运行,该窗体就存在于内存中了,不管当前它是否被调用。具有这种特性的窗体一般适用于窗体属性比较固定、经常被调用的情况。其优点是速度快,缺点是占用内存。在实际程序设计中,会遇见大量类似对话框功能的窗体,它们用于显示状态或输入信息,仅须在程序中调用一下,完成其功能就行了,无需常驻内存。这时可以通过选择Project/Options/Forms,将"Auto--Create forms "栏中相应的窗体,如Form1,用" >"键移动到"Available forms"栏中,并在程序需调用该窗体处,加入下列语句:

TForm1 *myform=new TForm1(this);

myform- >ShowModal();

delete myform;

窗体Form1仅是在需要调用时才调入内存,调用完成后,即用delete清除出内存。这样可减少程序对内存资源的占用。

三、遍历窗体控件的方法

要访问或修改窗体上的控件,方法很简单,以TEdit为例子:

Edit1- >Text="";

Edit2- >Text="";

但如果窗体上有十来个像Edit1这样的控件,需要进行相同的初始化,用上面的方法一个一个地进行,岂不麻烦!所以有必要掌握遍历窗体控件的方法。在介绍该方法之前,让我们先了解一下窗体Form的Components和Controls 属性。参见表一。

表一

属性 类型 说明

ComponentCount Int 目前Form上各类控件的总数

Components TCompont* 目前Form上指向所有控件的数组

ControlCount Int 目前Form上某一子区域上各类控件的总数

Controls TControl* 目前Form上指向某一子区域上所有控件的数组

 

以图一为例(图略)说明,Form1 的ComponentCount=6,而Panel1的ControlCount=4.,

其中:

数组 对象

Components[0] Panel1

Components[1] Label1

Components[2] Edit1

Components[3] Label2

Components[4] Edit2

Components[5] Button1

数组 对象

Controls[0] Label1

Controls[1] Edit1

Controls[2] Label2

Controls[3] Edit2

下面这段代码完成了对Panel1上所有TEdit控件的遍历初始化。读者稍加修改,即可对其它控件进行遍历。这里有一个小技巧,我们把需要进行初始化的控件放置在了一Panel1上,与不需要初始化的控件区分开来,这样便于编程。

AnsiString namestring="TEdit";

for(int i=1;i< Panel1- > ControlCount;i++)

{

if(Panel1- > Controls[i]- > ClassNameIs(namestring))

{

TEdit *p=dynamic_cast < TEdit* > (Panel1- >Controls[i]);

P- >Text="";

}

}

四、不规则窗口

1.在窗口定义中,加入HRGN hWndRgn;

2.在TForm::OnCreate()消息函数最后,加入下面的代码:

hWndRgn=::CreateEllipticRgn(0,0,Width,Height);

::SetWindowRgn(hWndRgn,TRUE);

3.设置TForm的属性为无标题,无边框。

4.编译连接应用程序,就可以看到一个椭圆形窗口。

五、MDI Form

1.Application->CreateForm(__classid(Tjjcginput),

&jjcginput);

后不用在使用显示Form的语句就可以显示出来了。

2.form的onclose事件必须用下面语句释放空间:

void

__fastcall TMDIChild::FormClose(TObject *Sender, TCloseAction &Action)

{

Action = caFree;

}
hugsnow 2001-11-24
  • 打赏
  • 举报
回复
VCL组件(动态生成的窗体也属于)不用手动删除,由它的所有者删除,比如TForm *form2=new TForm(this);
那么就由 this这个窗体来负责销毁 form2
我记得好像是这样的,不过这有点不符合C语言的习惯
但是比如 TStringList *l=new TStringList();这样初始化的VCL组件没有所有者,就必须自己用delete删除
mengxianbao1521 2001-11-24
  • 打赏
  • 举报
回复
不会的 因为你的动态form 在创立的同时 已经有了释放空件的语句。
delete Form
mengxianbao1521 2001-11-02
  • 打赏
  • 举报
回复
TForm2*form2=new form2(Application/this);//申请空间.
Form2=ShowModel();
delete Form2;//释放掉空间.
这个代码在form1中写,在form1中建立动态form ,
在连接form2.这样动态的form2就建立好了.
lynu 2001-11-02
  • 打赏
  • 举报
回复
ShowModal()是有模式窗体,打开后必须关闭才能返回.

不管Show,ShowModal(),只是这个窗体在delete之前还存在,都是可以delete form的.在OnClose()中加上Action=caFree,那么窗体关闭时就会自动释放.释放后再用delete会出错的.
01101230 2001-11-02
  • 打赏
  • 举报
回复
要delete Form必须先调用close()函数吧
01101230 2001-11-02
  • 打赏
  • 举报
回复
show()只是把此窗口带到最前端位置,而不是动态产生窗口
showmodal()是模态窗口的意思
action=caFree是用来销毁动态产生的窗口并释放内存的

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧