VB程序中初始化参数的存取

      □ 郭微光

      Windows软件初始化参数的获取和保存,是通过读取扩展名为INI的文本文件来实现的。在用户更改设置后, 软件会自动更改INI文件中相应的内容。由于所有参数均以磁盘文件的形式保存,所以,即使在退出Windows 并关机之后,仍不会丢失。软件在开始运行前,先在指定的INI文件中搜索所有的参数,然后获取这些参 数,并反映到软件运行的环境中去,这样,就使得用户使用起来更为方便。

      1.实现方法

      对于VB程序员来说,要保存用户设置的参数可以创建一个文件,以一定的格式将所有参数写入文件中。这 种方法虽然可行,但是,当参数数量很多时,就显得十分繁琐,并且容易出现读写错位。Windows提供的 API函数中GetPrivateProfileString和WritePrivateProfileString的功能,是在初始化文件的指定段内获取和设置字符 串,其基本方式是将参数以段为单位分组(每个段都有一个段名),段中的每一个参数均与一个关键字对应, 程序员只须给出关键字,函数将自动以规定格式把参数放置到位。通过使用这两个函数,可以很简单地实现 上述功能,并且其格式与Windows的规定一致,因此,不容易出错。

      为了在VB中使用Windows API函数,必须使用Declare语句把API函数引用到VB中,指明函数所在的DLL库文 件,并且声明函数参数和返回值的类型。当API函数用Declare语句正确地声明后,程序员就能像使用VB函数 或子程序一样调用此函数。

      这两个函数的使用如下:

      ①GetPrivateProfileString

      声明:Declare Function GetPrivateProfileString% Lib ″Kernel″ (ByVal lpApplicationName$,ByVal lpKeyName $,ByVal lpDefault$,ByVal lpReturnedString$,ByVal nSize%,ByVal lpFileName$)

      功能:获取初始化文件中与指定关键字对应的参数(字符串型变量),并将此参数拷贝到lpReturnedString中去。

      参数 类型/说明

      lpApplicationName String——待寻找的关键字所在的段。

      lpKeyName String——与参数相对应的关键字名。

      lpDefault String——指定关键字不存在时将要返回的缺省值。

      lpReturnedString String——预先分配好的,长度至少为nSize字节的字符串缓冲区。

      nSize Integer——将要装入lpReturnedString缓冲区的最大字符数。

      lpFileName String——初始化文件的名字。

      返回值: Integer——拷贝到lpReturnedString缓冲区的字符数。

      ②WritePrivateProfileString

      声明:Declare Function WritePrivateProfileString% Lib ″Kernel″ (ByVal lpApplicationName$,ByVal lpKeyName $,ByVal lpString$,ByVal lpFileName$)

      功能:在初始化文件的指定关键字项内设置参数(字符串)。

      返回值:Integer——如果成功,返回TRUE(非零);否则,返回零。

      2.范例说明

      下面用一个VB制作的文本编辑器为例,来说明这两个函数的使用。在用户使用文本编辑器之后,所打开文 件的文件名被依次保存到VBDEMO.INI文件中。当该文本编辑器启动时,先查找VBDEMO.INI文件中保存的 最后四个被打开的文件名,并在菜单中显示出来,用户只须选中菜单项,相应的文件即被打开。

      具体实现过程如下:

      (1)从菜单File中选取New Project项,并建立一个新窗体Form1,从工具箱中调出文本框Text1和公共对话框 CMDialog1,放置到窗体上。

      (2)清除文本框中的文本内容,将MultiLine属性设置为True,ScrollBars属性设置为Both。将公共对话框的 CancelError属性设置为True。

      (3)在Form1中生成一个File菜单,下面的级联菜单有mnuOpen和菜单组mnuRecentFile(1)~(4),其Caption分别为 Open和RecentFile。菜单组mnuRecentFile的Visible属性均设为False,并在Index框中填入相应的序号。

      (4)在Form1的Declare窗口中定义两个Windows的API函数,将上节中对函数进行声明的代码写入此窗口中。

      (5)在相关的事件中写入如下代码:

      Sub mnuOpen_Click()

      Dim OpenFileName As String

      On Error Resume Next

      CMDialog1.Filename=″″

      CMDialog1.Action=1

      If Err<>32755 Then′判断用户是否选择cancel

      OpenFileName=CMDialog1.Filename

      ′从公共对话框中获取将要打开的文件名

      OpenFile(OpenFileName)′打开文件

      WriteRecentFiles(OpenFileName)′将文件名写入VBDEMO.INI

      GetRecentFiles′读VBDEMO.INI,并设置mnuRecentFile

      End If

      End Sub

      Sub mnuRecentFile_Click(index As Integer)

      OpenFile(mnuRecentFile(index).Caption)′根据菜单标题打开相应的文件

      End Sub

      Sub Form_Load()

      GetRecentFiles′窗体显示之前先读VBDEMO.INI,设置mnuRecentFile

      End Sub

      (6)选择菜单View中的New Procedure,在Form1中增加以下几个新的过程:

      Sub OpenFile(OpenFileName$)

      On Error Resume Next

      Open FileName For Input As #1′打开选中的文件

      If Err Then

      MsgBox ″Can′t open file:″+OpenFileName

      Exit Sub

      End If

      Text1.Text=Input$(LOF(1),1)′将文件内容写入Text框中

      Close #1′关闭文件

      End Sub

      Sub WriteRecentFiles(OpenFileName$)

      Dim i,j,key,retval

      Dim IniString As String

      IniString=String(255,0)

      For i=3 To 1 Step -1

      ′将VBDEMO.INI文件中的RecentFile1移至RecentFile2,依次类推

      key=″RecentFile″ &i

      retval=GetPrivateProfileString(″Recent Files″,key,″No File″,IniString, Len(IniString),″VBDEMO.INI″)

      If retval And Left(IniString,7)<>″No File″ Then

      key=″RecentFile″ &(i+1)

      retval=WritePrivateProfileString(″Recent Files″,key,IniString,″VBDEMO.INI″)

      End If

      Next i

      retval=WritePrivateProfileString(″Recent Files″, ″RecentFile1″,OpenFileName, ″VBDEMO.INI″)′将打开的文 件放至RecentFile1的位置

      End Sub

      Sub GetRecentFiles()

      Dim retval,key,i,j

      Dim IniString As String

      IniString=String(255,0)

      For i=1 To 4′从VBDEMO.INI中获取最后被打开的四个文件的文件名

      key=″RecentFile″ &i

      retval=GetPrivateProfileString(″Recent Files″,key,″No File″,IniString, Len(IniString),″VBDEMO.INI″)

      If retval And Left(IniString,7)<>″No File″ Then

      Form1.mnuRecentFile(i).Caption=IniString

      ′将文件名写入窗体的菜单中

      Form1.mnuRecentFile(i).Visible=True

      End If

      Next i

      End Sub

      (7)运行程序。

      用此文本编辑器,不仅能打开文本文件、在文本框中对文件进行编辑,而且,最近打开的四个文件将按顺序 在菜单中显示出来。这些文件名是从WINDOWS\目录下的VBDEMO.INI文件中获取的,以下为一个 VBDEMO.INI文件的内容。

      [Recent Files]

      RecentFile1=C:\BORLANDC\USER\EXAM1.C

      RecentFile2=C:\WINDOWS\SETUP.TXT

      RecentFile3=D:\ADI_DSP\DFT.ASM

      RecentFile4=D:\ADI_DSP\21K.ACH

      在此例中段名为Recent Files,关键字为RecentFile1~4,“=”后的字符串为参数。

      (收稿日期:1996年12月)