110_《Delphi4编程技术内幕》

  1. 云栖社区>
  2. 博客>
  3. 正文

110_《Delphi4编程技术内幕》

非常老帅 2010-12-18 15:42:00 浏览580
展开阅读全文

《Delphi4编程技术内幕》

Delphi 教程 系列书籍 (110) Delphi4编程技术内幕》 网友(邦)整理 EMail: shuaihj@163.com

下载地址:

下载

Delphi4编程技术内幕

  • 原书名:Charlie Calvert's Delphi 4 Unleashed
  • 作者: Charlie Calvert
  • 译者: 潇湘工作室
  • 丛书名: 软件开发技术丛书
  • 出版社:机械工业出版社
  • ISBN:7111072162
  • 上架时间:2000-7-1
  • 出版日期:1999 年6月
  • 页码:986
  • 版次:1-1

内容简介

本书完整而全面地介绍了Delphi 4。其主要内容有COM和分布式计算、数据库编程、常规编程问题以及图形和DirectX 编程。通过本书的学习,读者不仅可以快速了解Delphi 4编程的要旨,还可以掌握许多新技术,如创建COM自动化服务器和客户程序、使用MIDAS进行多层数据库计算、使用DCOM跨网络分布数据库等。 本书最大的特点是代码丰富,不仅书中详细介绍了代码样例,配套光盘上还包括了许多书中没有介绍的源程序。本书适用于使用Delphi 4 编程的程序员。

目录

第一部分 入门

第1章 程序设计基础 1

1.1 本书的结构 2

1.2 范例程序 4

1.3 创建设计良好的程序 4

1.3.1 设计问题:书写简单的代码 4

1.3.2 螺旋式上升 5

1.3.3 好oop与差oop的对比 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 本书正文的注意事项 12

1.4.1 unleash和merc40包 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 delphi 4中的新工具 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.1 在thread2程序中使用线程 115

5.3.2 向线程函数传递一个参数 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

第二部分 创建组件

第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 包:将组件放入component palette中 153

6.3.1 什么是包 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 关于注册你自己的组件以及component editor的更多知识 199

7.4 component editor 200

7.5 不可视的组件 201

7.6 findallw 程序 202

7.6.1 使用tfileiterator遍历目录 213

7.6.2 什么时候应该把对象做成不可见组件 215

7.6.3 alldirs单元和fileiter单元 216

7.6.4 遍历目录 216

7.6.5 使用findfirst、findnext和findclose 217

7.6.6 创建事件处理程序 218

7.7 compdirs程序 220

7.8 tccpickdirdlg 226

7.9 组件模板 231

7.10 activex控件 232

7.11 总结 235

第三部分 数据库编程

第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 fields editor 255

8.5 计算字段 259

8.6 运行期间的tdbgrid 260

8.6.1 在运行中控制dbgrid的options属性 263

8.6.2 运行时显示dbgrid选项 264

8.7 使用tdbgrid列 265

8.7.1 改变tdbgird对象的标题 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.9 多记录对象 276

8.10 总结 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 kdadd代码 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 用ttreeview显示系统数据库 355

10.4.4 展开ttreeview节点 356

10.4.5 为ttreeview加入可用表的列表 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.1 创建数据库方案 393

12.2.2 修改表:空或非空 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

第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 从可执行文件访问存储在dl中的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.2.8 通过variant调用方法 506

15.3 idispatch、双重接口和dispinterface 507

15.3.1 从word调用simpleautoserver 508

15.3.2 vtable和双重接口 509

15.4 类型库 510

15.4.1 什么是类型库 511

15.4.2 创建类型库 511

15.4.2 有效的自动化类型 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 启动delphi和excel 528

16.2.1 启动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.7 创建excel自动对象 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

第五部分 internet 编程

第17章 接口和internet explorer 555

17.1 variant与接口的对比 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 使用ie和twebbrowser 568

17.4.1 开始:访问web page中的元素 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.2.3 isapi/nsapi 591

18.2.4 cgi与isapi 591

18.3 webbroker组件 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.1 fat url 602

18.7.2 cookie 602

18.7.3 隐含字段 602

18.8 高级网页的生成 605

18.9 tdatasettableproducer 610

18.10 database web application wizard 613

18.11 tquerytableproducer 613

18.12 总结 617

第19章 wininet和ftp 618

19.1 理解wininet、ftp和tcp/ip 618

19.1.1 所需文件 618

19.1.2 确保ftp在系统中运行 619

19.1.3 安装tcp/ip应该注意的问题 619

19.2 ftp使用wininet 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

第六部分 分布式编程

第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.1 建立服务器 657

20.2.2 理解safecall 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.4 术语 707

21.1.5 查找调度程序 707

21.2 技术细节:使用分布式数据集 708

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

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.5.3 tfont.name属性分析. 884

26.5.4 tfont.style属性分析 884

26.6 研究与使用tcanvas.penpos 884

26.7 研究与使用tcanvas.cliprect 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.11.7 修改cliprect 902

26.12 其他名称的线条 903

26.13 深入研究vcl 906

26.13.1 深入了解tcolor 906

26.13.2 colors样本项目 907

26.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.6 播放大文件 967

28.1.7 一次播放两个wav文件 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

网友评论

登录后评论
0/500
评论
非常老帅
+ 关注