| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2857 人关注过本帖
标题:编译成EXE文件后,退出不彻底的问题如何解决?
只看楼主 加入收藏
chansnsn
Rank: 2
等 级:论坛游民
帖 子:15
专家分:15
注 册:2013-6-27
收藏
得分:0 
回复 20楼 吹水佬
是的,按照各位大神提供的思路,我重新捋了一下逻辑。把登录表达放在了主表单中运行,不独立出来。
图片附件: 游客没有浏览图片的权限,请 登录注册


主程序这样处理:
 *****主程序MAIN.PRG****************
 CLEAR ALL
 SET EXACT ON
 SET SAFETY OFF
 SET DELETED On
 _screen.Visible =.f.
 
 SET EXCLUSIVE ON
 SET TALK OFF
 SET DATE TO ansi
 SET CENTURY ON    &&日期年份显示为4位数
 SET MULTILOCKS ON
 CLOSE ALL

DO FORM MAIN     &&运行主程序
READ EVENTS
CLEAR ALL
QUIT

  
在主表单的 QUERYUNLOAD()事件加入clear EVENTS,这样就完美解决了:

**********主表单的 QUERYUNLOAD()代码*********************
  CLOSE ALL
  CLEAR WINDOW      
  CLEAR EVENTS            

2021-11-11 08:56
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:41
帖 子:763
专家分:2503
注 册:2011-5-8
收藏
得分:0 
一般情况下,建立一主程序其中有以下内容
1、环境设置
2、全局变量
3、打开数据库
4、调用清扫程序

 ON SHUTDOWN myclear.prg
 ON SHUTDOWN quit
 DO FORM xtdl  &&系统登录
 do form yhzc &&&
中间可以有很多表单也可以没,它们退出只需要 thisform.release

 DO FORM main   &&由它退出系统
 READ EVENTS
 RETURN

退出整个系统按钮中
CLOSE TABLES all
RELEASE ALL
QUIT
就可以了。用主程序的好处很多,可以防止程序做大后全局变量有哪些不清楚。可以执行很多 ON SHUTDOWN
比如关闭数据库
建议打开与关闭数据库在些进行,可以方便地切换调试程序用的测试数据库。


dBase有人接盘了。
2021-11-11 20:00
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:746
专家分:1114
注 册:2021-10-13
收藏
得分:0 
给出一段代码,希望对写程序的狐友有帮助
lclogin=.f.
DO form login to lclogin &&登录表单,unload方法里返回.t.(验证通过) 或.f.(验证不通过),lclogin用来接收返回值
DO form frmmain WITH lclogin && 主表单的init方法里设置一个参数lclogin,当lclogin参数为.f.时,退出程序(是activate事件里调用thisform的release事件)。

frmmain的init方法:

PARAMETERS lclogin
    IF lclogin=.f.
        thisform.otoolbar=null
        CLEAR EVENTS        
    ELSE
        DO 主菜单.mpr with this
        this.Refresh
        *_vfp.Visible=.f.
        this.Top=0
        this.Left=0
        this.MaxButton=.t.
    ENDIF

activate 方法:

IF lclogin=.t.
    showtoolbar=Vartype(Thisform.otoolbar)
    If showtoolbar#"O" And showtoolbar#"X" &&判断工具栏对象是否创建并且不是被释放了
        Set Classlib To myclass Additive &&这里的“Toolbar”是存放工具栏可视类的类库文件名
        This.otoolbar=Createobject("coolbar",this) &&这里的“MyToolBar”是你定义的工具栏类名
        This.otoolbar.Dock(0) &&将工具栏停放至窗口的顶端
        This.otoolbar.Show &&显示工具栏
        Release Classlib myclass &&释放类库文件
    Endif
    READ events
ELSE
    thisform.Release
