• 我们在上一节当中写了一个选择路径的功能, 所以我们希望这个路径在每一次打开的时候都会重新显示出上次选择的, 这就需要借用到外部文件来储存了, 要把这个内容写在硬盘上, 这种文件一般就是所谓的后缀为.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 LongFunction Read(ByVal lpAppName As String, ByVal lpKeyName As String) As StringDim Rec As String: Rec = String(255, 0)Dim nc As Longnc = GetPrivateProfileString(lpAppName, lpKeyName, "", Rec, 255, Replace(CorelDRAW.Path, "Draw\", "Config\Cine.ini"))Read = Rec
End FunctionSub 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 SubPrivate 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 = 3Me.TextBox2.Value = 2Me.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的社区版,再在里面把帮助下载下来就可以了,或者直接去微软官方网站上也可以查看到

CorelDRAWX4的VBA插件开发(二十三)INI初始化文件的读写和路径的保存相关推荐

  1. CorelDRAWX4的VBA插件开发(二十五)多类目选择实现复合框内容置换

    有时候我们的复合框内的内容是有更多的需求,但是我们又不想另开一个窗口,怎么办呢,我们直接使用复合框内容替换就行啦 先上效果图: 先在面第板上拉出一个框架, 再在里面添加上三个选项按钮, 添加好之后这三 ...

  2. CorelDRAWX4的VBA插件开发(二十四)复合选框组件与联合命名面板

    我们在处理文档的时候碰上的最多的问题就是与字符串相当的问题,这里再拿出来单把各种使用命名的小组件讲一下,我们先上效果图: 我们可以在上图看到最终结果,可以让一行文件名跟随各种组件进行更改,下下面我们先 ...

  3. CorelDRAWX4的VBA插件开发(二十七)使用C++制作动态连接库DLL辅助VBA构键强大功能-(1)前言和准备工作

    我们在使用VBA的时候会很多的局限性,包括调用库和递归函数,对指针结构体和类都不友好,对时间复杂度和空间复杂度都优化得不够,换言之VB就不是从性能出发的语言,所以难免力不从心 所以这里用C++为VBA ...

  4. CorelDRAWX4的VBA插件开发(四) 用一个例子了解CORELDRAW-X4的四个基本对象

    CorelDRAWX4的VBA插件开发(四) 用一个例子了解CORELDRAW-X4的四个基本对象 1.打开第一章的界面如下图: 2.把之前的代码稍作修改 Sub 第一个插件()Dim zongShu ...

  5. c语言从txt中读取二维坐标,C语言二维数组在文件中读写的问题,谢谢

    已结贴√ 问题点数:10 回复次数:4 C语言二维数组在文件中读写的问题,谢谢 这是一个用二位数组写的五子棋小游戏的代码,我的思路是通过键盘输入坐标显示棋子,当输0 0时保存棋盘并结束游戏,下一次进入 ...

  6. CorelDRAWX4的C++插件开发(四十三)VBA的错误返回机制

    我们在写程序的时候往往不知道内部出了什么问题,所以问题返回机制还是比较重要的,程序可以不正确,但是程序一出问题直接就闪退崩溃也是一大麻烦,所以这里我们先探讨一下VBA的错误返回机制 我们先上代码 Co ...

  7. CorelDRAWX4的VBA插件开发(三十四)调用C++实现一键智能群组(第3节)主调函数以及三个被调函数

    这一节就进入到了群组的实质性的内容,先把群组Qunzu()函数展示一下 先展示主调函数Qunzu(),函数里面还有四个被调函数等会儿再说 BOOL Qunzu() {//undo开 这个是一键多步撤销 ...

  8. CorelDRAWX4的VBA插件开发(三十一)使用C++制作动态连接库DLL辅助VBA构键强大功能-(5)在VBA中动态调用DLL文件

    我们先来看一下动态调用的截图 先上代码 '静态调用 Public Declare Function wodedll Lib "E:\VS-DLL\conglingkaishi\Debug\C ...

  9. CorelDRAWX4的VBA插件开发(十七)一键新建折页参考线

    在做印刷品的折页的时候,我们往往需要用到参考线来进行制作,这里就放上一组一键新建带出血的可选几折页的参考线功能 前面是为了方便大家了解程序所以共用一个按钮,到了这里,我们经常要用到面板,按钮有点不够用 ...

最新文章

  1. 互联网协议 — BGP 边界网关协议 — Overview
  2. 数据加密和OpenSSL
  3. 【嵌入式】ARM技术博客汇总
  4. MybatisPlus入门Lombok的使用
  5. 计算机二级考vb试题,2017计算机二级考试VB练习题及答案
  6. Helm 3 完整教程(一):Helm 3 简介
  7. BZOJ3653: 谈笑风生
  8. 【渝粤教育】国家开放大学2018年秋季 0053-21T移动通信技术与移动通信设备 参考试题
  9. 别再骂中年人了,对他们好点吧~
  10. PHPMailer 报错:SMTP ERROR: Password command failed: 535 Login Fail
  11. axure手机页面设计说明_产品经理原型演示——Axure制作手机登陆界面
  12. RxJava操作符(四)Combining
  13. 苹果+android+扫码支付,苹果iOS12捷径扫码付款怎么设置 微信支付宝扫码二合一支付捷径...
  14. MXT6208量产修复工具+v2.0非常好用哦!
  15. 本地无需安装数据库,实现plsql远程连接数据库
  16. 解决迅雷下载外网文件速度为0
  17. ayo开发笔记2016-5-3
  18. Effective Java读书笔记一(Java Tips.Day.1)
  19. 【C】信息管理系统/通讯录通用模板(介绍静态、动态、文件三个版本)
  20. 日常开发中的一些js处理数据的方法,包括对数据的过滤,以及对数据的验证

热门文章

  1. 一个对dispatch_group的改进:TaskHarmonizer
  2. 如何检测PC上插了多少个摄像机?并进行多摄像头同步录制?
  3. php日期和时间函数,使用PHP中的日期和时间函数
  4. java socket 通信协议_java 基于TCP协议的Socket编程和通信
  5. elementUI 表格多行上移下移、单行移动、拖拽移动(行,列)
  6. 基于Web的电子商城销售系统
  7. java io inputstream_Java IO: InputStream
  8. 惠普大中华区总裁退休感言
  9. 如何判断树莓派GPIO引脚是否损坏
  10. 如何快速部署积分商城小程序