VFP应用系统的安全警告──设计技巧

Author: 谢古今 Date: 2001年 11期

    构建一个较完善的数据库应用系统是相当麻烦和复杂的,往往许多的工作均是为系统安全服务的,不过,这样处理才是真正的应用系统,因为许多情况下用户的操作不可能完全按照设计者的思路进行,为了防止合法用户的意外操作错误,对可能引起严重后果的操作均给出警告、提示。系统警告提示设置在一些不可恢复而又影响库表数据的操作之前。VFP系统提供了wait命令、message()、messagebox()等函数,利用这些系统命令与函数,可以编制出系统警告提示程序片断。这里简要介绍wait命令与messagebox()函数的用法与技巧。
  #1    1.wait命令
      作用:显示信息并且暂停程序执行直至用户按键或单击鼠标。
      语法:
      WAIT [cMessageText][TO VarName] [WINDOW [AT nRow,nColumn]] [NOWAIT] [TIMEOUT nSeconds]
      说明:cMessageText指定要显示的信息。如果忽略这个参数,系统显示默认信息“press any key continue...”,如果cMessageText是一个空串,系统不会显示信息,按任意键后程序便继续执行。
      TO VarName  保存按键值到一个变量或一个数组元素。
      WINDOW  显示信息在Visual FoxPro主窗口右上角的一个系统信息窗口中。按下CTRL或 SHIFT 键不放,该窗口会临时隐藏。
      AT nRow,nColumn 设定信息窗口在屏幕上的位置。(^11020503a^)(^11020503b^)
      NOWAIT  显示完信息后立即继续执行程序。
      TIMEOUT nSeconds  没有按键的情况下设置一定秒数后让程序继续运行。TIMEOUT 必须放在命令的最后否则会出错。
      例:WAIT  “等待信息”  WINDOW AT 20,20 timeout 2
      显示“等待信息”窗口在(20,20)位置,如果2秒内没有按键,信息窗口自动消失,程序继续进行。
  #1    2.messagebox()函数的用法
      格式:messagebox(cmessagetext [,ndialogboxtype [,ctitlebartext]])?牑?
      返回值:数字型
      变量说明:cmessagetext表示显示在对话框中的正文内容;ndialogboxtype表示出现在对话框中的按钮和图标及缺省按钮;ctitlebartext表示出现在对话框标题条中的文本。其中ndialogboxtype、ctitlebartext是可选项,ndialogboxtype缺省为0,ctitlebartext缺省为“Microsoft Visual Foxpro”。下面解释ndialogboxtype不同参数值代表的意义。
      参数ndialogboxtype可由三部分相加组合,分别控制按钮、图标、缺省按钮。例如ndialogboxtype=289=(1+32+256),则对话框特性如下:具有OK和Cancel 按钮,显示问号图标,缺省为第二按钮Retry。
      本函数使用时必须用在一个表达式中,单独使用是错误的。在程序中均把本函数用在IF语句中,用来作逻辑判断条件,以决定下一步的操作或仅给出提示。此外,如果cmessagetext较长,可以分为两段,中间加一个chr(13),这样显示时便从加chr(13)处另起一行。可以参看某表单中的“首次使用”按钮的click代码:
      if messagebox(“首次使用时,请输入口令guest!”+chr(13)+“可以进入系统。然后请修改口令!”,64,“口令”)=1
      return
      endif
      除了系统警告外,防止程序的错误运行也是比较重要的,数据库应用系统最好是防止系统同时运行多次。VFP自身的函数无法处理这个问题,但利用Windows提供的API就可以方便的解决。VFP系统把一些API函数封装在FOXTOOLS.FLL库中,通过调用相关函数,可以实现我们的目的。下面是主程序中的检测段:
      set library to sys(5)+curdir()+“foxtools.fll”  additive &&指定foxtools.fll库的路径。
      GetWind = RegFn(“FindWindow”,“CC”,“I”)
      wclass=0
      winname=“实验室管理系统”
      apphand = CallFn(GetWind,wclass,winname)  &&调用获得程序句柄的API函数
      if apphand<>0
      wait window “为了数据安全,“实验室管理系统”不能运行两次!”
      quit
      endif