VB读写ini文件(1
2007-06-20 11:32
自从注册表诞生以来ini文件正在逐渐失去其市场占有率,然而基于ini文件的独立性,致使其还没有到达退出历史舞台的地步,很多应用程序的初始化和一些界面参数的设置仍然很愿意从ini文件中读取,为了保证操作需用参数对ini文件的读取的通明性,建议使用一个模块来完成此工作。注:所有操作调用标准的Win API函数来完成。
  Dim Ret As Long
  Dim Start As Long
  Public FileName As String
  Const BufSize = 10240
  Dim buf As String * BufSize
  Private Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long
  Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
  Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
  Private Declare Function WritePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
  Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Public Sub SetValue(ByVal clsName As String, ByVal key As String, ByVal V As String)
      Ret = WritePrivateProfileString(clsName, key, V, FileName)
End Sub
 
Public Function GetValue(ByVal clsName As String, ByVal key As String) As String
    Ret = GetPrivateProfileString(clsName, key, "", buf, BufSize, FileName)
    Start = 1
    GetValue = RetStr()
End Function
 
Private Function RetStr() As String
      Dim i As Long
      i = InStr(Start, buf, Chr(0))
      If i > Start Then
        RetStr = Mid(buf, Start, i - Start)
      End If
      Start = i + 1
End Function
  至此已经完成了对一个完整的独立模块的封装,接下来就来看看怎么引用(其实看完上面程序就明了了)
VB读写INI文件(2
2007-06-20 11:32
INI 文件是什么样子?——不会吧,这都不知道。INI 文件就是 Windows 中常见的以 .ini 为扩展名的文件,其内部格式和各部分的名称如下:
  [Section1]
Key1=Value1
Key2=Value2
Key3=Vlaue3
  [Section2]
Key1=Value1
Key2=Value5
Key4=Value4
Key5=...
...
  INI 文件中分若干个段 (Section),每个段中有若干个键 (Key) (Value) 对。一个键值对保存一个信息;段则将属性类似的一些键值对组织在一起。同一个段中不能出现两次以上同样的键,但不同的段中可以出现相同的键。
  现在明白了吗?要是还不明白,就到 Windows 里两个 INI 文件看看,文本编辑器就可以打开的。明白了 INI 文件就要开始学习怎样在 VB 中读写 INI 了。
  VB 读写 INI 文件,难吗?不难,因为 Windows 已经为我们做好了一切,我们只需要调用它的 API 函数就可以了。为了读写 INI 文件,我们可能用到以下 API 函数:
  GetPrivateProfileInt
  GetPrivateProfileString
  WritePrivateProfileString
  其中 WritePrivateProfileString 是用来向 INI 文件写信息的,而 GetPrivateProfileInt GetPrivateProfileString 则是用来从 INI 文件中读信息的,前者用于读取整型数据,后者则用于读取字符串型数据。
  上述三个 API 函数在 VB 中的申明和说明如下:
Private Declare Function GetPrivateProfileInt Lib "kernel32" _
Alias "GetPrivateProfileIntA" ( _        ' 返回所读取的长整型值
    ByVal lpApplicationName As String, _    ' 要读取的段 (Section) 名称
    ByVal lpKeyName As String, _            ' write的返回值要读取的的键 (Key) 名称
    ByVal nDefault As Long, _                ' 指定默认值,如果读取时出错,则返回该值
    ByVal lpFileName As String) As Long      ' 指定要读的 INI 文件名
Private Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" ( _    ' 返回所读取的字符串值的真实长度
    ByVal lpApplicationName As String, _    ' 要读取的段 (Section) 名称
    ByVal lpKeyName As Any, _                ' 要读取的的键 (Key) 名称
    ByVal lpDefault As String, _            ' 指定默认值,如果读取时出错,则返回该值
    ByVal lpReturnedString As String, _      ' 指定接收返回值的字符串变量
    ByVal nSize As Long, _                  ' 指定允许字符串值的最大长度
    ByVal lpFileName As String) As Long      ' 指定要读的 INI 文件名
Private Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" ( _  ' 如果成功返回非 0 值,失败返回 0
    ByVal lpApplicationName As String, _    ' 要写入的段 (Section) 名称
    ByVal lpKeyName As Any, _                ' 要写入的的键 (Key) 名称
    ByVal lpString As Any, _                ' 要写入的值 (Value),以字符串表示
    ByVal lpFileName As String) As Long      ' 指定要写的 INI 文件名
  我们的目的是要在 VB 中写一个读写 INI 文件的类,所以在 VB 中新建一个工程,并添加一个类模块 (Class Module),命令类为 CIniFile,并且将上面的申明添加到类模块中。然后开始为类添加属性和方法。
  从上面的注释中,我们可以知道,每次调三个 API 之一都需要指定 INI 文件名。而在我们的 CIniFile 的每一个实例中,应该始终访问同一个 INI 文件,所以属性之一就是文件名:
  Private IniFileName As String
  另外,调用 API 的过程中可能会出现错误,那么 CIniFile 应该能提供错误信息,所以定义一个保存错误信息的变量作为 CIniFile 的第二个属性
  Public ErrorMsg As String
  由于访问什么段、什么键以及写入什么值都可以通过参数的形式传递给方法,而获取的值也都可以通过方法的返回值得以,所以不再需要其它属性了。不过在定义方法之前还需要对属性进行初始化:
