您现在的位置:TT数据库 > VB > VB软件设计中的几个问题

VB软件设计中的几个问题

2008-6-11  选择字号:  | |
打印本文章

  在软件开发过程中,有一些看似很简单的问题,却很容易被一般的开发人员所忽略,这些“Bugs”的存在,影响我们软件走向商品化。下面所列出的是笔者在使用VisualBasic开发软件时,碰到了几个这类问题,这里给出其解决方法,供大家探讨交流。

  一、防止应用程序加载两份

  当我们的应用程序在Windows下运行后,在操作过程中,有时会把它最小化隐藏起来,或者切换到程序管理器下进行其它操作,而后又想进入原来的应用程序,这时如果忘记了刚才启动的应用程序,又去重新启动该应用程序,在内存中就同时加载了两份同样的应用程序,这样不但占用了内存空间,而且容易引起误操作,造成数据的损失。为了避免这种情况发生,就需要程序能够给出提示“已经加载过”或直接进入第一次被加载的应用程序中。对于这个问题,看起来比较难办,其实我们只要对Windows管理应用程序的机理有所了解,就很容易解决。

  我们知道,对于每一个运行着的应用程序,Windows都分配给一个唯一的“句柄(Handle)”和一个模块代码(Module)。当同时运行两份相同的程序时,两份程序的模块代码都相同,因此,只要找到内存中两个相同的模块代码,我们就知道有两份程序在运行,从而可以控制它。Windows提供的两个接口函数GetModuleHandle和GetModuleUsage可以完成此任务。具体方法如下,首先在一个新的模块文件(*.Bas)中声明API函数。

  Declare Function GetModuleHandle Lib"Kernel"(ByVallpProgName$)

  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<>0 Then
  MsgBox"启动程序时发生错误",64
  Exit Sub
  End lf
  End Sub

  该过程完成后,在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函数

  Declare Function GetWindowsDirectory Lib "Kernel" (ByVal IpBuffer As String,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$)As String
  ’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
 
  三、在关掉窗体前提示保存数据

  一般说来,通常用5种方式可以关闭一个应用程序:
  1.用户选择了当前窗体ControlBox中的[关闭]命令
  2.激发程序中的结束命令代码(如End,Unload)
  3.退出Windows
  4.在Windows的任务列表中关闭应用程序。
  5.多文档操作时,关闭主MDI窗体,引起子MDI窗体关闭。

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

  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本身的潜力,深入掌握一些过程的操作技巧来解决;而有些较复杂的问题,涉及到Windows底层方面的操作,采用Windows的API函数,可以很容易实现。当然这需要对Windows的函数和机理有一定的了解。随着Windows编程水平的提高,我们会逐渐学会并喜欢利用API函数来辅助完成程序编码。

来源:knowsky    
相关的新闻
相关的专家答疑
VB常用术语具有什么具体的含义?本文主要为19个VB常用术语释义。包括:项目、控件、代码、像索、全局变量、函数、死循环、语法错误……
在软件开发过程中,有一些看似很简单的问题,却很容易被一般的开发人员所忽略,也影响我们软件走向商品化。下面是在使用VisualBasic开发软件时遇到的问题的解决方法。
怎样快速实现VB编程?本文介绍了在进行VB编程时所要注意的一些事项并提出一些实际建议,如尽可能不要使用平方根运算、用C++或者Delphi重新编写程序……
一个优秀的程序员在设计应用程序时,总是以方便用户的使用为程序设计的目标,而用户第一次接触应用程序就是从界面开始的,因此如何设计应用程序的界面有重要的意义。
VB的界面设计具有哪些原则和编程技巧?主要包括界面要具有一致性、常用操作要有捷径、提供简单的错误处理、提供信息反馈、操作可逆和操作可逆。
本专题主要介绍SQL Server 2008的新增特征:SQL Server 2008中的T-SQL基本对象和操作、T-SQL的函数类型和数据类型以及新的安全特性等等。
本篇文章主要介绍SQL Server数据存储的物理对象和原理,包括SQL Server 2005和2008里的物理数据存储、SQL Server 2008数据类型(即Datetime、字符串、自定义及等)、在SQL Server数据库中加强数据的完整性……
本文为SQL Server 2008初学者指南,主要介绍SQL Server2008 T-SQL支持的基本元素和基本操作。
最新更新
专家答疑
技巧
Phillip Bracken
我怎样在Oracle中增加SGA_MAX_SIZE?在计算机启动的时候出现了以下错误:"ORA-03113: end-of-file on communication channel"。请您告诉我增加SGA的一些步骤。
Rudy Limeback
我想用REPLACE语句替换AddressLine1域里面的数据,也就是想删除逗号、周期、连字符,并将 '3 South '替换成'3 S ' 然后……
Brian Peasland
设计备份方案时主要考虑哪些因素?什么是RTO、MTBF和MTTR?我不敢100%肯定RTO,但是我觉得就是Return to Operation的意思。换句话说就是将系统返回到正常操作时间……