动态创建窗口form2,与工程中创建窗口form2,用到的时候visible才设成true,都可实现功能,但有何区别?哪种方法好?

plum5 2008-10-22 12:39:30
在form1中动态创建窗口form2,与工程中创建窗口form2,用到的时候visible才设成true,都可实现功能,但有何区别?哪种方法好?
...全文
104 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangsp 2008-10-22
  • 打赏
  • 举报
回复
动态创建是使用的时候才开辟内存空间,用完就释放,工程中创建是静态的,也就是程序一运行就加载了该对象。该对象一直存在直到程序结束。
如果你的体统比较大 建议多用动态创建
如果你的系统不是很大 对性能也没有什么特别的要求用静态的就行了 这样实现起来也比较方便
话又说回来 现在机器的配置已经非常棒了 动态创建也没有什么必要了
aluyue 2008-10-22
  • 打赏
  • 举报
回复
楼上正解,
正如 窗体Close,其实只是隐藏起来,而并没有真正释放一样,直到主程序结束。
工程中创建 如果窗体比较多,那程序启动就变的很慢了。。。
天行归来 2008-10-22
  • 打赏
  • 举报
回复
动态创建是使用的时候才开辟内存空间,用完就释放,工程中创建是静态的,也就是程序一运行就加载了该对象。该对象一直存在直到程序结束。
plum5 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lynmison 的回复:]
以上代码可是致命错误,FormX由主窗体创建,你在FormX里就把主程序关闭,返回到主程序时,必然引发地址访问异常。
[/Quote]

我现在就是在FormX中用halt把程序关闭的,没有引发异常,程序可以很好的工作,但我担心这样结束程序不能释放内存

如果这方法不行,是不是在创建窗口中不能结束主程序?只有在工程中创建窗口中才能结束主程序?
genispan 2008-10-22
  • 打赏
  • 举报
回复
lynmison 向你学习
天行归来 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 plum5 的回复:]
我用的这种方式
主窗口:
try
fmXXX := TFormX.Create(self);
fmXXX.ShowModal;
finally
fmXXX.Free;
end;
edit1.text := xx;
.....

创建窗口fmXXX:
procedure TFormX.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.MainForm.Close; //创建窗口关闭,回到主窗口执行edit1.text := xx;
Application.Terminate; //创建窗口关闭,回到主窗口执行edit1.text := xx;
halt; …
[/Quote]


以上代码可是致命错误,FormX由主窗体创建,你在FormX里就把主程序关闭,返回到主程序时,必然引发地址访问异常。
plum5 2008-10-22
  • 打赏
  • 举报
回复
我用的这种方式
主窗口:
try
fmXXX := TFormX.Create(self);
fmXXX.ShowModal;
finally
fmXXX.Free;
end;
edit1.text := xx;
.....

创建窗口fmXXX:
procedure TFormX.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.MainForm.Close; //创建窗口关闭,回到主窗口执行edit1.text := xx;
Application.Terminate; //创建窗口关闭,回到主窗口执行edit1.text := xx;
halt; //整个程序结束
end;


天行归来 2008-10-22
  • 打赏
  • 举报
回复
模态窗口:
fmXXX := TFormX.Create(self);
fmXXX.ShowModal;
fmXXX.Free;
---------------------------------------------------------------
非模态:
if fmXXX<>nil then fmXXX := TFormX.Create(self);
fmXXX.Show;

//在非模态方式下,以下是必须
procedure TFormX.FormClose(Sender: TObject; var Action: TCloseAction);
begin
fmXXX := nil;
Action := caFree;
end;

应用程序关闭,就直接在主窗口 Close 就可以了。
plum5 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 suiyunonghen 的回复:]
Halt;
Application.MainForm.Close;
Application.Terminate
这三种方法都可以
[/Quote]

这三种方法我都试过了
只有halt;可以结束程序,但是不知这样结束程序,动态创建窗口form2的内存释放了没有?
Application.MainForm.Close;
Application.Terminate 都不行,会接着往下执行
zhao_yong 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 plum5 的回复:]
哦,谢谢楼上几位,这个我明白了
再问个问题:

工程中创建窗口用close可结束程序
在动态创建窗口中用close只能回到调用窗口,怎样结束程序呢?
[/Quote]
你所說的結束如果是結束整個程序進程就如樓上說的,如果只是想結束動態創建的窗口也只要close就可以了!
不得闲 2008-10-22
  • 打赏
  • 举报
回复
Halt;
Application.MainForm.Close;
Application.Terminate
这三种方法都可以
plum5 2008-10-22
  • 打赏
  • 举报
回复
哦,谢谢楼上几位,这个我明白了
再问个问题:

工程中创建窗口用close可结束程序
在动态创建窗口中用close只能回到调用窗口,怎样结束程序呢?
不得闲 2008-10-22
  • 打赏
  • 举报
回复
楼上都说的很清楚,动态创建是使用的时候才创建!用完释放,如果都放在工程文件中加载的话
如果窗体复杂,加载的窗体多!那么程序很可能要过很长时间才会显示出来

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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