我的Delphi书架

眼光在书架上扫过,想要为这篇命题作文找点素材。末了遗憾地发现,随着书架本身的逐渐升级,看书的时间却越来越少。最要命的是,连看书的心情竟也似乎变成了可望不可即的妙物。然而作文和程序一样,总是要写的。也许,现在少看书,是因为已经看了太多的书?还是书太多而无从选择?抑或是现在的书没有以前的好?这三种可能性中无论哪一种稍具成立的理由,大概都会引出一个结论——无论是对于程序员,还是对于从事其它职业的人,在其职业生涯中、甚至整个生命历程中,书籍的影响往往是靠前的。越先接触到的书,对人的影响越大。可悲的是在意识到这一点时,我们多半已经走了不少弯路,甚至在走了不少弯路之后仍未能得到确切、真实、有用的知识。曾身为初学者的我,不禁为初学者们暗中捏了一把汗。选书,难!

那么,书柜玻璃门里封存的书籍们,似乎也有了发挥余热的地方。虽然我不是专业程序员,但学习编程也有8年之久,利用Delphi协助教学工作也有45年。把我看书的经验(也许是不成熟的罢)介绍给初学者,在大家选书时能帮上一点小忙,这篇东西就算是功德圆满了。

几年前一个偶然的机会,有位朋友向我介绍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 MillerDavid Powell著,Special Edition Using Delphi 3;中文版由机械工业出版社出版,书名《Delphi 3开发使用手册》。Todd当时是Delphi开发支持部高级顾问,而David则任Borland Delphi资源支持工程师。两位作者对于Delphi的深刻理解,使得本书的价值大大提升了。单纯从“代码”或是“具体技术”来看,当然有过时的地方,但偶尔重温,仍能给人以启发。遗憾的是译文质量普通,印刷错误比比皆是,实在是糟蹋了一本好书。

Marco CantùTim GoochJohn F. Lam著,Delphi Developer’s Handbook;中文版由电子工业出版社出版,书名《Delphi高级开发指南》。该书主要作者MarcoDelphi界尽人皆知的专业作者和技术支持专家,他的一系列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 TeixeiraXavier PachecoBorland Delphi Developer’s Guide。我曾经有过一本中文版,不过出版社和中文书名都忘了,现在手头的是SAMS出的Delphi 6 Developer’s Guide英文原版。DDG系列和MD系列到底孰优孰劣,怕是上帝也难回答的问题吧。T-RexXSteve TeixeiraXavier Pacheco的昵称)二人均为Borland雇员。DDG6的前言就出自Borland Developer Relations部门的副总裁David IntersimoneDavid I)的手笔。就这一点而言似乎可以认为DDG系出名门;但Marco却更能从开发者的角度来审视Delphi。我的建议是,如果你买了MD,不妨也买一本相应版本的DDG,反之亦然。它们是竞争互补的关系,都有对方不能企及的优点,参照阅读则更为全面。对这两本书我想就不必多言了。总之,每位Delphi程序员都应该在开始学Delphi时就买一本DDG和一本MD;但是要记得,每种一本就够,真的。

还有一本不能不提的是Charlie CalvertDelphi 4 Unleashed;中文版是机械工业出的,书名《Delphi 4编程技术内幕》。这同样是一个系列中的一本,其它两本分别是Delphi UnleashedD2 Unleashed,中间缺了D3 Unleashed;而且,在D4 Unleashed之后也再也没有下文。还记得在深圳书城翻开这本书时,第一章就把我深深吸引住了。在这一章里,作者阐述了该书的风格和主要内容。请允许我引用一段——“我在写这本书是没有采用指南模式和参考模式,取而代之的是,我选择了一种描述性的风格,这意味着你可以坐在一张舒服的椅子上安静地进行阅读。……”而且,作者最终完美地实现了自己的承诺。Charlie在描述为该书写范例代码时巧妙地给初学者提出一些忠告:书写简单的代码螺旋式上升OOP与差OOP的对比注意灵活的事件处理程序不断梳理代码和分离对象避免使用隐藏数据交叉链接对象简短的方法避免特征漂移,真是用心良苦。这本书也正体现开发技术的专门化趋势——以章节为单位,就某一专门问题作深入探讨;看似不够系统,其实是在“深度”上下了功夫。

