为了方便用户使用和使系统具有灵活性,大多数Win-dows应用程序将用户所做的选择以及各种变化的系统信息记录在初始化(INI)文件中。因此,当系统的环境发生变化时,可以直接修改INI文件,而无需修改程序。由此可见,INI文件对系统功能是至关重要的。本文将介绍采用VisualBasicforWindows(下称VB)开发Windows应用程序时如何读写INI文件。 INI文件是文本文件,由若干部分(section)组成,在每个带括号的标题下面,是若干个以单个单词开头的关键词(keyword)和一个等号,每个关键词会控制应用程序某个功能的工作方式,等号右边的值(value)指定关键词的操作方式。其一般形式如下:
[section1] keyword1=valuel keyword2=value2 …… [section2] keyword1=value1 keyword2=value2 ……
其中,如果等号右边无任何内容(即value为空),那就表示Windows应用程序已为该关键词指定了缺省值,如果在整个文件中找不到某个关键词(或整个一部分),那同样表示为它们指定了缺省值。各个部分所出现的顺序是无关紧要的,在每一个部分里,各个关键词的顺序同样也无关紧要。 读写INI文件通常有两种方式:一是在Windows中用“记事本”(Notepad)对其进行编辑,比较简单,无需赘述;二是由Windows应用程序读写INI文件,通常是应用程序运行时读取INI文件中的信息,退出应用程序时保存用户对运行环境的某些修改。 关键词的值的类型多为字符串或整数型,应分两种情况读写。为了使程序具有可维护性和可移植性,最好把对INI文件的读写封装在一个模块(RWINI.BAS)中,在RWI-NI.BAS中构造GetIniS和GetIniN函数以及SetIniS和Se-tIniN过程,在这些函数和过程中需要使用WindowsAPI的“GetPrivateprofileString”、“GetPrivateProfileInt”和“WritePrivateProfileString”函数。 RWINI.BAS模块的程序代码如下: 在General-Declearation部分中声明使用到的WindowsAPI函数:
DeclareFunctionGetprivateprofileStringLib“Ker-nel”(ByVallpAppNameAsString, ByVallpKeyNameAsString,ByVallpDefaultAsString,ByVallpRetrm-StringAs String,ByValcbReturnStringAsInteger,ByValFilenameAsString)AsInteger DeclareFunctionGetPrivatePfileIntLib“Kernel”(ByVallpAppNameAsString, ByVallpKeyNameAsString,ByVallpDefaultAsInteger,ByValFilenameAsString)As Integer DeclareFuncitonWritePrivateprofileStringLib“Kernel”(ByVallpApplicationName AsString,ByVallpKeyNameAsString,ByVallpStringAsString,ByVallplFileName AsString)AsInteger FunctionGetIniS(ByValSectionNameAsString,ByValKeyWordAsString,ByValDefString AsString)AsString DimResultStringAsString*144,TempAsInteger DimsAsString,iAsInteger Temp%=GetPrivateProfileString(SectionName,KeyWord,“”,ResultString,144,AppProfileName()) ‘检索关键词的值 IfTemp%>0Then‘关键词的值不为空 s=“” Fori=1To144 IfAsc(Mid$(ResultString,i,1))=0Then ExitFor Else s=s&Mid$(ResultString,i,1) EndIf Next Else Temp%=WritePrivateProfilesString(sectionname,KeyWord,DefString,ppProfileName()) ‘将缺省值写入INI文件 s=DefString EndIf GetIniS=s EndFunction FunctionGetIniN(ByValSectionNameAsString,ByValKeyWordAsString,ByValDefValue AsIneger)AsInteger DimdAsLong,sAsString d=DefValue GetIniN=GetPrivateProfileInt(SectionName, KeyWord,DefValue,ppProfileName()) Ifd<>DefValueThen s=“”&d d=WritePrivateProfileString(SectionName, KeyWord,s,AppProfileName()) EndIf EndFunction SubSetIniS(ByValSectionNameAsString,BtVaKeyWordAsString,ByValValStr AsString) Dimres% res%=WritePrivateprofileString(SectionName,KeyWord,ValStr,AppProfileName()) EndSub SubSetIniN(ByValSectionNameAsString,ByValKeyWordAsString,ByValValInt AsInteger) Dimres%,s$ s$=Str$(ValInt) res%=WriteprivateProfileString(SectionName,KeyWord,s$,AppProfileName()) EndSub
SectionName为每一部分的标题,KeyWord为关键词,GetIniS和GetIniN中的DefValue为关键词的缺省值,SetIniS和SetIniN的ValStr和ValInt为要写入INI文件的关键词的值。为了能更好地说明如何使用以上函数和过程,下面举两个实例。 实例1: 开发应用程序通常要使用数据库和其它一些文件,这些文件的目录(包括路径和文件名)不应在程序中固定,而是保存在INI文件中,程序运行时由INI文件中读入。读入数据库文件的代码如下:
DimDatabasenameAsString Databasename=GetIniS(“数据库”,“职工”,“”) IfDatabaseName=“”ThenDatabaseName=InputBox(“请输入数据库《职工》的目录”), App.Title)’也可通过“文件对话框”进行选择 OnErrorResumeNext Setdb=OpenDatabas(DatabaseName) IfErr<>0Then MsgBox“打开数据库失败!”,MB- ICONSTOP,App.Title:GotoErrorProcessing Else SetIniS“数据库”,“职工”,DatabaseName EndIf OnErrorGoTo0 ……
实例2: 为了方便用户操作,有时需要保存用户界面的某些信息,例如窗口的高度和宽度等。装载窗体时,从INI文件中读入窗体高度和宽度,卸载窗体时将窗体当前高度和宽度存入INI文件,代码如下:
Sub Form1_Load() …… Forml.Height=GetIniN(“窗体1”,“高度”,6000) Form1.Width=GetIniN(“窗体1”,“高度”,4500) EndSub …… Sub Form1_Unload() …… SetIniN“窗体1”,“高度”,Me.Height SetIniN“窗体1,”宽度“,Me.Width …… End Sub
|