Private Sub Class_Initialize()
      IniFileName = vbNullString
      ErrorMsg = vbNullString
End Sub
  为了指定 INI 文件名给 CIniFile,需要定义一个方法:
Public Sub SpecifyIni(FilePathName)
      IniFileName = Trim(FilePathName)
End Sub
  在每次读写值之前还需要先判断是否已经指定了 INI 文件名,不然读什么写什么啊?
Private Function NoIniFile() As Boolean
      NoIniFile = True
      If IniFileName = vbNullString Then
        ErrorMsg = "没有指定 INI 文件"
        Exit Function
    End If
    ErrorMsg = vbNullString
    NoIniFile = False
End Function
  准备工作完成,现在才是重头戏,读写 INI 文件。似乎要简单一些,就先吧:
Public Function WriteString(Section As String, key As String, Value As String) As Boolean
      WriteString = False
      If NoIniFile() Then
        Exit Function
      End If
      If WritePrivateProfileString(Section, key, Value, IniFileName) = 0 Then
        ErrorMsg = "写入失败"
        Exit Function
    End If
    WriteString = True
End Function
 该方法在 INI 文件中写入一个键值,成功返回 True,失败返回 False。根据 WritePrivateProfileString 的需要,除了文件名这一参数不用提供之外,需要提供段名、键名和值三个参数,而且这三个参数当然来自用户。而 WritePrivateProfileString 是通过返回值是否为 0 来判断是否成功的,所以可以通过判断 WritePrivateProfileString 的返回值是否非 0 来返回 True False
  而读 INI 就要稍稍麻烦一点了,两个读取 INI 文件的的函数中,读取字符串那个虽然参数多些,但实现起来却更简单,所以,先写这个:
Public Function ReadString(Section As String, key As String, Size As Long) As String
    Dim ReturnStr As String
    Dim ReturnLng As Long
    ReadString = vbNullString
    If NoIniFile() Then
        Exit Function
    End If
    ReturnStr = Space(Size)
    ReturnLng = GetPrivateProfileString(Section, key, vbNullString, ReturnStr, Size,        IniFileName)
    ReadString = Left(ReturnStr, ReturnLng)
End Function
  这个方法在 INI 文件中读取一个键值,作为字符串返回。如果参数 Size 给定的大小不够,将不能返回完整的值串,但不会有任何提示。
  写这个函数的关键在 ReturnStr 的初始化和取值上。VB 中是不需要对字符串进行初始化的,也不需要分配空间。但是这里如果不将它初始化为一个足够长的字符串,就不能正确返回结果。这和 C 语言的字符串有关,就不多说了。ReturnStr 的取值也需要有趣,要使用 Left() 函数将其截断。如果不截断,取得的结果字符串就会有 Size 那么长,除了取得的值以外,其余部分都是用空格填充的。其原因与前面一点相同,与 C 语言的字符串有关。当然 Left() 函数也可以使用 Trim() 代替,效果是一样的。
  最后我们不得不面对这个最麻烦的 ReadInt 方法了。它为什么麻烦呢?看看现在的函数定义就知道了:
Public Function ReadInt(Section As String, key As String) As Long
    Dim ReturnLng As Long
    ReadInt = 0
    ReturnLng = GetPrivateProfileInt(Section, key, 0, IniFileName)
    If ReturnLng = 0 Then
       ReturnLng = GetPrivateProfileInt(Section, key, 1, IniFileName)
       If ReturnLng = 1 Then
          ErrorMsg = "不能读取"
          Exit Function
       End If
    End If
    ReadInt = ReturnLng