也是从这本书开始,我对Delphi图书的认识大体上定型了,开始更有针对性地选择读物,也从坊间寻得一些难得的佳作。Delphi类图书大体有系统介绍类、参考手册类、专门技术类,另外还有一类,名之为“杂锦”,此处不提。系统介绍类的,首推MDDDG系列。参考手册类的,曾买过清华大学出版社的《Delphi 4.0/5.0类参考指南》、《Delphi 4.0/5.0高级类参考指南》。这套书实质上差不多等于VCL帮助文档的中文版,但在中文资料缺乏的年代,仍有其存在的价值。平时浏览尚可,关键是还是查在线帮助方便些。这类书中有两本是不可缺少的手边参考读物。一本是Ray LischnerDelphi 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 ShannonDeveloper’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 Shooting1998年出版;另一个则是Tomes of Delphi: Developer’s Guide to Troubleshooting (Wordware Delphi Developer’s Library)。我手头电子科大出的是第一个版本,也可以说是稍稍过时的版本(对应Delphi 4),现在有没有新版本的中文版,我也不大清楚。

至于专门技术类图书,由于笔者开发应用领域有限,只能介绍自己熟悉的几本。一本是Eric HarmonDelphi COM Programming;中文版由机械工业出版,书名《Delphi COM深入编程》。该书关于接口的描述值得一读,但整体而言尚欠“深入”,对于只想大体了解COM技术的Delphi开发者大概够用。一本是Keith WoodDelphi Developer’s Guide to XML,尚无中文版。Keith也是Delphi Informant Magazine的资深作者,在圈内享有盛名。我曾代国内杂志向他约稿,他告知稿酬是“1000 USD for a small article”,而另一位DIM作者的开价不过是区区200USD而已。而这本厚达500页的Delphi XML技术专书,的确体现了Keith钻专门技术领域“牛角尖”的非凡功力。DelphiXML在作者笔下融会贯通,竟无丝毫阻滞隔阂之感。该书大体上分为三个部分:介绍XML/Delphi中的XMLDOM/SAX/Delphi实战XML,完整、充分、透彻地讲解了XMLDelphi中的应用。

还有一本是Alan C. Moore博士和John C.PenmanThe Tomes of Delphi: Basic 32-Bit Communications Programming,无中文版。说来好笑,我在Amazon订购的是Chad Z. Hower(昵称Kudzu)的相关著作。KudzuIndy控件组的原作者和现在的核心开发组灵魂人物。此兄夏天住在俄国圣彼得堡,冬天在塞浦路斯享清福,过的是神仙日子。他在Delphi通讯开发技术方面的思路也是天马行空,干冒天下之大不韪,叫嚣“blocking方式比non-blocking方式好”。我无意比较这两种socket通讯方式的优劣,不过但就Indy而言,通过多线程解决阻塞死锁问题的思路的确是独具一格。读者可以在http://www.hower.org/Kudzu/得到关于Kudzu的更多信息和Indy技术资料。不过由于那本书最后以付费e-book的形式发布(http://www.atozedsoftware.com/Indy/Book/index.html29欧元),就寄了这一本过来。回过头来讲Alan C.Moore的书,说实在话也很不错。内容涵盖Winsock APITAPI,开发WinsockTAPI通讯程序的Delphi程序员如果手上有这本书,无论是全书阅读还是置于案头参考,相信都会受益良多。最后我还想提及我国台湾省李维先生的一系列Delphi分布式开发著作。鉴于这些书在大陆热卖,就不多作介绍了。读者可以参考王行舟、陈省和我在《程序员》杂志三味书斋的一席清谈。

 

写到这里,作文就算是交差了。读者也许会不满意,而最不满意的恐怕还是我自己。书架上还有数本好书值得一赞;就提到的图书而言,介绍也失之简单。不过就这样简单地介绍,也已超出了编辑规定的字数。谁说Delphi无好书?到我的书架上翻翻看,也许有适合你的一本呢。

我的Delphi书架》有11个想法

  1. 虽然没看您的文章,在一番摸爬滚打之后,我已用delphi写了几个小东东,部分解决了工作中的问题。目前准备继续深究下去,这篇文章我只能带回家看了。上次您发给我的识别程序,我现在也可以写了,多谢您的指导。

  2. 曾经用过一个月的Delphi,维护和debug了一个医院管理系统,看过DDG6,受益颇多。要是早点看到你的这篇文章及推荐的其他几本书,可能会做的更好些,呵呵。

  3. Hello from Polska!:)

    Where I may take free e-book "The Tomes of Delphi: Basic 32-Bit Communications Programming"?

  4. 好像我没办法让自己有足够的时间去读完您的这篇文章,字太密了,盯着屏幕是很费眼的,您能把书目都列出来总结一下么?比较容易查找,或者用特殊颜色标记出来,,,

  5. 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的部分内容

  6. 我时常在VC++和Delphi之间难以选择,现在看了这篇文章,

    有了一点想法了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注