為了方便使用者使用和使系統具有靈活性,大多數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-StringAsString,ByValcbReturnStringAsInteger,ByValFilenameAsString)AsInteger
DeclareFunctionGetPrivatePfileIntLib"Kernel"(ByVallpAppNameAsString,ByVallpKeyNameAsString,ByVallpDefaultAsInteger,ByValFilenameAsString)AsInteger
DeclareFuncitonWritePrivateprofileStringLib"Kernel"(ByVallpapplicationNameAsString,ByVallpKeyNameAsString,ByVallpStringAsString,ByVallplFileNameAsString)AsInteger
FunctionGetIniS(ByValSectionNameAsString,ByValKeyWordAsString,ByValDefStringAsString)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文件,代碼如下:
SubForm1_Load()
……
Forml.Height=GetIniN("窗體1","高度",6000)
Form1.Width=GetIniN("窗體1","高度",4500)
EndSub
……
SubForm1_Unload()
……
SetIniN"窗體1","高度",Me.Height
SetIniN"窗體1,"寬度",Me.Width
……
EndSub->