作者介绍 1
前言 1
第一部分 C++Builder5基础 1
第1章 C++Builder简介 1
1.1 C++Builder基础 1
译者序 1
1.1.1 Hello World!从基本开始 2
1.1.2 VCL、窗体和组件 3
1.1.3 组件面板 5
1.1.4 编写你最初的一个真正的程序 7
1.1.5 熟悉C++Builder 11
1.2 C++Builder5新增功能 12
1.2.1 Web应用程序开发 13
1.2.2 分布式应用程序 13
1.2.5 调试 14
1.2.6 数据库应用程序开发 14
1.2.3 小组开发 14
1.2.4 应用程序本地化 14
1.2.7 开发效率 15
1.2.8 随书工具光盘 15
1.3 升级与兼容性问题 15
1.3.1 升级早期版本的C++Builder 16
1.3.2 在C++Builder5中使用现存的工程 16
1.3.3 创建兼容以前版本C++Builder的工程 16
1.3.4 其他工程升级问题的解答 17
1.4 从Delphi的移植 17
1.4.1 注释 17
1.4.2 变量 18
1.4.3 常数 18
1.4.4 操作符 19
1.4.5 控制程序流程 21
1.4.6 函数和过程 23
1.4.7 类 24
1.4.8 预处理指令 25
1.4.9 文件的类型 26
1.5 C++Builder5优点和缺点 27
1.5.1 真正的可视化:真正的快速应用程序开发 27
1.5.2 跟上C++标准 28
1.5.3 选择正确的开发环境 29
1.5.4 C++Builder优点和缺点小结 29
1.6 为Kylix做一些准备 30
1.6.1 Kylix和C++Builder的相似之处 30
1.6.2 Kylix和C++Builder之间的差异 31
1.7 小结 32
1.6.4 何时发布 32
1.6.3 将C++Builder工程移植到Kylix 32
2.1.1 C++Builder工程中使用的文件 33
第2章 C++Builder工程及IDE详述 36
2.1 理解C++Builder的工程 36
2.1.2 工程管理器 36
2.2 使用对象库 36
2.2.1 增加项目到对象库中 37
2.2.2 使用对象库中的项目 40
2.2.3 在一个工程内共享项目 41
2.2.4 定制对象库 41
2.2.5 创建并增加一个向导到对象库中 41
2.3 理解和使用包 44
2.3.1 使用包的注意事项 46
2.3.2 C++Builder运行期包 47
2.3.3 使用tdurnp 50
2.4.1 对象观察器中的属性类别 51
2.4 C++Builder5的IDE新特征介绍 51
2.4.2 对象观察器下拉列表中的图像 52
2.4.3 XML工程文件格式 54
2.4.4 以文本格式存储窗体 56
2.4.5 Node-Leve选项 58
2.4.6 新的To-Do列表 60
2.4.7 Console Wizard 62
2.5 小结 64
第3章 C++Builder编程 65
3.1 改善可读性的编程风格 65
3.1.1 使用简短的代码 65
3.1.2 代码布局的使用 67
3.1.3 使用合理的命名方法 72
3.1.5 使用注释 77
3.1.4 代码结构的使用 77
3.1.6 改善代码可读性的最后一个问题 81
3.2 在C++Builder中更好地编程 81
3.2.1 使用String类代替Char 81
3.2.2 理解引用并适当地使用它们 82
3.2.3 避免使用全局变量 85
3.2.4 理解并在代码中使用const 89
3.2.5 熟悉异常的原理 92
3.2.6 使用new和delete管理内存 95
3.2.7 理解和使用C++风张的类型转换 99
3.2.8 了解何时使用预处理器 100
3.2.9 了解和使用C++标准库 102
3.3 参考文献 103
3.4 小结 104
4.1.1 理解C++模板 105
第4章 C++Buiader高级编程 105
4.1 标准C++模板 105
4.1.2 探讨标准C++库功能 108
4.1.3 掌握包容器和迭代器 109
4.1.4 使用标准算法 115
4.1.5 走近SCL 116
4.2 使用智能指针和强大的包容器 116
4.2.1 堆与栈 116
4.2.2 指针 116
4.2.3 强包容器 120
4.2.4 缺陷 121
4.2.5 智能指针和强大的包容器小结 121
4.3 实现高级异常处理器 122
4.3.1 检查策略 122
4.3.3 替换编译器的缺省异常处理器 123
4.3.2 检查优点 123
4.3.4 加入特定工程信息到类 124
4.3.5 异常处理器的源代码 124
4.3.6 高级异常处理器小结 141
4.4 创建多线程应用程序 141
4.4.1 理解多任务 142
4.4.2 理解多线程 142
4.4.3 使用API调用创建一个线程 142
4.4.4 理解TThread对象 145
4.4.5 理解主VCL线程 150
4.4.6 建立优先级 152
4.4.7 计时线程 154
4.4.8 同步线程 155
4.5.2 软件设计中的可再用模式 159
4.5.1 理解模式的可再用的本性 159
4.5 设计模式介绍 159
4.5.3 作为词汇表的设计模式 160
4.5.4 设计模式格式 160
4.5.5 设计模式分类 161
4.5.6 有关设计模式的部分想法 162
4.6 小结 162
第5章 用户界面原则和技巧 164
5.1 用户界面原则 164
5.2 本章使用的工程实例 166
5.3 通过给用户提供反馈改善可用性 168
5.3.1 使用TProgressBar和TCGauge 168
5.3.2 使用Cursor 169
5.3.3 使用TStatrsBar 170
5.3.4 使用Hints 177
5.4.1 响应输入 193
5.4 通过输入焦点的控制改痒可用性 193
5.4.2 移动输入焦点 198
5.5 通过外观改善可用性 199
5.5.1 在按钮上只使用符号 201
5.5.2 使用符号作为文本的附加 202
5.5.3 使用颜色以提供可视化线索 206
5.5.4 使用形状控件 206
5.6 通过允许定制改善用户界面的可用性 208
5.6.1 停放 209
5.6.2 重定尺寸 212
第6章 编译和优化你的应用程序 215
5.6.3 使用TControlBar 221
5.6.4 控制可见性 232
5.6.5 定制MDI父窗体的客户区 235
5.7 通过记住用户的优选改善可用性 236
5.8.1 处理不同屏幕分辨率 244
5.8 处理不同的屏幕条件 244
5.8.2 处理不同字体尺寸 245
5.8.3 处理不同颜色深度 245
5.9 处理用户界面实现时的复杂性 245
5.9.1 使用Action列表 246
5.10 小结 249
6.1 理解编译器如何工作 251
6.2 加快编译速度 252
6.2.1 预编译头文件 253
6.2.2 加快编译速度的其他技术 254
6.3 C++Builder5编译器和连接器的改进 255
6.3.2 混合编译器的改进 256
6.3.1 后台编译 256
6.3.3 连接器的新改进 257
6.4 优化:介绍 257
6.5 招待速度的优化 259
6.5.1 Crozzle Solver应用程序示例 260
6.5.2 指数时间 261
6.5.3 有关执行速度的工程选项 263
6.5.4 检测瓶颈 264
6.5.5 优化设计和算法 268
5.9.2 共享事件处理器 274
6.5.6 讨论使代码合理化的技术 274
6.5.7 使数据合理化的技术 286
6.5.8 手工调整汇编代码 288
6.5.10 执行速度优化小结 291
6.6.1 优化程序规模 291
6.5.9 使用外部优化 291
6.6 优化应用程序的其他方面 292
6.6.2 最后的优化方面 292
6.7 小结 292
第7章 调试应用程序 293
7.1 调试概述 293
7.1.1 工程指导原则 294
7.1.2 编程指导原则 295
7.1.3 调试的任务 296
7.2 基本调试技术 296
7.2.1 输出调试信息 297
7.2.2 使用断言 302
7.2.3 实现全局异常处理器 303
7.3 使用C++Brilder交互式调试器 304
7.2.4 基本调试的其他问题 304
7.3.1 高级断点 305
7.3.2 C++Builder5中新的断点特征 308
7.3.3 C++Builder中的调试视图 308
7.3.4 监视、计算和修改 313
7.3.5 Debug Inspector 313
7.4 CodeGuard 314
7.4.1 启用和配置CodeGuard 315
7.4.2 使用CodeGuard 316
7.4.3 检查CodeGuard中的错误及其起因 317
7.5 高级调试 321
7.5.1 查找非法访问的根源 322
7.5.2 连接到运行中的进程 323
7.5.3 使用刚好及时调试 323
7.5.4 远程调试 324
7.5.6 其他调试工具 325
7.5.5 调试DLL 325
7.6 测试 327
7.6.1 测试的阶段和技术 327
7.6.2 测试的提示 328
7.7 小结 329
第8章 使用VCL组件 330
8.1 VCL概述 330
8.1.1 从TObject开始 331
8.1.2 建立在已有的对象的基础之上 332
8.1.3 使用VCL 333
8.1.4 C++扩展 335
8.2 流机制 341
8.2.1 高级流需求 342
8.2.2 非发布属性的流 342
8.3.1 通用控件动态链接库 346
8.3 通用控件更新 346
8.3.2 C++Builder通用控件更新 348
8.4 多种VCL的强化 351
8.4.1 新的Help Hint和Menu特点 351
8.4.2 访问注册表 351
8.4.3 VCL文件增强 351
8.4.4 新的TapplicationEvents组件 352
8.4.5 TIcon增强 352
8.4.6 其他的各种VCL强化 352
8.5.1 将TStringLIst作为容器使用 353
8.5.2 存储非VCL对象 353
8.5.3 将字符串连接到相同类型的对象 354
8.5.4 创建一个事件链 363
8.5.5 列表排序 364
8.5.6 一些改进 365
8.6.3 TToolBar组件 366
8.6.2 TListVIew组件 366
8.6.1 TTreeView组件 366
8.6 高级定制绘制事件 366
8.6.4 高级定制绘制事件范例 367
8.7 ControlPanelApplet向导组件 367
8.8 使用第三方组件 374
8.8.1 第三方组件的优点的缺点 375
8.8.2 到何处查找更多的C++Builder资源 375
8.9 小结 375
9.1 为什么要创建定制组长件 377
第9章 创建定制组件 377
9.2 理解组件的编写 378
9.2.1 为什么以现有的组件为基础 380
9.2.2 设计定制组件 380
9.2.3 使用VCL图表 380
9.3 编写非可视化的组件 380
9.3.1 属性 380
9.3.2 事件 388
9.3.3 方法 390
9.3.4 创建组件的异常 392
9.3.5 命名空间 394
9.3.6 响应消息 395
9.3.7 设计期和运行期 396
9.3.8 连接组件 398
9.3.9 在组件之间连接事件 400
9.4 编写可视组件 402
9.4.1 从何开始 402
9.4.2 TCanvas 403
9.4.3 在组件中使用图形 404
9.4.4 响应鼠标消息 407
9.4.5 组合所有技术 408
9.4.6 修改窗口组件 415
9.5 创建定制的数据感知组件 427
9.5.1 使控件只读 427
9.5.2 建立连接 428
9.5.3 使用OnDataChange事件 430
9.5.4 变成数据编辑控件 432
9.5.5 数据集更新 433
9.5.6 最后增加一个消息 435
9.6 注册组件 436
13.5.3 TDataSetTaqbleProducer 438
9.7 小结 438
第10章 创建属性和组件编辑器 439
10.1 创建定制的属性编辑器 441
10.3.2 通过手工创建获得一个非VCL类型的TTyPeInfo*(PTypeInfo) 446
10.1.1 GetAtributes()方法 449
10.1.2 GetValue()方法 449
10.1.3 SetValue()方法 450
10.1.4 Edit()方法 451
10.1.5 GetValues()方法 455
10.1.6 使用TPropertyEditor属性 455
10.1.7 选择适当的属性编辑器需要考虑的问题 456
10.2 属性和异常 457
10.3 注册定制属性编辑器 458
10.3.1 从一个现有的非VCL类型的类和属性中获取一个TTyPeInfo*(PTypeInfo) 459
10.3.3 如何获取非VCL类型和TTypeInfo* 468
10.3.4 重载属性编辑器的规则 468
13.8 Web安全性 468
10.4 在属性编辑器中使用图像 469
10.4.1 ListMeasureWidth()方法 473
10.4.2 ListMeasureHeight()方法 473
10.4.3 ListDrawValue()方法 474
10.4.4 PropDrawValue()方法 479
10.4.5 PropDrawName()方法 480
10.5 安装编辑器包 482
10.6 在属性编辑器中使用连接的图像列表 483
10.6.1 GetAttributes()方法 488
10.6.3 GetValues()方法 489
10.6.2 GetComponentImgeList()方法 489
10.6.4 ListMeasureWidth()和ListMeasureHeight()方法* 490
10.6.5 ListDrawValue()方法 491
10.6.6 PropDrawValue()方法 493
10.6.7 绘制图像时需要考虑的其他问题 495
10.6.8 连接到父类的TCustomImageList 495
10.6.9 ImageIndex属性的通用解决方案 499
10.7 创建定制组件编辑器 504
10.7.1 Edit()方法 508
10.7.2 EditProperty()方法 512
10.7.3 GetVerbCount()方法 513
10.7.4 GetVerb()方法 513
10.7.5 PrepareItem()方法 514
10.7.6 ExecuteVerb()方法 519
10.7.7 COpy()方法 520
10.9 在定制组件编辑器和属性编辑器中使用预定义图像 522
10.8 注册组件编辑器 522
10.9.1 将资源增加到包中 523
10.9.2 在属性和组件编辑器中使用资源 524
10.10 在定制组件中注册属性类别 528
10.10.1 理解类别和类别的创建 528
10.10.2 在类别中注册属性 530
10.11 小结 536
11.1.1 在对象观察器中显示类属性的发布属性 538
第11章 定制组件的更多技巧 538
11.1 定制组件的各种问题 538
11.1.2 在事件参数列表中使用名字空间 539
11.1.3 确定事件参数列表需注意的问题 540
11.1.4 重载DYNAMIC函数 544
11.1.5 在定制组件中处理消息 545
11.1.6 在组件中使用Windows的回调函数 558
11.1.7 选择基本的属性类型时的考虑 566
11.1.8 允许在设计期和运行期使用用组件 570
11.2 框架 571
11.2.2 TCustomFramer类 572
11.2.1 框架到底是什么 572
11.2.3 在设计期使用框架 573
11.2.4 在运行期使用框架 574
11.2.5 创建TFrame的派生类 574
11.2.6 由TFrame派生类继承 577
11.2.7 重用框架 578
11.3 组件发布和相关问题 579
11.2.8 框架的小结 579
11.3.1 将组件打包 580
11.3.2 发布文件应该放在何处 584
11.3.3 命名包和包的单元 584
11.3.4 命名组件 586
11.3.5 只发布设计期包 586
11.3.6 为不同版本的C++Builder发布组件 588
11.3.7 创建组件面板位图 591
11.3.8 设计组个把时的有关发布的指导原则 591
11.3.9 其他有关发布的问题 592
11.4 小结 592
12.1 串口通信 593
第二部分 通信、数据库和Web编程 593
第12章 通信编程 593
12.1.1 协议 594
12.1.2 状态机 596
12.1.3 结构 597
12.1.4 线程同步技术 597
12.1.5 缓冲 598
12.1.6 在串口通信中注释 598
12.2 互联网协议--SMTP、FTP、HTTP、POP3 599
12.2.1 遍历组件标签页 599
12.2.2 一个聊天服务器例子 600
12.2.3 一个聊天客户端例子 604
12.2.4 一个Email应用程序例子 607
12.2.5 一个HTTP服务器例子 614
12.2.6 一个FTP客户端软件例子 617
12.3 小结 622
13.1 Web模块 623
第13章 Web编程 623
13.2.1 CGI 624
13.2.2 WinCGI 624
13.2.3 ISAPI/NSAPI 624
13.2 Web服务器应用程序向导 624
13.2.4 CGI或者ISAPI 625
13.3 Web有Broker支持组件 625
13.3.1 TWebDispatcher 626
13.3.2 TWebModule 626
13.3.3 TWebResponse 628
13.3.4 TWebRequest 628
13.4 Web服务器 629
13.5 WebBroker生成组件 632
13.5.1 TPageProducer 632
13.5.2 TDataSetPageProducer 635
13.5.4 TQueryTableProducer 640
13.6 Web应用程序向导 644
13.7 保持状态 644
13.7.1 胖URL 645
13.7.2 Cookies 645
13.7.3 隐藏字段 646
13.8.1 安全Socket层 649
13.8.2 授权 649
13.8.3 加密Web应用程序 651
13.9 HTML和XML 655
13.10 InternetExpress 656
13.10.1 消费者订单 656
13.10.2 TMidasPageProducer 656
13.10.3 Web页编辑器 657
13.10.4 分发 658
13.10.5 最后的主/明细表 659
13.10.6 Web页设计问题 661
13.11 小结 662
第14章 数据库编程 663
14.1 数据库应用程序的结构模型 663
14.1.1 Borland数据库引擎 663
14.1.2 BDE原有(单层) 664
14.1.3 BDE/SQL链接(客户/服务器) 664
14.1.4 分布式(多层) 665
14.1.5 数据访问方法 666
14.1.6 原有组件 666
14.1.7 使用BDE的ODBC 666
14.1.8 使用原有组件的ODBC 667
14.1.9 ADO(ActiveX) 668
14.1.10 嵌入的SQL 668
14.1.11 原有API 669
14.1.12 数据库结构结论 669
14.1.13 有关数据库结构更多信息的来源 670
14.2 结构化查询语言 670
14.2.1 表和索引 670
14.2.2 参数 671
14.2.3 insert、update、delete和select 672
14.2.4 合计函数 673
14.2.5 有关SQL的更多信息 673
14.3 C++Builder的ADO特殊组件 674
14.3.1 ADO与BDE比较 674
14.3.2 组件一览 675
14.3.3 数据库连接 676
14.3.4 可访问的数据集 677
14.3.5 用TADLTable访问数据集 677
14.3.6 使用TADOConnand以访问数据集 680
14.3.7 可管理的事务 680
14.3.8 使用组件事件 681
14.3.9 创建基本的数据库应用程序 682
14.3.10 性能优化 682
14.3.11 错误处理问题 684
14.3.12 多层应用程序和ADO 684
14.3.13 ADO特殊组件结论 684
14.4 数据获取结构 684
14.4.1 基本选择 685
14.4.2 从多个源中提取数据 686
14.5.1 什么是数据模块 687
14.5 数据模块设计器 687
14.5.2 为什么要用数据模块 688
14.5.3 如何在应用程序、DLL和分布式对象中使用数据模块 689
14.5.4 数据模块中有什么 690
14.5.5 如何在我的数据柜里块中加入属性 690
14.5.6 如何使用数据模块设计器 691
14.5.7 高级内容 693
14.5.8 用数据模块继承的窗体 693
14.5.9 处理不规则的用数据模块继承的窗体 694
14.5.10 如何在特殊的用户界面中避免依赖性 695
14.5.11 如何在数据模块中共同使用特定应用程序和框架组件 695
14.5.12 包中的数据模块 697
14.5.13 数据模块设计器--结论 697
14.6 InterBase Express 698
14.6.1 Bug追踪者数据库计划 698
14.6.3 发生器、触发器和存储过程 700
14.6.2 数据库规则 700
14.6.4 Bug追踪者实现程序 702
14.6.5 Bug追踪器回顾 709
14.7 小结 709
第三部分 接口和分布式计算 711
第15章 DLL和插件 711
15.1 使用DLL向导 711
15.2 编写和使用DLL 712
15.2.1 静态连接DLL 713
15.2.2 从动态连接的DLL中导入函数 715
15.2.3 输出类 719
15.3 使用包与DLL的比较 721
15.4 在DLL中使用SDI窗体 723
15.5 在DLL和包中使用MDI子窗体 724
15.5.1 在DLL中使用MDI子窗体 724
15.5.2 在包中使用MDI子窗体 728
15.6 在C++Builder中使用微软VisualC++DLL 731
15.7 在微软的Visual C++中使用C++Builder DLL 731
15.8 编写插件 732
15.8.1 解剖插件 733
15.8.2 TIBCB5PlugInBase类 737
15.8.3 TBCB5Pluginmanager 740
15.8.4 插件回顾 741
15.9 小结 741
第16章 COM编程 743
16.1 理解COM服务器和客户端 743
16.2 再论输出接口和事件接收器 744
16.3 编写COM服务器 745
16.3.1 选择服务器类型 745
16.3.3 创建服务器 746
16.3.2 选择线程模式 746
16.3.4 加入COM对象 747
16.3.5 剖析生成的代码 750
16.3.6 编写方法体 754
16.3.7 加入更好的错误支持 755
16.3.8 实现触发事件的方法 758
16.3.9 实现一个定制接口 758
16.3.10 触发定制的事件 762
16.4 编写Proxy/Stub DLL 766
16.5 编写客户端COM 772
16.5.1 导入类型库 772
16.5.2 查看生成的C++结构 773
16.5.3 创建和使用COM服务器对象 776
16.5.4 获得基于Dispinterface的事件 777
16.5.5 查询定制的接口 779
16.5.6 编写定制的基于接口的事件接收器 780
16.6 推荐阅读 784
16.7 小结 785
第17章 走向分布式:DCOM 786
17.1 DCOM是什么 786
17.2 DCOMCnfg实用工具 787
17.2.1 全局安全性设置 787
17.2.2 每一服务器安全性设置 789
17.3 现场测试DCOM 791
17.3.1 创建服务应用程序 791
17.3.2 创建客户端应用程序 793
17.3.3 配置Launch和Access Permissions 794
17.4 安全性编程 796
17.4.1 CoInitializeSecurity函数参数 796
17.3.4 配置Identity 796
17.3.5 运行例子 796
17.4.2 使用CoInitializeSecurity 798
17.4.3 理解DLL客户端和安全性 799
17.4.4 实现程序化访问控制 799
17.4.5 实现接口范围的安全性 801
17.4.6 使用Balnket 802
17.5 小结 809
18.1.1 COM+应用程序 811
第18章 深入探讨:COM+ 811
18.1 COM+介绍 811
18.1.2 COM+目录 812
18.2 使用COM+服务 812
18.2.1 松散耦合事件 813
18.2.2 事务 814
18.2.6 负载平衡性 816
18.2.5 队列组件 816
18.2.4 安全性 816
18.2.3 同步性 816
18.3 开发和使用COM+事件 817
18.3.1 创建COM+事件对象 817
18.3.2 在COM+应用程序中安装事件 819
18.3.3 创建发布者 822
18.3.4 创建订户 823
18.3.5 配置订户 826
18.3.6 创建一个永久署名 827
18.3.7 创建一个临时署名 828
18.4 开发和使用COM+事务对象 837
18.4.1 为Business层创建事务对象 838
18.4.2 开发补偿资源管理器 846
18.4.3 创建客户端 857
18.5 小结 857
19.1 MIDAS介绍 859
第19章 使用MIDAS3的多层分布式应用程序 859
19.2 MIDAS客户端和服务器 861
19.2.1 创建一个简单的MIDAS服务器 861
19.2.2 检查MIDAS服务器注册 864
19.2.3 创建一个MIDAS客户端 865
19.2.4 使用Briefcase模式 868
19.2.5 使用ApplyUpdates 871
19.2.6 执行错误处理 871
19.2.7 说明Reconcile错误 874
19.2.8 远程访问服务器 875
19.2.9 创建一个MIDAS主-明细服务器 875
19.2.10 输出主-明细数据集 878
19.2.11 创建一个MIDAS主-明细客户端 878
19.2.12 使用嵌套表 879
19.2.13 理解MIDAS带宽瓶颈 881
19.3 MIDAS3增强 883
19.3.1 TDataSetProvider 883
19.3.2 TProvider与TAppServer 884
19.3.3 无状态数据处理 884
19.3.4 IntemetExpress应用程序 889
19.3.5 WebConnection组件 890
19.3.6 对象池 891
19.3.7 Socket服务器 892
19.3.8 对象代理 895
19.3.9 分发 895
19.4 小结 896
第20章 使用CORBA的分布式应用程序 897
20.1 CORBA介绍 897
20.2.2 Always或On-demand 898
20.2.1 静态和动态 898
20.2 CORBA是如何工作的 898
20.2.3 平面或分层 899
20.2.4 谁是服务器,谁是客户端 899
20.2.5 对象请求代理 899
20.2.6 基本对象适配器 899
20.2.7 便携对象适配器 899
20.2.8 CORBA与COM 899
20.3 Visibroker组件 900
20.3.1 智能代理 900
20.3.2 对象激活精灵 900
20.3.3 控制台 901
20.4 接口定义语言 901
20.4.1 interface关键字 901
20.4.5 异常 902
20.4.4 类定义 902
20.4.2 attribute关键字 902
20.4.3 方法 902
20.4.6 层次 903
20.4.7 模块 903
20.5 C++Builder5的新特点 904
20.6 C++Builder新的考验CORBA 905
20.6.1 Environment Options 905
20.6.2 Debugger OPtions 905
20.6.3 Project Options 906
20.6.4 CORBA Server Wizard 906
20.6.5 CORBA Client WIzard 907
20.6.6 CORBA IDL File WIzard 907
20.6.7 CORBA Object Implementation Wizard 907
20.6.9 Use CORBA Object Wizard 908
20.6.8 Project Updates对话框 908
20.6.10 C++Builder和C++Builder5之间的不同 909
20.7 实现程序模式 910
20.7.1 层次 911
20.7.2 虚拟实现程序层次 911
20.7.3 授权模型 911
20.8 穷人的CORBA 912
20.9 小结 912
第21章 集成微软Office 913
21.1 集成微软Office概况 913
21.2 如何集成 914
21.2.1 使用TOleContainer 916
21.2.2 使用Automation 916
21.2.3 使用Vartant和Automation对象 917
21.3.1 集合 919
21.3 集成Word 919
21.2.4 防范使用Autmation时的宏病毒 919
21.2.5 使用Word Basic 919
21.3.2 应用程序对象 920
21.3.3 使用文档 921
21.3.4 从Word中得到文本 923
21.3.5 在Word中文档中放入对象 926
21.4 集成Excel 929
21.4.1 获得应用程序对象 929
21.4.2 使用工作簿 929
21.4.3 将单元格放到Execl工作簿中 932
21.4.4 从Execl得到单元格 933
21.5 使用C++Builder5的Server组件 934
21.5.1 WordApplication和WordDocument组件 935
21.5.2 再次讨论词汇表 935
21.6.1 Word 939
21.5.3 有关ATL和OleServers的最后想法 939
21.6 更深入探讨 939
21.6.2 Excel 940
21.6.3 其他Office应用程序 940
21.7 小结 942
第22章 使用ActiveX技术 943
22.1 理解活动服务器对象 943
22.1.1 一个入门的例子:通过Active Server Object Wizard创建Response和Request对象 944
22.1.2 ASP Session、Server和Application对象 950
22.1.3 ASP对象和WebBroker支持 951
22.1.4 再次分发活动服务器对象 952
22.1.5 调试活动服务器对象 953
22.2 ActiveForm介绍 953
22.3 创建一个ActiveForm 953
22.4.1 为ActiveForm设置选项 955
22.4 在IE中分发一个要使用的ActiveForm 955
22.4.2 连结到一个ActiveForm 957
22.5 创建一个数据感知ActiveForm 959
22.5.1 使用CAB文件和包 961
22.5.2 ActiveForm更新 961
22.5.3 OCCACHE和Downloaded Program Files 962
22.6 创建ActiveForm作为MIDAS客户端 963
22.7 在Delphi中使用ActiveForm 964
22.8 使用ActiveForm创建组件模板 965
22.9 Shell编程 966
22.9.2 取出一个文件夹的内容 969
22.9.3 传送Shell对象 971
22.10 小结 975
23.1 报告中的数据表示 977
23.1.1 理解报告的价值 977
第23章 C++Builder的数据表示 977
第四部分 高级主题 977
23.1.2 用QuickReport产生报告 978
23.1.3 理解自定义浏览器的体系 978
23.1.4 QuickReport自定义浏览器小结 987
23.2 打印文本和图像 987
23.2.1 打印文本 987
23.2.2 打印图形 996
23.3 使用高级打印技术 1000
23.3.1 确定打印机分辨率 1000
23.3.2 确定可打印纸张区域大小 1001
23.3.3 确定物理尺寸 1001
23.3.4 确定打印机绘图能力 1001
23.3.5 怎样打印旋转字体 1002
23.3.6 访问打印机配置信息 1003
23.3.7 怎样得到缺省打印机名 1004
23.3.8 怎样设置缺省打印机 1005
23.3.9 重新设置TPuinter 1008
23.3.10 用TPuinter访问DEVMODE的常用信息 1009
23.3.11 使用PRINTER_INFO_2 1010
23.3.12 其他与纸张有关的函数 1015
23.3.13 处理作业 1022
23.3.14 怎样捕获PrintScreen键 1024
23.3.15 打印窗体 1025
23.3.16 创建打印预览 1026
23.3.17 使用与打印机有关的变换例程 1026
23.3.18 其他与打印机有关的信息 1028
23.4 用TChart组件建立图表 1029
23.4.1 开始学习TeeChart 1029
23.4.2 在运行时改变图表的外观 1030
23.4.3 与图表交互 1031
23.4.4 动态建立图表 1032
23.4.5 打印图表 1033
23.4.6 升级到TeeChart Pro 1034
23.5 小结 1034
第24章 使用Win32 API 1036
24.1 Win32 API与Win32中间件 1036
24.2 Windows和API的历史概述 1037
24.3 Win32 API功能范围 1039
24.3.1 窗口管理 1041
24.3.2 系统服务 1042
24.3.3 图形设备接口 1043
24.3.4 多媒体服务 1043
24.3.5 通用控件和对话框 1044
24.3.6 外壳特性 1045
24.3.7 国际特性 1046
24.3.8 网络服务 1047
24.4 Windows程序的构造和操作 1048
24.4.1 WinMain() 1048
24.4.2 窗口句柄 1049
24.4.3 Windows消息 1050
24.5 使用API的实例 1052
24.5.1 在程序中启动其他应用程序 1052
24.5.2 基本的文件I/O 1056
24.5.3 使用外壳的魔力 1064
24.5.4 实现多媒体服务 1073
24.5.5 使用全局惟一标识符 1077
24.5.6 确定系统信息 1078
24.5.7 闪现通知 1087
24.5.8 添加系统支持 1091
24.5.9 动画效果 1092
24.5.10 美化应用程序 1094
24.5.11 编写控制面板applet 1102
24.6 小结 1102
第25章 多媒体技术 1113
25.1 图形设备接口 1113
25.1.1 Windows API和设备描述表 1114
25.1.2 理解TCanvas:C++Builaer接口 1114
25.1.3 自定义绘制 1116
25.1.4 模拟钟表例子 1118
25.2 图像支持 1118
25.2.1 Windows位图对象 1118
25.2.2 TBitmap类 1119
25.2.3 JPEG图像 1119
25.2.4 GIF图像 1120
25.2.5 PNG图像 1121
25.3 图像处理 1123
25.3.1 显示和获取图像信息 1124
25.3.2 使用TCanvas-〉Pixels读取单个像素值 1125
25.3.3 图像生成 1126
25.3.4 使用ScanLine快速读取像素值 1127
25.3.5 点操作:门限操作和彩色/灰度转换 1128
25.3.6 全局操作:柱状图均衡 1130
25.3.7 几何转换:缩放 1132
25.3.8 空间操作:平滑和边缘检测 1134
25.4 音频文件、视频文件和CD音乐 1136
25.4.1 媒体控制接口 1136
25.4.2 波形音频接口 1141
25.4.3 波形音频接口小结 1147
25.5 小结 1147
26.1 OpenGL介绍 1149
第26章 DirectX和OpenGL视级图形技术 1149
26.1.1 OpenGL和Direct3D 1150
26.1.2 OpenGL命令结构 1150
26.1.3 在C++Builder中使用OnIdle()循环绘制 1150
26.2 使用OpenGL 1150
26.2.1 步骤1:OpenGL初始化 1151
26.2.2 步骤2:用灯光和阴影设置绘制环境 1155
26.2.3 步骤3:三维变换 1157
26.2.4 步骤4:绘制图元 1158
26.2.5 步骤5:置换表面 1166
26.2.6 OpenGL例子程序 1166
26.2.7 OpenGL小结 1167
26.2.8 OpenGL参考 1167
26.3 DirectX简介 1167
26.4.1 初始化DirectDraw 1168
26.4 使用DirectDraw 1168
26.3.1 DirectX API的COM基础 1168
26.3.2 非对象DirectX函数 1168
26.4.2 为DirectDraw调整显示设置 1170
26.4.3 绘制表面 1171
26.4.4 在DirectDraw表面上使用GDI 1173
26.4.5 把位图装载到表面 1175
26.4.6 DirectDraw例子程序 1179
26.4.7 DirectDraw小结 1179
26.5 使用DirectSound 1179
26.5.1 初始化DirectSound对象 1180
26.5.2 创建从缓冲 1181
26.5.3 DirectSound例子程序--多种声音播放器 1187
26.6 深入DirectX 1187
26.8 小结 1188
26.7 DirectX参考 1188
第五部分 C++Builder应用程序部署 1189
第27章 创建帮助文件和文档 1189
27.1 技术文档编写101--快速编写的10个步骤 1190
27.2 文档类型 1190
27.3 在线文档的策略 1191
27.4 帮助格式 1194
27.5 WinHelp格式帮助文件:Windows标准 1194
27.5.1 帮助制作工具 1195
27.5.2 上下文帮助 1196
27.5.3 MS Help Workshop 1197
27.5.4 What’s This?具有重要作用珈入到C++Builder 1201
27.5.5 使用高级特性扩展帮助工程 1202
27.6 Microsoft HTML帮助文件 1202
27.7.2 帮助方法 1204
27.7.1 Help属性 1204
27.7 VCL中帮助属性和方法 1204
27.7.3 事件 1206
27.8 帮助制作工具资源 1206
27.8.1 书籍 1206
27.8.2 Internet上可以得到的帮助制作工具 1206
27.9 小结 1210
第28章 软件发布 1211
28.1 语言的国际化和本地化 1211
28.1.1 语言国际化综述 1211
28.1.2 Localize应用程序 1212
28.1.3 要记住的事情 1217
28.2 Resource DLL Wizard 1217
28.2.1 安如何工作 1217
28.2.2 如何创建资源DLL 1218
28.2.3 如何测试 1219
28.3 要安装的其他文件和程序 1220
28.3.1 应用程序文件 1220
28.3.2 发布的步骤 1222
28.4 版权和软件许可 1223
28.4.1 版权 1223
28.4.2 软件许可 1224
28.5 软件保护 1224
28.5.1 保护应用程序 1224
28.5.2 使用第三方组件保护应用程序经 1225
28.5.3 使用其他类型的组件保护应用程序 1226
28.5.4 关于软件保护的一些考虑 1227
28.6 共享件 1227
28.6.1 共享件以及如何保护 1227
28.7.2 客户支持 1229
28.7.1 Web站点 1229
28.7.3 广告 1229
28.6.2 实现软件保护方法 1229
28.6.3 共享件方法概括 1229
28.7 通过Internet发布和销售 1229
28.7.4 免费标语广告 1230
28.7.5 接受信用卡和提供解锁代码 1231
28.8 小结 1232
30.11.3 使用轮廓 1232
28.7.6 Internet销售提示 1232
29.1.1 安装程序制作工具 1233
第29章 软件安装与升级 1233
29.1 安装和卸载 1233
29.1.2 Install Maker 1234
29.1.3 卸载 1236
29.2 CAB和INF文件 1237
29.2.2 INF文件 1239
29.2.3 Internet上的文件包 1242
29.3 版本、升级和补丁 1245
29.3.1 版本 1245
29.3.2 应用程序的升级 1246
29.3.3 补丁 1247
29.3.4 Patch Maker 1247
29.4 版本控制和TeamSource 1249
29.3.5 有关升级和补丁的一些注意事项 1249
29.4.1 谁应该使用TeamSource 1250
29.4.2 为什么要用TeamSource 1250
29.4.3 什么时候应该用TeamSource 1250
29.4.4 在哪里可以使用TeamSource 1250
29.4.5 如何使用TeamSource 1251
29.4.6 TeamSource窗口 1255
29.4.7 版本控制工具 1257
29.4.9 锁 1258
29.4.8 书签 1258
29.5 使用InstallShield Express 1259
29.5.2 开始使用InstallShield 1259
29.5.1 安装InstallShield 1259
29.6 小结 1265
29.5.3 测试 1265
第六部分 编程技巧 1267
30.1 用Enter键模拟Tab键 1268
30.1.1 解决方案 1268
30.1.2 代码说明 1268
30.2.1 解决方案 1268
30.2.2 代码 1270
30.1.3 缺陷 1270
30.2.3 确定OS版本小结 1271
30.2 确定OS的版本 1271
30.1.4 Tab键模拟小结 1271
30.3.1 背景 1273
30.3 使用浮点数编程 1273
30.3.2 使用浮点数 1274
30.3.3 加法和减法 1275
30.3.4 执行算法的公式组合 1278
30.3.5 比较数据 1278
30.3.6 浮点数小结 1278
30.4 实现splash界面 1279
30.4.1 WinMain()函数 1279
30.4.2 创建Spalsh界面 1280
30.5 防止多个实例运行 1281
30.5.1 解决方案 1282
30.5.2 代码 1282
30.5.3 多个实例运行小结 1286
30.6 使用拖放操作 1286
30.6.1 解决方案 1287
30.6.2 代码 1287
30.6.3 程序是如何工作的 1289
30.6.4 拖放小结 1290
30.7 捕获屏幕 1290
30.7.1 Windows如何处理窗口 1290
30.7.2 解决方案 1291
30.7.3 捕获屏幕小结 1295
30.8 实现TJoyStick组件 1295
30.9 创建类Windows系统监视器的应用程序 1305
20.9.1 Windows系统资源 1305
30.9.2 解决方案 1307
30.10 检验探测程序 1313
30.9.3 系统监视器小结 1313
30.11 使用树形视组件 1320
30.11.1 树形视的基础 1320
30.11.2 增加节点 1321
30.11.4 导航树形视 1324
30.11.5 访问节点 1325
30.11.6 查找节点 1326
30.11.7 显示节点数目 1327
30.11.8 上移和下移节点 1328
30.11.9 实现拖放 1329
30.11.10 修改节点 1331
30.11.11 删除节点 1333
30.11.12 支持Undo和Redo删除 1334
30.12 实现图标抽取应用 1336
30.11.14 TTree小结 1336
30.11.13 保存树 1336
30.13 创建类Windows浏览器的应用程序 1342
30.13.1 Windows外壳函数和接口 1343
30.13.2 解决方案 1343
30.13.3 Windows Explorer小结 1348
30.14 使用NT服务 1349
30.14.1 SendMsg程序 1349
30.14.2 Stickums服务 1351
30.14.3 Stickem客户程序 1354
30.14.4 Windows服务小结 1355
30.15 使用加密技术 1355
30.15.1 解决方案 1355
30.15.2 文件编码 1358
30.15.3 文件解密 1363
30.16 创建世界昼夜时钟 1365
30.17 小结 1371
第31章 一个现实的例子 1372
31.1 检验World Wave Statistics程序 1372
31.2 检验源代码 1373
31.2.1 头文件math.h 1373
31.2.2 头文件mapunit.h 1374
31.2.3 头文件wavedata.h 1374
31.2.4 源代码文件about.cpp 1375
31.3 检验TMainUnit的代码 1375
31.4 进行某些改进 1379
31.5 小结 1381
第七部分 附录 1383
附录A 信息源 1383