Delphi 中大量Frame 在win98下出现的问题. 500 分(300分)

  • 主题发起人 主题发起人 YellowMoon
  • 开始时间 开始时间
订个邮件
 
可是,我现在不是用QuickReport,也出那样的错误!
我也是用Frame,我现在比较关心的是解决的办法,一会给用户一个OS Function是会吓死
他们的!
 
我们夜出现过这个问题。晕
memproof测试一下
 
跟踪调试,找出问题所在,
不行的话修改VCL源码
 
楼上兄弟,这个错误不是可以跟踪的,因为,它不是在执行到某个地方出的错,
而是不定时,不定点的错误!愁呀!
 
听说frame 不太好,不过没玩过,测试了一下,太耗费资源,
为什么不用 baseclass
 
问题是我现在已经用了Frame,公司开始就定了的,我没有办法更改。但出了问题,我想
找个好的办法解决。
 
这个问题我遇到过,和frame没有关系。是因为你在frame上放了太多的控件,导致
句柄不够了。win98不像win2000,2000是纯32位的,句柄数量没有限制,而98下句柄
的数量是有限制的,好像是16k。

解决的方法就是每个frame都动态创建,用完就free。
我写了一个类名做参数的procedure来动态创建和free。
procedure TForm_ClerkMain.CreateFrame(frame: TFrame;FormClass: String);
var
formClass: TFormClass;
begin
if frame<>nil then
frame.Free;
frame := TFormClass(GetClass(FormClass)).Create(self);
frame.Parent := self;
frame.Align := alClient;
frame.Show;
end;

在使用之前要在initialiaziton里注册你所用到的类名。
initialization
//注册窗体类,作为参数传递。
RegisterClass(Tframe_PC_Module);
RegisterClass(Tframe_PC_Authority);
RegisterClass(Tframe_PC_WageMap);
RegisterClass(Tframe_PC_Wage);
 
[Veteran]说得挺对的,Frame是基于操作系统的,如果太多会占用系统太多资源,只是
程序无法运行!所以你在写代码时应该注意释放资源!
 
其实,我不是用的frame,我用的是form,每次在创建form的时候把owner和parent都
设为Mainfrom。
 
这个和frame基于操作系统的没有关系把,只要是winControl类就会占用系统句柄,
只要是GraphicControl类就会占用设备句柄,而且系统资源和内存是没有任何关系
的,只和系统句柄,设备句柄,用户句柄有关系。
 
misxjq,不是我不肯释放资源,但我没有用完的Frame,我总不能释放它吧!
薄荷,你说的我认为是对的(心里只是感觉对),你说与内存没有关系,与句
柄有关系,但我,怎么才能加系统可以使用句柄的数量呢,或是有别的解决
办法 。
 
是啊
Frame太消耗资源了,而且我还发现在Delphi5下如果PageControl和Frame共用
这个问题特别严重,如果单是Frame问题还少一点
 
98系统的句柄数量受堆栈大小的限制,是固定的,不可能增加了。
要么你改用2000,如果一定要用98的话,你看看你的frame里面是否有些
控件不是同时显示的,比如有好多pageControl,每个上面有好多控件,
以前你是通过visible或者bringtoFront来控制显示,那么你可以改成
用动态创建的方法来实现。或者是有个PageControl,好多页,那么每页
里的控件也动态创建,一次只创建一页的内容。
 
有没有大量使用combobox?
 
薄荷,我发现一个重大的问题,你就在我办公桌旁!为什么这么说呢,因为,怎么你说的问题
就是发生在我身上的问题呢!
另:我又发现,在98下不运行程序,就是单单的用D6打开窗体文件,
打开多了就会出现上面的这个OS问题。
 
青萍说的也很对,我就是Frame+Page,可怜呀,好像我知道D有这个问题一样,唉,害的是自己呀
 
虽然我在这里还是很愁,可还是希望大家平安夜快乐。在新的一年有好的心情。
 
首先申明,这个问题和delphi没关系,因为你放的frame和pageControl都是窗体类,
都要占用句柄,这是系统决定的,不管你用什么开发工具都是一样。你说的在D6里
打开窗体就会有这个问题,也是因为在开发的时候打开的窗体,已经占用了句柄。

我也在窗体上放了很多pageControl,也出现了你这样的问题,不单这样,你如果在
窗体上放了超过90个combobox也会出现这样的问题。所有有人认为如果是要开发在98
下能运行的程序,最好在98下开发。我的解决办法是把每个PageControl放到form上,
然后把form动态创建到你的frame里。也许还有其他解决办法但是归根到底都离不开
动态创建动态释放。
 
后退
顶部