第1章 引言 1
1.1 本书内容 1
第一部分 使用C++Builder编程 1
1.2 本书约定 2
1.3 开发支持 2
第2章 C++Builder编程 3
2.1 集成开发环境概述 3
2.2 设计应用程序 3
2.3 理解VCL 3
2.3.1 属性 3
2.3.2 方法 4
2.3.3 事件 4
2.4 VCL中的对象、组件与控件 4
2.4.2 TPersistent分支 5
2.4.3 TComponent分支 5
2.4.1 TObject分支 5
2.4.4 TControl分支 6
2.4.5 TWinControl分支 6
2.4.6 TControl的共同属性 7
2.4.7 TControl通用标准事件 8
2.4.8 TWinControl的共同属性 8
2.4.9 TWinControl的通用标准事件 9
2.4.11 使用组件 10
2.4.10 创建应用程序用户界面 10
2.4.12 VCL标准组件 11
2.5 使用帮助对象 19
2.5.1 使用列表 19
2.5.2 使用串列表 19
2.5.3 Windows注册表和INI文件 23
2.6 开发应用程序 25
2.6.1 编辑代码 25
2.6.3 发布应用程序 26
2.6.2 调试应用程序 26
第3章 创建应用程序、组件和程序库 27
3.1 创建应用程序 27
3.1.1 Windows应用程序 27
3.1.2 程序设计模板 28
3.1.3 控制台应用程序 28
3.1.4 服务应用程序 28
3.2 创建程序包和DLL 32
3.3 在C++Builder中使用DLL 33
3.4 在C++Builder中创建DLL 33
3.5 创建包含VCL组件的DLL 34
3.6 链接DLL 36
3.7 编写数据库应用程序 36
3.8 创建分布式应用程序 36
3.8.1 使用TCP/IP的分布式应用程序 36
3.8.2 使用COM和DCOM的分布式应用程序 37
3.8.3 使用CORBA的分布式应用程序 38
3.8.4 分布式数据库应用程序 38
3.9 使用数据模块和远程数据模块 38
3.9.1 创建及编辑数据模块 38
3.9.2 存取窗体的数据模块 39
3.9.3 向应用程序服务器工程中加入远程数据模块 39
3.10 使用对象仓库 39
3.10.1 在工程中共享对象 39
3.10.2 在对象仓库中加入对象 39
3.10.3 在小组环境中共享对象 39
3.10.4 在工程中使用对象仓库的对象 40
3.10.5 使用工程模板 40
3.10.6 修改共享对象 40
3.10.7 指定一个缺省工程、新窗体以及主窗体 41
4.1.3 隐藏主窗体 42
4.1.2 加入其他窗体 42
第4章 开发应用程序用户界面 42
4.1 理解TApplication、TScreen和TForm 42
4.1.1 使用主窗体 42
4.1.4 工作在应用程序层 43
4.1.5 处理屏幕 43
4.1.6 管理布局 43
4.2 处理消息 44
4.3 窗体的更多细节 44
4.3.1 控制窗体何时驻留内存 44
4.3.2 给窗体传递其他参数 46
4.3.3 从窗体获取数据 46
4.4 重用组件和组件组 49
4.5 创建并使用组件模板 49
4.6 使用框架 50
4.6.1 创建框架 50
4.6.2 使用并修改框架 50
4.7 创建并管理菜单 51
4.6.3 共享框架 51
4.7.1 打开菜单设计器 52
4.7.2 创建菜单 53
4.7.3 在对象观察器中编辑菜单项 55
4.7.4 使用菜单设计器上下文菜单 56
4.7.5 使用菜单模板 57
4.7.6 将菜单保存为菜单模板 57
4.7.7 在运行时控制菜单项 58
4.7.8 合并菜单 58
4.7.9 引入资源文件 59
4.8 设计工具栏和酷栏 59
4.8.1 使用面板组件增加工具栏 59
4.8.2 使用工具栏组件增加工具栏 61
4.8.3 增加酷栏组件 62
4.8.6 隐藏和显示工具栏 63
4.8.4 响应点击 63
4.8.5 增加隐藏的工具栏 63
4.9 使用动作列表 64
4.9.1 动作对象 64
4.9.2 使用动作 65
4.9.3 预定义动作类 67
4.9.4 编写动作组件 68
第5章 应用控件 71
5.1 实现控件拖放操作 71
5.1.1 开始拖动操作 71
5.1.2 接受拖动项 71
5.1.3 放下项 72
5.1.4 终止拖动操作 72
5.1.5 通过拖动对象定制拖放操作 72
5.2.2 使控件成为一个可停靠子控件 73
5.2.3 控制子控件如何被停放 73
5.2 实现控件的拖动-停靠操作 73
5.2.1 使窗口控件成为一个停靠点 73
5.1.6 改变拖动鼠标指针 73
5.2.4 控制子控件如何取消停靠 74
5.2.5 控制子控件如何响应拖动-停靠操作 74
5.3 处理控件中的文本 74
5.3.1 设置文本对齐方式 75
5.3.2 在运行时增加滚动条 75
5.3.3 增加剪贴板对象 75
5.3.4 选择文本 76
5.3.5 选定全部文本 76
5.3.6 剪切、拷贝及粘贴文本 76
5.3.7 删除选定文本 76
5.3.10 处理OnPopup事件 77
5.3.8 禁用菜单项 77
5.3.9 提供弹出式菜单 77
5.4 在控件中加入图形 78
5.4.1 指定控件为属主绘制控件 78
5.4.2 给串列表增加图形对象 79
5.4.3 调整属主绘制项的大小 80
5.4.4 绘制各属主绘制项 81
第6章 使用图形和多媒体 82
6.1 图形编程概述 82
6.1.1 刷新屏幕 82
6.1.2 图形对象的样式 83
6.1.3 画布的通用属性和方法 83
6.1.4 使用Canvas对象的属性 84
6.1.5 使用Canvas的方法来绘制图形对象 87
6.1.6 在应用程序中处理多个绘图对象 89
6.1.7 在图形中绘制 93
6.1.8 加载和保存图形文件 95
6.1.9 使用剪贴板处理图形 96
6.1.10 拖引线示例 97
6.2 使用多媒体 101
6.2.1 将无声的视频剪辑加入应用程序 102
6.2.2 将声音和/或视频剪辑加入应用程序 103
第7章 编写多线程应用程序 105
7.1 定义线程对象 105
7.1.1 初始化线程 106
7.1.2 编写线程函数 106
7.1.3 编写清理代码 108
7.2 协调线程 108
7.2.1 避免同时访问 108
7.2.2 等待其他线程 110
7.4 调试多线程应用程序 111
7.3.2 开始和停止线程 111
7.3.1 重载缺省优先级 111
7.3 执行线程对象 111
第8章 异常处理 113
8.1 C++异常处理 113
8.1.1 异常处理的ANSI规定 113
8.1.2 异常处理语法 113
8.1.3 声明异常 114
8.1.4 发送异常 114
8.1.5 处理异常 117
8.1.6 异常规范 119
8.1.7 异常处理的构造和析构 120
8.1.8 未处理的异常 120
8.1.9 设置异常处理选项 120
8.2 Win32下的结构异常 121
8.2.1 结构异常的语法 121
8.2.3 异常过滤器 122
8.2.2 处理结构异常 122
8.2.4 在C++中混用结构异常 124
8.2.5 定义异常 125
8.2.6 引发异常 125
8.2.7 终止块 126
8.3 VCL异常处理 127
8.3.1 C++和VCL异常处理之间的差别 127
8.3.2 处理操作系统异常 128
8.3.3 处理VCL异常 128
8.3.4 VCL异常类 128
8.3.5 可移植性考虑 130
第9章 VCL的C++语言支持 131
9.1 C++和Object Pascal对象模型 131
9.1.1 对象本身和实例 131
9.1.2 C++Builder中VCL类的对象构造 132
9.1.3 在基类构造函数调用虚拟方法 134
9.1.4 对象析构 136
9.1.5 AfterConstruction和BeforeDestruction 137
9.1.6 类虚拟函数 137
9.2 Object Pascal数据类型和语言概念的支持 138
9.2.1 Typedefs 138
9.2.2 支持Object Pascal语言的类 138
9.2.3 Object Pascal语言的C++语言对应 138
9.2.4 动态数组 139
9.2.5 定义不同的类型 141
9.2.6 资源字符串 141
9.2.7 缺省参数 142
9.2.8 运行时类型信息 142
9.2.9 未映射的类型 143
9.2.10 关键字扩展 144
9.2.11 __declspec关键字扩展 145
第10章 使用包和组件 147
10.1 为什么使用包 147
10.2 运行时包 147
10.2.1 在应用程序中使用运行时包 147
10.2.2 动态装载包 148
10.2.3 决定使用哪个运行时包 148
10.2.4 定制包 148
10.3 设计时包 149
10.4 创建和编辑包 150
10.4.1 创建包 150
10.4.2 编辑现有的包 150
10.4.3 包源文件和工程选项文件 151
10.4.4 理解包的结构 152
10.4.5 编译包 152
10.5.3 包集文件 154
10.5.2 将包发布给其他开发者 154
10.5 发布包 154
10.5.1 发布使用包的应用程序 154
第11章 创建国际化的应用程序 156
11.1 国际化和本地化 156
11.1.1 国际化 156
11.1.2 本地化 156
11.2 国际化应用程序 156
11.2.1 应用程序代码 156
11.2.2 设计用户界面 160
11.2.3 分离资源 160
11.2.4 创建资源DLL 160
11.2.5 使用资源DLL 161
11.2.6 动态切换资源DLL 162
11.3 本地化应用程序 162
12.1 发布一般应用程序 163
第12章 发布应用程序 163
12.2 发布数据库应用程序 165
12.2.1 提供数据库引擎 165
12.2.1 多级分布式应用程序服务 166
12.3 发布Web应用程序 166
12.4 为各种主机环境编程 166
12.4.1 屏蔽分辨率和颜色浓度 167
12.4.2 字体 168
12.4.3 Windows版本 168
12.5 软件许可证要求 168
12.5.1 DEPLOY.TXT 168
12.5.2 README.TXT 169
12.5.3 No-nonsense许可协议 169
12.5.4 第三方的产品文档 169
13.1 使用数据库 171
13.1.1 数据库类型 171
第二部分 开发数据库应用程序 171
第13章 设计数据库应用程序 171
13.1.2 数据库安全 172
13.1.3 事务 173
13.1.4 数据字典 173
13.1.5 引用完整性、存储过程和触发器 174
13.2 数据库结构 174
13.2.1 可扩展性规划 175
13.2.2 一级数据库应用程序 176
13.2.3 二级数据库应用程序 176
13.2.4 多级数据库应用程序 177
13.3 设计用户接口 178
13.3.1 显示单条记录 178
13.3.2 显示多条记录 178
13.3.4 选择要显示的数据 179
13.3.3 分析数据 179
13.3.5 编写报表 180
第14章 开发一级与二级应用程序 181
14.1 基于BDE的应用程序 181
14.1.1 基于BDE(应用程序)结构 181
14.1.2 数据库连接 183
14.1.3 使用事务 183
14.1.4 缓存更新 186
14.1.5 创建及重组数据表 187
14.2 基于ADO的应用程序 187
14.2.1 基于ADO的应用程序结构 187
14.2.2 连接到ADO数据库 188
14.2.3 获取数据 188
14.2.4 创建并重组ADO数据库表 188
14.3.1 创建数据集 189
14.3 flat-file数据库应用程序 189
14.3.2 装载和存储数据 191
14.3.3 使用公文包模式 191
14.4 扩充为三级应用程序 192
第15章 创建多级应用程序 193
15.1 多级数据库模式优点 193
15.2 理解MIDAS技术 193
15.2.1 基于MIDAS的多级应用程序概述 194
15.2.2 客户端应用程序结构 194
15.2.3 应用程序服务器结构 195
15.2.4 选择连接协议 198
15.3 创建多级应用程序 199
15.4 创建应用程序服务器 199
15.4.1 设置远程数据模块 200
15.5 创建客户端应用程序 202
15.4.3 扩展应用程序服务器接口 202
15.4.2 为应用程序服务器创建一个数据提供者 202
15.5.1 连接应用程序服务器 203
15.5.2 管理服务器连接 205
15.5.3 调用服务器接口 205
15.6 在多级应用程序中管理事务 206
15.7 支持主/明细关系 206
15.8 支持远程数据模块的状态信息 207
15.9 编写MIDAS Web应用程序 208
15.9.1 将客户端应用程序以ActiveX控件形式分发 209
15.9.2 使用InternetExpress创建Web应用程序 209
15.9.3 使用XML代理 211
15.9.4 使用MIDAS页生成器创建Web页面 213
第16章 使用提供者组件 216
16.1 确定数据源 216
16.2 选择如何进行更新 216
16.3.1 指定出现在数据包里的字段 217
16.3.2 设置影响数据包的选项 217
16.3 控制包括在数据包里的信息 217
16.3.3 加入定制信息到数据包 218
16.4 响应客户端数据请求 219
16.5 响应客户端更新请求 219
16.5.1 在更新数据库前编辑delta包 220
16.5.2 影响更新如何被应用 220
16.5.3 屏显单独的更新 221
16.5.4 在提供者端解决更新错误 221
16.5.5 对不仅涉及单一数据表格的数据集应用更新 222
16.6 响应客户端产生的事件 222
16.7 处理服务器限制 222
第17章 管理数据库会话 224
17.1 使用一个session组件 224
17.1.1 使用缺省session 224
17.1.2 创建额外的session 225
17.1.3 为session命名 226
17.1.4 启动session 226
17.1.5 定制session的启动方式 227
17.1.6 指定缺省的数据库连接方式 227
17.1.7 创建、打开和关闭数据库连接 227
17.1.8 取消临时数据库连接 228
17.1.9 搜索数据库连接 228
17.1.10 取得有关session的信息 229
17.1.11 使用BDE别名 230
17.1.12 迭代一个session的数据库组件 231
17.1.13 指定Paradox目录位置 232
17.1.14 使用有口令保护Paradox和dBASE表 232
17.2 管理多个session 234
17.3 在数据模块中使用session组件 235
18.1.1 使用临时数据库组件 236
18.1.2 在设计时创建数据库组件 236
第18章 连接到数据库 236
18.1 理解永久和临时数据库组件 236
18.1.3 在运行时创建数据库组件 237
18.2 控制连接 237
18.2.1 关联数据库组件与session 238
18.2.2 指定一个BDE别名 238
18.2.3 设置BDE别名参数 239
18.2.4 控制服务器登录 239
18.2.5 连接到数据库服务器 240
18.2.6 连接到远程服务器时的特别考虑 240
18.2.7 关闭与数据库服务器的连接 241
18.2.8 关闭数据集但不关闭与服务器的连接 241
18.2.9 迭代数据库组件的数据集 241
18.5 从TDatabase组件中执行SQL语句 242
18.5.1 从TDatabase执行SQL语句 242
18.4 在数据模块中使用数据库组件 242
18.3 理解数据库与session组件的交互 242
18.5.2 执行参数化的SQL语句 243
第19章 理解数据集 245
19.1 什么是TDataSet 245
19.2 数据集类型 246
19.3 打开和关闭数据集 246
19.4 确定和设置数据集状态 247
19.4.2 浏览一个数据集 248
19.4.1 关闭数据集 248
19.4.3 允许编辑数据集 249
19.4.4 允许插入新的记录 250
19.4.5 允许对数据表做索引搜索和取范围 250
19.4.6 计算字段 250
19.4.7 过滤记录 251
19.4.8 更新记录 251
19.5 浏览数据集 251
19.5.1 使用First和Last方法 251
19.5.4 使用Eof和Bof属性 252
19.5.2 使用Next和Prior方法 252
19.5.3 使用MoveBy方法 252
19.5.5 标记并返回到记录位置 254
19.6 搜索数据集 255
19.6.1 使用Locate 255
19.6.2 使用Lookup 256
19.7 使用过滤器显示和编辑一个数据子集 256
19.7.1 打开和关闭过滤器 257
19.7.2 创建过滤器 257
19.7.3 设置过滤器属性 257
19.7.4 编写一个OnFilterRecord事件处理程序 258
19.7.5 设置过滤器选项 258
19.7.6 浏览过滤后的数据集记录 259
19.8 修改数据 260
19.8.1 编辑记录 260
19.8.3 删除记录 261
19.8.2 加入新的记录 261
19.8.4 把数据写入数据库 262
19.8.5 取消改动 262
19.8.6 修改整条记录 262
19.9 使用数据集事件 263
19.9.1 终止一个方法 263
19.9.2 使用OnCalcFields 264
19.10 使用基于BDE的数据集 264
19.10.1 基于BDE的功能概述 265
19.10.2 处理数据库和session连接 265
19.10.3 使用缓存更新 266
19.10.4 缓存BLOB 267
第20章 使用字段组件 268
20.1 理解字段组件 269
20.1.1 动态字段组件 269
20.2 创建永久字段 270
20.1.2 永久字段组件 270
20.4 定义新的永久字段 271
20.3 排列永久字段 271
20.4.1 定义一个数据字段 272
20.4.2 定义一个计算字段 272
20.4.3 编写计算字段的程序代码 273
20.4.4 定义一个查找字段 273
20.4.5 定义一个合计字段 274
20.4.6 删除永久字段组件 275
20.5 设置永久字段的属性和事件 275
20.5.1 在设计时设置显示和编辑属性 275
20.5.2 在运行时设置字段组件的属性 276
20.5.3 创建字段组件的属性集 276
20.5.5 删除关联属性 277
20.5.5 控制和屏蔽用户输入 277
20.5.4 关联数据集到字段组件 277
20.5.7 为数值、日期和时间字段使用缺省格式 278
20.5.8 处理事件 278
20.6 运行时使用字段组件的方法 279
20.7 显示、转换和存取字段值 279
20.7.1 在标准控件中显示字段组件值 279
20.7.2 转换字段值 280
20.7.3 使用缺省数据集属性存取字段值 281
20.7.4 使用数据集的Fields属性存取字段值 281
20.7.5 使用数据集的FieldByName方法存取方法 281
20.8 检查字段的当前值 282
20.9 设置字段的缺省值 282
20.10 使用限制 282
20.10.1 创建定制限制 282
20.10.2 使用服务器限制 282
20.11.1 显示ADT和数组字段 283
20.11 使用对象字段 283
20.11.2 使用ADT字段 284
20.11.3 使用数组字段 285
20.11.4 使用数据集字段 285
20.11.5 使用引用字段 286
第21章 使用数据表 287
21.1 使用数据表组件 287
21.2 设置数据表组件 287
21.2.1 指定数据库位置 287
21.2.2 指定数据表名 288
21.2.3 为本地数据表指定数据表类型 288
21.2.4 打开、关闭数据表 289
21.3 控制对数据表的读/写访问 289
21.4 搜索记录 290
21.5.2 使用IndexName指定索引 292
21.5.1 使用GetIndexNames方法取得可用的索引列表 292
21.5 排序记录 292
21.5.3 为SQL数据表指定排序顺序 293
21.5.4 检查索引的字段列表 294
21.6 使用数据子集 294
21.6.1 理解范围和过滤器的不同 294
21.6.2 创建和应用一个新的范围 295
21.6.3 修改范围 297
21.7 删除一个数据表中的所有记录 297
21.8 删除数据表 298
21.9 重命名数据表 298
21.10 创建数据表 298
21.11 从另一个数据表导入数据 299
21.12 使用TBatchMove 300
21.12.1 创建批移动组件 300
21.12.2 指定批移动模式 301
21.12.5 处理批移动错误 302
21.12.3 映射数据类型 302
21.12.4 执行批移动 302
21.13 链接到相同数据库表的同步数据表 303
21.14 创建主/明细表 303
21.15 使用嵌套数据表 304
第22章 使用查询 306
22.1 有效地使用查询 306
22.1.1 对桌面数据库开发者使用查询 306
22.1.2 对数据库服务器开发者使用查询 307
22.2 使用查询组件能够存取什么数据库 307
22.3 使用查询组件概述 307
22.4 指定要执行的SQL语句 308
22.4.1 在设计时指定SQL属性 309
22.4.2 在运行时指定SQL语句 309
22.5 设置参数 310
22.5.2 在运行时提供参数 311
22.5.1 在设计时提供参数 311
22.5.3 使用数据源绑定参数 312
22.6 执行查询 312
22.6.1 在设计时执行查询 313
22.6.2 在运行时执行查询 313
22.7 准备查询 314
22.8 取消查询准备以释放资源 314
22.9 创建异类查询 314
22.10 提高查询性能 315
22.11 使用结果集 315
22.11.1 允许编辑结果集 315
22.11.2 对可用结果集的本地SQL要求 316
22.11.3 对可用结果集的远程服务器SQL要求 316
22.11.4 更新可用结果集的限制 316
22.11.5 更新只读结果集 316
23.1 何时使用存储过程 317
第23章 使用存储过程 317
23.2 使用存储过程 318
23.2.1 创建存储过程组件 318
23.2.2 创建存储过程 318
23.2.3 准备和执行存储过程 319
23.2.4 使用返回结果集的存储过程 319
23.2.5 使用以参数返回数据的存储过程 320
23.2.6 使用在数据上执行操作的存储过程 321
23.3 理解存储过程的参数 323
23.3.1 使用输入参数 323
23.3.2 使用输出参数 323
23.3.3 使用输入/输出参数 324
23.3.4 使用结果参数 324
23.3.5 在设计时访问参数 324
23.3.7 在运行时创建参数 325
23.3.6 在设计时设置参数信息 325
23.3.8 绑定参数 326
23.4 在设计时查看参数信息 326
23.5 使用Oracle重载存储过程 327
第24章 使用ADO组件 328
24.1 ADO组件概况 328
24.2 连接到ADO数据仓库 329
24.2.1 使用TADOConnection连接到数据仓库 329
24.2.2 调整连接 331
24.2.3 列出数据表和存储过程 332
24.2.4 使用(连接)事务 334
24.3 使用ADO数据集 334
24.3.1 所有ADO数据集组件的共有特点 335
24.3.2 使用TADODataSet 339
24.3.3 使用TADOTable 340
24.3.4 使用TADOQuery 341
24.3.5 使用TADOStoredProc 342
24.4 执行命令 344
24.4.1 指定命令 344
24.4.2 使用Execute方法 345
24.4.3 取消命令 345
24.4.4 使用命令获取结果集 345
24.4.5 处理命令参数 346
第25章 创建和使用客户端数据集 347
25.1 使用客户端数据集处理数据 347
25.1.1 在客户端数据集中浏览数据 347
25.1.2 限制记录显示 347
25.1.3 描述主/明细关系 348
25.1.4 限制数据值 348
25.1.5 设置只读数据 348
25.1.6 编辑数据 349
25.1.7 排序和索引 350
25.1.8 表示计算值 351
25.1.9 使用被维护的合计 352
25.1.10 加入特定应用程序信息到数据 354
25.2 从另一个数据集复制数据 354
25.2.1 直接指定数据 354
25.2.2 复制一个客户端数据集指针 355
25.3 使用带有数据提供者的客户端数据集 355
25.3.1 指定数据提供者 355
25.3.2 从应用程序服务器得到参数 356
25.3.3 传送参数给应用程序服务器 356
25.3.4 重载应用程序服务器上的数据集 357
25.3.5 从应用程序服务器请求数据 357
25.3.6 处理限制 358
25.3.7 更新记录 359
25.3.9 使用定制事件与提供者通信 361
25.3.8 刷新记录 361
25.4 使用带有flat-file数据的客户端数据集 362
25.4.1 创建新的数据集 362
25.4.2 从文件或数据流中装载数据 362
25.4.3 合并更新到数据 363
25.4.4 存储数据到文件或数据流 363
第26章 使用缓存更新 364
26.1 决定何时使用缓存更新 364
26.2 使用缓存更新概述 364
26.2.1 允许和禁用缓存更新 365
26.2.2 提取记录 365
26.2.3 应用缓存更新 366
26.2.4 取消未定的缓存更新 368
26.2.5 撤消删除缓存记录 369
26.2.6 指定缓存中的可视记录 369
26.2.7 检查更新状态 370
26.3 使用更新对象来更新数据集 371
26.3.1 为数据集指定UpdateObject属性 371
26.3.2 为更新组件创建SQL语句 372
26.3.3 执行更新语句 375
26.3.4 使用数据集组件更新数据集 377
26.4 更新只读结果集 377
26.5 控制更新处理 378
26.5.1 决定是否需要控制更新处理 378
26.5.2 创建一个OnUpdateRecord事件处理程序 378
26.6 处理缓存更新错误 379
26.6.1 引用要应用更新的数据集 380
26.6.2 指明产生错误的更新类型 380
26.6.3 指定要执行的动作 380
26.6.4 使用错误消息文本 381
26.6.5 访问字段的OldValue、New Value和Cur Value属性 381
27.1 使用通用的数据控件特征 383
第27章 使用数据控件 383
27.1.2 编辑并更新数据 384
27.1.1 关联数据控件与数据集 384
27.1.3 禁止和允许数据显示 385
27.1.4 刷新数据显示 385
27.1.5 允许鼠标、键盘及定时器事件 386
27.2 使用数据源 386
27.2.1 使用TDataSource属性 386
27.2.2 使用TDataSource事件 387
27.3 显示单个字段的控件 388
27.3.1 以标签显示数据 388
27.3.2 在编辑框中显示和编辑字段 388
27.3.3 在备注控件中显示和编辑文本 388
27.3.5 显示并且编辑在图像控件中的图形 389
27.3.6 在列表框和组合框中显示和编辑数据 389
27.3.4 在rich edit备注控件中显示和编辑文本 389
27.3.7 在查找列表和组合框中显示和编辑数据 390
27.3.8 使用复选框处理布尔型字段值 392
27.3.9 使用单选组控件限制字段值 392
27.4 使用TDBGrid查看与编辑数据 393
27.4.1 使用缺省状态的网格控件 393
27.4.2 创建定制网格 394
27.4.3 显示ADT和数组字段 397
27.4.4 设置网格选项 398
27.4.5 在网格中编辑 399
27.4.6 在设计时对列重排序 400
27.4.7 在运行时对列重排序 400
27.4.8 在运行时响应用户动作 400
27.5 创建包含其他数据感知控件的网格 401
27.6 导航和操作记录 402
27.6.1 选择显示浏览器按钮 402
27.6.3 多个数据集使用一个浏览器 403
27.6.2 显示飞出式帮助 403
第28章 使用决策支持组件 405
28.1 概述 405
28.2 关于crosstabs 406
28.2.1 一维的crosstabs 406
28.2.2 多维的crosstabs 406
28.3 使用决策支持组件指南 406
28.4 使用决策支持组件的数据集 407
28.4.1 使用TQuery或TTable创建决策数据集 407
28.4.2 使用Decision Query编辑器创建决策数据集 408
28.4.3 决策查询的属性 408
28.5 使用决策立方 408
28.5.1 决策立方的属性和事件 408
28.6 使用决策源 409
28.5.2 使用Decision Cube编辑器 409
28.7 使用决策控制轴 410
28.8 创建和使用决策网络 410
28.8.1 创建决策网络 411
28.8.2 使用决策网格 411
28.8.3 决策网格属性 411
28.9 创建和使用决策图 412
28.9.1 创建决策图 412
28.9.2 使用决策图 412
28.9.3 决策图显示 413
28.9.4 定制决策图 413
28.10 运行时的决策支持组件 415
28.10.1 运行时的决策控制轴 415
28.11.2 设置维状态 416
28.11 决策支持组件和内存控制 416
28.11.1 设置最大维、合计及单元 416
28.10.3 运行时的决策图 416
28.10.2 运行时的决策网格 416
28.11.3 使用分页维 417
第三部分 编写分布式应用程序 419
第29章 编写CORBA应用程序 419
29.1 CORBA应用程序概述 419
29.1.1 了解存根和框架 420
29.1.2 使用聪明代理 420
29.1.3 激活服务器应用程序 421
29.1.4 动态绑定接口调用 421
29.2 编写CORBA服务程序 421
29.2.1 定义对象的接口 421
29.2.2 使用CORBA服务器向导 422
29.2.3 从IDL文件生成存根和框架 422
29.2.4 使用CORBA对象的实现向导 423
29.2.5 实现CORBA对象 424
29.2.6 改变CORBA接口 426
29.2.7 注册服务器接口 427
29.3 编写CORBA客户程序 427
29.3.1 使用存根 427
29.3.2 使用动态调用接口 428
29.4 测试CORBA服务器 429
29.4.1 建立测试工具 429
29.4.2 记录和运行测试的脚本 430
第30章 创建Internet服务器应用程序 431
30.1 术语和标准 431
30.1.1 统一资源定位符URL的构成 431
30.1.2 HTTP请求报文头信息 432
30.2 HTTP服务器的活动 432
30.2.1 构造客户请求 432
30.2.2 处理客户请求 432
30.3 Web服务器应用程序 433
30.3.1 Web服务器应用程序的分类 433
30.2.3 响应客户请求 433
30.3.2 创建Web服务器应用程序 434
30.3.3 Web模块 434
30.3.4 Web应用程序对象 435
30.4 Web服务器应用程序的结构 435
30.5 Web派发器 435
30.5.1 为派发器添加处理项 436
30.5.2 派发请求报文 436
30.6 处理项 436
30.6.1 确定处理项的触发时间 436
30.6.2 利用处理项响应客户请求 437
30.7 访问客户请求的信息 438
30.7.1 包含了请求报文头信息的属性 438
30.7.2 HTTP请求报文的内容 439
30.8 创建HTTP响应报文 439
30.8.2 设置报文的内容 440
30.8.1 填写响应报文的头 440
30.8.3 发送应答信息 441
30.9 生成响应报文的内容 441
30.10 在响应报文中使用数据库信息 444
30.10.1 给Web模块添加一个会话 444
30.10.2 用HTML表示数据库的信息 444
30.11 调试服务器应用程序 446
30.11.1 调试ISAPI和NSAPI应用程序 446
30.11.2 调试CGI和Win-CGI应用程序 448
第31章 使用套接字 450
31.1 实现服务 450
31.1.1 理解服务协议 450
31.1.2 服务和端口 450
31.3.1 说明主机 451
31.3 说明套接字 451
31.2.3 服务器连接 451
31.2.2 侦听连接 451
31.2 套接字连接的类型 451
31.2.1 客户连接 451
31.3.2 使用端口 452
31.4 使用套接字组件 452
31.4.1 使用客户套接字 452
31.4.2 使用服务器套接字 453
31.5 响应套接字的事件 454
31.5.1 出错事件 454
31.5.2 客户事件 454
31.5.3 服务器事件 455
31.6 通过套接字连接读写数据 455
31.6.1 非阻塞连接 455
31.6.2 阻塞连接 456
第四部分 开发基于COM的应用程序 459
第32章 COM技术概述 459
32.1.1 COM接口 460
32.1 COM应用程序的构成 460
32.1.2 COM服务器 461
32.1.3 COM客户 463
32.2 COM扩展 464
32.2.1 自动化服务器 465
32.2.2 活动服务器页 465
32.2.3 ActiveX控件 466
32.2.4 活动文档 466
32.2.5 事务对象 466
32.2.6 类型库 467
32.3 使用向导实现COM对象 469
第33章 使用类型库 473
33.1 类型库编辑器 473
33.1.1 类型库编辑器的部件 473
33.1.2 类型库元素 477
33.1.3 使用类型库编辑器 478
33.2 发布类型库 484
第34章 创建COM客户程序 486
34.1 引入类型库信息 486
34.1.1 使用Import Type Library对话框 487
34.1.2 使用Import ActiveX对话框 487
34.1.3 引入类型库信息后生成的代码 488
34.2 控制引入的对象 489
34.2.2 使用组件包装器 489
34.2.2 使用数据感知的Active X控件 490
34.2.3 使用Microsoft Word打印文档的例子 491
34.2.4 编写基于类型库定义的客户代码 493
34.3 为没有类型库的服务器创建客户程序 495
35.1 创建COM对象概述 496
35.2 设计COM对象 496
第35章 创建简单的COM服务器程序 496
35.3 使用COM对象向导 497
35.4 使用自动化对象向导 497
35.5 指定ATL选项 500
35.6 定义COM对象接口 500
35.6.1 为对象接口添加属性 501
35.6.2 给对象接口添加方法 501
35.6.3 提供客户事件 501
35.7 自动化接口 502
35.7.1 双向接口 502
35.7.2 派发接口 503
35.7.3 自定义接口 503
35.8 调度数据 503
35.8.1 自动化兼容的类型 503
35.9.1 注册进程内服务器 504
35.9 注册COM对象 504
35.8.3 自定义调度 504
35.8.2 自动化调度的类型限制 504
35.9.2 注册进程外服务器 505
35.10 调试应用程序 505
第36章 创建活动服务器页 506
36.1 创建活动服务器对象 506
36.1.1 使用ASP本征 507
36.1.2 为进程内或进程外服务器创建ASP 510
36.2 注册活动服务器对象 510
36.2.1 注册一个进程内服务器 510
36.2.2 注册一个进程外服务器 510
36.3 测试和调试活动服务器页应用程序 510
第37章 创建ActiveX控件 512
37.1 创建ActiveX控件概述 512
37.2 设计ActiveX控件 513
37.3 从VCL控件生成ActiveX控件 514
37.4 创建基于VCL窗体的ActiveX控件 515
37.5 ActiveX控件的许可证控制 515
37.6 自定义ActiveX控件接口 516
37.6.1 添加附加的属性、方法和事件 517
37.6.2 使简单数据与类型库的绑定 518
37.7 为ActiveX控件创建属性页 520
37.7.1 创建属性页 520
37.7.2 向属性页添加控件 520
37.7.3 把属性页与ActiveX控件的属性关联 521
37.7.4 把属性页与ActiveX控件关联 521
37.8 注册ActiveX控件 522
37.9 测试ActiveX控件 522
37.10 在网络上发布ActiveX控件 522
第38章 创建MTS或COM+对象 524
38.1 理解事务对象 524
38.2.1 访问对象的前后关系 525
38.2 管理资源 525
38.2.2 及时激活 526
38.2.3 资源共享 526
38.2.4 对象共享 529
38.3 MTS和COM+的事务支持 530
38.3.1 事务的特性 530
38.3.2 状态相关和状态无关对象 531
38.3.3 影响事务如何结束 531
38.3.4 初始化事务 532
38.3.5 事务超时 534
38.4 基于角色的安全性 534
38.5 创建事务对象概述 535
38.6 使用事务对象向导 535
38.7 生成COM+事件 537
38.7.1 使用事件对象向导 537
38.8 传递对象指针 538
38.7.2 使用COM+事件对象激发事件 538
38.9 调试和测试事务对象 539
38.10 安装事务对象 539
38.11 管理事务对象 540
第五部分 创建定制组件 541
第39章 组件创建概述 541
39.1 可视组件库 541
39.2 组件和类 542
39.3 如何创建组件 542
39.3.1 修改已有的控件 542
39.3.2 创建窗口控件 543
39.3.3 创建图形控件 543
39.3.4 子类Windows控件 543
39.3.5 创建不可视组件 543
39.4 组件内部有什么 543
39.4.2 属性、方法和事件 544
39.4.1 消除相关性 544
39.4.3 图形封装 545
39.4.4 注册 545
39.5 创建新组件 545
39.5.1 使用组件向导 546
39.5.2 手工创建组件 547
39.6 测试未安装的组件 549
39.7 测试已安装的组件 551
39.8 安装组件到组件面板 551
39.8.1 定位组件文件 552
39.8.2 添加组件 552
第40章 组件开发员的面向对象编程 553
40.1 定义新类 553
40.1.1 派生新类 553
40.3 控制访问 554
40.2 祖先、后代和类层次结构 554
40.1.2 声明新组件类 554
40.3.1 隐藏实现细节 555
40.3.2 定义组件开发员接口 557
40.3.3 定义运行时接口 557
40.3.4 定义设计时接口 557
40.4 派发方法 557
40.4.1 常规方法 558
40.4.2 虚拟方法 558
40.5 抽象类成员 559
40.6 类与指针 559
第41章 创建属性 560
41.1 为什么要创建属性 560
41.2 属性的类型 560
41.4 定义属性 561
41.4.1 属性声明 561
41.3 发布继承的属性 561
41.4.2 内部数据存储 562
41.4.3 直接访问 562
41.4.4 访问方法 562
41.4.5 缺省属性值 564
41.5 创建数组属性 565
41.6 存储和载入属性 565
41.6.1 使用存储-载入机制 566
41.6.2 指定缺省值 566
41.6.3 决定存储内容 567
41.6.4 载入后的初始化 567
41.6.5 存储和载入未发布的属性 567
42.1.1 事件是closure 569
42.1.2 事件是属性 569
第42章 创建事件 569
42.1 什么是事件 569
42.1.3 事件类型是closure类型 570
42.1.4 事件处理程序是可选的 570
42.2 实现标准事件 571
42.2.1 标识标准事件 571
42.2.2 使事件可见 571
42.3.1 触发事件 572
42.3.2 定义处理程序类型 572
42.3 定义你自己的事件 572
42.2.3 改变标准的事件处理 572
42.3.3 声明事件 573
42.3.4 调用事件 573
第43章 创建方法 575
43.1 避免相关性 575
43.2 命名方法 575
43.5 声明方法 576
43.4 虚拟方法 576
43.3.1 应为public的方法 576
43.3 保护方法 576
43.3.2 应为protected的方法 576
第44章 在组件中使用图形 578
44.1 图形概述 578
44.2 使用画布 579
44.3 使用图片 579
44.3.1 使用图片、图形或画布 579
44.3.2 载入和存储图形 580
44.3.3 处理调色板 580
44.4 幕后位图 581
44.4.1 创建和管理幕后位图 581
44.4.2 拷贝幕后位图 581
44.5 响应改变 581
45.1 理解消息处理系统 583
45.1.1 Windows消息中有什么 583
第45章 处理消息 583
45.1.2 派发消息 584
45.2 修改消息处理 584
45.2.1 重载处理器方法 584
45.2.2 使用消息参数 585
45.2.3 屏蔽消息 585
45.3 创建新的消息处理器 586
45.3.1 定义自己的消息 586
45.3.2 声明一个新的消息处理方法 587
第46章 使组件在设计时可用 588
46.1 注册组件 588
46.1.1 声明Register函数 588
46.1.2 编写Register函数 588
46.2 添加组件面板位图 590
46.3 为你的组件提供帮助 590
46.4.1 派生属性编辑器类 592
46.4 添加属性编辑器 592
46.4.2 将属性作为文本进行编辑 593
46.4.3 将属性作为整体进行编辑 593
46.4.4 指定编辑器特性 594
46.4.5 注册属性编辑器 594
46.5 添加组件编辑器 595
46.5.1 向上下文菜单添加项目 595
46.5.2 改变双击时的行为 596
46.5.3 添加剪贴板格式 597
46.5.4 注册组件编辑器 597
46.6 属性范畴 598
46.6.1 一次注册一个属性 598
46.6.2 一次注册多个属性 598
46.6.3 属性范畴类 598
46.6.4 使用IsPropertyInCategory函数 599
46.7 将组件编译成软件包 599
46.8 解决定制组件问题 600
第47章 修改已有的组件 601
47.1 创建和注册该组件 601
47.2 修改组件类 602
47.2.1 重载构造函数 602
47.2.2 指定新的缺省属性值 603
第48章 创建图形组件 604
48.1 创建和注册组件 604
48.2 发布继承的属性 605
48.3 添加图形能力 605
48.3.1 决定画什么 605
48.3.2 重载构造函数和析构函数 606
48.3.3 发布笔和刷子 607
48.3.4 绘制组件图像 609
48.3.5 调整形状绘制 610
49.1 创建和注册组件 612
第49章 定制网格 612
49.3 修改初始值 613
49.2 发布继承的属性 613
49.4 重定义单元大小 614
49.5 填充单元 615
49.6 定位月和年份 619
49.7 定位日期 620
49.7.1 移动选择 620
49.7.2 提供OnChange事件 620
49.7.3 排除空白单元 621
第50章 创建数据感知控件 622
50.1 创建数据浏览控件 622
50.1.1 创建和注册组件 622
51.1 定义组件接口 623
50.1.2 创建只读的控件 623
50.1.3 添加数据链接 625
50.1.4 响应数据修改 627
50.2 创建数据编辑控件 627
50.2.1 修改FReadOnly的缺省值 628
50.2.2 处理鼠标按下和键盘按下消息 628
50.2.3 更新字段数据链接类 629
50.2.4 修改Change方法 630
50.2.5 更新数据集 630
第51章 创建对话框组件 632
51.2 创建和注册组件 632
51.3 创建组件接口 633
51.3.1 包含窗体单元文件 633
51.3.2 添加接口属性 634
51.3.3 添加Execute方法 634
51.4 测试组件 636
附录 ANSI具体实现标准 637