简介面向 Visual Basic 6.0 初学者的系统学习与开发参考包涵盖入门教程、控件属性说明、函数速查、MSDN 帮助文档和配套示例并附 Visual C 6.0 从入门到提高的完整文档适合从零学习 VB 编程或需要查阅控件与 API 说明的开发者。压缩包共 3583 个文件约 327.4MB包含 frm、vbp、bas 等 VB 工程源文件chm、hlp、htm 帮助与教程页ocx、dll 运行组件以及 ico、bmp、gif 界面素材此外还有大量 exe、avi、mp2 等演示与多媒体文件且目录按模块组织便于初学者按阶段使用可按需检索。目前已有 8222 人学习下载。借助其中 Visual Basic 从入门到精通、控件属性大全、语言参考函数速查等资料读者既能系统补足 VB6 基础也能在实际编码时快速查询函数与属性整体覆盖从语法学习、界面设计到组件运行的完整链路资料密度较高适合初、中级学习者长期参考。1. 为什么 2025 年还有人在学 Visual Basic 6.0你可能觉得 Visual Basic 6.0 是上个世纪的古董但现实是大量企业的核心业务系统仍然跑在 VB6 写的程序上。某公司老旧的订单管理系统、某高校的教务系统、甚至某些工业设备的上位机控制界面都是 VB6 的作品。这些系统不会因为语言“过时”就自动消失它们还在每天产生数据、支撑业务。于是出现了一个奇特的现象新手在论坛里问怎么入门老手在四处找当年的代码片段来维护旧系统。这篇教程要解决的不是“VB6 是不是最好的语言”这种争论而是“怎么用最短的时间把 VB6 的基础吃透并且能写出能跑的示例程序”。我会跳过那些教科书式的概念铺垫直接讲清楚 VB6 的开发环境怎么搭、语法核心怎么用、常见坑怎么躲。适合三种人接手旧项目维护的开发者、需要快速写内部小工具的从业者、还在用 VB6 做课程设计的在校生。读完你应该能独立写完一个带界面、能处理数据、能打包分发的小程序。2. 搭建 VB6 开发环境兼容性设置与 IDE 使用要点2.1 在 Win10/Win11 上安装 VB6 的兼容性方案VB6 是 1998 年发布的产品官方支持最高到 Windows 7。但这不代表它在 Windows 10 和 Windows 11 上完全不能用。很多开发者遇到安装失败、IDE 异常崩溃、控件无法注册的问题根源往往不是 VB6 本身坏了而是安装方式不对。我一般在 Windows 10/11 上安装 VB6 的流程是这样的先确认系统是 64 位还是 32 位。如果是 64 位系统安装文件会自动放到C:\Program Files (x86)\Microsoft Visual Studio\VB98这个路径下这没问题。关键步骤是安装完成后要到安装目录下找到 VB6.exe右键选择“属性”在“兼容性”选项卡里勾选“以兼容模式运行这个程序”下拉选择 Windows 7同时勾选“以管理员身份运行此程序”。# 安装前的准备工作以 Windows 10 为例 1. 关闭 UAC用户账户控制到最低级别 2. 以管理员身份运行安装光盘或安装包里的 SETUP.EXE 3. 安装过程中遇到提示启动修复时选择跳过 4. 安装完成后不要立即打开 VB6先重启一次系统这个步骤里有两个细节关闭 UAC 是为了避免安装过程中的权限弹窗导致回滚重启是为了让注册表写入彻底生效。如果不做这两步很可能会遇到安装到一半提示错误、或者安装完成后打开 VB6 直接报“找不到 DLL”的情况。此外如果你是在 Windows 11 上安装还建议把安装程序的兼容模式也设为 Windows 7我遇到过不设置的话安装界面会显示不全的问题。安装完成后打开 VB6 时会看到一个“新建工程”对话框默认选择“标准 EXE”即可。这里有个小提示如果每次打开都出现这个对话框可以在“工具”菜单下的“选项”中找到“环境”标签页把“启动时显示”改为“创建新工程”这样可以直接跳过对话框。2.2 IDE 布局与三窗口协作工程资源管理器、属性窗口、代码窗口VB6 的 IDE 和现代开发工具完全不同它由多个可浮动的子窗口组成。新手最容易困惑的是窗口太多不知道看哪个。我的建议是只关注三个核心窗口工程资源管理器显示所有窗体、模块、类模块、属性窗口显示当前选中控件的属性、代码窗口写事件过程和函数。 第一次打开 VB6 后建议先做一件事调整窗口布局 操作路径视图菜单 - 工程资源管理器 / 属性窗口 / 工具箱 把这三个窗口固定到 IDE 的右侧和左侧形成固定布局 Private Sub Form_Load() Form_Load 是窗体加载时触发的事件过程 在此处写初始化代码比如设置标题、填充下拉框等 Me.Caption 我的第一个 VB6 程序 End Sub这个三段式的分工逻辑是工程资源管理器管文件结构属性窗口管设计期属性代码窗口管运行期逻辑。分工清晰后写代码时其实大多数时间只在代码窗口和属性窗口之间切换。还有一点值得注意工具箱里默认显示的控件并不是全部。需要通过“工程”菜单里的“部件”对话框勾选额外的控件库比如 Microsoft Windows Common Controls 6.0才能使用 ListView、TreeView、Toolbar 这些高级控件。我见过不少初学者卡在“找不到某个控件”上。原因通常就两个要么部件没导入要么控件放在了工具箱的某个标签页里没看到。需要记住的是VB6 的很多高级功能不是开箱即用的要通过“部件”来手动加载这也是新手排查控件缺失问题的第一站。2.3 用“立即窗口”和“本地窗口”做最简单的调试VB6 的调试工具虽然原始但非常有效。立即窗口Immediate Window可以理解为控制台你可以在里面直接输入语句执行也可以让代码运行时用 Debug.Print 往这里输出信息。本地窗口Locals Window则能实时查看当前过程中的所有变量值。这两个窗口组合起来是排查逻辑错误的利器。Private Sub Command1_Click() Dim i As Integer Dim total As Integer total 0 For i 1 To 10 total total i Debug.Print i i , total total 在立即窗口输出中间结果 Next i MsgBox 总和 total End SubDebug.Print 是学习过程中最适合用来观察程序执行过程的工具。点击命令按钮后去打开立即窗口可以看到每一步的累计值。如果结果不对比如 total 没有按预期累加就能定位到是循环条件写错了还是变量类型不对导致溢出。注意这里第 10 行中 total 声明为 IntegerVB6 中 Integer 的范围是 -32768 到 32767如果累加超过这个范围程序会报溢出错误。把 Integer 改成 Long 就能解决。这种数据类型问题在 VB6 里非常常见几乎属于必踩的坑。本地窗口的使用方式更简单在代码中设置断点点击代码行左侧灰色区域出现红色圆点程序运行到断点处会暂停这时打开本地窗口就能看到所有变量的当前值。这个习惯值得一直保持下去哪怕到了后面做较大的项目。3. VB6 语法核心从变量、分支到循环的示例代码3.1 数据类型与变量声明的正确方式VB6 的数据类型比现代语言少得多但正因为少选错的代价更直接。最常用的是 Integer整型、Long长整型、String字符串、Boolean布尔、Single单精度浮点、Double双精度浮点、Currency货币型、Date日期型、Variant变体型。Dim strName As String Dim intAge As Integer Dim lngCount As Long Dim blnFlag As Boolean Dim dblPrice As Double Dim dtCreateTime As Date Dim varAnything As Variant 实际使用示例 strName 张三 intAge 25 lngCount 100000 blnFlag True dblPrice 99.9 dtCreateTime Now varAnything 可以是任意类型这里要特别强调声明习惯随手写变量而不声明类型是 VB6 开发中最常见的不良习惯。VB6 默认允许隐式声明也就是说你直接写myVar 1而不声明 Dim程序也能跑但 myVar 会被当成 Variant 类型占用更多内存且类型转换有开销。更危险的是如果变量名拼写错误VB6 不会报错而是悄悄创建一个新变量bug 极难追踪。解决方案是在每个模块的顶部加上Option Explicit它会强制要求所有变量必须先声明再使用。在“工具”菜单的“选项”对话框“编辑器”标签页里勾选“要求变量声明”新模块会自动加上这句话这个方法建议养成习惯并坚持使用。关于 Variant 类型我个人的建议是除非确实需要接收未知类型的数据否则尽量避免使用。它在运行时才确定类型带来便利的同时也带来不确定性尤其在做数值运算时容易出现类型不匹配的运行时错误。3.2 If 分支与 Select Case 条件选择分支结构是程序做决策的基础。VB6 的 If 语句和现代语言差别不大但有几个特有的书写习惯需要注意。多行 If 语句以 End If 结尾这是新手最容易丢的部分。Dim score As Integer score 85 方式一单行 If 语句适合简单判断 If score 60 Then MsgBox 及格 方式二多行 If 语句适合复杂逻辑 If score 90 Then MsgBox 优秀 ElseIf score 60 Then MsgBox 及格 Else MsgBox 不及格 End If 方式三Select Case 语句适合多条件分支 Select Case score Case 90 To 100 MsgBox 优秀 Case 60 To 89 MsgBox 及格 Case Else MsgBox 不及格 End SelectSelect Case 的可读性在条件较多时明显优于多层 ElseIf。注意 Case 语句的写法Case 90 To 100表示闭区间Case Is 100用于比较运算多个值用逗号分隔比如Case 60, 70, 80。如果你发现条件写在 Case 表达式后不生效通常是大小写没匹配或者类型不一致比如拿字符串去和数值比较。VB6 比较时如果不做转换常常得不到预期结果处理方法是先用 Val() 或 CInt() 做类型转换后再比较。3.3 For 循环与 Do Loop 循环的适用场景VB6 主要的循环结构有 For...Next、Do While...Loop、Do Until...Loop。For 循环适合知道循环次数的情况Do 循环适合以条件为终止标志的轮询场景。Dim i As Integer 示例 1计算 1 到 100 的累加和 Dim sum As Long sum 0 For i 1 To 100 sum sum i Next i 示例 2从 10 倒数到 1 For i 10 To 1 Step -1 Debug.Print i Next i 示例 3Do While 循环读取文件行模拟 Dim strLine As String Dim fileNum As Integer fileNum FreeFile Open C:\data.txt For Input As #fileNum Do While Not EOF(fileNum) Line Input #fileNum, strLine Debug.Print strLine Loop Close #fileNumFor 循环的 Step 参数很关键正数递增、负数递减。如果忘记写 Step默认步长为 1。Do While...Loop 是“当条件为真时执行”Do Until...Loop 是“执行直到条件为真”。一个容易混淆的细节是判断条件的位置Do While...Loop先判断后执行可能一次都不执行Do...Loop While先执行后判断至少执行一次。在文件读取这种场景中常用Do While Not EOF(fileNum)来确保读到文件末尾为止。使用 Open 语句操作文件时记得在处理完后使用 Close 释放文件句柄不释放的话后续再打开同一文件会报“文件已打开”的错误。旧系统中最常见的资源泄露问题十有八九就是文件没关闭或数据库连接没释放。4. 用 VB6 做一个完整的示例登录窗口与数据录入窗体4.1 界面设计工具箱控件摆放与属性设置构造界面时常用的控件有 Label标签、TextBox文本框、CommandButton命令按钮、ComboBox下拉框、ListBox列表框、CheckBox复选框、OptionButton单选按钮、DataGrid数据表格。下面做一个用户登录加数据录入的最小示例。 窗体上的控件布局规划 窗体名称frmLogin 属性设置 Caption 系统登录 BorderStyle 1 - Fixed Single固定边框不允许调整大小 StartUpPosition 1 - CenterOwner屏幕居中 Label1 的 Caption 设为 用户名 Label2 的 Caption 设为 密码 Text1 的 Text 设为空字符串Name 改为 txtUser Text2 的 Text 设为空字符串PasswordChar 设为 *Name 改为 txtPassword Command1 的 Caption 设为 登录Name 改为 cmdLogin Command2 的 Caption 设为 取消Name 改为 cmdCancel属性窗口是这个阶段使用频率最高的面板。有几个属性它的用途很容易被忽视。PasswordChar 决定文本框输入时显示什么字符设为*就是密码框。如果设了 PasswordChar 又希望允许用户看到真实内容可以在代码中动态修改这个属性。还有一个属性叫 MaxLength限制文本框中输入的字符个数用户名一般限制为 20 个字符。设计界面时建议在 Form_Load 中做一些初始化而不是在属性窗口把所有事情都静态配好好处是便于维护和动态调整。Private Sub Form_Load() 初始化登录窗体 Me.Caption 系统登录 txtUser.Text 清空用户名 txtPassword.Text 清空密码 txtUser.SetFocus 焦点定位到用户名输入框 End Sub这里 SetFocus 的作用是让程序启动后光标自动停在用户名文本框里省去用户点击这一步。注意 SetFocus 不能用在未显示的窗体上否则会报错。如果希望焦点默认落在密码框或其他控件改这一行即可。4.2 登录按钮的校验逻辑非空判断、长度判断与错误处理登录按钮的核心逻辑通常是从文本框取值检查是否为空再和预设值比较按照结果给出响应。这里可以用常量或者简单的条件判断来演示但实际项目中数据一般来自数据库逻辑结构是一样的。Private Sub cmdLogin_Click() 1. 判断用户名为空 If Trim(txtUser.Text) Then MsgBox 请输入用户名, vbExclamation, 提示 txtUser.SetFocus Exit Sub End If 2. 判断密码为空 If Trim(txtPassword.Text) Then MsgBox 请输入密码, vbExclamation, 提示 txtPassword.SetFocus Exit Sub End If 3. 判断用户名长度是否超过限制 If Len(txtUser.Text) 20 Then MsgBox 用户名长度不能超过20个字符, vbCritical, 错误 Exit Sub End If 4. 模拟验证用户身份 Dim strUser As String Dim strPwd As String strUser admin strPwd 123456 If txtUser.Text strUser And txtPassword.Text strPwd Then MsgBox 登录成功, vbInformation, 成功 这里可以添加跳转到主窗体的代码 Else MsgBox 用户名或密码错误, vbCritical, 失败 End If End Sub这个示例里用了 Trim() 函数去除首尾空格避免用户误输入空格导致判断失败。vbExclamation、vbCritical 是 VB6 内置的消息框图标常量分别对应黄色感叹号和红色叉号。还有一个细节String 比较在 VB6 中默认是区分大小写的所以“Admin”和“admin”会被视为不同值。如果期望不区分大小写可以用StrComp(txtUser.Text, strUser, vbTextCompare)来做比较。4.3 数据录入窗体的增查改删与数据验证数据录入是 VB6 最常见的企业应用场景。下面用内存数组模拟一个简化版的学生成绩管理展示如何处理记录的增、查、改、删同时体现数据验证的写法。 模块级变量保存学生信息用二维数组模拟数据表 Dim arrStudents(100, 3) As String Dim intStudentCount As Integer Private Sub cmdAdd_Click() 添加学生记录 Dim strName As String Dim strScore As String strName Trim(txtName.Text) strScore Trim(txtScore.Text) 数据验证学号不能为空 If strName Then MsgBox 姓名不能为空, vbExclamation, 提示 Exit Sub End If 数据验证成绩必须是数字 If Not IsNumeric(strScore) Then MsgBox 成绩必须是数字, vbExclamation, 提示 Exit Sub End If 数据验证成绩范围检查 If Val(strScore) 0 Or Val(strScore) 100 Then MsgBox 成绩必须在0-100之间, vbExclamation, 提示 Exit Sub End If intStudentCount intStudentCount 1 arrStudents(intStudentCount, 0) strName arrStudents(intStudentCount, 1) strScore 刷新列表显示 Call RefreshList End Sub Private Sub RefreshList() 清空并重新填充列表控件 Dim i As Integer List1.Clear For i 1 To intStudentCount List1.AddItem arrStudents(i, 0) - arrStudents(i, 1) Next i End SubIsNumeric() 函数是 VB6 中判断字符串是否为数字的有效手段它的判断范围比想象中宽比如“1.5”、“-2”都会返回 True。如果业务上对格式更敏感比如只允许两位小数还需要进一步处理可以使用 Like 表达式配合模式匹配来补充验证。这里的数组只是演示真实项目中数据往往来自数据库或者文本文件但验证和刷新的结构没有本质区别。在写数据录入程序时请记得每个功能按钮的代码不要写得过于冗余。不同按钮的公共代码可以提取到独立的 Sub 或 Function 中上面的 RefreshList 就是这种思路。这样能助你在后续需求变更时少改几处重复代码。5. VB6 挖坑记兼容性、控件与工程文件的三类常见问题5.1 在 Win10 上打开 VB6 就闪退或 IDE 崩溃现象安装完成后双击 VB6.exeIDE 还没完全加载就自动关闭没有任何错误提示。原因VB6 的 IDE 与 Windows 10/11 的某些显示驱动或系统主题存在兼容问题尤其是系统开启了高 DPI 缩放时IDE 的渲染容易直接出错。解决右击 VB6.exe在兼容性选项卡中选择“替代高 DPI 缩放行为”将缩放执行设为“系统”。另外在兼容模式中选择 Windows 7 也可以避免多数闪退问题。如果仍然崩溃可以尝试在“属性”中的“颜色”选项改为 16 位色这个对策虽然听着古老但确实有效。我遇到过一台笔记本上 IDE 频繁闪退改成 16 位色后问题就消失了原因和显卡驱动渲染模式有关。这类问题看起来是玄学实际是多版本图形接口冲突。5.2 使用 MSFlexGrid 或 ListView 时提示“类未注册”现象工程中引入了 MSFlexGrid 控件运行时报“类未注册”或“ActiveX 部件无法创建对象”。原因安装 VB6 时未完整注册所有 ActiveX 控件或者系统替换了相关 DLL。MSFlexGrid 对应的文件是 MSFLXGRD.OCXListView 对应 MSCOMCTL.OCX这两个文件如果缺失或版本冲突就会报错。解决以管理员身份打开命令提示符手动注册对应的 OCX 文件。一般这两个文件在C:\Windows\SysWOW64或C:\Windows\System32目录下。注册命令为regsvr32 msflxgrd.ocx和regsvr32 mscomctl.ocx。如果提示文件找不到先从另一台正常安装过 VB6 的电脑上拷贝对应文件再执行注册。注意 64 位系统上 32 位 OCX 文件要存放在 SysWOW64 目录下这是新手容易踩的坑文件放到了 System32regsvr32 也提示成功但程序还是报错因为 64 位进程无法加载 32 位控件。5.3 窗体文件.frm损坏或打开乱码现象用记事本或其它文本编辑器打开 .frm 文件后看到中文注释变成了乱码或者从旧系统拷贝的 .frm 文件在打开时提示格式无效。原因VB6 的窗体文件默认保存为 ANSI 编码。从较老的操作系统拷贝过来时如果经过了某些工具转换或传输过程编码可能被破坏。另外直接双击 .frm 文件如果弹出的不是 VB6也可能是系统关联出了问题。解决用 VB6 的“添加窗体”功能从“文件类型”下拉框中选择“所有文件”找到目标 .frm 文件后VB6 会尝试重新解释其内容。如果窗体文件有乱码很多情况下只是因为显示字体不支持与编码关系不大——这时可以打开“工具”菜单中的“选项”在“编辑器格式”中更换字体比如改为中文仿真字体。如果实在无法打开可以查看 .frm 文件文本内容手工重建窗体。这种做法虽然繁琐但能保住代码逻辑。注意备份原始文件重建过程中最容易发生逻辑丢失。6. 进阶玩法用 API 调用与自定义控件让 VB6 程序不显老6.1 通过 Windows API 调用系统功能替代过时的内置能力VB6 自带的功能在当年已经很丰富但在今天看来很多系统级操作仍然需要直接调用 Windows API。这部分能明显提升程序的“现代感”。常用的 API 有GetSystemMetrics用来获取屏幕分辨率SetWindowPos用来置顶窗口PlaySound用来播放声音。下面展示一个用 API 实现窗口置顶的例子。 声明 Windows API 函数 Private Declare Function SetWindowPos Lib user32 (ByVal hwnd As Long, ByVal hwndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 常量定义 Private Const HWND_TOPMOST -1 Private Const HWND_NOTOPMOST -2 Private Const SWP_NOMOVE H2 Private Const SWP_NOSIZE H1 将当前窗体置顶 Private Sub Form_Load() SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE End SubAPI 调用的核心是正确匹配参数类型。hwnd是窗体的句柄在 VB6 中直接用Me.hwnd获取。hwndInsertAfter传 -1 表示将窗口置顶传 -2 表示取消置顶。SWP_NOMOVE和SWP_NOSIZE是标志位表示不改变窗口位置和尺寸如果省略这两个标志后面的 X、Y、cx、cy 参数会被实际用于重设窗口状态所以它们的值不能随意写。使用 Or 连接多个标志位是按位或运算的通用写法这一点与大多数 Windows 编程语言一致。6.2 用 Timer 控件实现后台轮询和定时任务Timer 控件是 VB6 中经常被低估的一个功能。它不需要任何额外依赖就可以做到定时执行代码。常见场景包括定期检查某个状态、定时保存数据、倒计时显示。Private Sub Form_Load() 设置定时器属性 Timer1.Interval 1000 每 1000 毫秒1 秒触发一次 Timer1.Enabled True 启用定时器 End Sub Private Sub Timer1_Timer() 每秒更新一次状态栏显示时间 StatusBar1.Panels(1).Text 当前时间 Format(Now, yyyy-mm-dd hh:mm:ss) End SubInterval 的最小有效值是 1 毫秒但不建议设得太小如果执行的代码稍微复杂就会造成界面卡顿。情况允许时轮询的需求也可以用 Timer 实现但它不是真正的多线程所以不要在 Timer 事件里执行耗时的循环或数据库操作否则界面会“假死”。一个更合理的方案是用 Timer 触发一个标志位然后在空闲事件或者独立线程里做耗时处理。不过对多数旧系统维护场景来说把握好“Timer 事件里只做轻量操作”这个原则就够了。6.3 自定义一个简单的类模块让代码具备面向对象雏形VB6 的类模块是很多自学者的盲区。它允许定义自定义的数据结构和操作构建类似于“对象”的东西。用类模块封装数据访问逻辑能在中小型项目中带来明显的维护便利。 类模块名称clsStudent 定义学生类的属性 Private m_strName As String Private m_intScore As Integer 属性赋值 Public Property Let Name(ByVal strValue As String) m_strName strValue End Property 属性读取 Public Property Get Name() As String Name m_strName End Property Public Property Let Score(ByVal intValue As Integer) If intValue 0 And intValue 100 Then m_intScore intValue Else m_intScore 0 非法数据设为 0 End If End Property Public Property Get Score() As Integer Score m_intScore End Property 对象方法 Public Function GetGrade() As String Select Case m_intScore Case 90 To 100 GetGrade 优秀 Case 60 To 89 GetGrade 良好 Case Else GetGrade 不及格 End Select End Function在窗体模块中这样使用这个类Dim objStudent As clsStudent Set objStudent New clsStudent objStudent.Name 张三 objStudent.Score 92 MsgBox objStudent.Name 的评价 objStudent.GetGrade() Set objStudent Nothing类模块的价值在于把数据和操作绑定在一起调用方不需要关心内部实现。上面示例中Score 属性在赋值时就自动做了范围检查这比在窗体代码中到处判断要干净得多。注意在 VB6 中对象变量必须使用 Set 赋值这在初学者中比较常见。用完对象后通常要显式将对象变量设为 Nothing及时释放引用否则可能出现资源无法释放的情况。6.4 用“打包和部署向导”生成安装包的注意事项程序写完了要把 .exe 和依赖的 OCX、DLL 一起发给别人用VB6 自带的“打包和部署向导”可以完成这个任务。要注意的坑有不少。打包时最常犯的错误是漏掉运行库文件。VB6 程序依赖的标准运行库包括 - MSVBVM60.DLLVB6 虚拟机核心 - OLEAUT32.DLLActiveX 自动化支持 - MSCOMCTL.OCX公共控件 - MSFLXGRD.OCXFlexGrid 表格控件向导生成的安装包默认会包含这些文件但如果你使用了某些第三方控件需要在向导的“文件”步骤中手动确认它们被包含。打包完成后在干净的系统上做一次安装测试看是否缺少文件、注册是否成功。一个好习惯是把测试机器做成无开发环境的虚拟机这样才能真正验证安装包的完整性避免发给客户后到处弹错误框。想想这些年接触过的 VB6 项目最让我印象深刻的不是某个复杂的算法而是一个看似不起眼的习惯对每个程序都保存一份包含版本号、修改日期、改动描述的清单文件。这个习惯让我在很多年后接手旧系统时能够快速定位当时的修改意图。写到这里也把这句话分享给你。希望你在 VB6 的学习和维护路上少踩一点坑多省一点时间。本文还有配套的精品资源点击获取