收 藏 投 稿 繁 体 RSS 
站长吧-中国站长学习与交流的网站
首 页 运 营 学 院 建 站 论 坛
Web master8.net  
 网站运营  
  欢迎在本站发布信息,在线投递稿件请点这里。编辑QQ:4908220,欢迎联系交流。
业界动态 创业故事 推广研究 策划盈利 电子商务 企业平台
  站长工具
SEO查询 Whois查询 Pr查询 域名查询 IP查询 网页编辑器
 建站服务  
  如有建站意向,请尽快联系我们,以便安排时间... 建站服务 QQ4908220 QQ:4908220
作品展示 服务范围 服务流程 服务报价 联系方式 付款方式
文章正文  » 您的当前位置: 首页 >> 学院 >> 程序开发 >> ASP
VB软件设计中的几个问题
  来源:互联网 | 时间:2005-10-04 | 浏览:   相关评论 | 报告错误 | 发布文章
【字号: | | 】 【背景色 杏仁黄 秋叶褐 胭脂红 芥末绿 天蓝 雪青 灰 银河白(默认色)
VB软件设计中的几个问题 
在软件开发过程中,有一些看似很简单的问题,却很容易被一般的开发人员所忽略,这些“Bugs”的存在,影响我们软件走向商品化。下面所列出的是笔者在使用Visual Basic开发软件时,碰到了几个这类问题,这里给出其解决方法,供大家探讨交流。
  
  一、防止应用程序加载两份

  当我们的应用程序在Windows下运行后,在操作过程中,有时会把它最小化隐藏起来,或者切换到程序管理器下进行其它操作,而后又想进入原来的应用程序,这时如果忘记了刚才启动的应用程序,又去重新启动该应用程序,在内存中就同时加载了两份同样的应用程序,这样不但占用了内存空间,而且容易引起误操作,造成数据的损失。为了避免这种情况发生,就需要程序能够给出提示“已经加载过”或直接进入第一次被加载的应用程序中。对于这个问题,看起来比较难办,其实我们只要对Windows管理应用程序的机理有所了解,就很容易解决。我们知道,对于每一个运行着的应用程序,Windows都分配给一个唯一的“句柄(Handle)”和一个模块代码(Module)。当同时运行两份相同的程序时,两份程序的模块代码都相同,因此,只要找到内存中两个相同的模块代码,我们就知道有两份程序在运行,从而可以控制它。Windows提供的两个接口函数GetModuleHandle和GetModuleUsage可以完成此任务。具体方法如下,首先在一个新的模块文件(??*.Bas)中声明API函数。
  
  Declare Function GetModuleHandle Lib"Kernel" (ByVal lpProg Name$)
  
  Declare Function GetModuleUsage Lib"Kernel"(ByVal hModule)
  
  同时建立一个子过程,名字为main,子过程中的代码如下:
  
  Sub Main() On Error GoTo errMain‘错误处理Dim hModule%‘模块句柄Dim AppCount%‘应用程序的个数appPath$=app.Path +""‘应用程序的启动路径hModule %=GetModuleHandle(appPath$+app.EXEName+".exe")‘获得该程序的句柄。

  AppCount %=GetModuleUsage(hModule)‘获得模块代码,即运行的应用程序数目。

  lf AppCount%>1 Then‘同一应用程序数大于1 MsgBox"程序已经加载",64 End‘结束当前启动的应用程序Elsc mainForm.Show‘mainForm是程序的主窗体End lf Exit Sub errMain: lf Err<>0Then MsgBox"启动程序时发生错误",64 Exit Sub End lf End Sub该过程完成后,在VB3.0主菜单[options]下,选择[Project]菜单项,设定[Start up From]项为Sub main,即程序运行时,最先从Sub main子程序开始。这样保证上面的代码一定被执行。Sub main是VB3.0约定的子过程名,不能用其它的名字来代替。

  重新生成EXE文件,在程序管理器下,启动该应用程序,然后把产生的窗体最小化,接着从程序管理器下再运行它,用户将看到一个消息框,告诉用户,应用程序已被加载过了,第二份程序终止执行。上面的程序仅用来防止加载二份程序,但还没有做到当不能启动第二份时,自动进入到第一份程序。要做到这一点,所涉及的程序较复杂,这里就不详细介绍了。

  二、判断Windows的安装路径

  在我们开发的软件中,有时会直接调用Windows提供的小应用程序,如计算器、计事本等;或需要把一些特殊的文件放到Windows或SYSTEM的路径下。通常,Windows都安装在C:\WINDOWS目录下,但用户可以任意修改Windows的主目录名,因此,在我们的软件中,就需要判断Windows的安装路径。

  对于这个问题,Windows提供了两个API函数:

