-
我们在上一节当中写了一个选择路径的功能, 所以我们希望这个路径在每一次打开的时候都会重新显示出上次选择的, 这就需要借用到外部文件来储存了, 要把这个内容写在硬盘上, 这种文件一般就是所谓的后缀为
.ini
文件了. -
这种ini文件里面, 是分成了若干个部分,第一个部分就是
section
,也就是小节
,在文件内部是[XXX]
这种形式出现,然后就是key
部分,也就是关键字,然后后面再接上等于号和具体值
我们看到上图中, 是一个我自己新建的Cine.ini
的这么一个文件,这里面第一行的userfomr1就是小节名称, 而path就是关键字,后面的部分就是储存的值.
先上图
- 先在工程窗口内在自己的文档之下新建一个模块取名为system,右侧红框中是添加的代码
'read
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
'write
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As Long
Function Read(ByVal lpAppName As String, ByVal lpKeyName As String) As String
Dim Rec As String: Rec = String(255, 0)
Dim nc As Long
nc = GetPrivateProfileString(lpAppName, lpKeyName, "", Rec, 255, Replace(CorelDRAW.Path, "Draw\", "Config\Cine.ini"))
Read = Rec
End Function
Sub WriteProfile(ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpString As String)
WritePrivateProfileString lpAppName, lpKeyName, lpString, Replace(CorelDRAW.Path, "Draw\", "Config\Cine.ini")
End Sub
- 然后再把弹窗的部分代码稍作修改, 进入到userform1的代码界面
- 然后把右侧红框的代码作一下小小的修改
Private Sub CommandButton7_xuanZeLuJin_Click()
UserForm1.TextBox5.Value = CorelDRAW.CorelScriptTools.GetFolder("D:\")
system.WriteProfile "userform1", "path", UserForm1.TextBox5.Value
End Sub
Private Sub UserForm_Initialize()
Me.ComboBox1.AddItem ("300")
Me.ComboBox1.AddItem ("400")
Me.ComboBox1.AddItem ("500")
Me.ComboBox1.AddItem ("600")
Me.ComboBox1.AddItem ("100")
Me.TextBox1.Value = 3
Me.TextBox2.Value = 2
Me.TextBox5.Value = system.Read("userform1", "path")
Me.TextBox6_wenJianMing.Value = "新建文件名"
End Sub
上面就只把有修改的功能展示了一下
- 演示
可以看到我们的路径保存已经弄好啦
代码浅析
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
我们先看到这一行,Private 是私有的意思,就是这个功能只能在system里面的功能才能调外,外部的代码是无法访问的Declare
是声明的意思,这个功能是用来修饰后面的Function,后面接Lib
是一个可选的固定用法,lib是静态库的意思,(静态库是相对于动态库DLL来说的).然后它这里lib后面就接上库的具体名称kernel32
,这个kernel32是windows系统里面的内核库Alias
是指示这个库内的某个功能函数,后面接函数名称GetPrivateProfileStringA
就是这个具体的函数,这是一个读取ini的功能
我们可以在微软的帮助手册中查看到它是一个Window API,稍微了解一下,第一个参数就是小节名称,第二个是关键字,第四个是用来储存字符串的位置,第五个nSize就是字节长度,表示在这个关键字内部取出多少个字符的意思,而lpFileName就是这个ini文件的路径了- 后面的括号就是所需要的参数了,这里说一下
ByVal
, 与这个ByVal 相对应的就是ByRef
, 这种是用来修饰后面这个变量的,如果没有写明是ByVal 还是ByRef一般来说VB是默认的ByRef, 是什么意思呢? ByRef就是表示后面这个参数量是它亲自参与到功能内部去做事情, 它是会被影响的,增加了或者减少了都会改变这个量, 而ByVal
与之刚好相反, 它表示后面的参数量会被系统派出一个一样的代表去参与功能内部去做事情,不管他是增加了还是减少了与参数量无关,并不会改变原本参数量的值, 所以一般来说我们能用ByVal 的时候都尽量用上ByVal , 这样子程序一般就不会出现什么错误 , 用比较来说,ByRef就相当于C++里面的&符号 , 传进去的就是参数本身. - 另一个
WritePrivateProfileString
就是写入功能了,大概也就是这个意思,写功能就要多了一个具体参数. 这里多了一个lpString
这个值就是待写入的字符串了 - 这里重点说一下第一次现了的
Function Read
,我们这一次这个功能函数没有用sub,这里用的是Function,这是因为Function是最后是需要反回一个值的,所以在参数的括号后面还用了As String
来修饰这个read,就是告诉程序这个read功能返回的值是一个字符串. Dim Rec As String: Rec = String(255, 0)
设置一个叫Rec的且长度为255的字符串GetPrivateProfileString(lpAppName, lpKeyName, "", Rec, 255, Replace(CorelDRAW.Path, "Draw\", "Config\Cine.ini"))
这个GetPrivateProfileString就是我们上面写好的功能, 有返回值所以使用参数的时候使用了括号,这个返回值有点用,他会告诉我们在读取的时候如果发生了错误会返回一些不同的值,当然我们知道就好了,这里不细说,想了解的可以去查看微软帮助手册, 前面几个都是正常的参数调用, 这里主要说一下Replace(CorelDRAW.Path, "Draw\", "Config\Cine.ini")
这个是一个字符串替换的功能,在这里直接这样使用是可以的,因为我们带了括号,所以程序会把这个值求出来,我这里只是想在coreldraw的专门用来放置ini文件的这个Config内部新建一个ini文件而已,所以这里先从程序内部调出了文件在系统盘内的路径,然后把这个路径最后面的"Draw\替换成了Config\当然大家想放在任何地方都可以,但我们的程序往往要使用在不同的机器上面,每个程序安装的路径都不同,所以要尽可能的用这种方式
- 后面的写入我就还是用的
Sub WriteProfile
,这个写入我们就不需要反回值了,虽然他有返回值但我们不需要用,所以就用个sub,调用的时候也可以省去括号 - 后面的
system.WriteProfile "userform1", "path", UserForm1.TextBox5.Value
这一句是在路径弹窗的后面执行, 这个时候 的UserForm1.TextBox5.Value
内部已经是我们选择好的路径,所以就直接调用system.WriteProfile
这个功能就好了,然后我们就可以在Cine.ini的内部看到一个小节被新建好了叫[userform1]
,然后关键字path
,后面就是路径
- 然后我们只要在这个窗口初始化函数内部把值改成从ini内部去读取就好了
Me.TextBox5.Value = system.Read("userform1", "path")
附带说一下,想查看微软帮助手册可以先下载一个VS的社区版,再在里面把帮助下载下来就可以了,或者直接去微软官方网站上也可以查看到