第一部分使用C++Builder编程第1章引言 11.1本书内容 11.2本书约定 21.3开发支持 2第2章C++Builder编程 32.1集成开发环境概述 32.2设计应用程序 32.3理解VCL 32.3.1属性 32.3.2方法 42.3.3事件 42.4VCL中的对象.组件与控件 42.4.1TObject分支 52.4.2TPersistent分支 52.4.3TComponent分支 52.4.4TControl分支 62.4.5TWinControl分支 62.4.6TControl的共同属性 72.4.7TControl通用标准事件 82.4.8TWinControl的共同属性 82.4.9TWinControl的通用标准事件 92.4.10创建应用程序用户界面 102.4.11使用组件 102.4.12VCL标准组件 112.5使用帮助对象 192.5.1使用列表 192.5.2使用串列表 192.5.3Windows注册表和INI文件 232.6开发应用程序 252.6.1编辑代码 252.6.2调试应用程序 262.6.3发布应用程序 26第3章创建应用程序.组件和程序库 273.1创建应用程序 273.1.1Windows应用程序 273.1.2程序设计模板 283.1.3控制台应用程序 283.1.4服务应用程序 283.2创建程序包和DLL 323.3在C++Builder中使用DLL 333.4在C++Builder中创建DLL 333.5创建包含VCL组件的DLL 343.6链接DLL 363.7编写数据库应用程序 363.8创建分布式应用程序 363.8.1使用TCP/IP的分布式应用程序 363.8.2使用COM和DCOM的分布式应用程序 373.8.3使用CORBA的分布式应用程序 383.8.4分布式数据库应用程序 383.9使用数据模块和远程数据模块 383.9.1创建及编辑数据模块 383.9.2存取窗体的数据模块 393.9.3向应用程序服务器工程中加入远程数据模块 393.10使用对象仓库 393.10.1在工程中共享对象 393.10.2在对象仓库中加入对象 393.10.3在小组环境中共享对象 393.10.4在工程中使用对象仓库的对象 403.10.5使用工程模板 403.10.6修改共享对象 403.10.7指定一个缺省工程.新窗体以及主窗体 41第4章开发应用程序用户界面 424.1理解TApplication.TScreen和TForm 424.1.1使用主窗体 424.1.2加入其他窗体 424.1.3隐藏主窗体 424.1.4工作在应用程序层 434.1.5处理屏幕 434.1.6管理布局 434.2处理消息 444.3窗体的更多细节 444.3.1控制窗体何时驻留内存 444.3.2给窗体传递其他参数 464.3.3从窗体获取数据 464.4重用组件和组件组 494.5创建并使用组件模板 494.6使用框架 504.6.1创建框架 504.6.2使用并修改框架 504.6.3共享框架 514.7创建并管理菜单 514.7.1打开菜单设计器 524.7.2创建菜单 534.7.3在对象观察器中编辑菜单项 554.7.4使用菜单设计器上下文菜单 564.7.5使用菜单模板 574.7.6将菜单保存为菜单模板 574.7.7在运行时控制菜单项 584.7.8合并菜单 584.7.9引入资源文件 594.8设计工具栏和酷栏 594.8.1使用面板组件增加工具栏 594.8.2使用工具栏组件增加工具栏 614.8.3增加酷栏组件 624.8.4响应点击 634.8.5增加隐藏的工具栏 634.8.6隐藏和显示工具栏 634.9使用动作列表 644.9.1动作对象 644.9.2使用动作 654.9.3预定义动作类 674.9.4编写动作组件 68第5章应用控件 715.1实现控件拖放操作 715.1.1开始拖动操作 715.1.2接受拖动项 715.1.3放下项 725.1.4终止拖动操作 725.1.5通过拖动对象定制拖放操作 725.1.6改变拖动鼠标指针 735.2实现控件的拖动-停靠操作 735.2.1使窗口控件成为一个停靠点 735.2.2使控件成为一个可停靠子控件 735.2.3控制子控件如何被停放 735.2.4控制子控件如何取消停靠 745.2.5控制子控件如何响应拖动-停靠操作 745.3处理控件中的文本 745.3.1设置文本对齐方式 755.3.2在运行时增加滚动条 755.3.3增加剪贴板对象 755.3.4选择文本 765.3.5选定全部文本 765.3.6剪切.拷贝及粘贴文本 765.3.7删除选定文本 765.3.8禁用菜单项 775.3.9提供弹出式菜单 775.3.10处理OnPopup事件 775.4在控件中加入图形 785.4.1指定控件为属主绘制控件 785.4.2给串列表增加图形对象 795.4.3调整属主绘制项的大小 805.4.4绘制各属主绘制项 81第6章使用图形和多媒体 826.1图形编程概述 826.1.1刷新屏幕 826.1.2图形对象的样式 836.1.3画布的通用属性和方法 836.1.4使用Canvas对象的属性 846.1.5使用Canvas的方法来绘制图形对象 876.1.6在应用程序中处理多个绘图对象 896.1.7在图形中绘制 936.1.8加载和保存图形文件 956.1.9使用剪贴板处理图形 966.1.10拖引线示例 976.2使用多媒体 1016.2.1将无声的视频剪辑加入应用程序 1026.2.2将声音和/或视频剪辑加入应用程序 103第7章编写多线程应用程序 1057.1定义线程对象 1057.1.1初始化线程 1067.1.2编写线程函数 1067.1.3编写清理代码 1087.2协调线程 1087.2.1避免同时访问 1087.2.2等待其他线程 1107.3执行线程对象 1117.3.1重载缺省优先级 1117.3.2开始和停止线程 1117.4调试多线程应用程序 111第8章异常处理 1138.1C++异常处理 1138.1.1异常处理的ANSI规定 1138.1.2异常处理语法 1138.1.3声明异常 1148.1.4发送异常 1148.1.5处理异常 1178.1.6异常规范 1198.1.7异常处理的构造和析构 1208.1.8未处理的异常 1208.1.9设置异常处理选项 1208.2Win32下的结构异常 1218.2.1结构异常的语法 1218.2.2处理结构异常 1228.2.3异常过滤器 1228.2.4在C++中混用结构异常 1248.2.5定义异常 1258.2.6引发异常 1258.2.7终止块 1268.3VCL异常处理 1278.3.1C++和VCL异常处理之间的差别 1278.3.2处理操作系统异常 1288.3.3处理VCL异常 1288.3.4VCL异常类 1288.3.5可移植性考虑 130第9章VCL的C++语言支持 1319.1C++和ObjectPascal对象模型 1319.1.1对象本身和实例 1319.1.2C++Builder中VCL类的对象构造 1329.1.3在基类构造函数调用虚拟方法 1349.1.4对象析构 1369.1.5AfterConstruction和BeforeDestruction 1379.1.6类虚拟函数 1379.2ObjectPascal数据类型和语言概念的支持 1389.2.1Typedefs 1389.2.2支持ObjectPascal语言的类 1389.2.3ObjectPascal语言的C++语言对应 1389.2.4动态数组 1399.2.5定义不同的类型 1419.2.6资源字符串 1419.2.7缺省参数 1429.2.8运行时类型信息 1429.2.9未映射的类型 1439.2.10关键字扩展 1449.2.11__declspec关键字扩展 145第10章使用包和组件 14710.1为什么使用包 14710.2运行时包 14710.2.1在应用程序中使用运行时包 14710.2.2动态装载包 14810.2.3决定使用哪个运行时包 14810.2.4定制包 14810.3设计时包 14910.4创建和编辑包 15010.4.1创建包 15010.4.2编辑现有的包 15010.4.3包源文件和工程选项文件 15110.4.4理解包的结构 15210.4.5编译包 15210.5发布包 15410.5.1发布使用包的应用程序 15410.5.2将包发布给其他开发者 15410.5.3包集文件 154第11章创建国际化的应用程序 15611.1国际化和本地化 15611.1.1国际化 15611.1.2本地化 15611.2国际化应用程序 15611.2.1应用程序代码 15611.2.2设计用户界面 16011.2.3分离资源 16011.2.4创建资源DLL 16011.2.5使用资源DLL 16111.2.6动态切换资源DLL 16211.3本地化应用程序 162第12章发布应用程序 16312.1发布一般应用程序 16312.2发布数据库应用程序 16512.2.1提供数据库引擎 16512.2.2多级分布式应用程序服务 16612.3发布Web应用程序 16612.4为各种主机环境编程 16612.4.1屏幕分辨率和颜色浓度 16712.4.2字体 16812.4.3Windows版本 16812.5软件许可证要求 16812.5.1DEPLOY.TXT 16812.5.2README.TXT 16912.5.3No-nonsense许可协议 16912.5.4第三方的产品文档 169第二部分开发数据库应用程序第13章设计数据库应用程序 17113.1使用数据库 17113.1.1数据库类型 17113.1.2数据库安全 17213.1.3事务 17313.1.4数据字典 17313.1.5引用完整性.存储过程和触发器 17413.2数据库结构 17413.2.1可扩展性规划 17513.2.2一级数据库应用程序 17613.2.3二级数据库应用程序 17613.2.4多级数据库应用程序 17713.3设计用户接口 17813.3.1显示单条记录 17813.3.2显示多条记录 17813.3.3分析数据 17913.3.4选择要显示的数据 17913.3.5编写报表 180第14章开发一级与二级应用程序 18114.1基于BDE的应用程序 18114.1.1基于BDE的(应用程序)结构 18114.1.2数据库连接 18314.1.3使用事务 18314.1.4缓存更新 18614.1.5创建及重组数据表 18714.2基于ADO的应用程序 18714.2.1基于ADO的应用程序结构 18714.2.2连接到ADO数据库 18814.2.3获取数据 18814.2.4创建并重组ADO数据库表 18814.3flat-file数据库应用程序 18914.3.1创建数据集 18914.3.2装载和存储数据 19114.3.3使用公文包模式 19114.4扩充为三级应用程序 192第15章创建多级应用程序 19315.1多级数据库模式优点 19315.2理解MIDAS技术 19315.2.1基于MIDAS的多级应用程序概述 19415.2.2客户端应用程序结构 19415.2.3应用程序服务器结构 19515.2.4选择连接协议 19815.3创建多级应用程序 19915.4创建应用程序服务器 19915.4.1设置远程数据模块 20015.4.2为应用程序服务器创建一个数据提供者 20215.4.3扩展应用程序服务器接口 20215.5创建客户端应用程序 20215.5.1连接应用程序服务器 20315.5.2管理服务器连接 20515.5.3调用服务器接口 20515.6在多级应用程序中管理事务 20615.7支持主/明细关系 20615.8支持远程数据模块的状态信息 20715.9编写MIDASWeb应用程序 20815.9.1将客户端应用程序以ActiveX控件形式分发 20915.9.2使用InternetExpress创建Web应用程序 20915.9.3使用XML代理 21115.9.4使用MIDAS页生成器创建Web页面 213第16章使用提供者组件 21616.1确定数据源 21616.2选择如何进行更新 21616.3控制包括在数据包里的信息 21716.3.1指定出现在数据包里的字段 21716.3.2设置影响数据包的选项 21716.3.3加入定制信息到数据包 21816.4响应客户端数据请求 21916.5响应客户端更新请求 21916.5.1在更新数据库前编辑delta包 22016.52影响更新如何被应用 22016.5.3屏显单独的更新 22116.5.4在提供者端解决更新错误 22116.5.5对不仅涉及单一数据表格的数据集应用更新 22216.6响应客户端产生的事件 22216.7处理服务器限制 222第17章管理数据库会话 22417.1使用一个session组件 22417.1.1使用缺省session 22417.1.2创建额外的session 22517.1.3为session命名 22617.1.4启动session 22617.1.5定制session的启动方式 22717.1.6指定缺省的数据库连接方式 22717.1.7创建.打开和关闭数据库连接 22717.1.8取消临时数据库连接 22817.1.9搜索数据库连接 22817.1.10取得有关session的信息 22917.1.11使用BDE别名 23017.1.12迭代一个session的数据库组件 23117.1.13指定Paradox目录位置 23217.1.14使用有口令保护Paradox和dBASE表 23217.2管理多个session 23417.3在数据模块中使用session组件 235第18章连接到数据库 23618.1理解永久和临时数据库组件 23618.1.1使用临时数据库组件 23618.1.2在设计时创建数据库组件 23618.1.3在运行时创建数据库组件 23718.2控制连接 23718.2.1关联数据库组件与session 23818.2.2指定一个BDE别名 23818.2.3设置BDE别名参数 23918.2.4控制服务器登录 23918.2.5连接到数据库服务器 24018.2.6连接到远程服务器时的特别考虑 24018.2.7关闭与数据库服务器的连接 24118.2.8关闭数据集但不关闭与服务器的连接 24118.2.9迭代数据库组件的数据集 24118.3理解数据库与session组件的交互 24218.4在数据模块中使用数据库组件 24218.5从TDatabase组件中执行SQL语句 24218.5.1从TDatabase执行SQL语句 24218.5.2执行参数化的SQL语句 243第19章理解数据集 24519.1什么是TDataSet 24519.2数据集类型 24619.3打开和关闭数据集 24619.4确定和设置数据集状态 24719.4.1关闭数据集 24819.4.2浏览一个数据集 24819.4.3允许编辑数据集 24919.4.4允许插入新的记录 25019.4.5允许对数据表做索引搜索和取范围 25019.4.6计算字段 25019.4.7过滤记录 25119.4.8更新记录 25119.5浏览数据集 25119.5.1使用First和Last方法 25119.5.2使用Next和Prior方法 25219.5.3使用MoveBy方法 25219.5.4使用Eof和Bof属性 25219.5.5标记并返回到记录位置 25419.6搜索数据集 25519.6.1使用Locate 25519.6.2使用Lookup 25619.7使用过滤器显示和编辑一个数据子集 25619.7.1打开和关闭过滤器 25719.7.2创建过滤器 25719.7.3设置过滤器属性 25719.7.4编写一个OnFilterRecord事件处理程序 25819.7.5设置过滤器选项 25819.7.6浏览过滤后的数据集记录 25919.8修改数据 26019.8.1编辑记录 26019.8.2加入新的记录 26119.8.3删除记录 26119.8.4把数据写入数据库 26219.8.5取消改动 26219.8.6修改整条记录 26219.9使用数据集事件 26319.9.1终止一个方法 26319.9.2使用OnCalcFields 26419.10使用基于BDE的数据集 26419.10.1基于BDE的功能概述 26519.10.2处理数据库和session连接 26519.10.3使用缓存更新 26619.10.4缓存BLOB 267第20章使用字段组件 26820.1理解字段组件 26920.1.1动态字段组件 26920.1.2永久字段组件 27020.2创建永久字段 27020.3排列永久字段 27120.4定义新的永久字段 27120.4.1定义一个数据字段 27220.4.2定义一个计算字段 27220.4.3编写计算字段的程序代码 27320.4.4定义一个查找字段 27320.4.5定义一个合计字段 27420.4.6删除永久字段组件 27520.5设置永久字段的属性和事件 27520.5.1在设计时设置显示和编辑属性 27520.5.2在运行时设置字段组件的属性 27620.5.3创建字段组件的属性集 27620.5.4关联数据集到字段组件 27720.5.5删除关联属性 27720.5.6控制和屏蔽用户输入 27720.5.7为数值.日期和时间字段使用缺省格式 27820.5.8处理事件 27820.6运行时使用字段组件的方法 27920.7显示.转换和存取字段值 27920.7.1在标准控件中显示字段组件值 27920.7.2转换字段值 28020.7.3使用缺省数据集属性存取字段值 28120.7.4使用数据集的Fields属性存取字段值 28120.7.5使用数据集的FieldByName方法存取字段值 28120.8检查字段的当前值 28220.9设置字段的缺省值 28220.10使用限制 28220.10.1创建定制限制 28220.10.2使用服务器限制 28220.11使用对象字段 28320.11.1显示ADT和数组字段 28320.11.2使用ADT字段 28420.11.3使用数组字段 28520.11.4使用数据集字段 28520.11.5使用引用字段 286第21章使用数据表 28721.1使用数据表组件 28721.2设置数据表组件 28721.2.1指定数据库位置 28721.2.2指定数据表名 28821.2.3为本地数据表指定数据表类型 28821.2.4打开.关闭数据表 28921.3控制对数据表的读/写访问 28921.4搜索记录 29021.5排序记录 29221.5.1使用GetIndexNames方法取得可用的索引列表 29221.5.2使用IndexName指定索引 29221.5.3为SQL数据表指定排序顺序 29321.5.4检查索引的字段列表 29421.6使用数据子集 29421.6.1理解范围和过滤器的不同 29421.6.2创建和应用一个新的范围 29521.6.3修改范围 29721.7删除一个数据表中的所有记录 29721.8删除数据表 29821.9重命名数据表 29821.10创建数据表 29821.11从另一个数据表导入数据 29921.12使用TBatchMove 30021.12.1创建批移动组件 30021.12.2指定批移动模式 30121.12.3映射数据类型 30221.12.4执行批移动 30221.12.5处理批移动错误 30221.13链接到相同数据库表的同步数据表 30321.14创建主/明细表 30321.15使用嵌套数据表 304第22章使用查询 30622.1有效地使用查询 30622.1.1对桌面数据库开发者使用查询 30622.1.2对数据库服务器开发者使用查询 30722.2使用查询组件能够存取什么数据库 30722.3使用查询组件概述 30722.4指定要执行的SQL语句 30822.4.1在设计时指定SQL属性 30922.4.2在运行时指定SQL语句 30922.5设置参数 31022.5.1在设计时提供参数 31122.5.2在运行时提供参数 31122.5.3使用数据源绑定参数 31222.6执行查询 31222.6.1在设计时执行查询 31322.6.2在运行时执行查询 31322.7准备查询 31422.8取消查询准备以释放资源 31422.9创建异类查询 31422.10提高查询性能 31522.11使用结果集 31522.11.1允许编辑结果集 31522.11.2对可用结果集的本地SQL要求 31622.11.3对可用结果集的远程服务器SQL要求 31622.11.4更新可用结果集的限制 31622.11.5更新只读结果集 316第23章使用存储过程 31723.1何时使用存储过程 31723.2使用存储过程 31823.2.1创建存储过程组件 31823.2.2创建存储过程 31823.2.3准备和执行存储过程 31923.2.4使用返回结果集的存储过程 31923.2.5使用以参数返回数据的存储过程 32023.2.6使用在数据上执行操作的存储过程 32123.3理解存储过程的参数 32323.3.1使用输入参数 32323.3.2使用输出参数 32323.3.3使用输入/输出参数 32423.3.4使用结果参数 32423.3.5在设计时访问参数 32423.3.6在设计时设置参数信息 32523.3.7在运行时创建参数 32523.3.8绑定参数 32623.4在设计时查看参数信息 32623.5使用Oracle重载存储过程 327第24章使用ADO组件 32824.1ADO组件概况 32824.2连接到ADO数据仓库 32924.2.1使用TADOConnection连接到数据仓库 32924.2.2调整连接 33124.2.3列出数据表和存储过程 33224.2.4使用(连接)事务 33424.3使用ADO数据集 33424.3.1所有ADO数据集组件的共有特点 33524.3.2使用TADODataSet 33924.3.3使用TADOTable 34024.3.4使用TADOQuery 34124.3.5使用TADOStoredProc 34224.4执行命令 34424.4.1指定命令 34424.4.2使用Execute方法 34524.4.3取消命令 34524.4.4使用命令获取结果集 34524.4.5处理命令参数 346第25章创建和使用客户端数据集 34725.1使用客户端数据集处理数据 34725.1.1在客户端数据集中浏览数据 34725.1.2限制记录显示 34725.1.3描述主/明细关系 34825.1.4限制数据值 34825.1.5设置只读数据 34825.1.6编辑数据 34925.1.7排序和索引 35025.1.8表示计算值 35125.1.9使用被维护的合计 35225.1.10加入特定应用程序信息到数据 35425.2从另一个数据集复制数据 35425.2.1直接指定数据 35425.2.2复制一个客户端数据集指针 35525.3使用带有数据提供者的客户端数据集 35525.3.1指定数据提供者 35525.3.2从应用程序服务器得到参数 35625.3.3传送参数给应用程序服务器 35625.3.4重载应用程序服务器上的数据集 35725.3.5从应用程序服务器请求数据 35725.3.6处理限制 35825.3.7更新记录 35925.3.8刷新记录 36125.3.9使用定制事件与提供者通信 36125.4使用带有flat-file数据的客户端数据集 36225.4.1创建新的数据集 36225.4.2从文件或数据流中装载数据 36225.4.3合并更新到数据 36325.4.4存储数据到文件或数据流 363第26章使用缓存更新 36426.1决定何时使用缓存更新 36426.2使用缓存更新概述 36426.2.1允许和禁用缓存更新 36526.2.2提取记录 36526.2.3应用缓存更新 36626.2.4取消未定的缓存更新 36826.2.5撤消删除缓存记录 36926.2.6指定缓存中的可视记录 36926.2.7检查更新状态 37026.3使用更新对象来更新数据集 37126.3.1为数据集指定UpdateObject属性 37126.3.2为更新组件创建SQL语句 37226.3.3执行更新语句 37526.3.4使用数据集组件更新数据集 37726.4更新只读结果集 37726.5控制更新处理 37826.5.1决定是否需要控制更新处理 37826.5.2创建一个OnUpdateRecord事件处理程序 37826.6处理缓存更新错误 37926.6.1引用要应用更新的数据集 38026.6.2指明产生错误的更新类型 38026.6.3指定要执行的动作 38026.6.4使用错误消息文本 38126.6.5访问字段的OldValue.NewValue和CurValue属性 381第27章使用数据控件 38327.1使用通用的数据控件特征 38327.1.1关联数据控件与数据集 38427.1.2编辑并更新数据 38427.1.3禁止和允许数据显示 38527.1.4刷新数据显示 38527.1.5允许鼠标.键盘及定时器事件 38627.2使用数据源 38627.2.1使用TDataSource属性 38627.2.2使用TDataSource事件 38727.3显示单个字段的控件 38827.3.1以标签显示数据 38827.3.2在编辑框中显示和编辑字段 38827.3.3在备注控件中显示和编辑文本 38827.3.4在richedit备注控件中显示和编辑文本 38927.3.5显示并且编辑在图像控件中的图形 38927.3.6在列表框和组合框中显示和编辑数据 38927.3.7在查找列表和组合框中显示和编辑数据 39027.3.8使用复选框处理布尔型字段值 39227.3.9使用单选组控件限制字段值 39227.4使用TDBGrid查看与编辑数据 39327.4.1使用缺省状态的网格控件 39327.4.2创建定制网格 39427.4.3显示ADT和数组字段 39727.4.4设置网格选项 39827.4.5在网格中编辑 39927.4.6在设计时对列重排序 40027.4.7在运行时对列重排序 40027.4.8在运行时响应用户动作 40027.5创建包含其他数据感知控件的网格 40127.6导航和操作记录 40227.6.1选择显示浏览器按钮 40227.6.2显示飞出式帮助 40327.6.3多个数据集使用一个浏览器 403第28章使用决策支持组件 40528.1概述 40528.2关于crosstabs 40628.2.1一维的crosstabs 40628.2.2多维的crosstabs 40628.3使用决策支持组件指南 40628.4使用决策支持组件的数据集 40728.4.1使用TQuery或TTable创建决策数据集 40728.4.2使用DecisionQuery编辑器创建决策数据集 40828.4.3决策查询的属性 40828.5使用决策立方 40828.5.1决策立方的属性和事件 40828.5.2使用DecisionCube编辑器 40928.6使用决策源 40928.7使用决策控制轴 41028.8创建和使用决策网格 41028.8.1创建决策网格 41128.8.2使用决策网格 41128.8.3决策网格属性 41128.9创建和使用决策图 41228.9.1创建决策图 41228.9.2使用决策图 41228.9.3决策图显示 41328.9.4定制决策图 41328.10运行时的决策支持组件 41528.10.1运行时的决策控制轴 41528.10.2运行时的决策网格 41628.10.3运行时的决策图 41628.11决策支持组件和内存控制 41628.11.1设置最大维.合计及单元 41628.11.2设置维状态 41628.11.3使用分页维 417第三部分编写分布式应用程序第29章编写CORBA应用程序 41929.1CORBA应用程序概述 41929.1.1了解存根和框架 42029.1.2使用聪明代理 42029.1.3激活服务器应用程序 42129.1.4动态绑定接口调用 42129.2编写CORBA服务程序 42129.2.1定义对象的接口 42129.2.2使用CORBA服务器向导 42229.2.3从IDL文件生成存根和框架 42229.2.4使用CORBA对象的实现向导 42329.2.5实现CORBA对象 42429.2.6改变CORBA接口 42629.2.7注册服务器接口 42729.3编写CORBA客户程序 42729.3.1使用存根 42729.3.2使用动态调用接口 42829.4测试CORBA服务器 42929.4.1建立测试工具 42929.4.2记录和运行测试的脚本 430第30章创建Internet服务器应用程序 43130.1术语和标准 43130.1.1统一资源定位符URL的构成 43130.1.2HTTP请求报文头信息 43230.2HTTP服务器的活动 43230.2.1构造客户请求 43230.2.2处理客户请求 43230.2.3响应客户请求 43330.3Web服务器应用程序 43330.3.1Web服务器应用程序的分类 43330.3.2创建Web服务器应用程序 43430.3.3Web模块 43430.3.4Web应用程序对象 43530.4Web服务器应用程序的结构 43530.5Web派发器 43530.5.1为派发器添加处理项 43630.5.2派发请求报文 43630.6处理项 43630.6.1确定处理项的触发时间 43630.6.2利用处理项响应客户请求 43730.7访问客户请求的信息 43830.7.1包含了请求报文头信息的属性 43830.7.2HTTP请求报文的内容 43930.8创建HTTP响应报文 43930.8.1填写响应报文的头 44030.8.2设置报文的内容 44030.8.3发送应答信息 44130.9生成响应报文的内容 44130.10在响应报文中使用数据库信息 44430.10.1给Web模块添加一个会话 44430.10.2用HTML表示数据库的信息 44430.11调试服务器应用程序 44630.11.1调试ISAPI和NSAPI应用程序 44630.11.2调试CGI和Win-CGI应用程序 448第31章使用套接字 45031.1实现服务 45031.1.1理解服务协议 45031.1.2服务和端口 45031.2套接字连接的类型 45131.2.1客户连接 45131.2.2侦听连接 45131.2.3服务器连接 45131.3说明套接字 45131.3.1说明主机 45131.3.2使用端口 45231.4使用套接字组件 45231.4.1使用客户套接字 45231.4.2使用服务器套接字 45331.5响应套接字的事件 45431.5.1出错事件 45431.5.2客户事件 45431.5.3服务器事件 45531.6通过套接字连接读写数据 45531.6.1非阻塞连接 45531.6.2阻塞连接 456第四部分开发基于COM的应用程序第32章COM技术概述 45932.1COM应用程序的构成 46032.1.1COM接口 46032.1.2COM服务器 46132.1.3COM客户 46332.2COM扩展 46432.2.1自动化服务器 46532.2.2活动服务器页 46532.2.3ActiveX控件 46632.2.4活动文档 46632.2.5事务对象 46632.2.6类型库 46732.3使用向导实现COM对象 469第33章使用类型库 47333.1类型库编辑器 47333.1.1类型库编辑器的部件 47333.1.2类型库元素 47733.1.3使用类型库编辑器 47833.2发布类型库 484第34章创建COM客户程序 48634.1引入类型库信息 48634.1.1使用ImportTypeLibrary对话框 48734.1.2使用ImportActiveX对话框 48734.1.3引入类型库信息后生成的代码 48834.2控制引入的对象 48934.2.1使用组件包装器 48934.2.2使用数据感知的ActiveX控件 49034.2.3使用MicrosoftWord打印文档的例子 49134.2.4编写基于类型库定义的客户代码 49334.3为没有类型库的服务器创建客户程序 495第35章创建简单的COM服务器程序 49635.1创建COM对象概述 49635.2设计COM对象 49635.3使用COM对象向导 49735.4使用自动化对象向导 49735.5指定ATL选项 50035.6定义COM对象接口 50035.6.1为对象接口添加属性 50135.6.2给对象接口添加方法 50135.6.3提供客户事件 50135.7自动化接口 50235.7.1双向接口 50235.7.2派发接口 50335.7.3自定义接口 50335.8调度数据 50335.8.1自动化兼容的类型 50335.8.2自动化调度的类型限制 50435.8.3自定义调度 50435.9注册COM对象 50435.9.1注册进程内服务器 50435.9.2注册进程外服务器 50535.10调试应用程序 505第36章创建活动服务器页 50636.1创建活动服务器对象 50636.1.1使用ASP本征 50736.1.2为进程内或进程外服务器创建ASP 51036.2注册活动服务器对象 51036.2.1注册一个进程内服务器 51036.2.2注册一个进程外服务器 51036.3测试和调试活动服务器页应用程序 510第37章创建ActiveX控件 51237.1创建ActiveX控件概述 51237.2设计ActiveX控件 51337.3从VCL控件生成ActiveX控件 51437.4创建基于VCL窗体的ActiveX控件 51537.5ActiveX控件的许可证控制 51537.6自定义ActiveX控件接口 51637.6.1添加附加的属性.方法和事件 51737.6.2使简单数据与类型库的绑定 51837.7为ActiveX控件创建属性页 52037.7.1创建属性页 52037.7.2向属性页添加控件 52037.7.3把属性页与ActiveX控件的属性关联 52137.7.4把属性页与ActiveX控件关联 52137.8注册ActiveX控件 52237.9测试ActiveX控件 52237.10在网络上发布ActiveX控件 522第38章创建MTS或COM+对象 52438.1理解事务对象 52438.2管理资源 52538.2.1访问对象的前后关系 52538.2.2及时激活 52638.2.3资源共享 52638.2.4对象共享 52938.3MTS和COM+的事务支持 53038.3.1事务的特性 53038.3.2状态相关和状态无关对象 53138.3.3影响事务如何结束 53138.3.4初始化事务 53238.3.5事务超时 53438.4基于角色的安全性 53438.5创建事务对象概述 53538.6使用事务对象向导 53538.7生成COM+事件 53738.7.1使用事件对象向导 53738.7.2使用COM+事件对象激发事件 53838.8传递对象指针 53838.9调试和测试事务对象 53938.10安装事务对象 53938.11管理事务对象 540第五部分创建定制组件第39章组件创建概述 54139.1可视组件库 54139.2组件和类 54239.3如何创建组件 54239.3.1修改已有的控件 54239.3.2创建窗口控件 54339.3.3创建图形控件 54339.3.4子类Windows控件 54339.3.5创建不可视组件 54339.4组件内部有什么 54339.4.1消除相关性 54439.4.2属性.方法和事件 54439.4.3图形封装 54539.4.4注册 54539.5创建新组件 54539.5.1使用组件向导 54639.5.2手工创建组件 54739.6测试未安装的组件 54939.7测试已安装的组件 55139.8安装组件到组件面板 55139.8.1定位组件文件 55239.8.2添加组件 552第40章组件开发员的面向对象编程 55340.1定义新类 55340.1.1派生新类 55340.1.2声明新组件类 55440.2祖先.后代和类层次结构 55440.3控制访问 55440.3.1隐藏实现细节 55540.3.2定义组件开发员接口 55740.3.3定义运行时接口 55740.3.4定义设计时接口 55740.4派发方法 55740.4.1常规方法 55840.4.2虚拟方法 55840.5抽象类成员 55940.6类与指针 559第41章创建属性 56041.1为什么要创建属性 56041.2属性的类型 56041.3发布继承的属性 56141.4定义属性 56141.4.1属性声明 56141.4.2内部数据存储 56241.4.3直接访问 56241.4.4访问方法 56241.4.5缺省属性值 56441.5创建数组属性 56541.6存储和载入属性 56541.6.1使用存储-载入机制 56641.6.2指定缺省值 56641.6.3决定存储内容 56741.6.4载入后的初始化 56741.6.5存储和载入未发布的属性 567第42章创建事件 56942.1什么是事件 56942.1.1事件是closure 56942.1.2事件是属性 56942.1.3事件类型是closure类型 57042.1.4事件处理程序是可选的 57042.2实现标准事件 57142.2.1标识标准事件 57142.2.2使事件可见 57142.2.3改变标准的事件处理 57242.3定义你自己的事件 57242.3.1触发事件 57242.3.2定义处理程序类型 57242.3.3声明事件 57342.3.4调用事件 573第43章创建方法 57543.1避免相关性 57543.2命名方法 57543.3保护方法 57643.3.1应为public的方法 57643.3.2应为protected的方法 57643.4虚拟方法 57643.5声明方法 576第44章在组件中使用图形 57844.1图形概述 57844.2使用画布 57944.3使用图片 57944.3.1使用图片.图形或画布 57944.3.2载入和存储图形 58044.3.3处理调色板 58044.4幕后位图 58144.4.1创建和管理幕后位图 58144.4.2拷贝幕后位图 58144.5响应改变 581第45章处理消息 58345.1理解消息处理系统 58345.1.1Windows消息中有什么 58345.1.2派发消息 58445.2修改消息处理 58445.2.1重载处理器方法 58445.2.2使用消息参数 58545.2.3屏蔽消息 58545.3创建新的消息处理器 58645.3.1定义自己的消息 58645.3.2声明一个新的消息处理方法 587第46章使组件在设计时可用 58846.1注册组件 58846.1.1声明Register函数 58846.1.2编写Register函数 58846.2添加组件面板位图 59046.3为你的组件提供帮助 59046.4添加属性编辑器 59246.4.1派生属性编辑器类 59246.4.2将属性作为文本进行编辑 59346.4.3将属性作为整体进行编辑 59346.4.4指定编辑器特性 59446.4.5注册属性编辑器 59446.5添加组件编辑器 59546.5.1向上下文菜单添加项目 59546.5.2改变双击时的行为 59646.5.3添加剪贴板格式 59746.5.4注册组件编辑器 59746.6属性范畴 59846.6.1一次注册一个属性 59846.6.2一次注册多个属性 59846.6.3属性范畴类 59846.6.4使用IsPropertyInCategory函数 59946.7将组件编译成软件包 59946.8解决定制组件问题 600第47章修改已有的组件 60147.1创建和注册该组件 60147.2修改组件类 60247.2.1重载构造函数 60247.2.2指定新的缺省属性值 603第48章创建图形组件 60448.1创建和注册组件 60448.2发布继承的属性 60548.3添加图形能力 60548.3.1决定画什么 60548.3.2重载构造函数和析构函数 60648.3.3发布笔和刷子 60748.3.4绘制组件图像 60948.3.5调整形状绘制 610第49章定制网格 61249.1创建和注册组件 61249.2发布继承的属性 61349.3修改初始值 61349.4重定义单元大小 61449.5填充单元 61549.6定位月和年份 61949.7定位日期 62049.7.1移动选择 62049.7.2提供OnChange事件 62049.7.3排除空白单元 621第50章创建数据感知控件 62250.1创建数据浏览控件 62250.1.1创建和注册组件 62250.1.2创建只读的控件 62350.1.3添加数据链接 62550.1.4响应数据修改 62750.2创建数据编辑控件 62750.2.1修改FReadOnly的缺省值 62850.2.2处理鼠标按下和键盘按下消息 62850.2.3更新字段数据链接类 62950.2.4修改Change方法 63050.2.5更新数据集 630第51章创建对话框组件 63251.1定义组件接口 63251.2创建和注册组件 63251.3创建组件接口 63351.3.1包含窗体单元文件 63351.3.2添加接口属性 63451.3.3添加Execute方法 63451.4测试组件 636附录ANSI具体实现标准 637