VisualBasic软件设计中的几个问题

坚持再坚持是我

坚持再坚持是我

2016-02-19 13:18

今天图老师小编给大家介绍下VisualBasic软件设计中的几个问题,平时喜欢VisualBasic软件设计中的几个问题的朋友赶紧收藏起来吧!记得点赞哦~
在软件开发过程中,有一些看似很简单的问题,却很容易被一般的开发人员所忽略,这些“Bugs”的存在,影响我们软件走向商品化。下面所列出的是笔者在使用VisualBasic开发软件时,碰到了几个这类问题,这里给出其解决方法,供大家探讨交流。
  
  一防止应用程序加载两份
  当我们的应用程序在Windows下运行后,在操作过程中,有时会把它最小化隐藏起来,或者切换到程序管理器下进行其它操作,而后又想进入原来的应用程序,这时如果忘记了刚才启动的应用程序,又去重新启动该应用程序,在内存中就同时加载了两份同样的应用程序,这样不但占用了内存空间,而且容易引起误操作,造成数据的损失。为了避免这种情况发生,就需要程序能够给出提示“已经加载过”或直接进入第一次被加载的应用程序中。对于这个问题,看起来比较难办,其实我们只要对Windows管理应用程序的机理有所了解,就很容易解决。
  我们知道,对于每一个运行着的应用程序,Windows都分配给一个唯一的“句柄(Handle)”和一个模块代码(Module)。当同时运行两份相同的程序时,两份程序的模块代码都相同,因此,只要找到内存中两个相同的模块代码,我们就知道有两份程序在运行,从而可以控制它。Windows提供的两个接口函数GetModuleHandle和GetModuleUsage可以完成此任务。具体方法如下,首先在一个新的模块文件(*.Bas)中声明API函数。
  
  DeclareFunctionGetModuleHandleLib"Kernel"(ByVallpProgName$)
  
  DeclareFunctionGetModuleUsageLib"Kernel"(ByValhModule)
  
  同时建立一个子过程,名字为main,子过程中的代码如下:
  
  SubMain()
  OnErrorGoToerrMain‘错误处理
  DimhModule‘模块句柄
  DimAppCount‘应用程序的个数
  appPath$=app.Path ""‘应用程序的启动路径
  hModule=GetModuleHandle(appPath$ app.EXEName ".exe")‘获得该程序的句柄。
  AppCount=GetModuleUsage(hModule)‘获得模块代码,即运行的应用程序数目。
  lfAppCount1Then‘同一应用程序数大于1
  MsgBox"程序已经加载",64
  End‘结束当前启动的应用程序
  Elsc
  mainForm.Show‘mainForm是程序的主窗体
  Endlf
  ExitSub
  errMain:
  lfErr0Then
  MsgBox"启动程序时发生错误",64
  ExitSub
  Endlf
  EndSub
  该过程完成后,在VB3.0主菜单[options]下,选择[Project]菜单项,设定[StartupFrom]项为Submain,即程序运行时,最先从Submain子程序开始。这样保证上面的代码一定被执行。Submain是VB3.0约定的子过程名,不能用其它的名字来代替。
  重新生成EXE文件,在程序管理器下,启动该应用程序,然后把产生的窗体最小化,接着从程序管理器下再运行它,用户将看到一个消息框,告诉用户,应用程序已被加载过了,第二份程序终止执行。上面的程序仅用来防止加载二份程序,但还没有做到当不能启动第二份时,自动进入到第一份程序。要做到这一点,所涉及的程序较复杂,这里就不详细介绍了。
  
  二判断Windows的安装路径
  在我们开发的软件中,有时会直接调用Windows提供的小应用程序,如计算器、计事本等;或需要把一些特殊的文件放到Windows或SYSTEM的路径下。通常,Windows都安装在C:\WINDOWS目录下,但用户可以任意修改Windows的主目录名,因此,在我们的软件中,就需要判断Windows的安装路径。对于这个问题,Windows提供了两个API函数:GetWindowsDirectory和GetSystemDirectory,可以返回Windows目录和SYSTEM目录的名称。
  为此,编制一个通用函数GetWinDir,它返回Windows的安装目录名称。类似,可以写出GetSysDir,略。
  
  在*.BAS模块文件中声明API函数
  
  DeclareFunctionGetWindowsDirectoryLib"Kernel"(ByValIpBufferAsString,ByValnSizeAsInteger)asIntegerFunctionGetWinDir()AsStringDimWindir$Windir$=Space$(144)‘144是WINDOWS目录名称理论上的最大长度。
  
  lfGetWindowsDirectory(Windir$,144)=0Then
  MsgBox"不能确定WINDOWS的安装路径",16
  GetWinDir=""
  Else
  Windir$=ALLTrim$(Windir$)
  ifRight$(Windir$,1)“”thenWindir$=Windir$ “”
  ‘加上反斜杠
  GetWinDir=Windir$
  Endlf
  EndFunction
  其中ALLTRIM是用来去掉字符串中空字符的函数
  FunctionALLTrim(FatStr$)AsString
  'thisFunctiondeleteSpacecharinstringofFatStr$
  DimSlimStr$,I
  SlimStr$=FatStr$
  I=lnStr(SlimStr$,Chr$(0))‘空格的位置
  IfIThenSlimStr$=Left$(SlimStr$,I-1)
  SlimStr$=Ltrim$(Rtrim$)(SlimStr$))
  AIITrim$=SlimStr$
  EndFunction
  三在关掉窗体前提示保存数据
  一般说来,通常用5种方式可以关闭一个应用程序:
  1.用户选择了当前窗体ControlBox中的[关闭]命令
  2.激发程序中的结束命令代码(如End,Unload)
  3.退出Windows
  4.在Windows的任务列表中关闭应用程序。
  5.多文档操作时,关闭主MDI窗体,引起子MDI窗体关闭。
  在关闭一个应用程序前,我们要给用户一个机会,提示“是否保存数据”,或者取消“关闭”的操作。在VB中,窗体的关闭引发的是Form_Unload事件,我们可以对该事件进行编程,来控制“关闭”操作。假设现已有一个过程FileSave用来保存文件,则可以这样来编写程序。
  SubForm_Unload(CancelAslnteger)
  selectcastMsagbox(“是否保存数据?”,3 32)
  ‘Yes,No,Cnacel三种选择
  case6‘YES
  FileSave‘保存数据
  case2‘cancel
  Cancel=TRUE‘取消关闭操作
  caseelse‘NO‘不保存,执行关闭操作
  Endselect
  EndSub
  上面代码中的Cancel变量,是Form_unload事件本身的固有传出变量,它给Windows控制过程传递消息,从而控制程序的走向。
  
  上面三个例子,只是软件完善过程中的一些小问题,要使软件稳定可靠,需要做大量细致认真的工作。有些问题,我们可以通过发掘VB本身的潜力,深入掌握一些过程的操作技巧来解决;而有些较复杂的问题,涉及到Windows底层方面的操作,采用Windows的API函数,可以很容易实现。当然这需要对Windows的函数和机理有一定的了解。随着Windows编程水平的提高,我们会逐渐学会并喜欢利用API函数来辅助完成程序编码。->

展开更多 50%)
分享

猜你喜欢

VisualBasic软件设计中的几个问题

编程语言 网络编程
VisualBasic软件设计中的几个问题

使用mysql中遇到的几个问题

编程语言 网络编程
使用mysql中遇到的几个问题

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

曾经回答的几个问题

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
曾经回答的几个问题

CSS网页布局中要注意的几个问题

Web开发
CSS网页布局中要注意的几个问题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

网页设计必须注意和掌握的几个问题

Web开发
网页设计必须注意和掌握的几个问题

Ajax须注意的几个问题

Web开发
Ajax须注意的几个问题

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

分享十五个最佳jQuery 幻灯插件和教程

分享十五个最佳jQuery 幻灯插件和教程

JSP牵手JSF打造完美的Web应用

JSP牵手JSF打造完美的Web应用
下拉加载更多内容 ↓