End Function
  这个方法在 INI 文件中读取一个整数值,失败时返回 0。考虑到某些键的值也可能为 0,故应结合 ErrorMsg 判断是否成功。
  这个方法中调用了两次 GetPrivateProfileInt,为什么要这样呢?因为 GetPrivateProfileInt 如果成功则返回取得的值,如果不成功则返回给定的默认值。这样就会出现一种情况:如果我给的默认值是 0GetPrivateProfileInt 函数取得的值也是 0,那么它是成功还是失败呢?同样,如果我给的默认值是 1GetPrivateProfileInt 函数取得的值也是 1,那就是成功还是失败呢?既然一次取值无法判断,那就多取一次,第一次设定默认值为 0,第二次设定默认值为 1INI 文件的中值不会跟着我的默认值变吧?!虽然这样麻烦一些,但毕竟把问题解决了。
  自此,我们终于把一个 CIniFile 写完了——现在读写 INI 文件再也不需要像写 CIniFile 一样考虑许多东西了,CIniFile 已经帮我们做了。
VB读写INI文件(3
2007-06-20 11:33
我们在制作应用程序时,经常要用到INI文件,INI文件是一种非常有用的文件,它由节、关键字和值组成。但是VB并没有给提供读取INI文件的函数。我们可以通过Windows API函数中有相应的函数,来实现读取INI文件,但每次使用都必须声明。
1.读INI文件
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
lpApplicationName:  节的名字
lpKeyName:      关键字
lpReturnedString:    返回的字符串
lpFileName:      ini文件的名称
2.写INI文件
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
lpApplicationName:  节的名字
lpKeyName:      关键字
lpString:      要改变的值
lpFileName:      ini文件的名称
应用举例:
'文件名SourceDB.ini文件
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

'以下两个函数,/ini文件,固定节点setting,in_key为写入/读取的主键
'仅仅针对是非值
'Yyes,Nno,Eerror
Public Function GetIniTF(ByVal In_Key As String) As Boolean
    On Error GoTo GetIniTFErr
    GetIniTF = True
    Dim GetStr As String
    GetStr = VBA.String(128, 0)
    GetPrivateProfileString "Setting", In_Key, "", GetStr, 256, App.Path & "\SourceDB.ini"
    GetStr = VBA.Replace(GetStr, VBA.Chr(0), "")
    If GetStr = "1" Then
        GetIniTF = True
        GetStr = ""
    Else
        GoTo GetIniTFErr
    End If
    Exit Function
    GetIniTFErr:
    Err.Clear
    GetIniTF = False
    GetStr = ""
End Function

Public Function WriteIniTF(ByVal In_Key As String, ByVal In_Data As Boolean) As Boolean
    On Error GoTo WriteIniTFErr
    WriteIniTF = True
    If In_Data = True Then
        WritePrivateProfileString "Setting", In_Key, "1", App.Path & "\SourceDB.ini"
    Else
        WritePrivateProfileString "Setting", In_Key, "0", App.Path & "\SourceDB.ini"
    End If
    Exit Function
    WriteIniTFErr:
    Err.Clear
    WriteIniTF = False
End Function

'以下两个函数,/ini文件,不固定节点,in_key为写入/读取的主键
'针对字符串值
'空值表示出错
Public Function GetIniStr(ByVal AppName As String, ByVal In_Key As String) As String
    On Error GoTo GetIniStrErr
    If VBA.Trim(In_Key) = "" Then
        GoTo GetIniStrErr
    End If
    Dim GetStr As String
    GetStr = VBA.String(128, 0)
    GetPrivateProfileString AppName, In_Key, "", GetStr, 256, App.Path & "\SourceDB.ini"
    GetStr = VBA.Replace(GetStr, VBA.Chr(0), "")
    If GetStr = "" Then
        GoTo GetIniStrErr
    Else
        GetIniStr = GetStr
        GetStr = ""
    End If
    Exit Function
    GetIniStrErr:
    Err.Clear
    GetIniStr = ""
    GetStr = ""
End Function

Public Function WriteIniStr(ByVal AppName As String, ByVal In_Key As String, ByVal In_Data As String) As Boolean
    On Error GoTo WriteIniStrErr
    WriteIniStr = True
    If VBA.Trim(In_Data) = "" Or VBA.Trim(In_Key) = "" Or VBA.Trim(AppName) = "" Then
        GoTo WriteIniStrErr
    Else
        WritePrivateProfileString AppName, In_Key, In_Data, App.Path & "\SourceDB.ini"
    End If
    Exit Function
    WriteIniStrErr:
    Err.Clear
    WriteIniStr = False
End Function
VB读取INI文件(4
2007-06-20 11:33
其实现在想想很简单~~
1、调用API
Private Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA"  (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFilename As String) As Long
Private Declare Function GetPrivateProfileInt Lib "Kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFilename As String) As Long
Private Declare Function GetProfileSection Lib "Kernel32" Alias "GetProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Private Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFilename As String) As Long
2、写2个部分的程序
Function ReadIni(Filename$, SectionName$, KeyName$) As String
    Dim RetStr As String
    RetStr = String(255, Chr(0))
    ReadIni = Left(RetStr, GetPrivateProfileString(SectionName$, ByVal KeyName$, "", RetStr,          Len(RetStr), Filename$))
End Function
Public Sub WriteIni(Filename$, SectionName$, KeyName$, Str$)
HandleIo = WritePrivateProfileString(SectionName$, KeyName$, Str$, Filename$)
End Sub
实例:我的VB课程表
Private Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFilename As String) As Long
Private Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFilename As String) As Long
Dim weekchg!
Private Sub Daychange_Click()
Call Run
End Sub
Private Sub Exit_Click()
Unload Me
End
End Sub
Private Sub Form_Load()
Dim flag!, todayIsWeek!
showTime.Caption = Now    '防止出现程序启动的第1秒没有时间显示
flag = (Date - DateValue("06, 02, 19")) \ 7 + 1    '计算第几周
weekchg = flag Mod 2          '计算单双周,余1为单周,余0为双周
showTerm.Caption = "2005年第2学期第" & flag & ""      '显示第几周
todayIsWeek = Weekday(Now)    '从系统中得到今天的星期
'显示当天的课程(自动选择单双周)-------------------
'当天为单周-------------------
If weekchg = 1 Then
  Weekchange(1).Value = True
  '当天为双周-------------
