当前位置:主页>销售管理软件> 列表

MDI结构的程序子窗体释放后再打开程序报错! 找简单的进销存软件

记账软件版1楼: 我是用动态的方式创建子窗体的语句如下:
if CreateForm(F_Tank) = false then //CreateForm调用自行编写的判断窗体是否存在函数
F_Tank := TF_Tank.Create(Application); //动态创建窗体
CreateForm调用自行编写的判断窗体是否存在函数代码如下:
function TF_Main.CreateForm(CForm:TForm):boolean;
var {*****用户自定义MDIChild子窗体存在判断函数*****}
No:integer;
FormExist:boolean;
begin
FormExist := false;
if (CForm = NiL) then //判断CForm是否为空
begin
CreateForm := false; //函数返回值赋false
exit; //退出本函数
end;
for No:=0 to Screen.FormCount-1 do //判断窗体是否已经被建立起来
begin
if Screen.Forms[No].ClassType = CForm.ClassType then //窗体存在判断
FormExist := true; //窗体已经创建,用户没看到可能是处于隐藏或者最小化
end;
if FormExist = false then //窗体没有创建,返回false
CreateForm := false;
if CForm.WindowState = wsMinimized then //窗体已经创建,但处于最小化状态
ShowWindow(CForm.Handle,SW_SHOWNORMAL) //显示窗体
else //窗体已经创建,但处于隐藏状态
ShowWindow(CForm.Handle,SW_SHOWNA); //显示窗体
if not CForm.Visible then
CForm.Visible := true;
CForm.BringToFront; //当前窗口显示在最面前
CForm.SetFocus; //把光标的焦点转移到刚才创建或显示的窗口上
CreateForm := true; //函数返回值赋true
end;
我在每个子窗口的Close事件中加了Action := caFree;用于子窗体释放空间。
程序第一次打开和关闭子窗体没有问题,但第二次打开时就会报错某内存地址错,然后程序退出,如果不要Close事件中的Action := caFree这条语句可以正常执行,但子窗体只能最小化无法关闭。请问如何解决?

2楼: 在FormDestroy中加入
F_Tank := nil; 如简单的进销存软件

3楼: 在FormDestroy中加入F_Tank := nil;后还是行。

4楼: 还是报某个内存地址读错误。

5楼: Close事件中的Action := caFree;再加一句F_Tank:=nil; 这句不能放在destroy中.


错误原因: 窗体释放时,窗体变量不会自动赋为nil,需要手工来控制.

6楼: 直接把 :=nil 加在Action := caFree;后面得了。

记账软件版7楼: 子窗体在free掉以后,给主窗体发个消息,由主窗体置F_Tank:=nil.
创建的时候只要判断F_Tank 是否为nil,nil 则创建
否则bringtofront就ok了

8楼: lanyun2,我是一个初学者。请问具体如何实现?