Delphi是Inprise(前Borland)公司推出的一种非常优秀的高效而快速的开发工具。从1995年面\r\n世以来,受到了世界各地越来越多的程序员的喜爱。\r\n 本书采用问答的方式,回答了开发人员在使用该工具中经常遇到的问题。同时也介绍了一些常用的经验和技巧。一般每个问题都有“问题”、“原理”、“步骤”、“多学几招”四个部分或者其中的几个部分。内容则突出实战技巧,一般不涉及很多原理性的内容,解决的问题都是每个程序员开发一般系统可能遇到的具体问题。\r\n 本书适合于对Delphi有一定了解的读者。对于将要或者正在开发具体软件项目者,则会发现本书更加适用。
第1章 安装和IDE环境\r\n\r\nDelphi安装过程一开始就无故终止\r\nDelphi和显示卡驱动程序的冲突\r\n如何阻止Local Interbase服务器程序在系统启动时自动运行?\r\n安装程序在更新/合并BDE的设置时出现错误\r\n安装Delphi的时候出现奇怪的错误,并报告错误号xxx等\r\n在Windows 2000 Bata版上如何安装Delphi?\r\n安装Delphi时出现“Can`t find PVCS”错误\r\n如果不想依赖安装光盘,请问如何从硬盘或者网络上安装Delphi?\r\n如何在程序中构造自己的中断事件?\r\n检测Delphi IDE是否正在运行\r\n\r\n第2章 Object Pascal语言\r\n\r\n如何在C语言中调用Delphi写的动态连接库?\r\nString类型和PChar类型使用的区别\r\n如何正确地使用TStream的Read/Write方法?\r\n变量申明在interface的private和var中有什么区别?\r\n如何在定义数组时同时给定初值?\r\n如何判断一个pChar的内容是否为空?\r\n如何格式化输出字符串?\r\n如何对字符串加密?\r\n如何进行二进制、十进制和十六进制数的转换?\r\n在Delphi中通过内嵌汇编调用WindowsAPI函数\r\n如何得到过程/函数的地址?\r\n如何通过流保存对象属性值?\r\n如何拷贝一个文件?\r\n如何剪切中文字符串而不会出现乱码?\r\n如何得到X的Y次方?\r\n什么是内存泄漏?\r\n建立最小的Delphi程序\r\n\r\n第3章 数据库技术\r\n\r\n如何得到SQL返回的计算结果?\r\nDbase和Prodox数据库的压缩\r\n如何在字段名中使用空格?\r\n如何得知现在数据库操作的进度?\r\n在DBMemo中查找文号\r\n如何在数据库中查询日期\r\n数据表的索引被损坏了怎么办?\r\n如何创建Paradox数据表和索引?\r\n如何恢复在Dbase中被删除的记录?\r\n为何在Paradox数据表中创建indexe时不能设定ixUnique选项?\r\n如何使用动态创建的数据库别名(Alias)?\r\n如何知道某个数据库别名(Alias)所指的数据库目录(如 paradox)或数据库名称(interbase)?\r\n如何优化BDE的设置以提高数据库性能?\r\n使用BDE的ASCll驱动数据库\r\n如何在数据库中读写blob字段?\r\n如何实现用户自定义公式报表计算?\r\n使用TQuery时出现“Error creating cursor handle”错误\r\n如何在程序运行中改变数据库别名指向的路径?\r\nIn Memory Table技术的应用\r\n如何设定多用户环境的Paradox数据库?\r\n如何利用DAO存取Access数据库?\r\n利用Table更新Memo字段\r\n如何压缩及修复Access数据库?\r\n如何有效地存取Access数据库?\r\n在Oracle数据库中能否通过存储过程使用自定义函数\r\n如何找到当前BDE文件存在的目录?\r\n检测当前BDE的版本号\r\n如何通过程序在注册表中注册BDE?\r\n如何重整TDBGrid的栏目次序?\r\n如何防止KEY VIOLATION错误?\r\n制作一个数据库快速搜索器\r\n如何实现数据库相关的树型控制?\r\n保存DBGrid中的用户设定\r\n\r\n第4章 网络通信和Internet\r\n\r\n获知当前网络用户的名称(用户名)\r\nCGI技术的原理和开发概略\r\n多进程间如何通过共享内存实现通信?\r\n列出目前可用的Modem的相关信息\r\n检测网卡的物理地址(MAC地址)\r\n如何得到本地计算机的名字和自己的IP地址?\r\n实现到 Internet的超级链接\r\n如何知道系统有几个串口?\r\n局域网内的消息通信技术\r\n如何捕获Winsock的错误?\r\n网络共享目录的设定\r\n检测当前系统中是否安装了Internet Explore\r\n当前系统默认的浏览器是什么?\r\n如何在程序中利用TAPI通过Modem拨号?\r\n检测当前是否连接到Internet\r\n如何在WebServer程序中返回图像?\r\n监视POP3信箱\r\n\r\n第5章 窗体界面和绘图\r\n\r\n察看和改变系统的显示分辨率和调色板\r\nDelphi 3图形VCL中的一个Bug\r\nDelphi中控件深度投影及阴影效果的实现\r\n当控件重绘时如何防止闪动的情况?\r\n如何在程序运行时隐藏鼠标?\r\n如何在某个窗口模拟按键?\r\n合理地制作程序启动封面\r\n如何显示旋转的字体?\r\n如何修改对话框使得提示为中文?\r\n如何选择合适的组合框(ComboBox)?\r\n基于调色板的图像消隐技术\r\n如何实现位图背景平铺功能?\r\n如何使得窗体(Form)透明?\r\n闪动窗体标题栏以提醒用户注意\r\n怎样将窗体设成在任意部分都可使用鼠标拖动的窗体?\r\n得到目前系统中焦点所在窗口的句柄\r\n列出系统中当前所有的可用字体\r\n在用户界面中用回车键代替Tab键\r\n询问用户是否真的要关闭窗口\r\n通过系统托盘(trny)显示和隐藏程序界面\r\n如何在系统托盘(tray)上显示弹出菜单?\r\n如何显示和隐藏任务条?\r\n如何改变窗体的系统菜单?\r\n如何显多行提示条?\r\n\r\n第6章 多媒体及相关设备\r\n\r\n检测当前计算机中是否安装了光驱设备\r\nDelphi 4程序为何不能正常播放Audo-CD?\r\n如何通过编程关闭/开启声音通道或者只关闭其中一个通道?\r\n如何制作自己的屏幕保护程序?\r\n如何检测系统中是否安装了声卡?\r\n如何让系统通过扬声器发出声音?\r\n如何播放一张标准音乐CD(Audio-CD)?\r\n如何控制系统中安 装的操纵杆?\r\n如何打开和关闭光驱?\r\n如何解读MP3文件信息?\r\n如何播放程序资源文件中的声音资源?\r\n将按钮(Button)和指定声音关联\r\n如何检测系统中是否存在鼠标?\r\n如何得到CD的卷标?\r\n检测光驱中是否放置了CD\r\n如何将资源文件加入到EXE程序中去?\r\n如何实现光盘插入自动运行?\r\n如何改变Windows系统桌面墙纸?\r\n\r\n第7章 控件开发和使用\r\n\r\n在TDBGrid/TstringGrid饲中用回车键代替Tab的功能\r\n设置TDateTimePicker的显示格式\r\n将注册表中的内容转化为.REG文件\r\n标准可视控件如何实现剪贴板的拷贝与粘贴?\r\n检测用户多长时间没有按键盘\r\nMEMO的UNDO功能\r\n超级链接的视觉效果\r\n如何给TListBox加上水平的滚动条?\r\n如何选择合适的组合框?\r\n如何取得Memo控件的编辑内容的行号?\r\n在运行时使用鼠标移动控件\r\n在DBGRID中实现COPY、PASTE功能\r\n如何在StringGrid中使用下拉列表框?\r\n如何在ListBox中添加图标?\r\n\r\n第8章 报表和打印\r\n\r\n如何最简等地向打印机发送数据?\r\n如何直接控制打印机输出?\r\n如何打印一个位图?\r\n检测打印机的可用输出方式\r\n如何向打印机输出控制字符?\r\n为何有时在QuickReport预览后会耗尽系统资源?\r\nQuickReport中如何指定某台打印设备?\r\n如何直接将DBGrid的内容输出到打印机?\r\n利用Excel输出报表\r\n如何更改打印机使用的纸张类型?\r\n如何设定缺省的打印机?\r\n在QuickReport上是否能够打印任意的控件?\r\n如何在QuickReport的expressions中使用其他数据集的字段?\r\n一次输出QReport的多份拷贝\r\n为什么见不到QReport预览窗口的标题?\r\n在QReport中如何改变打印机设置?\r\nQReport中计算表达式总返回0\r\nQReport的升级问题\r\n在NT 4上打印报表发现已定义了字体的标签经常发生随机变化\r\n如何使用QuiCkReport的Add Printable?\r\n在没有安装打印机驱动程序的机器上使用QuickReport会产生错误\r\n如何使用QuickReport的HTML输出功能?\r\n使用QRCreateList为何总是出错?\r\n\r\n第9章 Windows API函数\r\n\r\n如何防止同一个程序运行多次?\r\nWindows系统退出时的窗体事件处理\r\n如何取得当前的环境变量?\r\n如何得到当前运行程序的路径和文件名?\r\n如何通过程序设置系统时间?\r\n如何同步运行一个外部程序?\r\n如何获取一个应用程序的标题图标\r\n实现不同的退出Windows的方式\r\n如何激活/禁止屏幕保护程序?\r\n如何得到当前系统用户名以及系统的产品注册号?\r\n如何通过程序移动当前光标的位置?\r\n判定Windows的安装目录和临时文件目录\r\n如何截获得到按下方向键的键盘消息?\r\n如何将程序添加到自动启动项中?\r\n如何得知窗口现在的状态为最大或最小化?\r\n使程序不出现在任务条中\r\n如何创建或者更换系统墙纸(wallpaper)?\r\nDelphi中有没有类似于VB的DoEvents方法?\r\n用Application.OnMessage事件处理消息\r\n禁止Form的放大/缩小/移动/关闭\r\n如何检测鼠标进入或者离开一个可视控件?\r\n如何在“系统菜单条”中添加自己的内容?\r\n如何通过程序控制ComboBox显示了拉菜单或者隐藏下拉菜单?\r\n如何自定义窗体最大化按钮?\r\n如何使用EnumChildWindows()函数枚举子窗体?\r\n在程序中如何区分左shift键和右shift键?\r\n如何捕获磁盘错误?\r\n如何得知Memo中能够显示多少行信息?\r\n如何把文件删除到回收站中?\r\n\r\n第10章 其他\r\n\r\n如何获得当前系统相关目录?\r\n如何调出系统的文件查找对话框?\r\n如何使用Windows HOOK技术?\r\n屏幕抓词的技术原理\r\n如何判断一个字符串中有多少个汉字?\r\n如何进行GB码与BIG5码之间的转换?\r\n如何编写一个精确的延时程序?\r\n如何检测当前系统中是否正在运行SoftICE?\r\n如何“处理”加密的Delphi控件?\r\n显示密码编辑框中的密码\r\n如何对中文输入法调用和管理?\r\n如何用拼音首字符序列来实现检索功能?\r\n如何实现与资源管理器之间的文件拖放?\r\n如何将一个流的内容写入到剪贴板中并处理?\r\n如何实现远程屏幕截取?\r\n\r\n\r\n附录\r\n附录A:Delphi及BDE各版本升级列表\r\n附录B:Delphi编译错误信息对照表\r\n附录C:虚拟键值列表\r\n附录D:BDE错误列表\r\n附录E:常用Internet资源\r\n\r\n后记
1995年的暑假,我正在一边准备开始为期两年的第二学位学习以继续我的大学生活,一边在一个课题组里做开发。某一天课题组老师从北京开会回重庆,告诉我们,她碰巧参加了一个新软件的发布会。据说这个软件功能非常的强大,而且属于第一个真正意义的RAD工具。一方面,我对Borland公司(现在改名为Inprise)非常有好感(至今为止Turbo C和Trubo Pascal还在世界各地被广泛使用);另一方面,我对新事物也非常感兴趣,所以就和课题组的其他同事一起鼓动,购买了一套这个产品的第一个版本(1.0版),它就是Delphi,我也从此开始了我的Delphi“历程”。
随着Delphi从当初的1.0到现在的5.0,在开发中也渐渐摸索和积累了一些经验。由于经常上网,所以也时常和别人讨论一些问题。除去一些具体的问题,经常有初学者问:“我怎样才能快速入门?”,“我怎样才能快速提高?”,“我应该看些什么样的书?”。就我自己的体会,我认为编程水平的提高主要靠多实际应用、多思考,在学习中学习,这样提高起来比较快。单纯的先去学Object Pascal,然后捧一本大全开始做练习,这样的学习效率是非常低的。这种学习方式可能适合于其它知识的学习,但是不适合用来学习编程。
只有在积累了一定的编程经验时,去看一些全面介绍Delphi技术的书籍才会有针对性,带着问题看书和盲目地看书相比其结果是截然不同的。而且现在市面上的书籍一般都是大同小异,只要能够真正啃完一部,其水平也相当了不得了。
但是即使看完了各种“大全”类书籍,还是有大量具体问题得不到解决。就拿一个简单的有关Delphi安装的问题来说,当初我拿到Delphi 3后迫不及待的就开始install,可同一张光盘,在实验室的三台机器上结果大大的不同,除了一台计算机可以顺利安装并使用外,另两台计算机装完后死活不能进入IDE界面。我反复察看文档,然后反复改变软件、硬件环境,折腾了两天两夜,终于发现是和那块WinFast 280显卡冲突,具体而言是和S3某个版本的驱动程序冲突,更换后立刻解决问题。其实这样的问题还很多,也许在冥思苦想N天之后,答案就是一句话、一段代码、一个很不起眼的技巧。这些问题看似很小,在一般的专著中鲜有涉及,可是如果不解决却会给开发带来很大障碍。另一方面,一些方法隐藏在各种专著、CD、文档中,要把它们找出来也相当费事。而我们常用的技巧和方法相对而言不是很多,把这些“小”技巧、“小”知识整理出来,就能够使得我们的开发变得事半功倍。
本书就是基于这样的出发点,突出实战技巧,整理出了开发中常见的大约150多个问题。问题覆盖了从安装、配置到数据库、网络、多媒体、API函数等等,不一而足。问题与答案的来源大致有以下几个途径:
1.Inprise技术支持站点提供的TI和FAQ;
2.国内外Delphi爱好者总结的各种Delphi知识,例如著名的UDDF;
3.我个人在论坛、社区回答别人问题的总结;
4.其他开发中积累的有价值的问答。
本书的篇章划分基本按照一般Delphi书籍的习惯,但是具体内容是以问答的方式表现的,这样能够用最少的篇幅覆盖更多的内容。这里一再强调,我个人认为本书是针对Delphi开发及使用问题解答的一本“手册”,最好能够和其它Delphi专著配合使用,而且是在掌握了一些Delphi基本的编程技巧后再使用本书,这样效果会比较好。
希望这本书能对Delphi开发者有一些实际帮助。我曾对网易虚拟社区北京Delphi版(http://bi.nease.net)和广州Delphi版(http://bi.nease.net)一段时间内的问题做了一个统计,除了一些特别基本的问题(在一般Delphi书籍中也有介绍)和非技术问题外,大约50%的问题可以从本书中找到答案,最起码也可以提供一些线索。另一方面,我的知识面也非常有限,许多问题尽管我努力验证,也难免会发生谬误,希望发现了问题的朋友能够指出问题所在,以便改进。
感谢我的同事、朋友们,他们在我遇到问题时总是及时地给我解答,使我获益匪浅。在此还要感谢金地公司和编辑袁阳先生,他们为本书的出版付出了大量心血。