|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
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 想问问大家上面这样的处理方法哪里会有问题
----------------------------------------------
- |
作者: |
|
2014/11/28 10:52:40 |
1楼: |
mybean框架中有提供一个注册单实例插件。在需要的时候GetBean创建一次后,以后都会使用同一个实例,注意窗体实例,不要释放掉,否则再次调用时会AV异常
----------------------------------------------
DIOCP官方社区|MyBean官方社区http://www.diocp.org/
|
作者: |
|
2014/11/28 11:47:31 |
3楼: |
这不就是对象池的概念吗?
----------------------------------------------
|
作者: |
|
2014/11/28 12:35:49 |
4楼: |
这个就相当于是一个很简单的对象池,但是就是不知道哪里用的不对,再次读取出的窗体经常会内存错误
----------------------------------------------
-
|
作者: |
|
2014/11/28 13:21:41 |
5楼: |
思想是對的,你要注意的是,窗體用完后,默認是不是free掉了,vcl下默認是hide的,這時候是可以直接使用的,不需要再創建. fmx下在窗體你同樣要檢查相關的屬性, 在create前判斷是否未釋放.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
|
作者: |
|
2014/11/28 16:33:32 |
6楼: |
思想是對的,你要注意的是,窗體用完后,默認是不是free掉了,vcl下默認是hide的,這時候是可以直接使用的,不需要再創建. fmx下在窗體你同樣要檢查相關的屬性, 在create前判斷是否未釋放. |
用的是vcl控件,窗体关闭事件里面写的是action:=caHide,没有free,同时把窗体的self做为指针存入缓存数组,但是下次再取出来用时,经常会报内存错误,无法再显示窗体,所以不明白是哪个环节出了问题。
----------------------------------------------
-
|
作者: |
|
2014/11/28 19:16:07 |
7楼: |
你这种作法,何必呢?
动态创建创建。。
关闭时,直接 close;
需要再用时,,,直接 show出来就行了呀。
只是在需要用时,用 assigned() 判断一下该窗体对象是否存在,,不存在就创建。存在就直接SHOW
----------------------------------------------
我是菜鸟,己经搞了十多年了,但是我仍然很菜。
|
作者: |
zhipu (zhipu) |
★☆☆☆☆ |
-
|
普通会员 |
|
2014/11/28 19:50:29 |
8楼: |
有毛病
----------------------------------------------
-
|
作者: |
|
2014/11/28 21:14:37 |
9楼: |
你这种作法,何必呢?
动态创建创建。。
关闭时,直接 close;
需要再用时,,,直接 show出来就行了呀。
只是在需要用时,用 assigned() 判断一下该窗体对象是否存在,,不存在就创建。存在就直接SHOW |
因为存在大量不同类型的窗体,但是每个用户最经常做的就是频繁开关几种窗体,而且一种类型的窗体也可能会需要同时创建几个、同时显示,所以建立一个窗体缓存提高用户体验还是很有必要的
----------------------------------------------
-
|
|