第1章走进Delphi本章回答了谁是本书的读者。本书适用于中、高级的Delphi程序员,以及从VisualBasic或C++语言迁移到Delphi的专业程序员。对于中等程度或过渡型的读者,本章提供了调整的机会。本章是专门为中等程度及过渡型的读者所设计的。如果您对基础知识了解得很清楚,可以跳过本章。本章试图保证在涉及基础知识时,我们大家都处于同一水准上。对于中等技术水平的Delphi程序员,这一章将填补他的一些知识漏洞;而对于过渡型的读者,这一章则架起了通往本书及Delphi的其余部分的桥梁。Delphi之美在于它令人迷惑般的简单。我曾使用C、C++、Java、VisualBasic、Access及其他许多语言进行编程,但Delphi一直是我最喜爱的语言。从表面上看,Delphi与VisualBasic有惊人的相似。作为一种工具,Delphi建立在成熟的面向对象语言ObjectPascal之上。使用Delphi,您可以做到能用C++完成的任何事情但避免C++的大部分麻烦;使用Delphi,您可以创建VisualBasic应用程序。反过来则是做不到的。在C++中,程序员可能会在内存管理、模板、操作符重载时遇到麻烦,而在Delphi中则不会出现这种问题。在VisualBasic中您会很快遇到一些障碍,而且会经常出现这样的情况。Delphi既具有C++的强大性又具有VisualBasic的易用性。1.1浏览和配置IDE当您运行Delphi时就可以看到IDE(集成开发环境,IntegratedDevelopmentEnvironment)。事实上,Delphi的先驱之一TurboPascal就提供了业界最早的IDE。在早期版本的TurboPascal中,集成开发环境用于建立DOS应用程序,在当时非常有效,就像现在的Delphi一样。我们来回顾一下Delphi的基本功能。2Delphi6应用开发指南1.1.1打开文件和保存文件Delphi存在的目的是用于Windows编程。而Windows程序具有图形用户界面。Delphi工程的图形部分存储在描述程序外观的资源文件中,代码则写在另一个文件中。因此每个Windows工程都会有两个或更多的文件。文件的集合称之为工程。当您要编写程序时,您需要创建一个新的工程。创建一个新的工程很幸运,当您打开Delphi时,会默认地创建一个新的Windows应用程序工程。也可以运行Delphi来创建新的工程,按Alt+F,N键即可。创建的新工程的选项位于File,New菜单中。这两种途径都可以得到新的工程,如图1.1所示。图1.1创建一个新工程时桌面的外观显示在前台的单元文件可供编写程序代码。显示在后台并与单元文件稍有偏移的是第1章走进Delphi3窗体,可在其中设计程序的图形用户界面。根据需要,Delphi创建的Windows应用程序可拥有任意数目的窗体,每个窗体有一个单元文件和窗体文件。单元的数目同样的不受限制,但并非所有的单元都有窗体。如果单元不需要可视化的外观,那么它就不需要窗体。按Alt+F,N,U键可以创建无窗体的单元。这就是从File,New菜单中创建一个新单元的过程。打开文件和关闭文件为管理桌面需要打开或关闭文件,这取决于您的工作在程序代码中所处的位置。文件操作可以在File菜单中找到。要关闭特定的文件,请确认代表该文件的窗体或单元位于前台。按Alt+F,C键可以关闭前台文件。当您所关闭的单元有相关联的窗体时,关联的窗体也会被关闭,反之亦然。打开文件是在File菜单中的操作。可以按Alt+F,O键来打开文件,或使用File菜单中的Reopen命令(刚好位于Open菜单项之下)来选择一个最近关闭的文件。当打开的单元有相关联的窗体时,只需选择单元的名字则窗体文件也会打开。保存文件同所有的文件操作一样,Save操作也在File菜单中。您可以选择Save,SaveAs,SaveProjectAs,或SaveAll等菜单项来保存您的工作。Save用于保存前台文件,SaveAs用新的名字保存前台文件,SaveProjectAs以不同的名字保存工程,而SaveAll则用一次操作保存了工程中的所有文件。当保存工程时,您对工程文件的命名再加上.DPR扩展名将成为编译时程序的名字。1.1.2搜索代码程序员通常会在几个星期之内忘掉所编写的代码。程序员在跟踪并修改代码时,可能会花费相当可观的时间查找代码。Delphi提供了一些很好的工具来做这些工作。查找与替换Delphi的Search菜单提供了几种搜索方法。在Search菜单中,能执行Find,FindinFiles,Replace,SearchAgain或者IncrementalSearch等操作。例如,当您按Ctrl+F键时,就会显示如图1.2所示的Find对话框,它包含两个属性页。按Ctrl+R键则显示ReplaceText4Delphi6应用开发指南对话框,它比Find对话框多一个输入域,您可以在其中输入文字用以替代找到的文字,除此之外它与Find对话框几乎完全相同。图1.2按Ctrl+F键显示如图的带两个属性页的Find对话框。Find属性页可用于在前台文件中查找,FindinFiles属性页是基于文件路径和掩码,可在一个或多个文件中进行查找按F3键可运行SearchAgain菜单项。这将利用上一次输入到Find,FindinFiles或Replace对话框中的信息重复上一次查找。一个不错的附加查找功能是IncrementalSearch(增量查找)。按Ctrl+E键可启动增量查找。如果发现匹配,增量查找将寻找键入的每个字符。在图1.3中键入字母me,结果关键字implementation中的me被找到,从而被高亮显示。跳到行号如果知道要检查的代码的行号,GoToLineNumber功能是很有用的。按Alt+G键就可以使用GoToLineNumber功能。例如,如果把代码连同行号打印出来并发现了一个错误,这个命令很快就能找到错误位置。另一项技术是创建日志文件,当代码运行时向每个日志项添加行号,然后可以用日志文件中引用的行号和GoToLineNumber功能迅速把光标移动到该行代码。第1章走进Delphi5图1.3按Ctrl+E键启动增量查找;查找过程会像您分别键入了每个字符一样地执行浏览对象如图1.4所示是BrowseSymbol对话框,它可以迅速查找关于一个类的所有信息,或者对象类的某个实例的所有引用。当您按Alt+S,Y键并输入TForm(一个类名)将显示如图1.5所示的对话框,其中有Scope和Inheritance属性页,并包含了所有引用了TForm类的单元。在本例中可以看到forms.pas和Unit1.pas,其中forms.pas包含了TForm类的实现,而Unit1.pas中包含了一个对TForm的引用。图1.4按Alt+S,Y键打开如图1.5所示的Symbolexplorer,它提供关于输入的符号属性的详细信息6Delphi6应用开发指南图1.5输入变量名,您只能得到引用该变量的单元的名字如果您键入对象的名字,SymbolExplorer将只显示一个列表,其中包含了引用该对象的单元的名字。1.1.3探索DelphiDelphi是一种基于ObjectPascal的快速应用程序开发工具,ObjectPascal是全功能的面向对象语言,这意味着:其功能主要集中在类的定义方面,这些类映射到描述问题域行为和数据的实体。而属性可以是数据或过程。随之而来,在Delphi中必须有管理对象信息的工具。有几种这样的工具。很明显的一种是代码。对于过渡型的程序员,不那么清楚的一对工具是ObjectInspector和ObjectTreeView。本节将示范如何使用ObjectInspector和ObjectTreeView,以便在设计时管理对象。Delphi还有其他一些有趣的特性,可有助于管理任务列表、调试任务,以及窗体的可视化布局。除了ObjectInspector和ObjectTreeView之外,本节还将示范使用To-DoList、特定的调试视图和AlignmentPalette。ObjectInspector如图1.6所示的ObjectInspector是一个数据访问对话框,可用于在设计时定义对象数据的默认值。如图所示,当前对象和类分别是Form1和TForm1。如果对列出的值进行第1章走进Delphi7修改,就改变了Form1的初始值。图1.6在设计时从ObjectInspector顶部的下拉列表中选定对象,即可改变其初始值在Properties属性页中,包含了设计时Form1对象所有可改变的数据。Events属性页则包含了对Windows消息作出反应的一些特别的特性。事件基本上是对鼠标单击之类的Windows消息作出响应的子程序。单击Event属性页,并在右栏中双击,Delphi会创建Shell函数,响应与该事件相关的消息。例如,单击Event属性页,在与OnClick事件相邻的右栏中双击,Delphi会创建如图1.7所示的空过程。8Delphi6应用开发指南图1.7双击一个事件特性将在单元中创建一个空过程,该空过程包含了双击的事件特性所对应对象的引用。在图中Form1对象的OnClick事件被双击通过向该过程添加代码,您可以对该事件作出特定的响应。在例子中,单击窗体将运行OnClick事件相应的代码。请动手试一下这个例子。1.创建一个新的工程。2.如果ObjectInspector没有打开,请按F11键打开它。3.在ObjectInspector中,如果Form1没有被选定,请从下拉列表框中选定它。4.单击Events属性页。5.找到OnCreate事件(请注意事件是按照字母顺序排列的)。6.在OnCreate事件的右侧双击。7.单元中添加窗体的OnCreate事件的Shell过程。将下面一行代码添加到begin与end之间的光标闪烁处。ShowMessage('HelloWorld!');8.按F9键运行程序。将显示如图1.8所示的对话框。第1章走进Delphi9图1.8前面的列表中所描述的例子程序的输出注意:如果偶尔对某个事件创建了事件过程,而又并不真正需要它,只要不向begin和end关键字之间添加任何代码即可;下次保存工程或该文件时,Delphi将清除空的事件过程。虽然可以手工编码事件过程,但上面的方法是向对象添加事件过程的最简单的途径。当向非可视化控件添加事件过程时,您需要创建事件过程并将其与事件的数据和代码联系起来。第6章将示范该技术。最后要注意:ObjectInspector不允许对特性或事件赋予错误类型的初值。在ObjectInspector中,向数据赋值的代码与运行时所用的代码是相同的,因此其行为也是类似的。一般来说,如果对象的属性的赋值不合适,将会显示如图1.9所示的异常。无论在设计时或运行时出现无效赋值,都会发生异常。10Delphi6应用开发指南图1.9如果向对象的属性输入无效值,ObjectInspector使用异常处理进行恢复ObjectTreeviewDelphi是面向对象的开发环境,因此用户可以从管理对象间相互关系的机制中受益。一种机制便是ObjectTreeview。按Alt+V,j键可以打开ObjectTreeview。ObjectTreeview以层次化的方式在对象中进行定位。ObjectInspector只是按字母顺序列出所有的对象,而ObjectTreeview则按照对象之间关系的顺序将其列出。例如当一个OK按钮位于窗体之上时,从语义上可称窗体拥有该按钮。当在ObjectTreeview中单击某对象时,则该对象将成为ObjectInspector中的当前对象。以这种方式,ObjectTreeview可帮助您很快的找到并管理特定对象的属性。To-DoListDelphi5中添加了To-DoList特性。To-DoList与Post-It®记事本功能相仿。当处于任务当中或结束当天工作时,如果需要保