ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8777|回复: 7

救助!VB中实现程整个序退出功能的代码应该怎么写?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-5-20 20:36 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我编了个程序,里面含有很多窗体,定义了不少的全局变量.如何实现程整个序退出功能,将程序所占有的一切资源都释放掉.

TA的精华主题

TA的得分主题

发表于 2007-5-20 20:49 | 显示全部楼层

你好.这个好像不是Word的知识规范.

我以为正常的退出,这个可能是系统来处理的吧?

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-5-20 22:37 | 显示全部楼层

我编写的程序中有调用word VBA一部分代码,我只是想知道VB或是VBA中有没有类似C语言中的free()之类释放内存占用的函数,还是系统会自动处理.如果占用内存不被释放掉的话会引起内存泄露的.

我想在窗体中定义一个退出按扭,但不知道如何编写一段代码来把整个程序所有占用的资源清楚实现完全退出.

TA的精华主题

TA的得分主题

发表于 2007-5-21 05:46 | 显示全部楼层
QUOTE:
以下是引用before7000在2007-5-20 20:36:33的发言:
我编了个程序,里面含有很多窗体,定义了不少的全局变量.如何实现程整个序退出功能,将程序所占有的一切资源都释放掉.

难道不能使用初始化对象变量的方式吗?

比如,在特定阶段时,把所有全局变量初始化以减少内存占用,如释放对象变量 Set A =Nothing,b=0,c="",d=Empty等。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-5-21 21:28 | 显示全部楼层

多谢守柔的回答,还有个问题比如你上面提到的b=0,是释放内存还是赋值呢?

TA的精华主题

TA的得分主题

发表于 2007-5-22 05:43 | 显示全部楼层
QUOTE:
以下是引用before7000在2007-5-21 21:28:36的发言:

多谢守柔的回答,还有个问题比如你上面提到的b=0,是释放内存还是赋值呢?

呵呵,我能表述的,可能就是这些,以下内容摘自http://www.cndevx.com/club/dispbbs.asp?boardid=30&id=64686

优化之路:精简VB程序的代码

我们所能做的就是:

1.标志符名称

  2.注释

  3.空行

  其他元素,如变量、窗体和过程,确实要占用内存的一部分空间,最好将它们精简以使效率更高。当应用程序作为一个.exe文件运行时,有几项技术可用于缩小应用程序所需内存。以下技术可缩小代码大小:

  1.减小加载窗体数目

  2.减小控件数目

  3.用标签代替文本框

  4.保持数据在磁盘文件和资源中,并且只在最需要时才加载

  5.组织模块

  6.考虑替换Variant数据类型

  7.使用动态数组,并在删除时回收内存空间

  8.消除死代码和无用的变量

  9.回收被字符串和对象变量用过的空间

  一、每一个加载的窗体,无论是与否,都要占用一定数量的内存(其数量随着窗体上控件的类型和数量,以及窗体上位图的大小等不同而有所改变)。所以,为了节约内存,我们只在需要时才加载窗体,不需要时卸载窗体(而不是隐藏窗体)。记住:任何对窗体的引用,和对用New声明的窗体变量的引用,都会导致VB加载该窗体。

  当使用Unload方法卸载窗体时,只能卸载释放掉部分窗体所占的空间。若想释放所有空间,可用关键字Nothing使窗体的引用无效,如:

  Set From=Nothing

  二、设计应用程序时,窗体应尽量少用控件。实际的限制取决于控件的类型和系统。实际上,含有大量控件的窗体将运行缓慢。一项与之相关的技术就是:在设计时,尽可能使用控件数组,而不是在窗体上放置大量同类型的控件。

  三、标签控件占用的Windows资源比文本框少,因此,在可能的情况下,应使用标签代替文本框。

  例如,当窗体上需要一个隐藏的控件保存文本时,使用标签应该更为有效。如果是需要大量文本域的数据输入窗体,也可以用这种技术优化。这时,我们可以针对每一个域创建一个标签,并使用单文本框输入,在LostFocus事件中移动它到下一个标签的位置:

Prirate Sub Label1_LostFocus? ?

Update Label1

Label1.Option=Text1.text

Text1.Move Label2.Left?Label2.Top

Text1.Text1 contents

Text1.Text=Label2.Caption

End Sub 

 

TA的精华主题

TA的得分主题

发表于 2007-5-22 05:49 | 显示全部楼层
 通过适当设置BackColorBorderStyle的属性,可以使标签看起来像文本框,虽说这会需要更多的代码,但对于含有大量文本域的窗体,它可以大大地减少资源的使用。

  四、在设计中,直接放入应用程序的数据(像属性或代码中的文字字符串和数值)将增加运行时程序占用的内存。运行时从磁盘文件和资源中加载数据可以减少内存占用。这对大的位图和字符串特别有价值。

  五、VB只在需要时才加载模块,即当代码调用模块中的一个过程时,模块才被加载到内存中。若从未调用一特定模块中的过程,VB决不会加载该模块。因此,尽量把相关的过程放在同一个模块中,让VB只在需要时才加载模块。

  六、Variant数据使用极其灵活,但占用内存大。所以,我们应考虑用其他数据类型代替Variant变量,特别是替代Variant变量数组。

  每一个Variant占用16个字节,而Integer占用2个字节,Double占用8个字节,长字符串变量占用4个字节,加上字符串中每一个字符占用1个字节,共5个字节。但Variant字符串变量会占用16个字节,再加上字符串中每一个字符占用一个字节。因为它们太大,消耗堆栈空间特别快,所以特烦人,尤其是在作局部变量或过程的参数时。但有些情况下,Variant变量的灵活性又能给程序带来极大的方便,所以,用不用这项优化技术应根据应用程序的情况来作取舍。

  七、这项技术相信大家并不陌生。动态数组可用EraseReDim Preserve收回数组所占用的内存。例如:Erase MyArrayErase用于完全删除数组;ReDim Preserve则只缩短数组而不丢失其内容:

  ReDim Preserve MyArray?10?smallernum?

  删除固定数组不能收回它占用的内存空间,只可简单地清除数组内每一个元素。如果元素是字符串,或包含字符串或数组的Variant变量,那删除数组可回收这些字符串或Variant变量所占用的内存,而不是数组本身所占用的内存。

  八、当过程结束时,可自动回收(非静态)局部字符串和数组变量所占用的内存空间。但是,全局、模块级的字符串和数组变量一直存活到整个程序结束。要使应用程序尽量小,应尽可能地回收这些变量所占用的空间。

  九、再开发和修改程序时,可能遗留了一些死代码——代码中的一个完整过程,而它并没有被任何地方调用,也可能声明了一些不用的变量。虽然再创建.exe文件时,VB确实可删除无用的常数,但不能删除无用的变量和死代码。

  要消除死代码,可在编辑菜单中,使用查找命令搜索特定变量的引用;或者,当每个模块都含有Option Explicit语句时,通过删除或注释该变量的声明,并运行应用程序,可迅速发现变量是否被调用,若被调用,则VB会出错,否则就没被使用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-5-22 21:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

万分感谢 !

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 22:50 , Processed in 0.041220 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表