眼光在书架上扫过,想要为这篇命题作文找点素材。末了遗憾地发现,随着书架本身的逐渐升级,看书的时间却越来越少。最要命的是,连看书的心情竟也似乎变成了可望不可即的妙物。然而作文和程序一样,总是要写的。也许,现在少看书,是因为已经看了太多的书?还是书太多而无从选择?抑或是现在的书没有以前的好?这三种可能性中无论哪一种稍具成立的理由,大概都会引出一个结论——无论是对于程序员,还是对于从事其它职业的人,在其职业生涯中、甚至整个生命历程中,书籍的影响往往是靠前的。越先接触到的书,对人的影响越大。可悲的是在意识到这一点时,我们多半已经走了不少弯路,甚至在走了不少弯路之后仍未能得到确切、真实、有用的知识。曾身为初学者的我,不禁为初学者们暗中捏了一把汗。选书,难!
那么,书柜玻璃门里封存的书籍们,似乎也有了发挥余热的地方。虽然我不是专业程序员,但学习编程也有8年之久,利用Delphi协助教学工作也有4、5年。把我看书的经验(也许是不成熟的罢)介绍给初学者,在大家选书时能帮上一点小忙,这篇东西就算是功德圆满了。
几年前一个偶然的机会,有位朋友向我介绍Delphi,并极力推荐一本译作,英文原名Teach Yourself Delphi 3 in 21 days,译名早已忘记。记忆中译文质量尚可,且原书难度浅易,行文流畅,更可贵的是并不因“简”就“陋”,真是难得。可惜当时自朋友处借得,早已归还了。遍寻未果,上网一查才知道乖乖不得了。原来该书的作者Kent Reisdorph来头不小。该兄是著名Delphi第三方控件公司TurboPower的资深开发工程师,同时也是Borland Team B(在新闻组回答开发技术问题的小组)成员。当然就书的内容而言显得有些陈旧了。有兴趣的读者可以在这里全文阅读该书的D4版:http://www.cesis.lv/learn/delphi/fm.htm。
这本书让我彻底投入Delphi的怀抱。在之后的一段时间里,到处寻找有关Delphi的图书。买了不少垃圾,但也小有斩获。可以说,看得最仔细、从中所获也最多的图书,都是在这个阶段买的。其中的一些,甚至到今天仍然是时时翻阅的。让我来一一介绍它们。
Todd Miller和David Powell著,Special Edition Using Delphi 3;中文版由机械工业出版社出版,书名《Delphi 3开发使用手册》。Todd当时是Delphi开发支持部高级顾问,而David则任Borland Delphi资源支持工程师。两位作者对于Delphi的深刻理解,使得本书的价值大大提升了。单纯从“代码”或是“具体技术”来看,当然有过时的地方,但偶尔重温,仍能给人以启发。遗憾的是译文质量普通,印刷错误比比皆是,实在是糟蹋了一本好书。
Marco Cantù,Tim Gooch和John F. Lam著,Delphi Developer’s Handbook;中文版由电子工业出版社出版,书名《Delphi高级开发指南》。该书主要作者Marco是Delphi界尽人皆知的专业作者和技术支持专家,他的一系列Delphi技术书相当受欢迎。就这本书而言,其实是配合Marco的另一本著作——Mastering Delphi 3编写的,重点在于揭示MD3中未涉及的高级技术专题。光是看看章节标题就已经很吸引人了,举凡“流与持久性”、“运行时类型信息(RTTI)”、“进程与存储器”等章节,无疑不是针针见血,下下到肉,解决学习和开发过程中许多百思不得其解的问题。作者甚至不惜动用200多页、整整五章的篇幅来讨论如何扩展Delphi环境。除去介绍Open Tools API问题的专书之外(实在是太少了!因为Open Tools API根本没有正式的官方文档。),这本书恐怕就是最详细的了。
然后是Marco Cantù的著名Delphi技术书系列Mastering Delphi。我买的最早版本是Mastering Delphi 4;中文版同样是由电子工业出的,书名《Delphi 4从入门到精通》。这个系列紧跟Delphi升级的脚步,对应每一版本Delphi进行介绍。现在最新的版本是Mastering Delphi 7。我对该系列图书的看法是只买和自己当前所用Delphi版本相应的那本就好。在你有机会使用新版Delphi之前,从这本书中学习到的知识已经足用。假如你每次看Mastering Delphi的新版本都会如饥似渴、买之而后快,恐怕看书的态度需要改改才行——只要认认真真读过,你会发现书的主要结构并没有很大改变,只是撤换一些太陈旧的内容、补充新特性介绍而已。当然我无意贬低该系列图书的价值,它的价值早由市场的热烈追捧所体现。毋庸置疑这本书现在仍然是系统学习Delphi技术的权威读物之一。不过,在向它鞠躬之前,不妨以“赶潮头挣钱”为由竖竖中指,幽他一默。
另外一个经典系列是Steve Teixeira和Xavier Pacheco著Borland Delphi Developer’s Guide。我曾经有过一本中文版,不过出版社和中文书名都忘了,现在手头的是SAMS出的Delphi 6 Developer’s Guide英文原版。DDG系列和MD系列到底孰优孰劣,怕是上帝也难回答的问题吧。T-Rex、X(Steve Teixeira和Xavier Pacheco的昵称)二人均为Borland雇员。DDG6的前言就出自Borland Developer Relations部门的副总裁David Intersimone(David I)的手笔。就这一点而言似乎可以认为DDG系出名门;但Marco却更能从开发者的角度来审视Delphi。我的建议是,如果你买了MD,不妨也买一本相应版本的DDG,反之亦然。它们是竞争互补的关系,都有对方不能企及的优点,参照阅读则更为全面。对这两本书我想就不必多言了。总之,每位Delphi程序员都应该在开始学Delphi时就买一本DDG和一本MD;但是要记得,每种一本就够,真的。
还有一本不能不提的是Charlie Calvert著Delphi 4 Unleashed;中文版是机械工业出的,书名《Delphi 4编程技术内幕》。这同样是一个系列中的一本,其它两本分别是Delphi Unleashed和D2 Unleashed,中间缺了D3 Unleashed;而且,在D4 Unleashed之后也再也没有下文。还记得在深圳书城翻开这本书时,第一章就把我深深吸引住了。在这一章里,作者阐述了该书的风格和主要内容。请允许我引用一段——“我在写这本书是没有采用指南模式和参考模式,取而代之的是,我选择了一种描述性的风格,这意味着你可以坐在一张舒服的椅子上安静地进行阅读。……”而且,作者最终完美地实现了自己的承诺。Charlie在描述为该书写范例代码时巧妙地给初学者提出一些忠告:书写简单的代码–螺旋式上升–好OOP与差OOP的对比–注意灵活的事件处理程序–不断梳理代码和分离对象–避免使用隐藏数据交叉链接对象–简短的方法–避免特征漂移,真是用心良苦。这本书也正体现开发技术的专门化趋势——以章节为单位,就某一专门问题作深入探讨;看似不够系统,其实是在“深度”上下了功夫。
也是从这本书开始,我对Delphi图书的认识大体上定型了,开始更有针对性地选择读物,也从坊间寻得一些难得的佳作。Delphi类图书大体有系统介绍类、参考手册类、专门技术类,另外还有一类,名之为“杂锦”,此处不提。系统介绍类的,首推MD和DDG系列。参考手册类的,曾买过清华大学出版社的《Delphi 4.0/5.0类参考指南》、《Delphi 4.0/5.0高级类参考指南》。这套书实质上差不多等于VCL帮助文档的中文版,但在中文资料缺乏的年代,仍有其存在的价值。平时浏览尚可,关键是还是查在线帮助方便些。这类书中有两本是不可缺少的手边参考读物。一本是Ray Lischner著Delphi in a Nutshell;中文版由电力出版社出版,书名《Delphi技术手册》。为什么推荐这本书?首先是因为该书属于O’Reilly出版社著名的Nutshell(坚果)系列,而O’Reilly本身和坚果系列图书都是技术图书中“品质”的代名词。再者,作者Ray Lischner在开发界也算鼎鼎有名。他是加州技术学院的博士,Tempest Software公司创始人,之后执教于Oregon State University(俄勒冈州立大学),教授C++课程。Ray同时也是O’Reilly C++ in a Nutshell的作者。有趣的是,他还写过一本Shakespear for Dummies(莎士比亚傻瓜书),真是兴趣广泛。前年我在CoDelphi.com上推荐这本书时,曾有朋友颇不以为然,我猜想他们多半没仔细看过。该书不但以参考手册的形式系统介绍了Object Pascal,还就对象模型、运行时类型信息和并发编程等内容作了深入探讨,这些话题对于任何一个严肃的程序员都是有益的。然而和大多数引进版Delphi图书一样,其病在译文不佳。
另一本是Clay Shannon著Developer’s Guide to Delphi Trouble Shooting;中文版由电子科技大学出版社出版,书名《Delphi开发人员排错指南》。不认识Clay Shannon?那真是太可惜了,他可是Delphi Informant Magazine的高酬专栏作者,也常在BorCon上发表专场演说。这本书罗列了在Delphi程序设计中可能遇见的609种错误信息,分析其原因,并给出解决问题的参考方法;按字母顺序排列的错误信息检索,查起来非常方便。尽管在Delphi IDE中选定错误信息按F1也可以得到在线帮助,但与该书相比实在不可同日而语。翻阅书中条目,想起除错(Debug)的痛苦,自然就会深知“字字血泪”的意思了。读者要注意的是,这也是一个图书系列,到目前为止总共有两个版本,一个是Developer’s Guide to Delphi Trouble Shooting,1998年出版;另一个则是Tomes of Delphi: Developer’s Guide to Troubleshooting (Wordware Delphi Developer’s Library)。我手头电子科大出的是第一个版本,也可以说是稍稍过时的版本(对应Delphi 4),现在有没有新版本的中文版,我也不大清楚。
至于专门技术类图书,由于笔者开发应用领域有限,只能介绍自己熟悉的几本。一本是Eric Harmon著Delphi COM Programming;中文版由机械工业出版,书名《Delphi COM深入编程》。该书关于接口的描述值得一读,但整体而言尚欠“深入”,对于只想大体了解COM技术的Delphi开发者大概够用。一本是Keith Wood著Delphi Developer’s Guide to XML,尚无中文版。Keith也是Delphi Informant Magazine的资深作者,在圈内享有盛名。我曾代国内杂志向他约稿,他告知稿酬是“1000 USD for a small article”,而另一位DIM作者的开价不过是区区200USD而已。而这本厚达500页的Delphi XML技术专书,的确体现了Keith钻专门技术领域“牛角尖”的非凡功力。Delphi和XML在作者笔下融会贯通,竟无丝毫阻滞隔阂之感。该书大体上分为三个部分:介绍XML/Delphi中的XML(DOM/SAX)/Delphi实战XML,完整、充分、透彻地讲解了XML在Delphi中的应用。
还有一本是Alan C. Moore博士和John C.Penman著The Tomes of Delphi: Basic 32-Bit Communications Programming,无中文版。说来好笑,我在Amazon订购的是Chad Z. Hower(昵称Kudzu)的相关著作。Kudzu是Indy控件组的原作者和现在的核心开发组灵魂人物。此兄夏天住在俄国圣彼得堡,冬天在塞浦路斯享清福,过的是神仙日子。他在Delphi通讯开发技术方面的思路也是天马行空,干冒天下之大不韪,叫嚣“blocking方式比non-blocking方式好”。我无意比较这两种socket通讯方式的优劣,不过但就Indy而言,通过多线程解决阻塞死锁问题的思路的确是独具一格。读者可以在http://www.hower.org/Kudzu/得到关于Kudzu的更多信息和Indy技术资料。不过由于那本书最后以付费e-book的形式发布(http://www.atozedsoftware.com/Indy/Book/index.html,29欧元),就寄了这一本过来。回过头来讲Alan C.Moore的书,说实在话也很不错。内容涵盖Winsock API和TAPI,开发Winsock或TAPI通讯程序的Delphi程序员如果手上有这本书,无论是全书阅读还是置于案头参考,相信都会受益良多。最后我还想提及我国台湾省李维先生的一系列Delphi分布式开发著作。鉴于这些书在大陆热卖,就不多作介绍了。读者可以参考王行舟、陈省和我在《程序员》杂志三味书斋的一席清谈。
写到这里,作文就算是交差了。读者也许会不满意,而最不满意的恐怕还是我自己。书架上还有数本好书值得一赞;就提到的图书而言,介绍也失之简单。不过就这样简单地介绍,也已超出了编辑规定的字数。谁说Delphi无好书?到我的书架上翻翻看,也许有适合你的一本呢。
虽然没看您的文章,在一番摸爬滚打之后,我已用delphi写了几个小东东,部分解决了工作中的问题。目前准备继续深究下去,这篇文章我只能带回家看了。上次您发给我的识别程序,我现在也可以写了,多谢您的指导。
您好!打扰了!您能讲C++的课程吗?我现在正在找C++讲的非常棒的老师,您能帮我们介绍吗?谢谢!:)
请给我Email。
曾经用过一个月的Delphi,维护和debug了一个医院管理系统,看过DDG6,受益颇多。要是早点看到你的这篇文章及推荐的其他几本书,可能会做的更好些,呵呵。
good
Hello from Polska!:)
Where I may take free e-book "The Tomes of Delphi: Basic 32-Bit Communications Programming"?
to Polska: If you need this book, go Amazon.com and buy one copy for yourself. It really helps!
好像我没办法让自己有足够的时间去读完您的这篇文章,字太密了,盯着屏幕是很费眼的,您能把书目都列出来总结一下么?比较容易查找,或者用特殊颜色标记出来,,,
写的不错,我向大家推荐DDG,太强了,不看DDG,别学Delphi了
function TFormatLoad.AmalgamateReportXML(Report1,
Report2: TStringStream): String;
var i ,j, k, l :integer;
NodeListReport1, NodeListReport2 : IXMLNode;
NodeListReport1C, NodeListReport2C : IXMLNode;
Name1, Name2, DataField1, DataSet1, DataSetName1, Text1: Variant;
begin
Result :=”;
InitiallyReportXml.LoadFromStream(Report1 , xetUTF_8);
FormatReportXml.LoadFromStream(Report2 , xetUTF_8);
NodeListReport1 := InitiallyReportXml.DocumentElement.ChildNodes[0];
NodeListReport2 := FormatReportXml.DocumentElement.ChildNodes[0];
for i := 0 to NodeListReport1.ChildNodes.Count -1 do
begin
for j := 0 to NodeListReport1.ChildNodes[i].ChildNodes.Count -1 do
begin
if uppercase(trim(NodeListReport1.ChildNodes[i].ChildNodes[j].NodeName)) = ‘TFRXMEMOVIEW’ then
begin
Name1 := NodeListReport1.ChildNodes[i].ChildNodes[j].Attributes[‘Name’];
DataField1 := NodeListReport1.ChildNodes[i].ChildNodes[j].Attributes[‘DataField’];
DataSet1 := NodeListReport1.ChildNodes[i].ChildNodes[j].Attributes[‘DataSet’];
DataSetName1 := NodeListReport1.ChildNodes[i].ChildNodes[j].Attributes[‘DataSetName’];
Text1 := NodeListReport1.ChildNodes[i].ChildNodes[j].Attributes[‘Text’];
if Name1<>null then
begin
for k := 0 to NodeListReport2.ChildNodes.Count -1 do
begin
for l := 0 to NodeListReport2.ChildNodes[k].ChildNodes.Count -1 do
begin
Name2 := NodeListReport2.ChildNodes[k].ChildNodes[l].Attributes[‘Name’];
if Name2 = Name1 then
begin
NodeListReport2.ChildNodes[k].ChildNodes[l].Attributes[‘DataField’] :=DataField1;
NodeListReport2.ChildNodes[k].ChildNodes[l].Attributes[‘DataSet’] :=DataSet1;
NodeListReport2.ChildNodes[k].ChildNodes[l].Attributes[‘DataSetName’] :=DataSetName1;
NodeListReport2.ChildNodes[k].ChildNodes[l].Attributes[‘Text’] :=Text1;
end;
end;
end;
end;
end;
end;
end;
FormatReportXml.SaveToStream(Report2);
Result := Report2.DataString;
end;
合并两个XML的部分内容
我时常在VC++和Delphi之间难以选择,现在看了这篇文章,
有了一点想法了。