我在程序里使用到界面,参数等配置,希望有ini文件保存这些,
请问 如何建立ini文件?
用语句怎么管理它?

解决方案 »

  1.   

    Public 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
    Public 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
    Public Declare Function WritePrivateProfileString Lib "kernel32" _
           Alias "WritePrivateProfileStringA" (ByVal lpApplicationName _
           As String, ByVal lpKeyName As Any, ByVal lpString As Any, _
           ByVal lpFileName As String) As LongFunction GetIniS(ByVal SectionName As String, ByVal KeyWord As String, _
    ByVal DefString As String) As String
    Dim ResultString As String * 144, Temp As Integer
    Dim s As String, i As Integer
    Temp% = GetprivateprofileString(SectionName, KeyWord, "", ResultString, 144, App.Path & "\File.ini")
    '检索关键词的值
    If Temp% > 0 Then '关键词的值不为空
      s = ""
      For i = 1 To 144
       If Asc(Mid$(ResultString, i, 1)) = 0 Then
         Exit For
       Else
         s = s & Mid$(ResultString, i, 1)
       End If
      Next i
     Else
      Temp% = WritePrivateProfileString(SectionName, KeyWord, DefString, App.Path & "\File.ini")
     '将缺省值写入INI文件
      s = DefString
    End If
    GetIniS = s
    End Function
    Function GetIniN(ByVal SectionName As String, ByVal KeyWord _
    As String, ByVal DefValue As Integer) As Integer
     Dim d As Long, s As String
     d = DefValue
     GetIniN = GetPrivateProfileInt(SectionName, KeyWord, DefValue, App.Path & "\File.ini")
     If d <> DefValue Then
       s = "" & d
       d = WritePrivateProfileString(SectionName, KeyWord, s, App.Path & "\File.ini")
       
     End If
    End Function
    Sub SetIniS(ByVal SectionName As String, ByVal KeyWord As String, ByVal ValStr As String)
      Dim res%
      res% = WritePrivateProfileString(SectionName, KeyWord, ValStr, App.Path & "\file.ini")
    End Sub
    Sub SetIniN(ByVal SectionName As String, ByVal KeyWord As String, ByVal ValInt As Integer)
     Dim res%, s$
     s$ = Str$(ValInt)
     res% = WritePrivateProfileString(SectionName, KeyWord, s$, App.Path & "\File.ini")
    End Sub
      

  2.   

    上述三个 API 函数在 VB 中的申明和说明如下:  Private Declare Function GetPrivateProfileInt Lib "kernel32" _
    Alias "GetPrivateProfileIntA" ( _       ' 返回所读取的长整型值
        ByVal lpApplicationName As String, _    ' 要读取的段 (Section) 名称
        ByVal lpKeyName As String, _            ' 要读取的的键 (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 文件名
     
    从上面的注释中,我们可以知道,每次调三个 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 如果成功则返回取得的值,如果不成功则返回给定的默认值。这样就会出现一种情况:如果我给的默认值是 0,GetPrivateProfileInt 函数取得的值也是 0,那么它是成功还是失败呢?同样,如果我给的默认值是 1,GetPrivateProfileInt 函数取得的值也是 1,那就是成功还是失败呢?既然一次取值无法判断,那就多取一次,第一次设定默认值为 0,第二次设定默认值为 1,INI 文件的中值不会跟着我的默认值变吧?!虽然这样麻烦一些,但毕竟把问题解决了。  自此,我们终于把一个 CIniFile 写完了——现在读写 INI 文件再也不需要像写 CIniFile 一样考虑许多东西了,CIniFile 已经帮我们做了。
      

  3.   

    使用ini文件连接数据库
    方法:首先再模块里面写入:
    1,’在d盘根目录新建 aaa.ini文件‘仿真程序
    ‘模块中
    Option Explicit‘-------------------------
    ‘声明
    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
    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‘获得设置
    Public Function MyGetSetting(Section As String, KeyName As String, DefaultValue As String) As String    Dim X As Long
        Dim Holder As String * 255    X = GetPrivateProfileString(Section, KeyName, DefaultValue, Holder, 254, “d:\aaa.ini”)
        MyGetSetting = Left$(Holder, InStr(Holder, Chr$(0)) – 1)End Function‘保存设置Public Sub MySetSetting(Section As String, KeyName As String, KeyValue As String)    Dim X As Long    X = WritePrivateProfileString(Section, KeyName, KeyValue, “d:\aaa.ini”)End Sub
    2,Form接口上:Private Sub Form_Load()    Dim strServer As String
        Dim strUID As String
        Dim strPWD As String
        Dim strDBName As String
        Dim strConString As String
        
        strServer = MyGetSetting(“服务器名”, “服务器名”, “”)
        strUID = MyGetSetting(“用户名”, “用户名”, “”)
        strPWD = MyGetSetting(“密码”, “密码”, “”)
        strDBName = MyGetSetting(“数据库名”, “数据库名”, “”)   
        strConString = “Driver={SQL Server};Network Library=TCP/IP Sockets;SERVER=” & strServer & “;UID=” & strUID & “;PWD=” & strPWD & “;DATABASE=” & strDBName & “”
       
        conn.myconn.CommandTimeout = 30
        conn.myconn.Open strConString  
    End Sub调用MyGetSetting函数,在From_load从ini文件里面读出信息,然后把服务器名,用户名,密码,数据库名串到字符串里面,然后打开3,执行SQL语句:
    Private Sub Command1_Click()
       Dim rs As ADODB.Recordset
       Dim sql As String
       sql = “select * from student”
       Set rs = conn.myconn.Execute(sql)
       If rs.RecordCount > 0 Then
          Set TDBGrid2.DataSource = rs
       End If
    End Sub4,验证代码:
    写入ini 檔
    Private Sub Command3_Click()
      ‘保存变量
        MySetSetting “服务器名”, “服务器名”, “mis25”
        MySetSetting “用户名”, “用户名”, “”
        MySetSetting “密码”, “密码”, “”
        MySetSetting “数据库名”, “数据库名”, “hh”
        MsgBox “保存成功”End Sub
    5,读出ini档里面的内容
    Private Sub Command4_Click()
      ‘取出变量
        MsgBox MyGetSetting(“服务器名”, “服务器名”, “”)
        MsgBox MyGetSetting(“用户名”, “用户名”, “”)
        MsgBox MyGetSetting(“密码”, “密码”, “”)
        MsgBox MyGetSetting(“数据库名”, “数据库名”, “”)
      
    End Sub6,如果想保存在当前路径下:则把上面的代码改为:
    ‘获得设置
    Public Function MyGetSetting(Section As String, KeyName As String, DefaultValue As String) As String    Dim X As Long
        Dim Holder As String * 255  ‘  X = GetPrivateProfileString(Section, KeyName, DefaultValue, Holder, 254, “d:\aaa.ini”)
       X = GetPrivateProfileString(Section, KeyName, DefaultValue, Holder, 254, App.Path & “\aaa.ini”)
      
        MyGetSetting = Left$(Holder, InStr(Holder, Chr$(0)) – 1)End Function同样读出当前路径下的内容时,也把上面的代码改为‘保存设置Public Sub MySetSetting(Section As String, KeyName As String, KeyValue As String)    Dim X As Long  ‘  X = WritePrivateProfileString(Section, KeyName, KeyValue, “d:\aaa.ini”)
       X = WritePrivateProfileString(Section, KeyName, KeyValue, App.Path & “\aaa.ini”)
    End Sub1, 在SQLServer数据库里面设置访问数据库的用户名和密码:
    打开sqlserver------选择数据库下的User ----右键----New Database User---new
    输入用户名和密码(2次)
    2, 写ini檔,在ini文件里面纪录用户名和密码:
    3, 用户使用时候只要copy 和 ini档文件就Ok,因为,程序里面设置读的是当前路径下的ini文文件