6、用VB開(kāi)發(fā)應用程序如何使用INI文件
為了方便用戶(hù)使用和使系統具有靈活性,大多數Win-dows應用程序將用戶(hù)所做的選擇以及各種變化的系統信息記錄在初始化(INI)文件中。因此,當系統的環(huán)境發(fā)生變化時(shí),可以直接修改INI文件,而無(wú)需修改程序。由此可見(jiàn),INI文件對系統功能是至關(guān)重要的。本文將介紹采用VisualBasicforWindows(下稱(chēng)VB)開(kāi)發(fā)Windows應用程序時(shí)如何讀寫(xiě)INI文件。
INI文件是文本文件,由若干部分(section)組成,在每個(gè)帶括號的標題下面,是若干個(gè)以單個(gè)單詞開(kāi)頭的關(guān)鍵詞(keyword)和一個(gè)等號,每個(gè)關(guān)鍵詞會(huì )控制應用程序某個(gè)功能的工作方式,等號右邊的值(value)指定關(guān)鍵詞的操作方式。其一般形式如下:
[section1]
keyword1=valuel
keyword2=value2
……
[section2]
keyword1=value1
keyword2=value2
……
其中,如果等號右邊無(wú)任何內容(即value為空),那就表示W(wǎng)indows應用程序已為該關(guān)鍵詞指定了缺省值,如果在整個(gè)文件中找不到某個(gè)關(guān)鍵詞(或整個(gè)一部分),那同樣表示為它們指定了缺省值。各個(gè)部分所出現的順序是無(wú)關(guān)緊要的,在每一個(gè)部分里,各個(gè)關(guān)鍵詞的順序同樣也無(wú)關(guān)緊要。
讀寫(xiě)INI文件通常有兩種方式:一是在Windows中用"記事本"(Notepad)對其進(jìn)行編輯,比較簡(jiǎn)單,無(wú)需贅述;二是由Windows應用程序讀寫(xiě)INI文件,通常是應用程序運行時(shí)讀取INI文件中的信息,退出應用程序時(shí)保存用戶(hù)對運行環(huán)境的某些修改。
關(guān)鍵詞的值的類(lèi)型多為字符串或整數型,應分兩種情況讀寫(xiě)。為了使程序具有可維護性和可移植性,最好把對INI文件的讀寫(xiě)封裝在一個(gè)模塊(RWINI.BAS)中,在RWI-NI.BAS中構造GetIniS和GetIniN函數以及SetIniS和Se-tIniN過(guò)程,在這些函數和過(guò)程中需要使用WindowsAPI的"GetPrivateprofileString"、"GetPrivateProfileInt"和"WritePrivateProfileString"函數。
RWINI.BAS模塊的程序代碼如下:
在General-Declearation部分中聲明使用到的WindowsAPI函數:
Declare Function GetprivateprofileString Lib"Ker-nel"(ByVallpAppName As String,ByVallpKeyName As String,ByVallpDefault As String,ByVal lpRetrm-String As String,ByVal cbReturnString As Integer,ByVal Filename As String)As Integer
Declare FunctionGetPrivatePfileInt Lib "Kernel"(ByVal lpAppName As String,ByVal lpKeyName As String,ByVal lpDefault As Integer,ByVal Filename As String)As Integer
Declare FuncitonWritePrivateprofileString Lib "Kernel"(ByVal lpApplicationName As String,ByVal lpKeyName As String,ByVal lpString As String,ByVal lplFileName As String)As Integer
寫(xiě)入INI文件
Function GetIniS(ByVal SectionName As String,ByVal KeyWord As String,ByVal DefString As String)As String
Dim ResultString As String * 144,Temp As Integer
Dims As String,i As Integer
Temp%=GetPrivateProfileString(SectionName,KeyWord,"",ResultString,144,AppProfileName())
‘檢索關(guān)鍵詞的值
IfTemp%>0Then‘關(guān)鍵詞的值不為空
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())
‘將缺省值寫(xiě)入INI文件
s=DefString
EndIf
GetIniS=s
EndFunction
讀INI文件
FunctionGetIniN(ByValSectionNameAsString,ByValKeyWordAsString,ByValDefValue As Ineger)AsInteger
DimdAsLong,sAsString
d=DefValue
GetIniN=GetPrivateProfileInt(SectionName,KeyWord,DefValue,ppProfileName())
If d<>DefValueThen
s=""&d
d=WritePrivateProfileString(SectionName,KeyWord,s,AppProfileName())
EndIf
EndFunction
SubSetIniS(ByVal SectionName As String,BtVal KeyWord As String,ByVal ValStr As String)
Dim res%
res%=WritePrivateprofileString(SectionName,KeyWord,ValStr,AppProfileName())
EndSub
SubSetIniN(ByValSectionNameAsString,ByValKeyWordAsString,ByValValIntAsInteger)
Dimres%,s$
s$=Str$(ValInt)
res%=WriteprivateProfileString(SectionName,KeyWord,s$,AppProfileName())
EndSub
SectionName為每一部分的標題,KeyWord為關(guān)鍵詞,GetIniS和GetIniN中的DefValue為關(guān)鍵詞的缺省值,SetIniS和SetIniN的ValStr和ValInt為要寫(xiě)入INI文件的關(guān)鍵詞的值。為了能更好地說(shuō)明如何使用以上函數和過(guò)程,下面舉兩個(gè)實(shí)例。
實(shí)例1:
開(kāi)發(fā)應用程序通常要使用數據庫和其它一些文件,這些文件的目錄(包括路徑和文件名)不應在程序中固定,而是保存在INI文件中,程序運行時(shí)由INI文件中讀入。讀入數據庫文件的代碼如下:
DimDatabasenameAsString
Databasename=GetIniS("數據庫","職工","")
If DatabaseName=""ThenDatabaseName=InputBox("請輸入數據庫《職工》的目錄"),App.Title)’也可通過(guò)"文件對話(huà)框"進(jìn)行選擇
OnErrorResumeNext
Setdb=OpenDatabas(DatabaseName)
IfErr<>0Then
MsgBox"打開(kāi)數據庫失敗!",MB-
ICONSTOP,App.Title:GotoErrorProcessing
Else
SetIniS"數據庫","職工",DatabaseName
EndIf
OnErrorGoTo0
……
實(shí)例2:
為了方便用戶(hù)操作,有時(shí)需要保存用戶(hù)界面的某些信息,例如窗口的高度和寬度等。裝載窗體時(shí),從INI文件中讀入窗體高度和寬度,卸載窗體時(shí)將窗體當前高度和寬度存入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
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。