ElseIf weekchg = 0 Then
  Weekchange(0).Value = True
End If
Select Case todayIsWeek
Case 2
    Daychange.Text = "星期一"
Case 3
    Daychange.Text = "星期二"
Case 4
    Daychange.Text = "星期三"
Case 5
    Daychange.Text = "星期四"
Case 6
    Daychange.Text = "星期五"
Case 7
    MsgBox "今天是星期六没课哦,你将会看到星期一的课"
    Daychange.Text = "星期一"
Case 1
    MsgBox "今天是星期日没课哦,你将会看到星期一的课"
    Daychange.Text = "星期一"
End Select
Call Run
End Sub
Private Sub show_Click()
Call Run
End Sub
Private Sub Timer1_Timer()
showTime.Caption = Now
End Sub
Private Sub Weekchange_Click(Index As Integer)
If Index = 1 Then
    weekchg = 1    '选择单周
ElseIf Index = 0 Then
    weekchg = 0    '选择双周
End If
Call Run
End Sub
Public Sub Run()
Dim strPath$, weekstr$
strPath = App.Path & "\config.ini"
If weekchg = 1 Then
    weekstr = "单周"
ElseIf weekchg = 0 Then
    weekstr = "双周"
End If
For n = 1 To 5
    curricula(n).Text = ReadIni(strPath, weekstr & Daychange.Text, "curricula" & n)
    classroom(n).Text = ReadIni(strPath, weekstr & Daychange.Text, "classroom" & n)
    teacher(n).Text = ReadIni(strPath, weekstr & Daychange.Text, "teacher" & n)
    modality(n).Text = ReadIni(strPath, weekstr & Daychange.Text, "modality" & n)
Next n
End Sub
Function ReadIni(Filename$, SectionName$, KeyName$) As String
Dim RetStr As String
RetStr = String(255, Chr(0))
ReadIni = Left(RetStr, GetPrivateProfileString(SectionName$, ByVal KeyName$, "", RetStr, Len(RetStr), Filename$))
End Function
Public Sub WriteIni(Filename$, SectionName$, KeyName$, Str$)
HandleIo = WritePrivateProfileString(SectionName$, KeyName$, Str$, Filename$)
End Sub
Private Sub write_Click()
Dim strPath$, weekstr$
strPath = App.Path & "\config.ini"
If weekchg = 1 Then
    weekstr = "单周"
ElseIf weekchg = 0 Then
    weekstr = "双周"
End If
For n = 1 To 5
    Call WriteIni(strPath, weekstr & Daychange.Text, "curricula" & n, curricula(n).Text)
    Call WriteIni(strPath, weekstr & Daychange.Text, "classroom" & n, classroom(n).Text)
    Call WriteIni(strPath, weekstr & Daychange.Text, "teacher" & n, teacher(n).Text)
    Call WriteIni(strPath, weekstr & Daychange.Text, "modality" & n, modality(n).Text)
Next n
End Sub

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。