译者序 1
第一部分 入门 1
第1章 程序设计基础 1
1.1 本书的结构 2
1.2 范例程序 4
1.3 创建设计良好的程序 4
1.3.1 设计问题:书写简单的代码 4
1.3.3 好OOP与差OOP的对比 5
1.3.2 螺旋式上升 5
1.3.4 注意灵活的事件处理程序 6
1.3.5 感到懒于理清程序的环节 7
1.3.6 避免使用隐藏数据交叉链接对象 8
1.3.7 简短的方法 9
1.3.8 变量、方法以及过程的命名 10
1.3.9 避免特征漂移 10
1.3.10 创建组件 10
1.3.11 使用第三方工具 11
1.4.1 Unleash和Merc40包 12
1.4 本书正文的注意事项 12
1.4.2 CodeBox单元 13
1.4.3 建立网络 13
1.4.4 Borland/Inprise的名称变化 13
1.4.5 注释代码 14
1.5 总结 14
第2章 IDE和VCL增强 15
2.1 可停放的工具栏 15
2.2 使用工具窗口 16
2.3 使用Code Explorer 18
2.4 Delphi4中的新工具 21
2.4.1 使用Project Manager和调试器 21
2.4.2 调试DLL 22
2.4.3 使用模块视图 23
2.4.4 使用事件日志窗口 23
2.4.5 CPU视图 24
2.4.5 调试器中的新特征 25
2.4.6 Code Browser和Tooltip Symbol Insight 26
2.5 停靠窗口 26
2.5.1 在窗体中停放控件 27
2.5.2 在窗体中停放窗体 28
2.6 动作列表 31
2.6.1 使用动作列表 31
2.6.2 使用标准动作 35
2.7 函数重载 35
2.7.1 方法重载和继承 38
2.7.2 使用方法重载时要避免的错误 40
2.7.3 默认参数 42
2.8 动态数组 43
2.9 implements关键字 46
2.10 总结 48
第3章 多态性 49
3.1 多态性的概念 49
3.1.1 赋值和等于的比较 49
3.1.2 多态性的简单例子 50
3.2 多态性赋值能力 51
3.2.1 设置子对象适合于它们的父对象 51
3.2.2 多态性的另一面 52
3.3 虚方法和多态性 53
3.3.1 经典的形状演示 56
3.3.2 没有多态性的代码 62
3.4 VCL中的多态性 63
3.5 总结 65
第4章 异常处理 66
4.1 本章如何处理异常 67
4.2 异常的理论 67
4.2.1 异常的功能 67
4.2.2 默认异常处理程序 68
4.2.3 整个程序是一个大try块 69
4.2.4 未处理异常引起的恐慌 69
4.3 异常类 70
4.4 基本异常句法 71
4.4.1 一个简单的try.except模块 74
4.4.2 异常的关联错误字符串 75
4.4.3 找到错误的地址 76
4.4.4 异常处理总结 77
4.5 引发异常 77
4.5.1 引发VCL异常类 79
4.5.2 理解VCL异常类 81
4.5.3 运行Gauntlet:多异常类 82
4.5.4 在常规except语句中捕获异常 83
4.6 创建和引发自己的异常 83
4.7 再引发异常 87
4.8 try..finally块 88
4.9 流、异常和空闲空间 91
4.10 替换默认的异常处理程序 95
4.11 使用资源跟踪错误字符串 97
4.12 总结 101
第5章 线程 102
5.1 进程和内存 103
5.1.1 线程与多任务 104
5.1.2 抢占式与非抢占式多任务 106
5.2 线程:一个简单的例子 106
5.3 多线程程序 111
5.3.2 向线程函数传递一个参数 115
5.3.1 在Thread2程序中使用线程 115
5.3.3 临界区:让多个线程同时工作 117
5.4 处理互斥元 122
5.5 线程和VCL 126
5.6 线程安全数据库访问 127
5.7 VCL线程安全对象 128
5.8 使用TThread对象 128
5.9 设置线程的优先级 137
5.10 重访Delphi线程 142
5.11 总结 143
第二部分 创建组件 145
第6章 创建组件(一) 145
6.1 组件原理 146
6.2 创建现存组件的派生组件 146
6.2.1 创建简单的组件 146
6.2.2 双向工具 150
6.2.3 注册组件 151
6.2.4 改变组件的默认行为 151
6.2.5 动态创建并检查组件 152
6.3.1 什么是包 153
6.3 包:将组件放入Component Palette中 153
6.3.2 创建包 154
6.4 扩展Unleash单元 156
6.4.1 TCCBigEdit和TCCEmptyPanel控件 166
6.4.2 创建复合组件 166
6.4.3 创建组件的published属性 169
6.4.4 流属性的注意事项 170
6.5 创建真正有用的组件 171
6.6 总结 175
第7章 创建组件:(二) 177
7.1 从头开始建立组件 178
7.2 时钟组件 180
7.2.1 了解TCCClock 189
7.2.2 TCCColorClock 191
7.2.3 创建Fancy Clock 192
7.3 为组件创建图标 195
7.4 Tools API:Property Editor和Component Editor 196
7.4.1 五个主要的Tools API 196
7.4.2 Property Editor 196
7.4.3 关于注册你自己的组件以及Commponent Editor的更多知识 199
7.4 Commponent Editor 200
7.5 不可视的组件 201
7.6 FindAIlW程序 202
7.6.1 使用TFileIterator遍历目录 213
7.6.2 什么时候应该把对象做成不可见组件 215
7.6.3 AJIDirs单元和FileIter单元 216
7.6.4 遍历目录 216
7.6.5 使用FindFirst、FindNext和FindClose 217
7.6.6 创建事件处理程序 218
7.7 CompDirs程序 220
7.8 TCCPickDirDIg 226
7.9 组件模板 231
7.10 ActiveX控件 232
7.11 总结 235
第三部分 数据库编程 237
第8章 字段和数据库工具 237
8.1 从关系数据库开始 238
8.1.1 关系数据库模型的优势 239
8.1.2 简单的逻辑设置:关系数据库的基础 239
8.1.3 DBD和Database Explorer中的索引和关键字 240
8.2 重点规则:给每个表建立一个关键字 243
8.2.1 一对多的关系:数据和索引 244
8.2.2 用主关键字和主索引工作 245
8.2.3 用副索引和外部关键字工作 246
8.2.4 关键字的重要性 246
8.3 用数据库工具浏览和操作数据库 247
8.3.1 浏览DBDEMOS数据库的关键字和索引 247
8.3.2 用Database Desktop创建索引 250
8.3.3 创建别名 250
8.3.4 使用Database Desktop创建主关键字和外部关键字 251
8.3.5 探究引用完整性 252
8.3.6 关系数据库和联结 253
8.3.7 联结和QBE 254
8.4 Flieds Editor 255
8.5 计算字段 259
8.6 运行期间的TDBGrid 260
8.6.1 在运行中控制DBGrid的Options属性 263
8.6.2 运行时显示DBGrid选项 264
8.7.1 改变TDBGird对象的标题 265
8.7 使用TDBGrid列 265
8.7.2 改变网格里的整列 266
8.7.3 改变网格里一行的颜色 267
8.7.4 改变列宽 268
8.7.5 在TDBGrid里隐藏列 268
8.7.6 显示可见字段的列表 269
8.7.7 运行时移动列 270
8.8 查找字段 270
8.10 总结 276
8.9 多记录对象 276
第9章 平面文件现实世界数据库 278
9.1 本章示例程序 279
9.2 设计应用程序 279
9.2.1 定义数据 280
9.2.2 程序设计的焦点 282
9.3 定义程序的外观 284
9.4 查找:处理Category字段 286
9.5 设置程序的命令结构 287
9.6 查看应用程序的“粗略草稿” 289
9.7 创建自己的对象 290
9.8 创建最终的程序 291
9.9 切换进和切换出只读模式 309
9.10 排序数据 311
9.11 查询数据 313
9.12 筛选数据 314
9.13 标记文件 315
9.14 设置颜色 317
9.15 使用注册表 320
9.16 剪贴板:剪切、复制和粘贴 323
9.17 总结 323
第10章 关系式数据库 324
10.1 现实世界的数据 324
10.2 测试关联地址程序 325
10.3 kaAdd代码 328
10.3.1 使用kdAdd程序 338
10.3.2 为kdAdd建立索引 338
10.3.3 查询记录 339
10.3.4 插入数据和取消操作 340
10.3.5 删除数据:程序的数据模块初览 341
10.3.6 数据模块:级联删除 343
10.3.7 数据模块:总体登记 345
10.3.8 在字符串资源中加入错误字符串 345
10.3.9 About框 346
10.4 使用kdAddExplore和谐程序 346
10.4.1 使用TSession 347
10.4.2 kdAddExplore程序的代码 349
10.4.3 用TTree View显示系统数据库 355
10.4.4 展开TTree View节点 356
10.4.5 为TTree View加入可用表的列表 356
10.4.6 找到索引和字段 358
10.4.7 显示别名和别名参数 359
10.5 总结 360
第11章 使用本地InterBase服务器 361
11.1 从InterBase开始 361
11.1.1 数据库和工作市场 362
11.1.2 设置本地InterBase 362
11.1.3 设置InterBase别名 365
11.2 创建数据库 366
11.2.1 使用WISQL 367
11.2.2 创建表 367
11.3 利用WISQL管理数据库 368
11.4 事务处理 370
11.4.1 创建TRANSACT程序 370
11.4.2 使用TRANSACT程序 371
11.4.3 理解事务处理 372
11.5 高速缓存更新 373
11.6 多对多关系 378
11.7 安全和InterBase Server Manager 387
11.7.1 定义表的访问权力 388
11.7.2 利用InterBase Server Manager备份表 388
11.8 总结 389
第12章 InterBase编程 390
12.1 关于Music程序 391
12.2 设计Music程序 392
12.2.2 修改表:空或非空 393
12.2.1 创建数据库方案 393
12.2.3 重新命名现有表中的字段 394
12.2.4 创建Blob字段 395
12.2.5 主关键字和外部关键字 396
12.3 在Music表创建索引 398
12.4 生成器、触发器和存储过程 399
12.4.1 不要在活动索引上使用触发器 400
12.4.2 使用存储过程 401
12.4.3 来自Delphi端的存储过程 402
12.5 服务器端规划和客户端规则 403
12.6 Music程序界面概述 404
12.7 使用子窗体 405
12.8 Music程序的代码 408
12.8.1 使用Music程序 408
12.8.2 禁止密码:TdataBase对象 408
12.8.3 FormCreate事件 408
12.9 使用Music程序中的数据 411
12.10 向数据库提出一个问题:简短的SQL入门 412
12.10.1 不返回数据集合的存储过程 416
12.10.2 查看数据范围 417
12.11 总结 418
第四部分 COM 419
第13章 COM接口和基础 419
13.1 理解COM接口 419
13.1.1 COM是什么? 420
13.1.2 COM和窗口 420
13.1.3 即插即用应用程序 420
13.1.4 COM的问题 421
13.1.5 UNIX上的COM 422
13.1.6 COM+和COM的未来 423
13.2 接口介绍 423
13.2.1 新接口类型 423
13.2.2 接口不是类 424
13.2.3 不能直接实现接口 424
13.2.4 利用类实现接口 425
13.2.5 调用接口的方法 428
13.2.6 破坏接口 429
13.3 接口背后的理论 432
13.3.1 使用接口的原因 433
13.3.2 维护或更新接口 435
13.4 创建和使用COM接口 435
13.4.1 理解GUID 436
13.4.2 关于注册表和GUID所有内容 437
13.4.3 理解IUnknown 440
13.4.4 实现IUnknown 445
13.4.5 为接口指定GUID 447
13.4.6 幻数 448
13.4.7 UnknownByUser程序的注释 449
13.5 高级接口问题 450
13.5.1 多个接口 451
13.5.2 方法解析语句 454
13.5.3 Implements伪指令 455
13.5.4 虚方法表 458
13.6 总结 458
第14章 TComObject、TTypedComObject以及类型库 460
14.1 样例程序 460
14.2 TComObject 460
14.2.1 在DLL中放置普通接口 461
14.2.2 IClassFactory 469
14.2.3 ISystemInfo接口 470
14.2.4 注册DLL 470
14.2.5 从可执行文件访问存储在DLL中的COM对象 471
14.2.6 越过程序边界编组数据 472
14.2.7 编组数据 473
14.2.8 Variant数组 473
14.2.9 调用ISystemInfo数据 479
14.3 类型库和查询对象 482
14.3.1 创建类型库 483
14.3.2 创建查询类型库的客户程序 488
14.3.3 检索ITypeInfo 491
14.3.4 获取接口信息 494
14.4 总结 495
第15章 创建COM自动化服务器和客户程序 496
15.1 理解OLE自动化客户程序和服务器 496
15.2 建立简单的COM服务器和客户程序 497
15.2.1 建造简单的服务器 497
15.2.2 在服务器上添加方法 498
15.2.3 查看生成的源代码 499
15.2.4 添加接口属性 500
15.2.5 建立简单客户程序 500
15.2.6 通过TCOMInterface来调用方法 504
15.2.7 通过dispinterface调用方法 505
15.3 IDispatch、双重接口和dispinterface 507
15.3.1 从Word调用SimpleAutoServer 508
15.3.2 VTable和双重接口 509
15.4 类型库 510
15.4.2 创建类型库 511
15.4.1 什么是类型库 511
15.4.3 有效的自动化类型 512
15.5 用EmptyParam忽略参数 512
15.6 注册 513
15.7 自动编组数据 515
15.8 从一个CoClass得到两个或更多的接口 515
15.9 总结 526
第16章 用Delphi完成Word和Excel自动化 527
16.1 自动化Office应用程序的系统要求 527
16.2.1 启动Excel 528
16.2 启动Delphi和Excel 528
16.2.2 使用COMObj 529
16.2.3 了解Excel的简单自动化 530
16.2.4 比较接口和Variant 530
16.2.5 理解CreateOleObject 531
16.2.6 Variant和类型 532
16.2.4 创建Excet自动对象 532
16.3 了解Excel自动化对象 533
16.3.1 在Application对象内访问各种对象 534
16.3.2 使用自动化 535
16.4 在Excel和Word间共享图表 543
16.4.1 创建电子表格 546
16.4.2 创建图表 547
16.4.3 使用SeriesCollection对象 548
16.5 从Excel向Word复制数据 550
16.5.1 Word内部的自动化 551
16.5.2 发送文档 553
16.6 总结 553
17.1 Variant与接口的对比 555
第17章 接口和Internet Explorer 555
第五部分 Internet编程 555
17.1.1 补救接口 556
17.1.2 使用类型库 557
17.2 本章所需文件 557
17.3 使用Word和Excel 558
17.3.1 使用Excel和Word接口 565
17.3.2 比较Variant和接口技术 566
17.4.1 开始:访问Web Page中的元素 568
17.4 使用IE和TwebBrowser 568
17.4.2 运行时在浏览器上处理HTML 574
17.5 在浏览器内放置ActiveX控件 581
17.6 总结 588
第18章 WebBroker:CGI和ISAPI 589
18.1 Web Module 589
18.2 Web Server Application Wizard 589
18.2.1 CGI 590
18.2.2 WinCGI 590
18.3 WebBroker组件 591
18.2.3 ISAPI/NSAPI 591
18.2.4 CGI与ISAPI 591
18.3.1 TWebModule 592
18.3.2 TWebResponse 593
18.3.3 TWebRequest 593
18.4 IntraBob 594
18.5 TPageProducer 596
18.6 TDataSetPageProducer 598
18.7 浏览状态 601
18.7.3 隐含字段 602
18.7.1 Fat URL 602
18.7.2 Cookie 602
18.8 高级网页的生成 605
18.9 TDataSetTableProducer 610
18.10 Database Web Application Wizard 613
18.11 TQuery TableProducer 613
18.12 总结 617
19.1 理解WinINet、FTP和TCP/IP 618
19.1.1 所需文件 618
第19章 WindINet和FTP 618
19.1.2 确保FTP在系统中运行 619
19.1.3 安装TCP/IP应该注意的问题 619
19.2 FTP使用WindINet 622
19.2.1 使用InternetOpen 624
19.2.2 使用InternetConnect 624
19.2.3 获得当前目录 626
19.2.4 在目录中查找文件(一) 626
19.2.5 在目录中查找文件(二) 628
19.2.6 检索文件(一) 630
19.2.7 创建回调 631
19.2.8 检索文件(一) 635
19.2.9 发送文件到服务器的简单方法 637
19.2.10 删除文件 637
19.2.11 创建和删除目录 638
19.3 在程序中使用FTP控件 639
19.3.1 连接程序器 647
19.3.2 响应OnNewDir事件 648
19.3.3 改变目录 648
19.3.4 跟踪文件传送 649
19.4 总结 651
第六部分 分布式编程 653
第20章 DCOM 653
20.1 COM和分布式体系结构 653
20.1.1 什么是DCOM 653
20.1.2 在Windows 95/98和Windows NT上运行DCOM服务器 654
20.1.3 作为DCOM服务器使用Windows 98 656
20.2 简单的DCOM客户程序和服务器 656
20.2.2 理解Safecall 657
20.2.1 建立服务器 657
20.2.3 机器之间编组数据 658
20.2.4 创建DCOM客户程序 662
20.2.5 使用远程对象 670
20.3 再访问SystemInformation程序 670
20.4 轻量远程数据集 677
20.4.1 理解DataCOMServer程序 685
20.4.2 访问远程数据集的DataCOMClient 689
20.4.3 理解DataCOMClient 694
20.4.4 编辑数据行 696
20.5 程序数据和自动化数据 697
20.6 测试远程调试系统 702
20.7 总结 703
第21章 MIDAS 704
21.1 多层计算概述 704
21.1.1 什么是MIDAS 705
21.1.2 分布式计算的目的 706
21.1.3 公文包模型概述 706
21.1.5 查找调度程序 707
21.1.4 术语 707
21.2.1 建立简单的MIDAS应用程序 709
21.2.2 创建SimpleMidasServer 714
21.2.3 理解服务器 715
21.2.4 导出TProvider接口 715
21.2.5 为客户应用程序准备服务器 716
21.2.6 创建简单的MIDAS客户程序 717
21.2.7 理解简单的MIDAS客户程序 718
21.2.8 远程访问服务器 718
21.2.9 使用套接字代替DCOM 719
21.3 建立一对多应用程序 720
21.4 建立远程数据客户应用程序 722
21.4.1 更新和刷新数据 725
21.4.2 公文包模型 726
21.4.3 PacketRecords 727
21.5 错误处理 728
21.6 服务器端逻辑与客户端逻辑 729
21.7 所需的DLL 731
21.8 使用OLEnterprise 732
21.9 总结 733
第22章 ActiveForm 735
22.1 介绍ActiveForm 735
22.2 建立ActiveForm 736
22.3 配置在Internet Explorer里使用的ActiveForm 736
22.3.1 为ActiveForm设置选项 736
22.3.2 连接到ActiveForm上 737
22.3.3 了解OCCACHE 738
22.4 使用CAB文件和包 739
22.4.1 理解INF文件 741
22.4.2 许可证问题 742
22.5 在Word中运行ActiveForm 742
22.5.1 注册应用程序 742
22.5.2 在Microsoft Word里运行窗体 743
22.6 使用ActiveForm模板 745
22.7 套接字和ActiveForm 745
22.7.1 套接字概述 745
22.7.2 建立套接字支持的MIDAS ActiveForm 746
22.7.3 创建基于MIDAS的ActiveForm 747
22.8 总结 749
第23章 MTS 750
23.1 什么是MTS 750
23.2 如何安装MTS 752
23.3 创建简单的MTS服务器 752
23.4 创建简单的MTS客户程序 758
23.5 调用本地对象 760
23.6 用MTS注册对象 761
23.7 远程调用对象 761
23.8 创建简单的MTS数据库服务器 763
23.9 创建简单的MTS数据库客户程序 770
23.10 处理MTS事务 774
23.11 建立跨越多个服务器的MTS示例 784
23.12 Rocket程序的代码 786
23.13 总结 799
第24章 CORBA 800
24.1 理解CORBA 800
24.1.1 什么是CORBA 800
24.1.2 比较DCOM和CORBA 801
24.1.3 什么是ORB 802
24.1.4 什么是Smart Agent 803
24.1.5 什么是BOA 804
24.1.6 什么是代理、存根和框架 805
24.1.7 理解Delphi和CORBA 807
24.2 两个重要的CORBA存储库 808
24.2.1 什么是Interface Repository 808
24.2.2 什么是Implementation Repository 809
24.3 简单的CORBA对象 809
24.3.1 服务器 810
24.3.2 客户程序 817
24.3.3 理解客户程序 819
24.3.4 理解CORBA存根 822
24.3.5 理解CORBA框架 822
24.4 理解服务器的IDL接口 823
24.5 简单的CORBA动态项目 824
24.6 简单的CORBA数据库对象 831
24.6.1 创建CORBA数据库服务器 831
24.6.2 创建客户程序 840
24.7 利用VisiBroker Manager和OSFind 842
24.8 总结 843
第25章 Delphi、Java和C++ 844
25.1 在Delphi和Java中使用CORBA 844
25.2 从Delphi调用Java服务器 851
25.3 从C++Builder调用Delphi CORBA服务器 856
25.3.1 用C++建立CORBA服务器并从Delphi调用 866
25.3.2 理解BCBCorbaserver 871
25.4 总结 873
第26章 VCL图形类 875
第七部分 游戏编程 875
26.1 Windows GDI与VCL TCanvas 876
26.1.1 理解GDI 876
26.1.2 VCL使图形编程更容易 877
26.2 使用TCanvas 877
26.3 研究与使用画刷 878
26.3.1 TBrush.Color属性分析 878
26.3.2 TBrush.Style属性分析 878
26.3.3 TBrush.Assign方法分析 880
26.4 研究与使用画笔 881
26.4.1 TPen.Style属性分析 881
26.4.2 TPen.Width属性分析 881
26.4.3 TPen.Mode属性分析 881
26.5 研究与使用字体 883
26.5.1 TFont.Height属性分析 883
26.5.2 TFont.Size属性分析 883
26.7 研究与使用TCanvas.ClipRect 884
26.6 研究与使用TCanvas.PenPos 884
26.5.4 TFont.Style属性分析 884
26.5.3 TFont.Name属性分析 884
26.8 研究与使用TCanvas.CopyMode 885
26.9 研究与使用TCanvas.Pixels 886
26.10 分析与理解TCanvas方法 886
26.11 MainBrush范例代码 886
26.11.1 OnCreate事件 895
26.11.2 FormShow方法 896
26.11.3 设置画笔模式 897
26.11.4 使用Fonts 898
26.11.5 在画布上画出形状 899
26.11.6 使用CopyMode 902
26.12 其他名称的线条 903
26.13 深入研究VCL 906
26.13.1 深入了解TColor 906
16.13.2 Colors样本项目 907
16.13.3 OnChange事件处理程序 909
26.14 调色板 910
26.15 深入了解Windows的图形文件格式 910
26.15.1 分析位图和DIB 910
26.15.2 分析图标 911
26.15.3 分析元文件 912
26.16 分析TPaintBox和TImage 915
26.17 再谈位图 916
26.18 总结 923
第27章 DirectDraw 924
27.1 理解DirectDraw 924
27.1.1 什么是DirectDraw 925
27.1.2 关于双缓冲的几点想法 926
27.1.3 硬件与仿真 927
27.2 一个简单的DirectDraw程序 928
27.3 释放接口 934
27.3.1 进入独占模式和改变屏幕分辨率 935
27.3.2 DirectDraw表面是什么 935
27.3.3 向屏幕写文本 937
27.3.4 交换表面 938
27.3.5 释放内存 939
27.4 平滑动画 940
27.5 使用位图 949
27.6 游戏资源 955
27.7 总结 956
第28章 更多的DirectX技术 957
28.1 DirectSound 957
28.1.1 初始化DirectSound 958
28.1.2 枚举声音驱动程序 961
28.1.3 使用DirectSoundBuffer 962
28.1.4 打开WAV文件 964
28.1.5 播放声音文件 966
28.1.7 一次播放两个WAV文件 967
28.1.6 播放大文件 967
28.2 创建DirectX游戏 968
28.2.1 创建DelphiMan程序 970
28.2.2 实现DelphiMan程序的注意事项 979
28.2.3 “机器人物”的控制 982
28.2.4 小结DelphiMan程序 982
28.3 浏览Direct3D 982
28.4 关键的3D技术 983
28.5 总结 984
配套光盘内容 986