VFP编程中的变量操作 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

   

    一、问题的提出

    早期的数据库编程语言,如dBaseⅢ、Foxbase 2.0等对于变量的定义一般不需要作显式的说明也可引用,只要求用户对其进行相应的赋值,系统中就可为该变量准备相应的存储空间,系统中也能认同该变量,正是由于我们大多数编程人员具有这样的编程经验,在数据库编程时对于变量不作一些说明直接引用,往往会导致一些错误的发生,而这些错误在编程调试中是不易发现的,特别是局部与全局变量在递归中的使用问题;数据库在升级及更新换代的过程中,亦然兼容大多数人对于简单变量不定义但能使用的这种用法,另一方面更倡导结构化的设计思想,如果用户在阅读VFP提供的一些范例,不难看出它的编程风格完全和结构化的编程思想是一致的,

VFP编程中的变量操作

    笔者认为站在VFP的角度就应该完全按照结构化的思想来设计程序:如程序结构化、过程函数中的变量不用或者少用全局变量,内部使用的变量一般作局部变量进行定义;当然所有这些均建立在可视化的前提下,这是无容置疑的。笔者下面的一道程序正是犯了未定义局部变量而滥用全局变量的毛病。

   

    二、实例

   

    下面是笔者通过在VFP中的插入一个oleCtrol控件来实现将磁盘中的文件目录保存到一个目录树中以实现打开一个目录及迭起一个目录的操作,在装填oleCtrol的数据时对于目录树宜采用递归调用,其形式可采用深度优先搜索法,对于该结点在插入到oleCtrol后,然后对于与该结点相邻的所有结点为普通结点直接插入到oleCtrol中,若为子目录结点则递归调用该插入子程序(即深度遍历目录结构)。

    下面是有关将用户选择的目录中的数据填入到目录树中的一个递归程序,其过程叫做filltree(m.path,m.count),其代码如下:

    *procedure filltree(m.path,m.nlevel)

    parameters m.path,m.nlevel

    local nlvl,DirArr,nTotDir

    **由于该处缺少对于程序中的变量I的定义而导致程序不正常运行,改进后该位置增加了对于变量I的定义

    **该过程仅需要一个参数,其它参数可以缺少,对于缺少的参数进行设定

    m.path=alltrim(m.path)

    if (parameters()<2) or (type("m.nlevel")#"N")

    nlvl=0

    else

    nlvl=m.nlevel

    endif

    lvl=nlvl+1

    *将当前参数传过来的m.path及所处的层数保存在对象oleControl1中

    this.olecontrol1.AddItem(LOWER(m.path))

    this.olecontrol1.Indent(m.nlvl-1)=m.nlvl

    *列出当前目录下的所有目录,并排序

    DIMENSION DirArr[1,1]

    nTotDir=ADIR(DirArr,m.path+"*.","D")

    ASORT(DirArr)

    *对于当前目录下的所有目录实施相同的填充目录树的方式进行目录树的填入

    *即对于当前目录下的其它所有目录均采用filltree进行递归调用的处理

    FOR i = 1 TO m.nTotDir

    IF DirArr[m.i,1] != '.' AND ATC('D',DirArr[m.i,5])#0

    THIS.FillTree(m.path+DirArr[m.i,1]+'\', m.nlvl)

    ENDIF

    ENDFOR

    ****过程结束

    其中filltree是该表单form的一个方法程序,通过新建方法来设定的,filltree中的参数m.path是借助于命令按钮Directory传递过来的,Directory的Click事件是这样的,

电脑资料

VFP编程中的变量操作》(https://www.unjs.com)。

    **Directory的命令按扭事件借助于getdir()得到当前的路径

    local m.cdir

    m.cdir=getdir()

    thisform.olecontrol1.clear

    thisform.filltree(m.cdir)

    在上述程序运行的过程中,只能检索到一个目录,且是一个死循环,花了一上午的时间,终于被我检查出来了,这就是在该过程中对于过程中用到的变量i没有定义,而该变量i是作为深度优先搜索算法中的中间变量,在递归调用返回时应恢复到其调用递归前的状态,即是借助于局部数据区域保存的数据,或者说是每一次递归调用时,临时又分配一个这样的内存变量来保存数据,递归返回时撤消其生存的空间而恢复父进程的一些变量,可是由于没有被定义,而对于数据库语言将其作为全程变量来进行处理,该变量的值并不能在递归返回时恢复,因而出现死循环,可是对于变量没有被定义这样的处理,在VFP中是容许的,但是作为该种版本的数据库系统并不倡导这种处理方式,而这些也正是初次接触VFP或者是惯于使用Foxbase等语言的同志容易犯的错误所在,对于其它的高级语言如Pascal、C等语言,由于其变量要求先定义后引用的限制则不可能出现这种问题。

    三、结束语

    笔者是一个学习VFP的新手,对于象我这样一个学习VFP的新手来说,我认为除了要继承Foxbase等低级数据库的编程技巧外,更应去适应高版本的语言系统的一些规范,如对于VFP中的类的认识理解,对于VFP中编程中的一些模块化的风格(在过程或函数中少用或不用转移语句,对于过程或函数内部的变量应加以说明,一般不得使用全程变量)的理解,如上例中由于在方法程序中对于所使用的变量i进行显示的说明而导致程序严重的错误,而这种错误一般是不易发现的,这些错误也往往是容易犯的,希望通过此篇文章的阐述,让读者以此为戒,不犯同样的错误。

   

最新文章