Bt_dy.Enabled:=False;//打印按钮屏蔽
//  if not Assigned(frm_rpt_yuebb) then
  frm_rpt_yuebb:=Tfrm_rpt_yuebb.Create(self);//创建月报打印窗体
  frm_rpt_yuebb.rpt_title.Caption:=cx_yhm.Text+inttostr(cx_year.Value)+'年'+trim(cx_month.Text)+'月份报表';//月报名...
  frm_rpt_yuebb.QuickRep1.Preview;//预览
  frm_rpt_yuebb.Close;//窗体关闭
上面是我程序中月报查询打印模块打印按钮的代码,每一句我都注释了。问题是这样的。开始打印窗体的模式是fsMDIChild,但这样的话他的visible就不能设置为false,所以我把它的模式改为fsNormal,我运行程序,发现如果我多按几次打印按钮的话就在退出程序的时候就会报错,大概是读到哪些地址之类的,感觉就是用到了没有创建窗体上的东西或它本身,看这句 frm_rpt_yuebb:=Tfrm_rpt_yuebb.Create(self);//创建月报打印窗体
如果我创建了它没有把它关闭,只是最小化,如果我在按打印按钮的是又创建了一次。原因是不是这里呢?后来我加上了if not Assigned(frm_rpt_yuebb) then这句,单步调试的时候到frm_rpt_yuebb.QuickRep1.Preview;//预览
这里出毛病,给我感觉是frm_rpt_yuebb没有创建。大家给我分析一下原因呢。如果把frm_rpt_yuebb的模式改为fsMDIChild,它是属于打印查询月报窗体的自窗体还是应用程序的子窗体呢?谢谢大家分析哈。

解决方案 »

  1.   

    你的frm_rpt_yuebb是全局变量吗?在如果是frm_rpt_yuebb是MDI子窗体,则在它的的OnClose事件中Action:=caFree;
    OnDestroy事件中frm_rpt_yuebb:=Nil;if False=Assigned(frm_rpt_yuebb) then
      frm_rpt_yuebb:=Tfrm_rpt_yuebb.Create(Application);
    frm_rpt_yuebb.QuickRep1.Preview
      

  2.   

    缺少:frm_rpt_yuebb:=nil
    因此  if not Assigned(frm_rpt_yuebb) then 只在第一次起作用。
      

  3.   

    Assigned 只能判断空指针,而不能判断无效指针
      

  4.   

    在close事件里FREE掉,试度。
    action := cnfree;