VisualBasic软件设计中的几个问题

2016-02-19 13:18 13 1 收藏

今天图老师小编给大家介绍下VisualBasic软件设计中的几个问题,平时喜欢VisualBasic软件设计中的几个问题的朋友赶紧收藏起来吧!记得点赞哦~

【 tulaoshi.com - 编程语言 】

在软件开发过程中,有一些看似很简单的问题,却很容易被一般的开发人员所忽略,这些“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函数来辅助完成程序编码。->

来源:http://www.tulaoshi.com/n/20160219/1603701.html

延伸阅读
标签: Web开发
十一回家腐败了几天,回到公司,紧张的气氛又开始了。继续奋斗。 1. 用javascript中的Array存储服务器端传来的List数据。 有些数据从服务器端传过来,需要保存到客户端。 起初的做法,对于个别的数据,放在页面中的某个隐藏层中,或者作为隐藏字段存起来,当用的时候,再用JS取相应的控件再取到value。 div id="hdnUsrNm" style="display:n...
标签: 贺卡 电脑应用
第1步: 我用 iPad代替一下,如果你也有 iPad下这个软件(左图) 第2步: 打开软件后,按这个 第3步: 任选一个 ...
自然用户界面【1】(NUI , Natural User Interface)特别是触控技术使人机交互变得更加自然直观,更为人性化。比如ipad、iPhone和一些采用Windows Mobile,Android等系统的手机已经让用户体验到触控的便利。本篇文章要说的是一种关于手机端触控技术的交互设计,它利用我们的肌肉记忆,不需要过多思考,让我们依靠潜意识,动动手指就能完成任务它...
有关抗生素知识的几个问题 :家长一般都知道抗生素这个词,也听说了不能滥用抗生素,可孩子得了病,最要紧的是赶快治好,只要药能治病,哪里还顾得上医生和专业人士的忠告。那么在使用抗生素的过程中,会出现哪些问题呢? 1.抗生素在身体里起什么作用? 简单地说,抗生素只有一个功能:瞄准并杀死细菌。除此之外,它既不能缓解疼痛...
Delphi支持参数化SQL语句,不过俺很少用Paramters/Params属性,一般都是自己构造SQL, 用SQL.Text:='Select * from ..Where ID='''+edit1.text+''''; 不过这种方法要小心SQL注入攻击哦。 今天改用ADOQuery控件的Paramters属性,本已为简单的很,一用发现了不少问题。由于我只使用一个ADOQuery控件...

经验教程

785

收藏

59
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部