第一部分 快速开发的基础 3
第一章 Delphi 4下的Windows编程 3
1.1 历史的回顾 3
1.1.1 Delphi 1 4
1.1.2 Delphi 2 4
1.1.3 Delphi 3 4
1.1.4 Delphi 4 4
1.2 Delphi是什么 5
1.2.1 Delphi 4产品家族 5
1.2.2 可视化开发环境 6
1.2.3 优化的32位编译器 7
1.2.4 可伸缩的数据库访问 7
1.2.5 语言和库 7
1.3 Delphi 4的IDE 8
1.3.1 主窗口 8
1.3.2 工具栏 9
1.3.3 Form设计器 10
1.3.4 Object Inspector 10
1.3.5 代码编辑器 11
1.3.6 代码浏览器 11
1.4 源代码生成器 11
1.5 创建一个简单的应用程序 14
1.6 事件机制的优势在哪里 15
1.7 无约定编程 15
1.8 加速原型化 16
1.9 可扩展的元件和环境 16
第二章 Object Pascal语言 17
2.1 注释 18
2.2 新的过程和函数功能 18
2.2.1 圆括号 18
2.2.3 默认值参数 19
2.2.2 重载 19
2.3 变量 20
2.4 常量 21
2.5 运算符 23
2.5.1 赋值运算符 23
2.5.2 比较运算符 23
2.5.3 逻辑运算符 23
2.5.4 算术运算符 24
2.5.5 按位运算符 25
2.5.6 用于加减运算的过程 25
2.6 Object Pascal类型 26
2.6.1 类型的比较 26
2.6.2 字符 27
2.6.3 字符串 28
2.6.4 可变类型(Variant) 38
2.7.1 数组 48
2.6.5 Currency 48
2.7 用户自定义类型 48
2.7.2 动态数组 49
2.7.3 记录 50
2.7.4 集合 52
2.7.5 对象 54
2.7.6 指针 55
2.7.7 类型别名 57
2.8 类型强制转换 58
2.9 字符串资源 59
2.10 测试条件 59
2.10.1 使用if语句 60
2.10.2 使用case语句 60
2.11.1 for循环 61
2.11 循环 61
2.11.2 while循环 62
2.11.3 repeat...until 63
2.11.4 Break()过程 63
2.11.5 Continue()过程 63
2.12 过程和函数 64
2.12.1 传递参数 65
2.13 作用域 69
2.14 单元 70
2.14.1 uses子句 71
2.14.2 循环引用 71
2.15 包 72
2.15.1 使用Delphi包 72
2.15.2 包的语法 72
2.16 面向对象编程 73
2.16.1 基于对象与面向对象 74
2.17 使用Delphi对象 75
2.17.1 声明和创建实例 75
2.17.2 析构 75
2.18 方法 76
2.18.1 方法的类型 77
2.18.2 特性 79
2.18.3 可见性 79
2.18.4 友类 81
2.18.5 对象的秘密 81
2.18.6 TObject——所有对象的祖先 81
2.18.7 接口 82
2.19 结构化异常处理 86
2.19.1 异常类 89
2.19.2 执行的流程 90
2.20 运行期类型信息 93
2.19.3 再次触发异常 93
第三章 WIN32 API 95
3.1 对象——过去和现在 95
3.1.1 内核对象 95
3.1.2 进程 96
3.1.3 进一步介绍内核对象 97
3.1.4 GDI和用户对象 98
3.2 多任务和多线程 99
3.3 Win32内存管理 99
3.3.1 什么是线性内存模式 100
3.3.2 Win32怎样管理内存 100
3.4 Win32的错误处理 102
第四章 应用程序框架和设计 103
4.1 掌握Delphi环境和项目的体系结构 103
4.2.1 项目文件 104
4.2 构成Delphi 4项目的文件 104
4.2.2 单元文件 105
4.2.3 Form文件 105
4.2.4 资源文件 106
4.2.5 项目选项和桌面设置文件 106
4.2.6 后备文件 106
4.2.7 包文件 107
4.3 有关项目管理的提示 107
4.3.1 一个项目一个目录 107
4.3.2 代码中被共享的单元 107
4.3.3 多项目管理(项目组) 109
4.4 Delphi 4项目的框架类 110
4.4.1 TForm 110
4.4.2 TApplication 118
4.4.3 TApplication的方法 120
4.4.4 TApplication的事件 121
4.4.5 TScreen类 122
4.5 定义公共体系结构——使用对象库 123
4.5.1 应用程序的体系结构 123
4.5.2 Delphi固有的体系结构 123
4.5.3 体系结构的例子 123
4.5.4 子Form(TChildForm) 124
4.5.5 数据库基础模式Form(TDBModeForm) 127
4.5.6 数据库导航/状态Form(TDBNavStatForm) 128
4.6 一些项目管理的功能 134
4.6.1 在项目中添加资源 134
4.6.2 改变光标形状 137
4.6.3 防止出现一个Form的多个实例 138
4.6.4 在项目文件中增加代码 138
4.6.5 重载应用程序的异常处理 139
4.6.6 显示封面 142
4.6.7 使Form尺寸最小 144
4.6.8 运行一个无Form的项目 146
4.6.9 退出Windows 146
4.6.10 不允许关闭Windows 148
4.7 Windows 95认证 148
4.7.1 什么时候需要认证 148
4.7.2 适用于所有应用程序的条件 149
4.7.3 基于文件的应用程序需要满足的条件 149
4.7.4 实用程序需要满足的条件 150
第五章 理解消息 151
5.1 什么是消息 151
5.2 消息的类型 152
5.3 Windows消息系统是怎样工作的 153
5.4 Delphi的消息系统 154
5.5 处理消息 155
5.4.1 特殊的消息记录 155
5.5.1 消息处理:不是无约定的 158
5.5.2 对Result域赋值 158
5.5.3 TApplication的OnMessage事件 159
5.6 发送您自己的消息 159
5.6.1 Perform() 160
5.6.2 SendMessage()和PostMessage() 160
5.7 非标准的消息 160
5.7.1 通知消息 161
5.7.2 VCL内部的消息 162
5.7.3 用户自定义的消息 162
5.8 一个消息系统的剖析:VCL 164
5.9 消息与事件之间的关系 172
第六章 代码标准文档 173
6.1.2 边距 174
6.1.3 begin...end 174
6.1.1 缩进 174
6.1 一般的源代码格式规则 174
6.2 OBJECT PASCAL 175
6.2.1 括号 175
6.2.2 保留字和关键字 175
6.2.3 过程和函数(例程) 175
6.2.4 变量 177
6.2.5 类型 177
6.2.6 构造类型 178
6.2.7 语句 179
6.2.8 结构化异常处理 180
6.2.9 类 181
6.3.5 单元文件 183
6.3.4 远程数据模块文件 183
6.3.3 数据模块文件 183
6.3.2 Form文件 183
6.3 文件 183
6.3.1 项目文件 183
6.3.6 文件头 185
6.4 Form与数据模块 185
6.4.1 Form 185
6.4.2 数据模块 187
6.5 包 187
6.5.1 运行期包与设计期包 187
6.5.2 文件命名标准 188
6.6 元件 188
6.6.1 自定义的元件 188
6.6.2 元件实例的命名规则 189
6.6.3 元件的前缀 189
第七章 使用ActiveX控件 195
7.2 何时使用ActiveX控件 196
7.1 什么是ActiveX控件 196
7.3 把ActiveX控件加到元件选项板上 197
7.4 Delphi元件外套 199
7.4.1 外套文件是从哪来的 211
7.4.2 枚举 212
7.4.3 接口 212
7.4.4 TOleControl的派生类 212
7.4.5 方法 212
7.4.6 特性 213
7.5 在应用程序中使用ActiveX控件 214
7.6 发布带有ActiveX控件的应用程序 215
7.6.1 注册ActiveX控件 215
7.7 BLACKJACK:一个OCX示范程序 216
7.7.1 纸牌 216
7.7.2 游戏 219
7.7.3 调用ActiveX控件的方法 230
第二部分 高级技术 235
第八章 图像编程 235
8.1 TImage:显示图像 236
8.1.1 图像:位图、图元文件、图标 236
8.1.2 显示JPEG图像 237
8.2 使用TCanvas的特性 239
8.2.1 画笔 239
8.2.2 使用TCanvas.Pixels特性 247
8.2.3 刷子 247
8.2.4 字体 253
8.2.5 CopyMode特性 254
8.2.6 其他特性 259
8.3.2 用TCanvas画几何形状 260
8.3.1 用TCanvas画线 260
8.3 TCanvas的方法 260
8.3.3 画图的示范程序 261
8.3.4 用TCanvas输出文字 266
8.4 坐标系统和映射模式 271
8.4.1 设备坐标系 272
8.4.2 逻辑坐标系 272
8.4.3 屏幕坐标系 272
8.4.4 Form坐标系 272
8.4.5 坐标映射 273
8.4.6 设置映射模式 275
8.4.7 设置窗口/视区范围 275
8.4.8 关于映射模式的示范程序 276
8.5 创建一个绘画程序 282
8.5.1 Paint程序如何工作 298
8.5.4 依附到Win32剪贴链 299
8.5.5 复制位图 299
8.5.3 从剪贴板粘贴位图数据 299
8.5.2 TPanel 299
8.5.6 Paint程序的注释 300
8.6 编写动画程序 300
8.6.1 这个动画程序如何工作 304
8.7 高级字体 308
8.7.1 Win32字体类型 308
8.7.2 基本字体元素 308
8.7.3 GDI字体分类 310
8.7.4 显示不同字体 311
8.8 实际创建一种字体 311
8.8.1 这个程序是如何工作的 311
8.8.2 显示字体的有关信息 319
第九章 动态链接库 325
9.1 究竟什么是DLL 326
9.2 静态链接与动态链接 327
9.3 为什么要使用DLL 328
9.3.1 共享代码、资源和数据 328
9.3.2 隐藏实现的细节 328
9.3.3 自定义控件 329
9.4 创建和使用DLL 329
9.4.1 数数有几个美分(一个简单的DLL) 329
9.4.2 显示DLL中的模式Form 332
9.5 显示DLL中的无模式Form 334
9.6 在Delphi应用程序中使用DLL 336
9.6.1 显式调用DLL 338
9.7 DLL的入口和出口函数 340
9.7.1 进程/线程初始化和终止例程 340
9.7.2 DLL入口/出口示例 341
9.8.1 在16位Delphi中捕捉异常 345
9.8 DLL中的异常 345
9.8.2 异常和Safecall指示字 346
9.9 回调函数 346
9.9.1 使用回调函数 349
9.9.2 自定义的列表框 349
9.10 从DLL中调用回调函数 350
9.11 在不同的进程间共享DLL的数据 353
9.11.1 创建一个可以被共享数据的DLL 353
9.11.2 访问DLL中的共享数据 356
9.12 引出DLL中的对象 360
第十章 打印 367
10.1 TPrinter对象 368
10.2 TPrinter.Canvas 369
10.3 简单打印 369
10.3.1 打印TMemo元件中的内容 369
10.3.3 打印RTF格式的文本 371
10.3.2 打印位图 371
10.4 打印Form 372
10.5 高级打印 372
10.5.1 打印分栏报表 372
10.5.2 放弃打印进程 379
10.5.3 打印信封 380
10.5.4 抽象打印 380
10.5.5 一个简单的打印预览程序 393
10.6 其它打印任务 394
10.6.1 TDeviceMode结构 394
10.6.2 设置打印份数 397
10.6.3 设置打印方向 398
10.6.4 设置纸张尺寸 398
10.6.5 设置纸张的长度 398
10.6.6 设置页的亮度 398
10.6.9 设置打印质量 399
10.6.8 设置打印颜色 399
10.6.7 设置打印比例 399
10.6.10 设置双面打印 400
10.6.11 指定默认打印机 400
10.7 获取打印机信息 402
10.7.1 GetDeviceCaps()和DeviceCapabilities() 402
10.7.2 获取打印机信息的示范程序 403
第十一章 编写多线程应用程序 419
11.1 关于线程的解释 419
11.1.1 一种新型的多任务 420
11.1.2 线程的常规用法 420
11.1.3 不要滥用线程 420
11.2 TThread对象 420
11.2.1 TThread基础 421
11.2.3 线程终止 423
11.2.2 Thread实例 423
11.2.4 与VCL同步 425
11.2.5 一个演示程序 428
11.2.6 优先级和时序安排 429
11.2.7 挂起和唤醒线程 431
11.2.8 测试一个线程的时间 431
11.3 管理多线程 433
11.3.1 线程局部存储 433
11.3.2 线程同步 437
11.4 一个多线程的示范程序 450
11.4.1 用户界面 450
11.4.2 专门的搜索线程 459
11.4.3 调整优先级 464
11.5 多线程与数据库 467
11.6 多线程与图形处理 474
12.1.1 处理文本文件 481
12.1 处理文件的输入/输出 481
第十二章 文件处理 481
12.1.2 处理有类型文件 487
12.1.3 处理无类型文件 498
12.2 TTextRec和TFileRec结构 503
12.3 内存映射文件 504
12.3.1 内存映射文件的用途 504
12.3.2 使用映射文件 504
12.3.3 内存映射文件的一致性 512
12.3.4 文本搜索实用程序 512
12.4 目录和驱动器 521
12.4.1 获取可用的驱动器和驱动器类型的列表 521
12.4.2 获得驱动器信息 522
12.4.3 获取Windows目录 525
12.4.4 获得系统目录的位置 525
12.4.5 获取当前目录 526
12.4.6 在目录中查找文件 527
12.4.7 复制和删除目录树 530
12.4.8 获取文件的版本信息 533
12.4.9 获取版本号 541
12.4.10 获得操作系统信息 541
第十三章 核心技术 545
13.1 高级消息处理 545
13.1.1 Subclassing 546
13.1.2 Win32 API窗口过程 546
13.1.3 Delphi的窗口方法 548
13.1.4 HookMain Window() 551
13.2 防止出现应用程序的多个实例 553
13.3 使用BASM 558
13.3.1 BASM是怎样工作的 559
13.3.2 访问参数也很容易 559
13.3.4 完全用汇编写的过程或函数 560
13.3.3 Register调用约定 560
13.3.5 记录 561
13.4 使用挂钩 561
13.4.1 设置挂钩 561
13.4.2 使用挂钩函数 563
13.4.3 使用脱钩函数 563
13.4.4 使用SendKeys:一个Journal Playback类型的挂钩 563
13.5 使用C/C++的OBJ文件 578
13.5.1 调用一个函数 579
13.5.2 函数的名称问题 579
13.5.3 共享数据 579
13.5.4 使用Delphi RTL 580
13.6 使用C++类 587
13.7 Thunking 592
13.7.1 Generic Thunking 592
13.7.2 WM_COPYDATA 600
第十四章 获取系统信息 609
14.1 InfoForm——获取一般信息 609
14.1.1 格式化字符串 610
14.1.2 获取内存状态 611
14.1.3 获取OS版本信息 613
14.1.4 获取目录信息 614
14.1.5 获取系统信息 615
14.1.6 检查环境 617
14.2 平台中立 624
14.3 Windows 95/98:使用ToolHelp32 625
14.3.1 快照(Snapshots) 626
14.3.2 列举进程 627
14.3.3 列举线程 631
14.3.4 列举模块 633
14.3.5 列举堆 635
14.3.6 堆的视图 637
14.3.7 完整的源代码 639
14.4 Windows NT:PSAPI 650
第十五章 移植到Delphi 4 667
15.1 Delphi 4的新功能 667
15.1.1 哪个版本 667
15.1.2 单元、元件和包 668
15.2 从Delphi 3移植到Delphi 4 669
15.2.1 无符号的32位整数 669
15.2.2 64位整数 670
15.2.3 Real类型 670
15.3 从Delphi 2移植到Delphi 4 670
15.3.1 布尔类型 671
15.3.2 ResourceString 671
15.3.3 RTL的改变 671
15.4 从Delphi 1移植到Delphi 4 672
15.4.1 字符串和字符 672
15.3.4 TCustomForm 672
15.3.6 Automation服务器 672
15.3.5 GetChildren() 672
15.4.2 变量长度和范围 679
15.4.3 记录的排列 680
15.4.4 32位数学运算 681
15.4.5 TDateTime 681
15.4.6 单元结束代码 681
15.4.7 汇编语言 682
15.4.8 调用约定 682
15.4.9 动态链接库 682
15.4.10 Windows操作系统的变化 684
15.4.11 32位地址空间 684
15.4.14 Windows API函数的变化 685
15.4.13 VBX控件 685
15.4.12 32位资源 685
15.4.15 16位和32位并存 688
第十六章 MDI应用程序 691
16.1 创建MDI应用程序 691
16.1.1理解MDI基础 692
16.1.2 子Form 693
16.1.3 主Form 712
16.2 菜单 720
16.2.1 合并菜单 720
16.2.2 在菜单中列出打开的文档 721
16.3 杂类MDI技术 721
16.3.1 在MDI客户区输出一幅位图 721
16.3.2 创建一个隐藏的子Form 728
16.3.3 最小化、最大化、还原MDI子窗口 732
17.1 剪贴板的基础 735
第十七章 用剪贴板共享信息 735
17.1.1 文本 736
17.1.2 图像 737
17.2 创建您自己的剪贴板格式 738
17.2.1 创建一个剪贴板感知的对象 738
17.2.2 使用自定义的剪贴板格式 742
第十八章 多媒体编程 747
18.1 创建一个简单的媒体播放器 747
18.2 播放WAV文件 749
18.3 播放视频 749
18.3.1 显示第一帧 750
18.3.2 使用Display特性 750
18.3.3 使用DisplayRect特性 751
18.3.4 理解TMediaPlayer事件 751
18.3.5 DDGMPlay的源代码 752
18.5 创建音频CD播放器 754
18.4 设备支持 754
18.5.1 显示闪屏 755
18.5.2 开始编写CD播放器 757
18.5.3 更新CD播放器的信息 758
18.5.4 刷新CD播放器的方法 760
18.5.5 CD播放器的源代码 762
第十九章 测试与调试 771
19.1 常见的编程错误 772
19.1.1 在类的实例创建之前使用了它 772
19.1.2 确保类的实例被释放 773
19.1.3 驯服指针 774
19.1.4 使用未初始化的PChar 775
19.1.5 释放空指针 775
19.2.1 使用命令行参数 776
19.2.2 断点 776
19.2 使用内部集成调试器 776
19.2.3 逐行执行代码 778
19.2.4 使用Watch窗口 779
19.2.5 Inspector 779
19.2.6 计算和修改 779
19.2.7 访问调用栈 780
19.2.8 查看线程 781
19.2.9 事件日志 781
19.2.10 模块视图 782
19.2.11 调试DLL 782
19.2.12 CPU视图 783
19.3 TURBO调试器 784
19.3.1 CPU窗口 784
19.3.2 TD32的断点 785
19.3.3 模块视图 785