第一部分 了解Delphi和Linux 1
第1章 可视化开发 2
1.1 Kylix IDE 2
1.1.1 本章内容简介 2
1.1.2 IDE概述 3
1.2 菜单 3
1.2.1 菜单快捷键 4
1.2.2 快捷菜单 4
1.2.3 向菜单中添加新工具 4
1.2.4 工具栏 5
1.3 可视化开发 6
1.3.1 组件面板 7
1.3.2 软件包 8
1.3.3 使用Kylix窗体设计器 9
1.3.4 排列组件 9
1.3.5 对象查看器 10
1.3.6 配置对象查看器 11
1.3.7 编辑xfm文件 11
1.3.8 Constraints和Anchors 13
1.3.9 Tab顺序 14
1.3.10 对象查看器和事件 14
1.4 Kylix单元的源代码 14
1.4.1 Kylix单元的接口 15
1.4.2 Kylix单元的实现 17
1.4.3 FormCreate方法哪里去了 18
1.5 Pascal源文件 18
1.5.1 Delphi工程文件 19
1.5.2 单元 19
1.5.3 Pascal程序的入口 20
1.5.4 uses 子句和循环单元引用 20
1.6 Kylix中的编译阶段 22
1.7 使用容器 22
1.7.1 PannelDesign程序 24
1.8 本章小结 30
第2章 循环、分支、运算符和递归 31
2.1 术语定义:语句和表达式 31
2.1.1 表达式 31
2.1.2 语句 31
2.2 if 语句 32
2.3 Case 语句 34
2.4 for 循环 35
2.5 While语句 37
2.6 repeat语句 39
2.6.1 循环和分支小结 40
2.7 运算符简介 41
2.7.1 赋值运算符 41
2.7.2 除法运算符 41
2.7.3 布尔和逻辑运算符 42
2.7.4 关系运算符 42
2.7.5 获取变量的地址 43
2.7.6 执行字符串和指针运算的运算符 43
2.7.7 关于运算符的最后说明 44
2.8 递归 44
2.8.1 阶乘 44
2.8.2 Fibonacci数 45
2.8.3 递归绘图 47
2.9 本章小结 48
第3章 Pascal基本语法 49
3.1 本章内容 49
3.2 整型和浮点型 49
3.2.1 序数类型 50
3.2.2 使用序数的Pascal函数 51
3.2.3 枚举类型 53
3.2.4 浮点型 54
3.3 Pascal字符串 58
3.3.1 ShortStrings 59
3.3.2 AnsiString 59
3.3.3 PChar 61
3.3.4 WideString 62
3.4 强制类型转换 62
3.4.1 as、is运算符和Sender参数 63
3.5 数组 64
3.5.1 数组常量 65
3.5.2 动态数组和对象数组 65
3.5.3 调试数组:启用范围检查功能 68
3.6 记录 69
3.6.1 记录和with语句 69
3.6.2 Variant记录 70
3.7 指针 73
3.7.1 使用指向对象的指针 74
3.7.2 指针、构造函数和析构函数 76
3.7.3 虚拟方法和override编译指令 77
3.8 Object Pascal没有的特性 77
3.9 本章小结 77
第4章 对象和接口 79
4.1 Kylix的对象模型 79
4.1.1 在哪里声明对象 79
4.1.2 Object Pascal类的作用域规则 81
4.1.3 互相引用对方的类的作用域问题 81
4.1.4 声明方法 82
4.1.5 Object Pascal的继承模型:virtual和override 82
4.1.6 在声明中使用dynamic而不是virtual 83
4.1.7 调用覆盖方法的祖先:inherited 85
4.1.8 abstract编译指令 86
4.1.9 overload编译指令 87
4.1.10 类实例的实例化和释放 87
4.1.11 类方法 88
4.2 接口 88
4.2.1 接口类型 89
4.2.2 接口不是类 89
4.2.3 不能直接实现接口 90
4.2.4 用类来实现接口 90
4.2.5 调用接口的方法 93
4.2.6 释放接口 94
4.2.7 一个对象的多个接口 95
4.2.8 方法解析子句 98
4.2.9 IInterface的声明 99
4.2.10 接口的实质 101
4.2.11 使用接口的理由 102
4.2.12 维护和更新接口 103
4.3 Variant 104
4.4 RTTI和浮点类型 109
4.5 框 架 114
4.5.1 创建框架 114
4.5.2 重用框架 116
4.6 命令行编译器 117
4.7 本章小结 117
第5章 编辑器和调试器 118
5.1 源代码编辑器 118
5.2 编辑器和设计器 118
5.2.1 在编辑器中影响可视化工具 119
5.3 工程管理器 121
5.3.1 代码浏览器 122
5.3.2 定制代码浏览器的外观 124
5.3.3 代码生成:在编辑器和浏览器中完成类 125
5.4 浏览器 129
5.5 To-Do列表 130
5.5.1 工具窗口 132
5.5.2 保存桌面和调试桌面 133
5.6 神奇工具:Code Insight 133
5.6.1 代码完成化(Code Completion)的奇迹 133
5.6.2 Parameter Insight的奇迹 134
5.6.3 Code Insight:浏览源代码 135
5.6.4 代码模板将使您成为世界上最快的打字员 136
5.7 使用调试器 137
5.7.1 使用调试器单步调试代码 138
5.7.2 调试器不能单步调试的代码:优化 139
5.7.3 不能单步调试的代码:链接器 140
5.7.4 在Watch List窗口监视代码 140
5.7.5 查看变量 140
5.7.6 使用断点 141
5.8 使用异常来清理代码 142
5.8.1 声明自己的异常类 144
5.8.2 finally子句和再次引发异常 144
5.8.3 在调试器中使用CPU窗口 145
5.8.4 在线帮助 146
5.9 ElfDebug服务器 147
5.9.1 ElfDebugHelp单元提供的服务 155
5.9.2 DebugHelp单元的输出 156
5.9.3 向文本文件发送信息 157
5.9.4 向HTTP服务器发送信息 158
5.9.5 在服务器端接收信息 159
5.9.6 所有者绘制的列表框 159
5.10 本章小结 160
第6章 理解Linux环境 161
6.1 Linux环境概貌 161
6.2 Linux桌面 162
6.2.1 桌面分析 162
6.3 X体系结构概述 163
6.3.1 X的历史 163
6.3.2 名称X Window系统 164
6.3.3 X Window系统简介 164
6.3.4 网络和X客户/服务器模型 164
6.3.5 X服务器和X客户之间的细管道 164
6.3.6 连接到远程服务器 165
6.4 使用Kylix进行X编程 165
6.4.1 X中的"Hello,World"程序 167
6.4.2 使用XCreatWindow创建主窗口 172
6.4.3 层叠顺序 176
6.4.4 创建图形场境 177
6.4.5 事件循环 177
6.4.6 X编程小结 179
6.5 窗口管理器 179
6.5.1 为何创建窗口管理器 179
6.5.2 窗口管理器的强大功能 179
6.5.3 修改和查询窗口管理器 180
6.6 X工具包 180
6.6.1 控件、组件和部件 180
6.7 桌面简介 181
6.7.1 KDE桌面 181
6.7.2 GNOME桌面 181
6.8 本章小结 181
第二部分 CLX 183
第7章 CLX体系结构和可视化开发 184
7.1 Qt和CLX 184
7.1.1 FreeCLX 187
7.2 Qt和事件 187
7.2.1 难以理解的CLX消息 188
7.2.2 Qt信号和槽口 189
7.2.3 Qt应用程序对象和事件循环 191
7.2.4 在Object Pascal中调用Qt代码 191
7.3 使用CLX编写的Slider程序 192
7.4 CLX、Qt和Hook对象 193
7.4.1 CLX的不足之处:EventFilter Mojo 196
7.5 使用样式 200
7.6 使用资源 202
7.6.1 字符串资源 203
7.7 创建非矩形窗体 203
7.7.1 窗体继承 204
7.7.2 覆盖Widget的初始值 205
7.7.3 绘制窗体的外形 209
7.8 本章小结 210
第8章 代码的包装和共享 211
8.1 组件理论 211
8.2 从已有的组件派生出新的组件 212
8.2.1 保存工作 215
8.2.2 定义组件的特性 216
8.2.3 测试组件 217
8.3 软件包:将组件放置到组件面板中 218
8.3.1 软件包简介 218
8.3.2 软件包和LD_LIBRARY_PATH 218
8.3.3 软件包和组件面板 220
8.4 创建软件包 220
8.4.1 设计阶段软件包和运行阶段软件包 221
8.4.2 图标:使用DCR文件 222
8.4.3 同时打开软件包和工程 222
8.4.4 requires子句 222
8.4.5 注册组件 223
8.5 运行阶段软件包 223
8.6 在运行阶段进入软件包 226
8.7 创建共享对象 226
8.7.1 在Kylix程序中调用库中的例程 229
8.8 动态加载共享对象 229
8.9 本章小结 230
第9章 创建组件 231
9.1 使用消息 231
9.1.1 简单消息:一个有用的控件 231
9.1.2 响应消息 233
9.1.3 在组件中使用FilteEvents 234
9.2 扩展Elves单元 236
9.2.1 为CLX组件命名的艺术 245
9.2.2 TElfBigEdit控件和TElfEmtptyPanel控件 245
9.2.3 创建复合组件 246
9.2.4 为组件创建published属性 248
9.2.5 导出属性 249
9.3 另一个复合组件 249
9.4 创建一个由TLabel和TEdit组成的组件 254
9.4.1 改变标签的位置 262
9.4.2 ElfLabelEdit及其与Windows的兼容性 263
9.4.3 3D文本标签 263
9.5 本章小结 264
第10章 高级组件设计技术 266
10.1 属性 266
10.1.1 声明属性 267
10.1.2 在对象查看器中查看属性 269
10.2 再谈属性 269
10.3 从空白开始创建组件 276
10.4 Clock组件 278
10.4.1 理解TElfClock 283
10.4.2 Clock Paint方法: 284
10.4.3 TElfColorClock组件 284
10.4.4 创建别致的时钟 285
10.5 为组件创建图标 287
10.6 Tools API:属性编辑器和组件编辑器 288
10.6.1 设计阶段代码和运行阶段代码之比较 292
10.6.2 Kylix中的Tools API 293
10.6.3 Tools API和Wine 293
10.6.4 Tools API和接口 293
10.6.5 属性编辑器 293
10.6.6 再谈注册组件和组件编辑器 297
10.6.7 组件编辑器 298
10.6.8 关于组件维护的一些说明 299
10.7 组件模板 299
10.8 本章小结 300
第11章 图形 301
11.1 QGraphics.pas中的主要对象 301
11.2 TCanvas对象 301
11.3 使用Qt绘图 303
11.3.1 改变坐标系 304
11.4 TColor类型 305
11.5 画笔 306
11.6 钢笔 308
11.7 创建PenMode应用程序 312
11.8 字体 312
11.9 绘制形状 313
11.10 Mandelbrot范例 316
11.10.1 绘制Mandelbrot图形 323
11.10.2 绘制橡皮筋 323
11.10.3 TBitmap:为Mandelbrot图形照相 324
11.10.4 创建事件和处理OnPaint方法 325
11.10.5 LoadResource:创建开始的场景 326
11.11 虚构的3D世界 326
11.11.1 伪3D世界的体系结构 327
11.11.2 为游戏创建图形 329
11.11.3 双重缓存和表面 329
11.11.4 游戏引擎的核心代码 330
11.11.5 实现ISimpleSurface和IDrawTools 350
11.11.6 ISimpleSurface:创建即插即用的后端 352
11.11.7 在正确的位置绘制墙段 353
11.12 本章小结 355
第三部分 Linux系统编程 357
第12章 控制台应用程序、内存管理和文件I/O 358
12.1 控制台应用程序 358
12.1.1 控制台开发 359
12.1.2 运行控制台应用程序 359
12.2 内存管理 359
12.2.1 变量和数据结构 360
12.2.2 对象 360
12.3 Kylix中的文件I/O 361
12.3.1 传统的Pascal文件操作 361
12.3.2 使用TFileStream进行文件输入/输出 363
12.3.3 Linux文件的特点 365
12.3.4 使用glibc命令 367
12.4 本章小结 367
第13章 进程和线程 368
13.1 Linux中的应用程序执行方法 368
13.2 Kylix线程 369
13.2.1 通过线程访问内存 370
13.2.2 同步错误和线程安全 371
13.2.3 使用线程对象的Synchronize方法 371
13.2.4 临界段 372
13.2.5 多读专写同步器 372
13.2.6 锁定机制 373
13.2.7 线程结束和终止 373
13.2.8 调试多线程应用程序 374
13.2.9 有关线程的最后思考 374
13.3 Linux进程控制和进程间通信 374
13.3.1 创建新进程 375
13.3.2 发信号给进程或删除进程 376
13.4 本章小结 377
第四部分 DataCLX 379
第14章 DataCLX基础 380
14.1 DataCLX的体系结构 380
14.2 数据访问 380
14.2.1 连接到数据库 380
14.2.2 检索数据 381
14.3 数据控件 382
14.3.1 使用可视化数据控件显示数据 382
14.4 典型的数据流 385
14.4.1 交互式数据操纵 386
14.4.2 数据发布 386
14.5 配置服务器 387
14.5.1 连接到InterBase 387
14.5.2 连接到MySQL 388
14.5.3 连接到DB2 388
14.5.4 连接到Oracle 389
14.6 本章小结 389
第15章 使用数据-感知组件 390
15.1 TSQLConnection 390
15.1.1 TSQLConnection的属性 391
15.1.2 TSQLConnection的方法 392
15.1.3 TSQLConnection的事件 392
15.2 TSQLDataSet 394
15.3 TSQLQuery 394
15.4 TSQLStoredProc 395
15.5 TSQLTable 395
15.6 TClientDataset 395
15.6.1 TClientDataSet的属性 396
15.6.2 TClientDataSet的方法 397
15.7 TDataSetProvider 399
15.8 TSQLClientDataSet 400
15.9 TSQLMonitor 400
15.10 一般的数据集用法模式 402
15.10.1 查询 402
15.10.2 查找字段 402
15.10.3 参数化查询 403
15.10.4 主-细关系 403
15.10.5 定制明细网格 404
15.10.6 计算字段 405
15.10.7 本地递增搜索 405
15.10.8 本地过滤 407
15.10.9 书签 407
15.10.10 使用存储过程 409
15.10.11 客户端临时键 410
15.10.12 聚合字段 411
15.11 本章小结 411
第16章 数据访问层 412
16.1 数据访问层的目标 412
16.1.1 数据访问速度最大化 412
16.1.2 平台独立性 412
16.1.3 易于部署 413
16.1.4 使应用程序最小,占用的资源最少 413
16.1.5 为高效地处理SQL和存储过程提供通用接口 413
16.1.6 使驱动程序开发容易、可扩展 413
16.1.7 可访问数据库特定的特性 413
16.2 概貌 414
16.3 MyBase数据集 414
16.3.1 格式(二进制和XML) 415
16.3.2 元数据 415
16.3.3 约束 416
16.3.4 数据 416
16.3.5 字段类型 416
16.3.6 特殊字段 417
16.3.7 德尔塔 417
16.3.8 返回给发送方 418
16.4 数据库连接 419
16.4.1 dbExpress抽象 420
16.4.2 数据类型映射 428
16.5 dbExpress驱动程序开发 428
16.5.1 理解数据库厂商客户 429
16.5.2 初始化环境变量 429
16.5.3 连接到数据库服务器 429
16.5.4 初始化语句句柄 429
16.5.5 准备SQL语句 430
16.5.6 传递运行阶段参数 430
16.5.7 执行SQL语句 430
16.5.8 绑定记录缓冲区 430
16.5.9 取回记录 431
16.5.10 释放句柄和断开连接 432
16.6 dbExpress的核心实现 432
16.6.1 SQLDriver 432
16.6.2 SQLConnection 432
16.6.3 SQLCommand 433
16.6.4 SQLCursor 435
16.6.5 SQLMetaData 436
16.7 本章小结 436
第17章 创建一个应用程序 437
17.1 应用程序描述 437
17.2 数据库定义 438
17.2.1 表 438
17.2.2 索引 440
17.2.3 数据约束 440
17.2.4 生成器 441
17.2.5 存储过程 441
17.2.6 触发器 443
17.3 基本设计 444
17.3.1 数据模块 444
17.4 GUI界面 447
17.4.1 显示数据 447
17.4.2 编辑数据 447
17.4.3 扩展功能 448
17.5 Web界面 449
17.5.1 格式化 449
17.5.2 布局 453
17.5.3 导航 455
17.6 本章小结 457
第18章 数据库优化 458
18.1 简介 458
18.2 填充数据库 458
18.3 监视SQL通信 459
18.4 避免长时间打开事务 459
18.5 不要使用包含动词"like"的参数化查询 459
18.6 避免使用主键和外键 460
18.7 使用存储过程 460
18.8 使用触发器 461
18.9 精益求精 461
18.10 参数化并准备查询以达到最佳性能 462
18.11 像避免瘟疫一样避免使用fetchall 462
18.12 Rob的左外连接规则 462
18.12.1 设计时避免左外连接 463
18.12.2 使用相关的子查询 463
18.12.3 使用存储过程 463
18.12.4 使用左外连接 464
18.13 当数据库非常大或用户非常多时缓存查找表 464
18.14 使用智能查找 464
18.15 关闭元数据 465
18.16 关闭同步写入,但要清楚这样做的危险 465
18.17 理解数据库索引 466
18.17.1 理解选择性 466
18.17.2 谨慎使用外键 466
18.17.3 多列索引 466
18.17.4 对索引排序 466
18.17.5 索引字段应尽可能少 466
18.18 针对InterBase的技巧 466
18.18.1 不要使用大型VarChar 466
18.18.2 创建前端应用程序时总是使用远程连接 467
18.18.3 将数据库的页面大小设置为2KB或4KB 467
18.18.4 理解索引计划 467
18.18.5 使用Gfix来设置数据库缓存缓冲区 471
18.18.6 将InterBase安装在单处理器机器上 471
18.19 本章小结 471
第五部分 Web开发 473
第19章 Apache Web服务器应用程序 474
19.1 Web服务器应用程序 474
19.1.1 CGI协议 474
19.1.2 CGI表单 474
19.2 Apache Web服务器 475
19.2.1 Kylix和CGI 476
19.2.2 配置CGI 478
19.2.3 配置DSO 479
19.3 本章小结 480
第20章 Web服务器开发 481
20.1 Web模块 481
20.2 新建Web服务器应用程序 481
20.3 WebBroker组件 483
20.3.1 TWebDispatcher 484
20.3.2 TWebModule 484
20.3.3 TWebResponse 485
20.3.4 TWebRequest 485
20.4 显示内容 486
20.4.1 模仿GET 488
20.5 页面生成器 488
20.5.1 TPageProducer 488
20.5.2 HTMLDoc和HTMLFile 491
20.5.3 TDataSetPageProducer 491
20.6 表格生成器 497
20.6.1 TDataSetTalbeProducer 497
20.6.2 定制 502
20.6.3 主-细关系 502
20.7 本章小结 503
第21章 高级Web服务器开发 505
21.1 新的WebApp42 505
21.1.1 Producer和ProducerContent 505
21.2 dbExpress 506
21.3 TDataSetTableProducer 507
21.3.1 TSQLQueryTableProducer 507
21.3.2 PrepareSQLQueryTableProducer 509
21.4 维护状态信息 511
21.4.1 胖URL 512
21.4.2 Cookies 515
21.4.3 隐藏字段 516
21.5 高级页面生成技术 518
21.6 图像 522
21.7 跨平台策略 528
21.8 本章小结 529