ENDIF
2021-11-13 14:30
kangss
Rank: 6Rank: 6
等 级:贵宾
威 望:14
帖 子:218
专家分:464
注 册:2014-6-12
收藏
得分:0 
回复 21楼 chansnsn
你把这段代码保存到 MyQuit.PRG 中执行:

CLEAR EVENT
IF _SCREEN.FORMCOUNT>0
    DIMENSION TmpForm[_SCREEN.FormCount]
    FOR i=1 TO _SCREEN.FORMCOUNT
        TmpForm[i]=_SCREEN.FORMS(i)
    ENDFOR
    FOR i=1 TO _SCREEN.FORMCOUNT
        TmpForm[i].RELEASE
    ENDFOR
ENDIF
CLOSE DATABASES
QUIT
2021-11-13 14:46
wcx_cc
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:352
专家分:1152
注 册:2015-10-2
收藏
得分:0 
我用的方法是,如果
  do 表单
  clear event  
              
  表单退出按钮里 click 事件
 thisform.release 或 thisformset.release
 clear event
 主程序里什么退出语句也不要,程序执行完毕自然会退出,没遇到过退不彻底现象.

2021-11-15 02:30
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:746
专家分:1114
注 册:2021-10-13
收藏
得分:0 
do 主表单
read events &&这里容易出问题,最好放在表单的activate方法里。因为一旦对表单进行鼠标键盘操作后,释放表单后,又回到这一句了。

clear events &&关闭表单前,先结束鼠标,键盘事件处理。
thisform.release &&这两句可以放在unload 或destroy方法里。
2021-11-17 17:59
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:0 
read events 命令是使进入窗口消息循环
read events 放在不同的地方执行,可能会影响到窗口事件的触发。
觉得最好是放在窗口完全载入后再执行read events
2021-11-17 18:13
wcx_cc
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:352
专家分:1152
注 册:2015-10-2
收藏
得分:0 
纠正:今天打开此帖发现25楼写错了.当时是匆匆以写.第3行应该是 read event.很抱歉!但是25楼这种固定模式,是不会存在'不彻底退出'这种现象.原理很简单,
do 表单后,紧接一句 read event,正如吹佬所说,可以达到表单内信息载入完毕,运行焦点实际上是停留在 read event 上.而表单上的'退出'按钮上,click 事件里,执行 thisform.release,紧接 clear event,就可以释放这个停留,使程序继续向下进行.程序执行完毕肯定自然退出.'释放'语句是可以放在其他地方的(init 除外),那要根据个人需要而做,click 事件里直接释放表单,解除运行的滞留,个人使用中觉得是比较简捷的方式.


 
2021-11-17 23:04
总是出错
Rank: 2
等 级:论坛游民
威 望:1
帖 子:248
专家分:24
注 册:2012-12-24
收藏
得分:0 
回复 28楼 wcx_cc
我曾经为这个问题困扰过好长时间,后来看帮助,我感觉我是搞清楚了。先看帮助文件:
语法

READ EVENTS

说明

仅用于 Visual FoxPro。
当发出 read events 命令时,Visual FoxPro 启动事件处理。
发出 CLEAR EVENTS 命令停止事件处理。当发出 CLEAR EVENTS 命令时,程序继续执行紧跟在 READ EVENTS 后面的那条语句。
-----------------
以上是中文帮助。
也就是说,在READ EVENTS语句下一行,写上,thisform.release(关闭住表单,不退出VFP)或者写上QUIT退出VFP,然后主表单在退出按钮下写上CLEAR EVENTS后就可以。
2022-12-02 04:48
qhdlan
Rank: 1
等 级:新手上路
帖 子:5
专家分:5
注 册:2022-2-18
收藏
得分:0 
放在destroy事件中试试,我的都刚在这里用
CLOSE ALL
thisform.Release
CLEAR EVENTS
QUIT
图片附件: 游客没有浏览图片的权限,请 登录注册
2022-12-02 14:29
快速回复:编译成EXE文件后,退出不彻底的问题如何解决?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017073 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved