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月)