DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: webb123
今日帖子: 33
在线用户: 16
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 inca_erp (inca_erp) ▲▲▲▲△ -
普通会员
2014/11/28 10:44:36
标题:
怎么将动态创建的一系列窗体缓存起来供后续调用 浏览:1319
加入我的收藏
楼主: 有这样一个需求:
程序除主窗体外,其他窗体都是动态创建的,每窗体都包含不少数据集(TClientDataSet)和数据访问控件(grid,edit等)。动态创建控件需要消耗不少时间,从数据库读取数据也要时间,创建窗体速度会比较慢。
因此想将第一次创建过的窗体缓存起来(关闭时不释放,仅hide),下次使用同类窗体时再重新取出。

现在的做法是预先创建一个公共的数组
a:array[0..10] of TAAForm;
并写了两个函数
CacheFrm(fm:TAAForm);将窗体指针保存到数组的空闲位置
LoadFrm;从数组取出窗体指针

在窗体的close事件中
CacheFrm(self);
action:=caHide;

下次需要使用时再取出显示
var
fm:TAAForm;
begin
fm:=loadfrm
fm.show;

但是现在碰到的问题是,再取出窗体使用时,经常会碰到内存错误,比如
Access violation at address 00406EF8 in module 'project1.exe'. Read of address FFFFFFFC
想问问大家上面这样的处理方法哪里会有问题
----------------------------------------------
-
作者:
男 dinkysoft (天地弦) ★☆☆☆☆ -
盒子活跃会员
2014/11/28 10:52:40
1楼: mybean框架中有提供一个注册单实例插件。在需要的时候GetBean创建一次后,以后都会使用同一个实例,注意窗体实例,不要释放掉,否则再次调用时会AV异常
----------------------------------------------
DIOCP官方社区|MyBean官方社区http://www.diocp.org/
作者:
男 sbzldlb (边缘人) ★☆☆☆☆ -
盒子活跃会员
2014/11/28 11:37:39
2楼: 顶一下
----------------------------------------------
Delphi Android移动开发讨论论坛 老大富翁论坛历史数据搜索引擎
作者:
男 qiuyan81 (苦恋树) ★☆☆☆☆ -
普通会员
2014/11/28 11:47:31
3楼: 这不就是对象池的概念吗?
----------------------------------------------
作者:
男 inca_erp (inca_erp) ▲▲▲▲△ -
普通会员
2014/11/28 12:35:49
4楼: 这个就相当于是一个很简单的对象池,但是就是不知道哪里用的不对,再次读取出的窗体经常会内存错误
----------------------------------------------
-
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2014/11/28 13:21:41
5楼: 思想是對的,你要注意的是,窗體用完后,默認是不是free掉了,vcl下默認是hide的,這時候是可以直接使用的,不需要再創建.
fmx下在窗體你同樣要檢查相關的屬性, 在create前判斷是否未釋放.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 inca_erp (inca_erp) ▲▲▲▲△ -
普通会员
2014/11/28 16:33:32
6楼:
思想是對的,你要注意的是,窗體用完后,默認是不是free掉了,vcl下默認是hide的,這時候是可以直接使用的,不需要再創建.
fmx下在窗體你同樣要檢查相關的屬性, 在create前判斷是否未釋放.



用的是vcl控件,窗体关闭事件里面写的是action:=caHide,没有free,同时把窗体的self做为指针存入缓存数组,但是下次再取出来用时,经常会报内存错误,无法再显示窗体,所以不明白是哪个环节出了问题。
----------------------------------------------
-
作者:
男 inbreak (入侵) ★☆☆☆☆ -
盒子活跃会员
2014/11/28 19:16:07
7楼: 你这种作法,何必呢?


动态创建创建。。

关闭时,直接 close; 

需要再用时,,,直接 show出来就行了呀。

只是在需要用时,用 assigned() 判断一下该窗体对象是否存在,,不存在就创建。存在就直接SHOW
----------------------------------------------
我是菜鸟,己经搞了十多年了,但是我仍然很菜。
作者:
男 zhipu (zhipu) ★☆☆☆☆ -
普通会员
2014/11/28 19:50:29
8楼: 有毛病
----------------------------------------------
-
作者:
男 inca_erp (inca_erp) ▲▲▲▲△ -
普通会员
2014/11/28 21:14:37
9楼:
你这种作法,何必呢?


动态创建创建。。

关闭时,直接 close; 

需要再用时,,,直接 show出来就行了呀。

只是在需要用时,用 assigned() 判断一下该窗体对象是否存在,,不存在就创建。存在就直接SHOW




因为存在大量不同类型的窗体,但是每个用户最经常做的就是频繁开关几种窗体,而且一种类型的窗体也可能会需要同时创建几个、同时显示,所以建立一个窗体缓存提高用户体验还是很有必要的
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行66.40625毫秒 RSS