以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  窗口被关闭  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=133148)

--  作者:Grandraw
--  发布时间:2019/4/8 13:05:00
--  窗口被关闭
各位好,

今天发现一个无法解决的问题:

英文系统windows7,foxtable高级开发版。

之前设计了afteropenproject事件中自动打开一个模式窗口,原来一直运行良好。

今天把用户登录系统从系统默认的改成了自定义的,调试通过。期间也修改了Sql server后台数据库的一些表名,使其和foxtable的表名保持一致。

一起就绪后就突然发现登录后被自动打开的窗口,会在3秒左右自动闪退。我试过的解决办法:


1. 该窗口的beforeclose事件直接写入e.cancel=true;结果无效,还是无任何提示就退出。

2. 闪退之后,在命令窗口重新打开该form,没有问题不闪退。

3. 在afteropenproject时间中试着修改maintable,无论有无设置maintable代码,无论设置哪个maintable,都无效,窗口还是打开后三秒闪退。

这个窗口必须一开始就要打开,因为涉及不同用户所需要的界面,

请问老师还有什么可能的原因导致这个问题呢?


--  作者:Grandraw
--  发布时间:2019/4/8 13:34:00
--  
补充测试:在该模式窗口before close事件中写入messagebox代码,窗口闪退的之后显示了设定的信息,证明该before close事件被触发,但e.cancel=true代码无效。窗口也是先于messagebox被关闭。
--  作者:Grandraw
--  发布时间:2019/4/8 13:39:00
--  
下面是afteropenproject的代码

\'****************************************************************************************************
\'首先启动用户登录验证
Forms("UserLogin").Open()
If _UserName = "" Then
    \'若验证失败
    Syscmd.Project.Exit(False)
    Return \'这个要加上,因为既然要退出,就不应该再执行后面的初始化代码了,否则会出错
End If

\'****************************************************************************************************
\'项目的初始化代码改放在这里,因为在此之前事件的代码不会受到自定义用户的影响.
\'****************************************************************************************************
 
\'*****************************************************************************
\'针对用户类型加载不同的表和表的数据
For Each dt As DataTable In DataTables
    
    Select Case dt.name
       
            
        Case "Quotations"
            \'根据用户类别判定加载内容
            Select Case _usergroup
                Case "ExtQs"
                    dt.LoadFilter="Estimator=\'" & _PreferredName & "\'And DateDiff(m, DateReceived, GetDate()) < 4"  \'加载三个月及以内的数据
                    dt.load()
                Case "manager", "salesperson", "Qs","administrator"
                    \'加载全部数据
                    dt.LoadFilter="1=1"
                    dt.load()
                    \'其他人不加载数据
            End Select
            
        Case "MeasureDetails","PurchaseOrderDetails","SalesOrderDetails","PurchInvDetails","SalesInvDetails","StockAdjustmentDetail","ProcureContractDetails"
            \'还是不加载数据,稍后根据父行的变动而自动加载数据
            
        Case "GLedger_StockMovements", "GLedger_Transactions"
            \'还是不加载数据,因为数据太大.尽量都在后台操作. 后面步骤实在有需要时(如需要查询明细时)再按条件加载数据
            
        Case "SysUserAccounts"
            \'只有管理员才加载全部数据
            If _usergroup="administrator" Then
                dt.LoadFilter="1=1"
                dt.load()
            End If
            
        Case Else
            \'永远加载全部内容
            dt.LoadFilter="1=1"
            dt.load()
            
    End Select
Next
\'************************************************

\'************************************************
\'针对普通用户隐藏表标题
If User.Type = UserTypeEnum.Developer
    TableCaptionVisible =True
Else
    TableCaptionVisible = False
End If

\'************************************************
\'禁止普通用户非法复制表格内容
Select Case _UserGroup
    Case  "administrator"
    Case Else
        For Each dt As DataTable In DataTables
            Select Case dt.name
                Case "orderitems", "MeasureDetails","SalesInvDetails","PurchInvDetails","StockAdjustmentDetail","GLedgerEntry","SalesOrderDetails","PurchaseOrderDetails"
                    
                Case Else
                    dt.AllowClipBoard = False
            End Select
        Next
End Select

\'************************************************
\'针对用户类别打开不同的欢迎页面
Select Case _UserGroup
    Case "WorkShop"
        Forms("Production").show
        
    Case "ExtQS"
        Forms("Quotations").show      
        
    Case Else
          Forms("afterlogin").show
         MainTable=Tables("afterlogin")
        
End Select
\'*****************************************

--  作者:Grandraw
--  发布时间:2019/4/8 13:41:00
--  
Forms("Quotations").show  就是发生闪退的窗口,无论怎么改代码都不行。
--  作者:Grandraw
--  发布时间:2019/4/8 13:45:00
--  
刚又发现,当我重设项目属性后,afterproject事件似乎也被触发,这时该窗口正常打开不会闪退。问题只发生在我刚开始登陆系统的时候。图片点击可在新窗口打开查看
--  作者:有点甜
--  发布时间:2019/4/8 14:23:00
--  

 

你是不是设置了窗口的属性->自动打开->true?如果设置了,请改成false。

 

你屏蔽你启动项目的事件,如 afterOpenProject 等事件的代码,然后测试。

 

 


--  作者:Grandraw
--  发布时间:2019/4/9 5:39:00
--  
窗口属性是正确的没有打开。经屏蔽测试,初步认定是之前的步骤中启动qqclient造成的,不知道为什么会这样。
qqclient启动正常,但放在这个打开窗口之前就导致窗口闪退。
窗口的关闭似乎和popmessage的关闭是同时的,难道是qqclient的popmessage被自动关闭的时候和窗口发生了联动?

--  作者:Grandraw
--  发布时间:2019/4/9 5:44:00
--  
为了验证这个猜测,我更改qqclient代码,只登陆但不弹出popmessage,结果一切正常,窗口不再被关闭了。

结论猜测:极有可能是popmessage的定时关闭和后面登陆后自动打开的工作窗口发生了联动,希望Foxtable可以针对此点进行改进。

谢谢

--  作者:Grandraw
--  发布时间:2019/4/9 5:51:00
--  
再次测试,修改popmessage的duration选项,设为不自动关闭。项目打开后,发现该模式窗口始终处于最前端,popmessage窗口无法且换到前端而进行手工关闭。这个验证了上面的猜测,自动关闭popmessage的时候,程序错误地将处于最前端的模式窗口一并给关了。
--  作者:有点甜
--  发布时间:2019/4/9 10:20:00
--  

是有这种bug。你试试用【计划管理】打开popmessage窗口,也就是把计划打开,执行完以后,关闭计划

 

http://www.foxtable.com/webhelp/scr/0657.htm

 

或者是弃用popmessage,自己做一个提示窗口。