GetWindowsDirectory和GetSystemDirectory,可以返回Windows目录和SYSTEM目录的名称。

  为此,编制一个通用函数GetWinDir,它返回Windows的安装目录名称。类似,可以写出GetSysDir,略。
  
  在*.BAS模块文件中声明API函数
  Declare Function GetWindowsDirectory Lib "Kernel" (ByVal IpBuffer As S tring,ByV al nSize As Integer) as IntegerFunction GetWinDir () As String Dim Windir$ Windir$=Space$(144)‘144是WINDOWS目录名称理论上的最大长度。
  
  lf GetWindowsDirectory(Windir$,144)=0Then MsgBox"不能确定WINDOWS的安装路径",16 GetWinDir="" Else Windir$=ALLTrim$(Windir$)

  if Right$(Windir$,1)<>“”then Windir$=Windir$+“”‘加上反斜杠GetWinDir=Windir$ End lf End Function其中ALLTRIM是用来去掉字符串中空字符的函数FunctionALLTrim(FatStr$)AsString" this Function delete Space char in string of FatStr$
Dim SlimStr$,I%

  SlimStr$=FatStr$ I%=lnStr(SlimStr$,Chr$(0))‘空格的位置IfI%

  Then SlimStr$=Left$(SlimStr$,I%-1) SlimStr$=LTrim$(RTrim$)(SlimStr$))

  AIITrim$=SlimStr$ End Function

三?痹诠氐舸疤迩疤崾颈4媸?

  据一般说来,通常用5种方式可以关闭一个应用程序:

  1.用户选择了当前窗体Control Box中的[关闭]命令2.激发程序中的结束命令代码(如End,Unload) 3.退出Windows 4.在Windows的任务列表中关闭应用程序。

  2.多文档操作时,关闭主MDI窗体,引起子MDI窗体关闭。在关闭一个应用程序前,我们要给用户一个机会,提示“是否保存数据”,或者取消“关闭”的操作。在VB中,窗体的关闭引发的是Form_Unload事件,我们可以对该事件进行编程,来控制“关闭”操作。假设现已有一个过程FileS ave用来保存文件,则可以这样来编写程序。

  Sub Form_Unload(CancelAs lnteger) select cast Msagbox (“是否保存数据?”,3+32) 

  ‘Yes,No,Cnacel三种选择case 6‘YES FileSave‘保存数据case2‘cancel Cancel=TRUE‘取消关闭操作case else‘NO‘不保存,执行关闭操作End select End Sub上面代码中的Cancel变量,是Form_unload事件本身的固有传出变量,它给Windows控制过程传递消息,从而控制程序的走向。

  上面三个例子,只是软件完善过程中的一些小问题,要使软件稳定可靠,需要做大量细致认真的工作。有些问题,我们可以通过发掘VB本身的潜力,深入掌握一些过程的操作技巧来解决;而有些较复杂的问题,涉及到Window s底层方面的操作,采用Windows的API函数,可以很容易实现。当然这需要对Windows的函数和机理有一定的了解。随着Windows编程水平的提高,我们会逐渐学会并喜欢利用A PI函数来辅助完成程序编码。 
master8
  • 上一篇:ASP+Access的安全隐患及对策
  • 下一篇:万维网创始人博客处女秀

  • 我要投稿  打印本文  推荐本文  加入收藏  返回顶部  关闭窗口
    搜模板(www.somoban.com) 原创网站模板交易平台
    阿里妈妈再掀疯狂采购风,网站广告位严重告急,急召天下站长
    基于PHP+MySQL的整站、模块、插件开发等或者按需求实现相应功能;
基于各PHP主流建站系统CMS,BBS,BLOG等的模板定制,完全手写代码;
整站数据迁移或备份恢复;网页代码优化、重构;整站常规SEO优化;网站技术支持;
点击了解详情...
    站长论坛
    • 验证码: