2012年2月4日

Delphi Project 之工程管理器(Project Manager)

工程(Project)可以说是Delphi的生命。不可能创建一个没有工程的程序。利用工程可以把全部工作组合到一起,从而创建出可以执行的应用程序。

一般来说,每个工程都需要管理。也许要增加一个新的单元到工程中,或是从工程中删除一个单元;也许需要增加另一种类型的文件(比如二进制资源文件)到工程中。增加和删除单元及其他的工程文件,都需要通过Project Manager来进行的。

工程组(Project Groups)

工程是一个文件集合,这些文件一起起作用即可创建独立的可执行文件或DLL。这就是Delphi IDE涉及到的工程的定义。在现实中,有各种类型的工程,比如一项要完成的工作也可称为工程。

大型工程可以包括一个或多个可执行文件,以及若干个动态链接库(DLLs),由于有些工程由多个(不是单个)可执行程序组成,Delphi允许将若干个工程放在一起组成一个组,从而把组中全部工程当作一个单独的整体来处理。这个整体就叫做工程组。

1、为什么要使用工程组(Why Use Project Groups?)

大家可能会问:工程组有哪些优点?工程组的优点如下:

  • 使完整的软件工程的控制更方便。
  • 修改DLL与测试DLL的EXE可同时进行。
  • 一次可编译、链接一组工程。
  • 可同时打开多个工程,并可在打开的工程间来回切换。
  • 提供了一种组织相关工程的办法。

创建单个可执行文件的工程不需要工程组。一个单个工程不能看作一个组,对么?在单个工程情况下,工程组的概念就不合适了。

但是,设想一下:一个程序包含一个EXE文件和单个DLL,DLL和EXE是联系在一起的。当修改DLL时,一般都希望EXE就在旁边,可以立即测试DLL修改的效果。在这种情况下,使用工程组就会十分有意义,因为EXE和DLL总是在一起的。

可以创建一个包含该EXE和DLL的工程组。当要修改应用程序或DLL时,可打开该工程组(而不是单个工程)。打开工程组后,EXE工程和DLL工程会同时显示出来。可用Code Editor修改DLL或EXE,并在它们之间来回切换。如下图,就是Project Manager窗口,其中打开了这样一个工程组。

0256

使用工程组的另一个原因是:可将相关工程组织在一起。初听起来,这句话好像意义不大,下面来解释。比如一个公司开了一套串行通信组件集合,其中的组件分为三大类:基本串行通信、传真和TAPI,每一大类都包含很多样本程序。

在这种情况下,可以为传真类的程序创建一个工程组,为TAPI类中的程序创建一个工程组,为基本串行通信类中的程序创建一个工程组。这样,用户打开TAPI工程组,将全部的TAPI样本程序都置于其中。整个工程组可以同时编译、链接,因而可以节省时间并简化打开、编译链接每个工程的操作。这里,各个工程不像EXE和DLL那样一起工作,但这些工程是相关的,因而工程组的概念是有意义的。

2、活动的工程(The Active Project)

任何工程组中总有一个活动的工程,活动工程以粗体字显示在Project Manager中。如上面的图中,活动的工程为TestDLL。

当从Delphi主菜单中选取Compile或Build菜单项时,活动工程就会被编译、链接。

每当一个工程被设置成活动工程时,这两个菜单项都会发生改变。例如,如果活动工程的名为Project1,则两个菜单项的名就是【Compile Project1】和【Build Project1】;如果把一个名叫PictView的工程设置为活动工程,则这两个菜单项名就是【Compile PictView】和【Build PictView】。

通过Delphi主菜单或Delphi工具栏来增加元素,比如新增窗体或单元,都会自动添加到当前活动工程中。

把一个工程设置为活动工程的方法有多种。

  • 其中一种方法是:在要设置成活动工程的工程节点中任意选择一项,然后点击位于Project Manager窗口顶部的“Active”按钮。
  • 另一种方法是双击要设置成活动工程的工程节点。
  • 最后一种方法是从工程节点的快捷菜单中选择“Active”菜单项来激活某个工程。

工程管理窗口(The Project Manager Window)

工程管理器是所有工程和工程组的中央控制器。用工程管理器可增加文件到工程中、删除工程中的文件、查看单元或窗体、添加工程到工程组、改变工程的排列次序等等。可选择主菜单上【View | Project Manager】菜单项或按Ctrl + Alt + F11来显示工程管理器。

0257

Project Manager窗口含有一个树形列表控件,它最多显示四层,这四层是:

  • 工程组
  • 工程组内的工程
  • 工程中的窗体和其他文件
  • 窗体节点下的单个窗体文件和单元

自然地,在任何树列表控件(tree view control)中单个节点都可以展开或收缩。Project Manager节点都带有图标来指示该节点是否包含工程、单个文件、窗体或窗体/单元。如下图:

Note

在Project Manager中查看一个单元的路径及文件名,可点击Project Manager窗口中的单元,Project Manager状态栏就会显示该单元的全部路径和文件名。如下图:

0258

1、工程管理器快捷菜单(The Project Manager Context Menus)

工程管理器的大多数工作都是通过工程管理器快捷菜单来进行的。Project Manager有四个独立的快捷菜单,下面分别进行介绍。

(1)工程组快捷菜单(The Project Group Context Menu)

用鼠标右键点击位于Project Manager树顶点的工程组节点,会显示出工程组的快捷菜单。如下图:

image

  • 【Add New Project…】——打开对象库,选择一个新的应用程序、DLLs、窗体、数据模块、组件或对象库中的其他有效对象。
  • 【Add Existing Project…】——打开一个存储在磁盘上的工程文件,将它添加到工程组中。
  • 【Save Project Group】——保存工程组。工程组的扩展名为.bpg。
  • 【Save Project Group As…】——用一个新工程组名保存工程组。
  • 【View Project Group Source】——显示工程组源文件。工程组源文件是一个特殊文件(a makefile),它包含工程组内所有工程的引用。
  • 【ToolBar】——打开或关闭Project Manager的工具栏。
  • 【Status Bar】——打开或关闭Project Manager的状态栏。
  • 【Dockable】——指明Project Manager是否可泊位。

Note

Project Manager 中每个快捷菜单都含有ToolBar、Status Bar和Dockable菜单项。下面讲解其他Project Manager快捷菜单时不再重复介绍。

(2)工程快捷菜单(The Project Context Menu)

用鼠标右键点击Project Manager中的工程节点,就会显示出工程快捷菜单。如下图:

image

  • 【Add…】——打开Add to Project对话框,增加文件到工程中。从主菜单或Delphi工具栏选择【Project | Add to Project】,也可以打开该对话框。
  • 【Remove File…】——打开Remove From Project对话框,从工程中删除文件。从主菜单或Delphi工具栏选择【Project | Remove From Project】同样可以打开该对话框。
  • 【Save】——保存工程。也可从主菜单选择【File | Save】保存工程。
  • 【Options】——为工程显示Project Options对话框。也可从Delphi主菜单选择【Project | Options】来显示Project Options对话框。
  • 【Activate】——是工程变成活动工程。
  • 【Compile】——编译工程。
  • 【Build】——建立(编译并连接)工程。
  • 【View Source】——显示工程源文件(DPR文件)。也可从主菜单选择【Project | View Source】来显示工程源文件。
  • 【Close】——关闭工程及全部文件。如果工程时一个已保存工程组的一部分,则该工程节点图标会变灰;它仍是工程组的一部分,但在IDE中不能打开。如果工程是缺省工程组的一部分,则关闭该工程并把它从缺省工作组中移出。
  • 【Remove Project】——从工程组中删除工程。注意,不是把工程从硬盘上删除,只是将它移除工作组。也可点击Project Manager工具栏中的“Remove”按钮来将工程删除出工作组。
  • 【Build Sooner】——往工程树的上部移动工程。编译链接工程时按自上而下的顺序进行的。
  • 【Build Later】——往工程树的下部移动工程。

Note

Project Manager快捷菜单中的内容比本节中介绍的还要多。如果是批处理文件工程或者程序包工程,则工程快捷菜单包含附加菜单项。由于差别不大,就不专门介绍这些附加菜单项。

(3)单元快捷菜单(The Unit Context Menu)

用鼠标右键点击Project Manager中的单元节点时,会显出单元快捷菜单。如下图:

image

  • 【Open】——在Code Editor中显示单元(对于独立的单元),或在Form Designer中显示窗体(如果单元有相关联的窗体)。
  • 【Remove From Project】——把单元从工程中删除。删除时Project Manager不会给出提示,因而不能撤销删除。如果不小心错删了一个单元,再把它加到工程中就行了。
  • 【Save】——保存单元。也可从Delphi主菜单中选择【File | Save】保存。
  • 【Save As…】——打开Save As…对话框,用新单元名保存该单元,也可从Delphi主菜单中选择【File | Save As…】来完成同样的操作。

(4)文件快捷菜单(The File Context Menu)

用鼠标右键点击除工程组节点、工程节点、单元节点外的节点(通常是.pas或.dfm文件)时,会显示文件快捷菜单。如下图:

image

这个快捷菜单只有一个菜单项,【Open】菜单项把选择的节点显示在Code Editor或Form Designer中(由所选节点的类型决定是显示在Code Editor中还是Form Designer中)。

2、Project Manager工具栏和键盘命令(The Project Manager Toolbar and Keyboard Commands)

除了Project Manager快捷菜单外,Project Manager有一个工具栏,使用这个工具栏可方便工程管理器的操作。Project Manager工具栏包含三个按钮:

image

  • Add New Project按钮。该按钮显示Object Repository对象库,从而可增加新工程到工程组中。也可点击工程组快捷菜单的【Add New Project】菜单项来增加新工程到工程组中。
  • Remove按钮。该按钮把所选工程、单元、文件等从工程组中删除。
  • Active按钮。该按钮把所选目标激活成活动工程。

键盘命令包括Delete键和Insert键。当按下Delete键,所选节点就会被删除。若选的是工程节点,则把该工程从工程组中删除;若选的是单元节点,则把单元从所属工程中删除。Insert键的功能与工程快捷菜单【Add to Project】功能一样。

Tip

Project Manager工具栏按钮有大小两种尺寸。拖动工具栏底部可改变工具栏按钮的大小,往上拖显示小按钮;往下拖显示大按钮。如图:

0259

创建并使用工程组(Creating and Using Project Groups)

对于复杂工程,使用工程组时大有益处的,但是使用工程组不是强制的,没有必要每个工程都使用工程组。Project Manager有一个名为ProjectGroup1的缺省工程组,当不专门打开或创建工程组时,可使用这个工程组。不妨按以下步骤试试:

(1)选择【File | Close All】菜单项关闭所有打开的工程或工程组。

(2)选择【File | New Application】创建一个新应用程序。

(3)选择【View | Project Manager】来显示Project Manager。如下图:

0260

ProjectGroup1工程组时一个临时工程组。当从主菜单选择【File | Save All】菜单项时,系统会提示保存工程,而不是保存保存工程组。若要保存该工程组,必须在Project Manager的工程组快捷菜单中使用【Save Project Group】或【Save Project Group As…】菜单项来保存它。

1、增加单元(Adding Units)

要增加一个已存在的单元到工程中,只需要点击Project Manager工具栏上的Add按钮,或从Project Manager工程快捷菜单中选择【Add…】。

如果工程中有一个窗体的与一个单元同名,则不能把这个单元加到该工程中。

2、删除单元(Removing Units)

使用Remove From Project选项可将文件从工程中删除。另外,也可选择要删除的单元,然后按键盘上Delete键。从工程中删除掉的文件并未从硬盘上删除,而只是将它们移除工程编译/链接过程。

Note

从工程中删除单元时要多加小心,不要把工程中其他单元引用的单元删除了。如果删除了工程要用的单元,会导致编译出错。在删除一个单元之前,一定要搞清楚工程是否还要使用该单元。如果不小心删除了工程还需要的单元,可用【Add to Project】选项将它加回到工程中。

点击工程快捷菜单中的【Remove File…】,将会显示出“Remove From Project”对话框,该对话框允许选择多个单元,因此可以同时删除多个单元文件。如下图:

0261

3、查看单元或窗体(Viewing Units or Forms)

要查看单元、窗体或其他文件,只需双击想要查看的窗体或单元节点。还可以从Project Manager快捷菜单中选择【Open】菜单项,窗体或单元就会显示在Form Designer或Code Editor中(根据所选节点的类型)。

建立工程或工程组(Building Projects or Project Groups)

要编译、链接某个工程,可按下列方法之一进行:

  • 用鼠标右键点击Project Manager中的工程机电,再从快捷菜单中选【Build】菜单项。
  • 从Delphi主菜单选择【Project | Build <工程名>】。这个菜单项的名称随着当前活动的工程的工程名自动变化。
  • 按键盘上的Ctrl + F9来编译当前活动工程。

要编译、链接整个工程组,从Delphi主菜单中选择【Project | Build All Projects】,工程组的全部工程都会被编译、链接,顺序是自上而下从工程组的第一个工程到最后一个工程。

posted @ 2012-02-04 11:20 瓢虫Monster 阅读(583) 评论(0) 编辑

2012年2月3日

Dephil之使用程序包(Using Packages)

应用程序编写完后,可以用两种方法展开(deploy)它(“展开”( Deploying)的含义是指把应用程序分发给用户)。可将应用程序分发给公众,或者分发给某个公司内的用户。不论用何种方法,都需要知道哪些选项是可用的。从根本上讲,有两种选择:静态链接或动态链接使用程序包,下面将讨论这些选项,以便编程人员作出适当的选择来展开其应用程序。下面先讲讲选项。

什么是程序包(What's a Package?)

在讨论选项之前,先给出程序包的定义。

一个程序包(package)就是一段编译过的代码,驻留在BPL扩展名的文件中。

这个解释可能还是让人不好明白,下面来进一步讲解。移去外表包装,程序包实质上就是带bpl扩展名的DLL(这样讲可能有点过,但在这里还是很贴切的)。Delphi中有两种类型的程序包:运行阶段(runtime)程序包和设计阶段(design)程序包。下面分别讲述这两种类型的程序包,以便大家理解程序包是如何工作的。

1、 运行阶段程序包(Runtime Packages)

运行阶段程序包包含应用程序需要运行的代码。虽然Delphi提供了众多不同的程序包,但最主要的程序包是VCL70.BPL,这个程序包包含了全部的基础VCL代码。如果要在应用程序中使用程序包,就要装入VCL70.BPL程序包并根据需要从中调用例程。如果应用程序是数据库应用程序,同样也要装入VCLDB70.BPL,并按需要从中调用例程。除这里提到的两个程序包外,还有其他的Delphi程序包。

除VCL程序包外,应用程序可能要用到其他程序包,当使用第三方组件或任何自己编写的组件时,就会出现这种情况。必须查看第三方组件的文档,搞清楚应用程序需要运行哪些程序包。下面先介绍设计阶段程序包,然后回过头来展开使用程序包的应用程序。

2、 设计阶段程序包(Design Packages)

大多数的Delphi组件都包含一个运行阶段程序包和一个设计阶段程序包。运行阶段程序包包含组件要运行的全部代码;设计阶段程序包包含组件在设计时要在窗体上运行的代码,包括属性编辑器和组件编辑器。

设计阶段程序包有一个Requires列表,用以通知Delphi要运行哪些程序包。设计阶段程序包总是要用运行时程序包中的代码,还可能需要一个或多个VCL程序包中的代码。一个程序包可以包含多个组件的代码,运行阶段程序包与设计阶段程序包都是如此,没有必要一个组件对应一个单独的程序包。

由于设计阶段程序包只包含在设计时显示组件所需的代码,所以它通常比相应的运行阶段程序包要小很多。Delphi仅仅在设计时使用设计阶段程序包,应用程序不使用设计阶段程序包。

静态链接与动态链接(Static Linking Versus Dynamic Linking)

上面,已经对程序包有了一些基本的了解,下面开始学静态链接和动态链接。

1、 静态链接(Static Linking)

当应用程序使用VCL静态链接时,它不再需要使用程序包;应用程序要运行的全部代码都直接链接到应用程序的可执行文件中,它是一个独立的程序,不需要任何的支持文件(程序包或DLLs)。

Note

任何规则都有例外,静态链接应用程序不需要任何DLLs支持的二个前提条件:

  1. 假定应用程序不是数据库应用程序。Delphi数据库应用程序运行时需要Borland Database Engine(BDE),BDE主要是由DLLs组成的集合,因此该应用程序是静态链接,也是需要使用DLLs的。
  2. 假定应用程序不使用任何的ActiveX控件。实际上ActiveX控件是DLL的一种形式,因此,当应用程序使用ActiveX控件时,它就不再是一个独立的应用程序。

Delphi提供了链接选项,可对其进行选择。静态链接是缺省选择,与动态链接相比,静态链接有两条主要优点:

  1. 编程人员不需要操心附件文件的安装,应用程序包含了全部要运行的代码,不需要运行时程序库的支持。
  2. 静态链接的应用程序一般总比需要程序包的应用程序要小。在讲动态链接的优点和缺点时还要谈到这一点。

静态链接有一个重要缺陷,但它只在使用到很多用户定义的DLLs的应用给程序中显露出来。这一缺陷是:在每个模块(主应用程序本身)和每个DLL中,VCL和RTL代码是重复的,这意味着代码中有不必要的重复。

例如,假设每个模块至少要200KB的VCL基本代码和RTL代码,并假定一个主应用程序要求10个支持它的DLLs(动态链接库)。这意味着当实际只用200KB的代码时,却要使用2200KB的代码(11个模块x 200KB)。应用程序和DLLs都是静态链接,在它们之间不能共享VCL和RTL代码。

2、 动态链接(Dynamic Linking)

动态链接,是指应用程序在运行阶段动态地装入它要用的程序库代码。对于Delphi应用程序,这意味着任何需要的程序包都是在运行阶段装入。需要的程序包中肯定会包括一个或多个VCL程序包,并且可能还要用第三方程序包。

Note

应用程序装入程序包是自动进行的,不必编写代码来装入程序包,Delphi负责程序包装入的工作。在静态链接的基础上选择动态链接不需要对代码做任何修改,只需要改变一下分发应用程序的方式。这一点在后面很快就会讲到。

动态链接相对于静态链接有一个主要优点:多个模块可共享代码。还记得前面举的“一个应用程序与10个支持它的DLLs”的例子么?使用动态链接,应用程序和它所有的DLLs可共享来自VCL程序包中的全部代码。每个模块至少可以减少200KB,因为所有的基本代码都包含在运行阶段DLLs中。当大型软件产品包含多个应用程序或许多DLLs时,这一优点就更加明显。

动态链接也存在两个问题。第一个问题是需要与应用程序一起传送的程序包和DLLs可能非常大,光一个主要的VCL程序包VCL70.BPL就要1.3MB。除基本VCL程序包外,应用程序可能还需要用到其他的程序包,这意味应用程序至少需要1.3MB的DLLs才可以运行。第二个问题是动态链接更加难以捉摸、更麻烦,这个问题可以归结成“版本问题”。为了讲清楚这个问题可以打个比方。假定有两个版本的Delphi,用Delphi7.02创建了一个应用程序,并选择动态链接,这就要求传送VCL程序包和RTL DLL,客户在他的机器上安装上这个应用程序后一切工作正常。与此同时,可用Delphi4.0创建一个应用程序,也采用动态链接。客户购买了该应用程序并安装它。这个安装程序是家庭制作的,不那么正规,它会覆盖原有的应用程序安装的程序包和DLLs。由于用Delphi4.0创建的程序包版本比另一种的低,两者不兼容,应用程序会突然退出运行。是否看出问题所在?

现实中,诸如Inprise的商用软件公司是这样解决这一个问题的:对一个软件的不同版本,用不同的文件名来命名其程序包和DLLs,并将版本信息嵌入到程序包和DLLs中(一个好的安装程序会自动检查版本号,并且只安装版本比系统中已存在的程序包版本高的程序包)。Borland公司的程序包不会出问题。

如果使用的组件出自一家不负责任的公司,那就很可能出问题。随着Internet的迅速发展,组件的来源范围非常广,更要重视这个问题。在很多情况下,无法预料会出什么乱子,所以在购买便宜组件或使用免费组件时要特别小心。

3、 到底哪个好?(So Which Is Better?)

大家可能会问:应该用静态链接还是动态链接?这个问题的答案取决于所编写的应用程序的类型。一般来说,如果编写小规模或中等规模的应用程序,应该用静态链接;如果编写大规模的应用给程序或用到很多DLLs的应用给程序,则应该用动态链接。

考察一个简单例子可能会使这个问题更直观些。前面我们创建了程序ScratchPad,使用静态链接,该程序编译后是427KB左右;如果使用动态链接,则EXE文件大小可降至22KB左右,但必须传送1.3MB的程序包。在这种情况下,动态链接不是一个好的选择。

在应用程序中使用运行阶段程序包(Using Runtime Packages in Your Applications)

如果选择使用动态链接,则只需修改工程选项中的一个设置。请按以下步骤操作:

(1)从主菜单上选【Project | Options】菜单项,弹出“Project Options”对话框;

(2)点击“Project Options”对话框中的Packages页面,并选中位于对于对话框底部的“Build with runtime package”选项;

0254

(3)点击OK关闭“Project Options”对话框;

(4)重建(Rebuilt)该程序;

这就是全部要做的事情。切记:使用动态链接,不需要对代码作任何修改。

分发使用程序包的应用程序(Deploying Applications Using Packages)

要分发采用动态链接的应用程序,必须知道应用程序使用了哪些程序包。如果按照上一步的步骤,则可以肯定知道需要VCL70.BPL,可能还需要其他的VCL程序包,这取决于应用程序中使用的组件。

要照抄应用程序中用到的程序包,必须运行诸如TDUMP.EXE的工具并检查EXE引用的入口;TDUMP在Delphi安装目录的Bin目录下,要运行TDUMP,只需要打开命令提示符并转到应用程序所在目录,然后在命令行输入以下命令:

tdump scratchPad.exe

TDUMP立即以滚屏方式显示出信息,可按Pause键暂停以便查看显示信息。当然滚屏可能太快,可将TDUMP的输出定向到一个文本文件,这样查看文本文件即可。例如:

tdump scratchPad.exe > dump.txt

然后可在Code Editor中打开dump.txt文件查看其中的内容。

在TDUMP生成的文件中能看到类似下面的内容:

Section:             Import
  ImportLookUpTblRVA:00000000
  Time Stamp:        00000000
  Forwarder Chain:   00000000 (index of first forwarder reference)

Imports from rtl70.bpl
                  __fastcall System::initialization()
                  __fastcall System::Finalization()
                  __fastcall System::RegisterModule(System::TLibModule *)
                  System::__linkproc__ __fastcall LStrAsg(void *, const void *)
                  System::__linkproc__ __fastcall LStrArrayClr(void *, int)
                  System::__linkproc__ __fastcall LStrClr(void *)
                  System::__linkproc__ __fastcall Halt0()
                  System::__linkproc__ __fastcall StartExe(System::PackageInfoTable *, System::TLibModule *)
                  System::__linkproc__ __fastcall HandleFinally()
                  __fastcall System::TObject::Dispatch(void *)
                  __fastcall System::TObject::FreeInstance()
                  __fastcall System::TObject::NewInstance(System::TMetaClass *)

Imports from kernel32.dll
                  GetModuleHandleA

Imports from vcl70.bpl
                  __fastcall Forms::initialization()
                  __fastcall Forms::Finalization()
                  __fastcall Forms::TApplication::MessageBox(const char *, const char *, int)
                  __fastcall Forms::TApplication::Run()
                  __fastcall Forms::TApplication::CreateForm(System::TMetaClass *, void *)
                  __fastcall Forms::TApplication::Initialize()
                  __fastcall Forms::TApplication::SetTitle(const System::AnsiString)
                  __stdcall Forms::TCustomForm::QueryInterface(const _GUID&, void *)
                  __fastcall Forms::TCustomForm::UpdateActions()
                  __fastcall Forms::TCustomForm::ShowModal()
                  __fastcall Forms::TCustomForm::SetFocus()
                  __fastcall Forms::TCustomForm::CloseQuery()

从这里面找出所有带.bpl扩展名的文件并记录下它们的文件名。记录下的文件名就是那些必须与应用程序一起分发的程序包。

Note

拥有一个好的安装程序可以节省很多时间并省去许多麻烦,Delphi7专业版和企业版中带有InstallShield Express打包程序,Wise Install打包程序也不错。好的安装程序能指示出应用程序所需的程序包,并自动将它们包括进去。不建议在任何环境下都自己编写安装程序,因为编写安装程序要考虑的问题太多,很容易因考虑不周而出问题。

大多数时候不需要在应用程序中使用运行阶段程序包,但有时候却又非使用程序包不可。

posted @ 2012-02-03 11:09 瓢虫Monster 阅读(734) 评论(3) 编辑

Delphi之使用资源文件(Using Resource Files)

New Term

每个Windows应用程序都使用资源。资源(Resources)不是可执行代码,但它属于程序的一部分元素。

典型的Windows程序的资源有:

  • 加速器(Accelerators)
  • 位图(Bitmaps)
  • 光标(Cursors)
  • 对话框(Dialog boxes)
  • 图标(Icons)
  • 菜单(Menus)
  • 数据表(Data tables)
  • 字串表(String tables)
  • 版本信息(Version information)
  • 用户定义的专用资源(User-defined specialty resources)如声音和视频文件

Note

用Project Options对话框的Version Info页面可轻松地将版本信息加到Delphi工程中。如下图:

0246

资源一般包括在扩展名为.rc的资源脚本文件中(resource script file),资源文件就是文本文件。资源文件用资源编译器编译,并在链接时加到应用程序的.exe文件中。

通常大家认为资源要加到可执行文件中,但是有些资源,如位图、字符串表、波形文件,既可以放到外部文件中(.bmp、.txt、.wav),也可加到.exe文件并包含到应用程序文件中。

把资源放到.exe文件中有两条主要优点:

  • 存取资源的速度更快。因为在一个可执行文件中查找资源花的事件比从磁盘文件中装入资源花的时间要少。
  • 程序和资源可一起包含到单个单元(即.exe文件)中,而不需要一大堆的支持文件。

它的不足之处是:会使.exe文件稍稍增大。其大小不会比外部资源文件加可执行文件大。但是增加大小会使加载该程序的时间加长。

是把资源存为外部资源文件,还是把资源放到.exe文件中,这得由编程人员自己定。但要记住的是:这两种方式用哪一种都行(甚至可以在同一个程序中使用两种方式)。

Delphi中的资源(Resources in Delphi)

传统的Windows程序几乎都至少包含一个对话框和一个图标。但是,Delphi应用程序有所不同。首先,Delphi应用程序中没有真正意义上的对话框,实质上也就是没有对话框资源(Delphi中存储的窗体是资源,但它们是RCDATA资源,而不是对话框资源)。

Delphi应用程序有传统意义的图标资源。创建应用程序时,Delphi负责创建图标资源文件。类似地,在为Speedbutton、Image组件或BitBtn组件选择位图时,Delphi将所选位图文件包含到窗体资源中(作为窗体资源的一部分)。在建立应用程序时,窗体和它的全部资源一起包括到程序文件中。这些都是自动处理的。

有时需要在通常的Delphi处理中以外使用资源。例如,要制作动画,必须有一系列的位图,将它们装载进来作为可以最快速度执行的资源。在这种情况下,就需要知道如何把资源捆绑到Delphi应用程序中。

把资源文件捆绑到可执行文件中是件非常容易的事,实际创建资源却要困难的多。如果有一个好的资源编辑器,创建诸如位图、图标和光标之类的基本资源并不困难,但创建具有专业化品质的3D位图和图标却是一项艺术性的工作。我们肯定遇到过很多不错的程序,但它们的位图按钮实在难看。我们可以利用Delphi自带的Image Editor创建位图、图标和光标。

如果要创建字符串资源、用户数据资源、波形文件资源或其他专用资源,则可能需要第三方资源编辑器。

Note

如果手头有老版本的Borland Pascal,可使用其中的Resource Workshop编辑器编辑专用资源。创建好资源后,会形成一个.rc文件,Delphi中带有Borland Resource Compiler,用Borland Resource Compiler(BRCC32.EXE)将它编译成.res文件。从技术上讲,可以用任何一种文本编辑器创建.rc文件并用资源编译器编译它,但使用资源编辑器创建资源要容易的多。

现在在推荐一个款比较不错的第三方资源编辑器Resource Builder,该软件界面简洁,使用简单,大家可以百度一下。

编译资源文件(Compiling Resource Files)

资源文件创建好后,要用资源编译器来编译它。编译资源文件的方法有两种:

  • 从命令行手工编译资源文件。
  • 添加一个批处理文件工程到工程组。

用其中任意一个方法,编译完后都得到一个.res文件,将它链接到应用程序中。

1、 从命令行编译(Compiling from the Command Line)

从命令行编译资源文件,只需打开Windows中的命令提示框,并输入一行与下面相似的命令:

brcc32 jjres.rc

0247

当然,必须保证当前系统目录为Delphi安装目录的Bin目录下,如果不是,则必须输入BRCC32.EXE的完整路径。这个资源编译器速度非常快,甚至不等察觉,它就把资源脚本文件编译完成了。

2、 使用批处理文件工程(Using a Batch File Project)

添加一个批处理文件到工程组,与从命令行编译一样简单,并且还有一个好处:保证资源文件总是最新的。要搞清楚批处理文件如何工作,可执行下面的步骤:

(1)创建一个新的应用程序;

(2)选择【View | Project Manager】打开“Project Manager”工程管理器,如下图:

0248

(3)点击“Project Manager”工具栏上的“Add New Project”按钮,显示Object Repository对象库,如下:

0249

(4)双击Batch File图标来创建文件工程。将该批处理文件工程以Project2的名称添加到“Project Manager”中,如下:

0250

(5)用鼠标右键点击批处理文件节点并选择Save,将文件保存为test.bat

0251

(6)用鼠标右键再次点击批处理文件节点并选择【Edit/Options】,会弹出“Batch File Options”对话框;

0252

(7)在Command文本框内输入下列正文:

del myfile.res

brcc32 myfile.rc

(8)点击OK关闭“Batch File Options”对话框。

这个练习锁做的就是创建一个批处理文件,当编译工程组时,它就会执行。第(7)步输入的批处理文件命令删除一个名为myfile.res文件,并调用Delphi资源编译器编译myfile.rc文件。用资源编译器编译myfile.rc文件会生成一个名为myfile.res的文件。

工程组中的下一个工程可能要使用myfile.res。呵呵,那为什么要先删除myfile.res文件呢?这是因为,删除该文件后,就能知道资源编译器是重新建立了这个文件。如果资源编译器创建资源失败,则任何要使用这个资源文件的工程都将编译失败,并报告编译错误,提示编程人员,建立资源文件出错。

把资源文件链接到你的可执行文件中(Linking Resource Files to Your Executable)

编译好资源文件后,要把编译后的资源文件链接到程序的可执行文件中,可使用$R编译器指令。例如,要链接包含在myfile.res文件中的二进制资源,可在主窗体单元的开头处插入下面一行:

{$R myfile.res}

就这么简单!只要指定的文件存在,Delphi就会在链接时把这个编译过的资源添加到可执行文件中。

使用资源的样本程序(A Sample Program Using Resources)

下面的清单中,列出了Jumping Jack的程序的主窗体单元。这个程序显示一个带声音效果的简单动画。主窗体上有两个按钮:一个Image组件和一个Label组件。Jumping Jack程序说说明了资源在Delphi应用程序中的使用。它特别说明了如何加载以资源文件形式存储的位图,如何加载并显示字符串资源,以及如何播放资源文件中的波形音频。清单后面还列出了部分资源文件。先看看清单,然后再分析程序。

JJMain.pas清单

unit JmpJackU;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, MMSystem;

{$R JJRES.RES}

const
  IDS_UP = 101;
  IDS_DOWN = 102;

type
  TMainForm = class(TForm)
    Image: TImage;
    Label1: TLabel;
    Start: TButton;
    Stop: TButton;
    procedure FormCreate(Sender: TObject);
    procedure StartClick(Sender: TObject);
    procedure StopClick(Sender: TObject);
  private
    { Private declarations }
    Done: Boolean;
    procedure DrawImage(var Name: string);
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.DrawImage(var Name: string);
begin
  { 从资源文件中读取位图,通过资源名称}
  Image.Picture.Bitmap.LoadFromResourceName(HInstance, Name);
  { 让Image有机会显示位图}
  Application.ProcessMessages;
  { 延缓,让动画变慢}
  Sleep(20);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Image.Picture.Bitmap.LoadFromResourceName(HInstance, 'ID_BITMAP1');
end;

procedure TMainForm.StartClick(Sender: TObject);
var
  s: string;
  ResName: string;
  i: Integer;
  Buff: array[0..9] of Char;
begin
  s := 'ID_BITMAP';
  Done := False;
  while not Done do
  begin
    for i := 1 to 5 do
    begin
      ResName := s + IntToStr(i);
      DrawImage(ResName);
    end;
    LoadString(HInstance, IDS_UP, Buff, SizeOf(Buff));
    Label1.Caption := Buff;
    Label1.Refresh;
    PlaySound('ID_WAVEUP', HInstance, SND_ASYNC or SND_RESOURCE);
    Sleep(200);
    for i := 5 downto 1 do
    begin
      ResName := s + IntToStr(i);
      DrawImage(ResName);
    end;
    PlaySound('ID_WAVEDOWN', HInstance, SND_ASYNC or SND_RESOURCE);
    LoadString(HInstance, IDS_DOWN, Buff, SizeOf(Buff));
    label1.Caption := Buff;
    Label1.Refresh;
    Sleep(200);
  end;

end;

procedure TMainForm.StopClick(Sender: TObject);
begin
  { 当“Stop”按钮按下时,告诉循环停止}
  Done := True;
end;

end.

JJRec.rc清单

STRINGTABLE
BEGIN
101, "Up"
102, "Down"
END

ID_WAVEUP WAVE "up.wav"
ID_WAVEDOWN WAVE "down.wav"

ID_BITMAP1 BITMAP
MOVEABLE PURE LOADONCALL DISCARDABLE
LANGUAGE LANG_NEUTRAL, 0
BEGIN
'42 4D 76 02 00 00 00 00 00 00 76 00 00 00 28 00 '
'00 00 20 00 00 00 20 00 00 00 01 00 04 00 00 00 '
'00 00 00 02 00 00 00 00 00 00 00 00 00 00 10 00 '
'00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80 '
'00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80 '
'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF '
'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF '
'00 00 FF FF FF 00 BB BB BB BB BB BB BB BB BB BB '
'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB '
'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 B0 BB '
'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 B0 BB '

此处省略了部分内容,详细内容请查看示例代码

 

分析:

主窗体类声明中声明了一个Done的布尔型字段,Done用于确定何时终止动画。DrawImage方法用于在Image组件中显示位图。

注意:上列代码中,使用了两个Windows API函数来加载字符串和波形文件资源。在StartClick方法中,LoadString函数加载一个字符串到到一个字符数组缓冲区内。然后将该字符数组分配给窗体上的Label组件的Caption属性。

PlaySound函数用于播放波形文件资源。PlaySound函数用SND_ASYNC标志通知Windows开始播放音频并立即将控制返回给程序,这使得在播放音频的同时,动画能继续下去。SND_RESOURCE标志通知Windows,声音是一个资源,而不是磁盘上的一个文件。LoadString和PlaySound函数都使用HInstance全局变量通知Windows到可执行文件中去查找资源。装入位图资源,使用VCL方法LoadFromResourceName。

而资源文件JJRec.rc中的前5行说明字符串在资源脚本文件中的格式;使用文本编辑器创建字符串表非常容易。接下去是为两个波形文件创建各自的WAVE资源,这两个波形文件已存在该工程目录中。资源编译器一看到WAVE声明,它就会读声音文件并将它们编译进二进制资源文件。

Note

从上面的清单中看出,使用文本编辑器来创建某些类型的资源是比较容易的事。如果位图和波形音频文件存为了外部文件,可像上面的清单那样将它们包含到.RC文件中,并用资源编译器将它们编译为二进制资源文件。其中二进制资源文件可链接到应用程序的可执行文件中。

上面的资源清单只是部分代码,用传统的资源编辑器创建的位图常常以数字数据的形式包含到资源文件中,位图的资源描述可以很长。Jumping Jack位图资源描述大约有200行,因此未在清单中全部列出。下图给出了Jumping Jack启动后的界面。

0253

为应用程序创建附加资源不是什么高深的学问,但也不是很简单的事情。要搞清楚它们如何协调配合要花一定的事件。

以上代码均在Delphi7中测试通过,示例代码下载:JumpingJack.rar

posted @ 2012-02-03 02:12 瓢虫Monster 阅读(720) 评论(0) 编辑

2012年2月1日

Delphi之创建组件模板(Component Template)

New Term

组件模板(Component Template)是指修改后保存下来供以后再使用的一个或一组组件。

组件模板可用来创建、保存和重复使用组件组。实际上,组件模板不必是一组组件,完全可以是单个组件。举一个小例子对理解组件模板的用途会很有帮助,但先要简要介绍一下Windows编辑控件(edit control)。

与所有的Windows控件一样,标准Windows单行编辑控件有若干预定义动作。其中一个动作与Enter键的处理方式有关。如果当光标在编辑框控件上时用户按下Enter键,Windows就开始查找窗口上的缺省按钮,如果找到了缺省按钮,Windows就点击该按钮。

这是什么意思呢?比方说,一个窗体上有多个编辑控件和一个缺省按钮(如OK按钮或Default属性设成True的其他按钮),当按下Enter键且有一个编辑控件为当前控件时,窗口会关闭;如果窗体上无缺省按钮,Windows就会发出嘟嘟声。虽然这是标准的Windows动作,但很多用户觉得它很烦人,它们希望按下Enter键后输入焦点移到下一个控件,而不是关闭窗口。

这个问题的解决其实很简单。只要为OnKeyPress事件提供一个事件处理程序并加入代码,其代码如下:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Char(vk_return) then
  begin
    Key := #0;
    PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
  end;
end;

这段代码首先检查按下的键是不是Enter键(VK_RETURN虚拟键码),如果是,它就把键值设为#0,Windows就不会发出嘟嘟声。代码第6行发送一个Windows的WM_NEXTDLGCTL消息给窗体,该消息把焦点设置到下一个控件上,这就是与此有关的全部内容。

为新的Edit组件编写好代码后,可将它保存为一个组件模板。保存组件时,全部代码都一起保存下来。创建的代码模板保存到组件面板的Templates页面上。下面来创建一个组件模板,以便读者更好地理解。下面我们按步骤建立组件模板:

(1)在空白窗体上放置一个Edit组件,将其Name属性改为EnterAsTab,并清除它的Text属性;

image

(2)切换到Object Inspector的Events页面。创建OnKeyPress事件的事件处理程序。输入下面的代码:

procedure TForm1.EnterAsTabKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Char(vk_return) then
  begin
    Key := #0;
    PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
  end;
end;

(3)选取Edit组件,从主菜单上选【Component | Create Component Template】菜单项,显示出“Component Template Information”对话框;

0244

(4)在“Component Name”栏中输入TEnterAsTab,这时的对话框如上面所示;

(5)点击OK保存该组件模板。

现在组件面板上有了一个Templates页面。

0245

切换到Templates页面,选择需要的组件放置到窗体上,OnKeyPress事件处理程序的代码也随组件一起加到了窗体上。

Tip

一个窗体上如果有多个这样的组件,对于窗体上每个EnterAsTab组件,OnKeyPress事件处理程序的代码是重复的。为了避免代码重复,可只放置一个EnterAsTab组件于窗体上,其他组件可以是标准Edit组件,它们的OnKeyPress事件均有EnterAsTab组件的OnKeyPress事件处理程序处理。

组件模板的最大优势就是:每个组件的事件处理程序的代码与该组件存放在一起。用组件模板可将定值组件按自己的安排集中在一起:带有预定义过滤器和标题的公用对话框、带有符号的加速按钮、列表框或自动从文件中加载项目的组合框以及任意其他集合。

尽管组件模板概念适用于单个组件,但用它来处理多个组件更有意义。如果有一组组件要放置到窗体上,则可以创建一个由这组组件组成的组件模板,以后再用这组组件时只要点击一下由它们组成的组件模板就可以了。

Note

组件模板与对象库中保存的窗体有一些相似之处。组件模板用于窗体上的组件组。使用对象库保存要重复使用的窗体。

posted @ 2012-02-01 13:14 瓢虫Monster 阅读(25) 评论(0) 编辑

Delphi IDE之向代码中增加方法和字段

向代码中增加方法和数据字段(Adding Methods and Data Fields to Code)

现在可以看出,在快速创建Windows应用程序的UI(用户接口)部分,Delphi是一个强有力的工具。它创建了事件处理程序,因而编程人员可以输入代码驱动其应用程序。但不久将会发现,需要在实际应用中添加更加复杂的代码。

往应用程序中增加复杂代码,其中一部分是在Delphi生成的代码中添加自己编写的数据字段及方法,例如,一个简单的应用程序可能包含有两打各种类型的事件处理程序,Delphi创建所有的事件处理程序,我们只需要在空白处填入实际代码。要使创建的应用程序能真正运转起来,我们必须编写很多方法添加到其中。

往Delphi生成的代码中添加方法和数据字段并不困难,但必须清楚规则,否则就会遇到麻烦。

Delphi如何管理类声明(How Delphi Manages Class Declarations)

正如我们知道的,在用Form Designer创建新窗体时,Delphi自动为新建的窗体建立单元文件。Delphi在创建类声明时,它把类声明创建为两段,第一段是Delphi管理的类声明部分,第二段是我们自己来管理。

在前面讲解Form Designer和Menu Designer中创建了一个名为“ScratchPad”的程序,下面的列表是ScratchPad程序的主窗体类声明。

ScratchPad主窗体类声明(THE class DECLARATION FOR ScratchPad'S MAIN FORM)

type
  TMainForm = class(TForm)
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    StatusBar: TStatusBar;
    Memo: TMemo;
    MainMenu: TMainMenu;
    FileMenu: TMenuItem;
    FileNew: TMenuItem;
    FileOpen: TMenuItem;
    FileSave: TMenuItem;
    FileSaveAs: TMenuItem;
    N1: TMenuItem;
    FilePrint: TMenuItem;
    FilePrintSetup: TMenuItem;
    N2: TMenuItem;
    FileExit: TMenuItem;
    Edit1: TMenuItem;
    EditReplace: TMenuItem;
    EditFind: TMenuItem;
    N4: TMenuItem;
    EditPaste: TMenuItem;
    EditCopy: TMenuItem;
    EditCut: TMenuItem;
    N5: TMenuItem;
    EditUndo: TMenuItem;
    Help1: TMenuItem;
    EditAbout: TMenuItem;
    EditContents: TMenuItem;
    EditSelectAll: TMenuItem;
    EditWordWrap: TMenuItem;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    MemoPopup: TPopupMenu;
    PopupCut: TMenuItem;
    PopupCopy: TMenuItem;
    PopupPaste: TMenuItem;
    procedure FileExitClick(Sender: TObject);
    procedure EditCutClick(Sender: TObject);
    procedure FileNewClick(Sender: TObject);
    procedure FileOpenClick(Sender: TObject);
    procedure FileSaveClick(Sender: TObject);
    procedure FileSaveAsClick(Sender: TObject);
    procedure EditUndoClick(Sender: TObject);
    procedure EditSelectAllClick(Sender: TObject);
    procedure EditCopyClick(Sender: TObject);
    procedure EditPasteClick(Sender: TObject);
    procedure EditWordWrapClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

注意,组件声明的顺序与组件在窗体中的排列顺序一致。读者在“ScratchPad”中创建的主窗体类声明所包含的组件应该与上面列表中列出的相同,但排列顺序可能不一样。

有一点要特别指出:从类声明的第一行到关键字private这一段由Delphi管理,编程人员不要去动它。

Caution

在由Delphi管理的窗体类声明段中加进任何代码都会引起程序出错;一些情况下可能只是编译出错;但在某些时候也可能使程序出现无法修复的错误(这种情况很罕见,但是有可能发生)。因此,要像躲避瘟疫一样避开这段类声明。

在类声明的private段和public段添加数据字段或方法声明是安全的。还可以增加一个protected段,并在其中加进数据字段或方法。

简单介绍状态栏和提示信息(A WORD ABOUT STATUS BARS AND HINTS)

马上就要在ScratchPad程序的状态栏中加进显示提示文本的功能。在开始之前,需要简单介绍一下如何处理提示文本。

当Application对象的ShowHint属性设置为True(缺省设置),同时鼠标光标所指的ShowHint属性也设置成True时,就会触发提示事件。Application对象中有一个OnHint事件,只要提示事件被触发,该事件就会发生。Application对象的Hint属性包含了控件的提示文本。应用程序可使用OnHint事件来把提示显示在状态栏上。

问题是不能直接存取Application对象的OnHint事件。但是,可以将一个自己编写的方法分配给OnHint。这样,当提示事件发生时,该事件就改由自己的OnHint处理程序来处理。要做到这一点,就必须自己编写OnHint事件的事件处理程序。事件处理程序的编写下面再讲。

向代码中添加方法(Adding a Method to Your Code)

下面以在ScratchPad程序中实现提示文本的例子来讲解如何向应用程序中添加方法。首先,打开ScratchPad程序,如下图:
0242

以下各步就是为每一个工具栏按钮指定提示文本,以便状态栏接收提示信息。ScratchPad中的工具栏的按钮仅仅是用于演示,但这不妨碍为这些按钮指定提示文本。

(1)显示ScratchPad的主窗体,点击主窗体工具栏的第一个按钮;

(2)在Object Inspector中找到Hint属性,并输入下面的内容作为提示文本:

Open|Open an Existing File

image

(3)把ShowHint属性设置为True;

image

(4)对工具栏中的其他按钮重复第(2)步和第(3)步。为每个按钮加上提示文本;

(5)点击主窗体底部的状态栏组件。把SimplePanel属性设置为True,使整个状态栏可以通过SimpleText属性来显示文本字符串。

image

现在,各项准备工作均已完成。把创建的OnHint处理程序取名为MyOnHint。首先,按下列步骤把方法声明加到类声明中:

(1)切换到Code Editor中,并保证当前编辑文件为SPMain.pas

(2)在TScratchPad类的声明中找到private段,把下面一行代码加到private关键字后:

procedure MyOnHint(Sender : TObject);

为了方便观察,下面给出了类声明的最后几行,看起来如下:

  private
    { Private declarations }
    procedure MyOnHint(Sender : TObject);
  public
    { Public declarations }
  end;

很好,现在已经把新方法的说明加到了类声明中。下面还有两项工作要做,先是要把实际的方法加到执行段(implementation);然后把新方法分配给Application对象的OnHint事件。步骤如下:

(1)滚动屏幕到执行段的底部;

(2)输入以下代码(正好在单元结尾end关键字之上):

procedure TMainForm.MyOnHint(Sender: TObject);
begin
  StatusBar.SimpleText := Application.Hint;
end;

(3)切换到Object Inspector,从Object Inspector选取ScratchPad的主窗体MainForm;

image

(4)切换到Object Inspector的Events页面,双击OnCreate事件,此时会显示Code Editor,在Code Editor中输入代码:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Application.OnHint := MyOnHint;
end;

(5)编译并运行程序,当鼠标指着一个工具栏按钮时,长提示文本显示在状态栏上,当鼠标光标停留在一个按钮上时,该按钮的短提示文本会以工具提示的方式显示在按钮旁边。

0243

上面的第(2)步是把Application对象的Hint属性也就是提示文本赋值给StatusBar组件的SimpleText属性。第(5)步把第(2)步创建的方法分配给Application对象的OnHint事件。每当OnHint事件发生时,就调用MyOnHint方法,把提示文本显示在状态栏上。

Note

上面的例子是一个在应用中实现状态栏提示的例子,其过程比较繁琐,目的是讲解如何为窗体加方法及如何为事件分配方法。其实有一个简便的办法来实现状态栏提示,就是把状态栏的AutoHint属性设置为True,并指定每个组件的提示文本,其他工作由Delphi自动完成。

添加类数据字段(Adding a Class Data Field)

往类中添加数据字段,类似于向类中添加方法。只能把数据字段加到类声明的private段和public段,如果在类中创建了protected段,也可以往protected段中添加数据字段。

删除Delphi生成的代码(Deleting Delphi-Generated Code)

有时候需要把应用程序中Delphi生成的一段代码删除。例如,一个窗体上有一个按钮,由于改变了设计,不再需要这个按钮。从Form Designer中选取该按钮,并按键盘上的Delete键,就可以将这个按钮删除,Delphi删除按钮后,与按钮相对应的OnClick处理程序仍留在代码中。

Delphi明知道按钮已经删除,为什么不把与之对应的OnClick处理程序删除呢?因为有可能其他组件也使用这个事件处理程序。我们可以手动将其从代码中删除。

删除事件处理程序是件简单的事情。把事件处理程序中的代码全部删除,然后保存或编译工程,Delphi就会自动删除空的事件处理程序。

Note

有人可能会说,如果不能肯定某个事件处理程序是否被其他组件使用,最好还是将它留在代码中。依作者的卡法,这不是一个好的解决办法。编程人员有责任地对他自己的代码知道的一清二楚,及时删除不用的方法。不用的代码不会有什么大危害,但它会使.exe文件变得更庞大,某些情况下还会降低程序性能。请及时削减程序中不用代码或低效代码。

posted @ 2012-02-01 11:07 瓢虫Monster 阅读(839) 评论(5) 编辑

2012年1月31日

用Wizards(向导)建立窗体和应用程序

Note

如果你正在使用前面我介绍的“Delphi.7.Second.Edition.v7.2”版本的话,因为精简优化的原因,去掉了Dialog Wizard和Application Wizard两个向导,要想尝试此向导,请安装完整版Delphi7

Delphi有两个向导,其作用是引导用户创建应用程序,Dialog Wizard(对话框向导)帮助用户创建对话框,Application Wizard(应用程序向导)帮助用户创建基本样式的应用程序。以下分别讲述:

使用Dialog Wizard(对话框向导)

说实话,对话框向导要做的事情不多,因为,有实用价值的对话框都用Form Designer来制作。Dialog Wizard从对象库开始,选取主菜单【File | New | Other】菜单项显示对象库,切换到Dialogs页面,双击“Dialog Wizard”图标,如下图所示:

0230

双击后显示出Dialog Wizard对话框,如下图:

0231

可选择创建单页对话框或多页对话框,对话框左侧的图标是对话框外形。若选择创建单页对话框,则点击Next按钮后显示Dialog Wizard的下一页,如下图:

0232

在这一页上有三个单选按钮,分别是:

  • No buttons 对话框上没有按钮
  • Vertical along right edge 在对话框右边加按钮
  • Horizontal along bottom 在对话框底部加按钮

本页是Dialog Wizard的最后一页,选好按钮样式后,点Finish按钮,Delphi自动创建对话框,如下图:

0233

新建对话框显示在Form Designer上,它具有通过向导选定的全部特性,其BorderStyle属性为bsDialog,如下图:

image

用Dialog Wizard创建完基本的对话框后,可用Form Designer給它加上各种功能。

如果创建多页对话框,则Dialog Wizard的第二页如下图:

0234 

上图,选择“Multipage,using PageControl”多页对话框

该图显示了多行编辑编辑框,在对话框中输入每个页面的名称,每行为一个页面名称,如下图:

0235

然后点击“Next”按钮,显示出选择按钮位置的对话框,然后点击Finish按钮,Delphi就创建了多页对话框,如下图:

0236

Note

Dialog Wizard的最大用处是创建多页对话框。创建单页对话框时,从对象库中选一个预定义对话框比通过Dialog Wizard创建更简单。

用Application Wizard(应用程序向导)创建应用程序

Application Wizard是一个很有用的工具,可用它快速创建应用程序外壳。使用Application Wizard创建应用程序,先从主菜单选择【File | New | Other】,当对象库出现后,点击Projects页面,然后双击“Application Wizard”图标,如下图:

0237

Note

主菜单的【File | New | Application】菜单项创建基于当前缺省工程设置的应用程序。它并不启动Application Wizard。

下面分步介绍Application Wizard的用法。

(1) 第一页:菜单选择(Selecting the Menus)

启动Application Wizard后,显示的第一个窗口如下图所示:

0238

该窗口用于选择程序主菜单项目。可以有选择性地将File、Edit、Window、Help菜单加到应用程序主菜单上。

Tip

Window菜单通常是留给MDI应用程序使用。如果没有特别的需求,一般不要再SDI应用程序的菜单条上加入Window菜单。

 

Note

Application Wizard为应用程序加入的菜单是Windows应用程序最常用的菜单,要记住,Application Wizard创建的应用程序仅仅是个最基本的框架。必须对这些基本框架进行修改,才能使它成为一个实用的应用程序。

为应用程序选好菜单后,点击Next按钮进入下一页。

(2) 第二页:设置文件对话框过滤器(Setting the File Dialog Filters)

如果应用程序菜单上加入了File菜单,则此会显示如下的窗口:

0239

本窗口用于设置应用程序File Open和File Save对话框使用的过滤器。点击Add按钮来增加新过滤器,这时会弹出一个对话框,要求输入描述和过滤器。像设置公用文件对话框组件的Filter属性一样输入过滤器,输入文本性描述和实际文件掩膜(例如*.bmp)。可用Edit、Delete、Down按钮来改变、删除或移动过滤器

Note

只有在Application Wizard第一页中选择了菜单,第二页和第三页才会显示。更具体地说,只有在第一页中选了File菜单才会显示第二页。

(3) 第三页:建立工具栏(Setting Up the Speedbar)

Application Wizard第三页用来建立应用程序的工具栏。这可能是Application Wizard最有用的特性。通过本页可快速建立工具栏。如下图所示,图中已经创建好了工具栏。

0240

本页左侧的Menus列表框列出了四个菜单,每个菜单都可以增加按钮。从四个菜单任选一个菜单,位于Menus列表框的右侧的Available Commands列表框就会列出菜单的有效按钮。要增加工具栏按钮,可点击Available Commands列表框中的按钮,再点击Insert按钮,所选按钮就会增加到工具栏中。

使用Space按钮可增加分隔线到工具栏。增加分隔线可明显地将按钮分组。只要工具栏中未满,就可以继续往其中增加按钮。要删除工具栏中的按钮,只需点击工具栏的按钮,在点击Remove就行了。

Note

如果不把某个菜单加到应用程序中,就不会为这个菜单显示按钮。例如,如果不加入Window菜单,则点击Menus列表框中的Window项时,Available Commands列表框是空的。

Tip

某些特殊的应用程序只有工具栏而没有菜单。用Application Wizard创建工具栏又必须先创建菜单。要解决这一矛盾,可用Application Wizard先随便建个菜单,在创建工具栏,待程序生成后,从应用程序中删除MainMenu组件就可以将菜单删除。

第四页:设定最后选项(Setting the Final Options)

Application Wizard的第四页也是最后一页,用于设定程序名、存储该工程的路径、以及其他几个选项。如下图所示:

0241

本页上第一个字段指定应用程序的名字,它不是出现在Project Options对话框中的应用程序名,而是Delphi用于存储工程的文件名。仍需要设定Project Options对话框中的应用程序名。第二个字段用于指明该工程的存储目录;如果记不清具体路径,可单击Browser按钮,并从Select Directory对话框中选取路径。

Tip

可用Select Directory对话框创建并选择目录。点击Browser按钮,显示Select Directory对话框,输入要建目录的路径,再点击OK或Enter键,输入的目录如果不存在,Delphi会提示创建新目录。

本页下半部分给出了三个附加选项。如果创建MDI应用程序,就应选中“Create MDI Application”复选框。剩下的两个复选框用来创建状态栏和是否允许显示工具提示。

为应用程序确定了所有选择后,点击Next按钮,Delphi就按指定的选项来创建应用程序。Delphi尽可能多地编写应用程序代码,但终究数量不大,都是些基本代码。例如选择File菜单时,FileOpenClick处理程序已经处理成了如下格式:

Procedure TMainForm.FileOpen(Sender: TObject);
begin
  if OpenDialog.Execute then
  begin
    { Add code to open OpenDialog.FileName }
  end;
end; 

执行File Open对话框的代码已经写好,只需编写实际处理代码即可。

Tip

用Application Wizard创建完工程后,可选择【Project | Add to Repository】菜单项保存该工程留作以后使用,这样将省去再用Application Wizard创建基本应用程序的麻烦。在把工程保存到对象库之前,最好再加上一个About对话框。

使用向导既简单又快捷,但是,很多程序还是需要人工编写。Delphi提供了一个良好的开端,省去了人工创建基本应用程序元素的乏味过程。

Note

除了Dialog Wizard和Application Wizard两个向导外,Delphi还提供了其他的向导。例如,Database Form Wizard是用于创建数据库窗体;ActiveX Control Wizard帮助创建ActiveX控件。这些都是专用向导。在以后的讲解中将会介绍到。

posted @ 2012-01-31 12:45 瓢虫Monster 阅读(841) 评论(0) 编辑

2012年1月29日

Delphi之对象库(Object Repository)

对象库(Object Repository)是一种手段,通过这种手段,用户可以选择预定义的对象,并运用到自己的应用程序中,用对象库能做以下的工作:

  • 选择一个预定义的应用程序、窗体或对话框,用于用户的应用程序中。
  • 将用户自己的窗体、对话框及应用程序加入到对象库中。
  • 增加其他对象到用户的应用程序,如添加ASCII文本文件和附加的源代码单元。
  • 管理数据模块(data modules)
  • 创建组件(Components)
  • 创建新程序包(packages)
  • 创建新的ActiveX控件或ActiveForms。
  • 调用向导来帮助用户建立一个对话框或应用程序。

以上只是选择性的介绍,出了上面的列出的对象外,还可以创建其他对象。

1、对象库页面和选项(Object Repository Pages and Options )

只要从主菜单选取【File | New】项,对象库就会自动显示出来,如下图给出了不打开工程时出现的对象库窗口:

0213

Note

初看起来可能有点陌生,对象库的标题是“New Items”,对象库配置对话框的标题是“Object Repository”,但是这个“New Items”就是对象库窗口。

对象库有若干的选项页,每个页面包含不同的对象,从上图可以看出,最初选择的是New页面,下面列出了对象库各个页面的简单描述。

对象库页面

  • New——使用户能创建一个新应用程序、窗体或单元用于用户的应用程序。还能创建高级对象,如程序包(packages)、DLLs、组件、NT服务器应用程序、Web服务器应用程序和数据模块。
  • ActiveX——使用户创建新的ActiveX控件、类型库(type libraries)、COM对象、ActiveForms和其他的ActiveX对象。
  • Multitier——使用户能创建CORBA和MTS对象,以及数据模块(仅适用于客户/服务器版)。
  • Forms——使用户能用预建窗体(如About窗口、双列表窗口、带标签页等)创建标准窗体。
  • Dialogs——给出若干种基本的对话框类型供用户选择,还包括了Dialog Wizard。
  • Projects——列出全部可供选择的工程,用户可以从中选取一个来建立应用程序,其中还包含应用程序向导。
  • Data Modules——使用户能选择应用程序中的数据模块。
  • WebServices——使用户能创建SOAP服务器应用程序,数据模块等。
  • Web Documents——使用户创建标准的HTML、XSL、WML、XHTML等网页文本。

Note

如果用户在已打开工程的情况下调用“Object Repository”,会看到一个附加标签页,标签页的名称为当前工程的名称。点击这个标签页会显示一个页面,其中包括了该工程当前的全部对象。用户只需要从Object Repository中简单的选取,就能快速的重新使用窗体或其他对象。如下图:

0214

Note

对象库(Object Repository)有时也被称为Gallery(陈列室)。

在每个页面底部都有三个单选按钮,分别标着Copy、Inherit和Use,它们确定被选择对象的实现方式。根据被选对象,某些单选按钮可能会变灰(失效)。例如,在显示New页面时,三个按钮都变灰。这是因为在New页面上Copy是唯一的可用选项,因此Delphi把全部按钮变灰,并自动使用Copy选项。

(1)Copy按钮

当用户选中Copy按钮时,Delphi创建被选对象的一个拷贝并把它放到用户的应用程序中,这时用户可以自由修改这个拷贝对象,并且在用户修改应用程序中的这个对象时,Repository中的原始对象不会跟着改变。

为了更直观的理解,可以打个比方:有一张表格(比如说是一张工作日程表),想填上日程安排内容,但不能直接在原表上填写(如果在原表中填写,这张表就不能重复用了),而是应该拿原表去复印一份,并把原表保存好以备以后再用。

可以在复印的表格上填写。对象库中对象的拷贝正是这个道理。用户可以自由修改拷贝,原件不会改变。制作拷贝是使用对象的最安全办法。

(2)Inherit按钮

Inherit类似于Copy,但二者的最大区别是:Inherit新建对象还连接着原对象,如果修改库中原对象,新建对象会跟着作相同改变。反过来则不成立。用户可以修改新对象,而原对象不会改变。

为了理解这种类型的对象用法,再次打个比方:信息管理人员经常用电子表格程序创建电子表格数据表,并在字处理程序中使用该电子数据表制作报表。在从剪贴板粘贴或导入电子数据表到字处理程序时,他们通常有选择地链接数据到电子数据表。这样,当修改电子数据表时,字处理文档会跟着变化。

同样地,改变原窗体,所有的继承窗体都跟着改变。当多个窗体由一个公用窗体派生,且这个公用窗体某些地方要做修改时,可用Inherit选项。对原窗体的任何修改都将反映到继承窗体上。

(3)Use按钮

Use选项不是通用的。当用户使用USE一个对象时,也就是直接打开该对象进行编辑。当用户在对象库中存放了一个对象,并且要对该对象做永久性的修改时,选择本选项。在“Inherit按钮”中说过,对原窗体的修改会反映到所有继承窗体上。如果要改变一个原窗体,可以用Use选项打开它。

(4)使用对象库(Using the Object Repository)

当用户从Object Repository中选取一个对象时会发生什么情况?这取决于多个因素。其中包括所选对象的类型,当前是否打开了工程,以及用户选择的使用类型(Copy、Inherit或Use)。

如果用户打开了一个应用程序,同时要从Object Repository中选择创建一个新的应用程序,在显示新工程之前,系统会提示用户保存当前工程。

Tip

从主菜单上选择【File | New | Application】菜单项,是开始一个新应用程序的简捷方法。它等同于从主菜单上选择New菜单项,再从Object Repository中选择Application对象。类似地,主菜单上的New Form项是开始一个新窗体的简捷方法。

在用Object Repository创建新窗体时,打开与不打开工程,创建的方式是不同的。如果打开工程,新窗体作为一个窗体和相应的窗体单元加入到应用程序中;如果不打开工程,则新窗体和窗体单元被创建成独立的窗体。创建一个工程之外的窗体必须加到工程中才能在运行阶段使用。当要创建加入到对象库的新基础窗体时,使用本选项。

如果用户选择创建一个新单元或文本文件,则用Code Editor来创建新文件很简便(若是新单元,将其加入到当前工程即可)。创建一个新文本文件的理由有多种,比如说,用户要在应用程序中加入一个配置文件(INI文件),用户可在Object Repository中创建一个新文本文件来初步创建该配置文件。无论何时创建新单元,用户都要为用户的应用程序启动一个新的源文件,并且该源文件与窗体无关(比如包含文件)。

选择一个新的DLL,会导致创建一个新工程,该工程用作DLL。创建一个新组建或线程对象时,会填出一个对话框,询问有关要创建对象的详细信息。

(5)对象库查看窗(The Object Repository Views)

实际上对象库窗口是一个Win32的列表查看控件(listview control),它类似于Windows资源管理器的右半部分。有多种查看视图供用户选择:Large Icons、Small Icons、List、Details。缺省时查看视图为Large Icons。要改变查看对象库的视图,右键点击Object Repository,并从中选择所要的视图样式即可,如下图所示:

0215

Object Repository快捷菜单中还给出了不同的排列方式,可以按名称、描述、日期或作者进行排列。

2、利用对象库创建新对象(Creating New Objects from the Object Repository)

毫无疑问,对象库的最基本用途是:用库中对象创建新的对象。为了更好地理解,按下述步骤来创建一个简单的应用程序,它有一个主窗体、一个About对话框和一个次窗体。

(1)关闭所有的工程,从主菜单中选取【File | New】,在Object Repository选取Application,新应用程序创建后显示一个空白窗体。

(2)将两个按钮放置到窗体中,将其中一个按钮的Caption属性设置为“About”,另一个按钮的Caption属性设置为“Display Form2”,如果需要,亦可以改动每个按钮的Name属性。如下图:

0216

(3)从主菜单选择【File | New】,再次显示Object Repository,点击Forms标签,选择“About Box”对象,保证Copy单选按钮选中,如下图。点击OK创建一个新的About窗体,很快显示出About窗体,按需要进行修改(例如输入用户自己的信息、改变图标、窗体大小、位置等)。

0217

About窗口如下:

0218

(4)从主菜单选择【File | New】,第三次显示出Object Repository,点击Forms标签,选取“Dual list box”对象,点击OK。Dual list box窗口如下:

0219

(5)按要求编写两个按钮的事件处理程序(一个按钮显示About窗体,另一个显示Dual list box窗体)。别忘记把About窗体和Dual list box窗体的单元加到主窗体的uses中。代码如下:

uses UAboutBox, UDualListDlg;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  AboutBox.ShowModal;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DualListDlg.ShowModal;
end;

(6)编译运行并测试程序。

这个程序并没有做任何事情,它向大家说明了如何用Object Repository来快速地开发应用程序原型。

星星上面代码均在Delphi7中测试通过,示例代码下载:利用对象库创建新对象.rar

3、向对象库增加对象(Adding Objects to the Object Repository)

如果不能往Object Repository中增加用户自己的独享,就显示不出Object Repository的效果。可以往Object Repository中加入自己的对象,并且也应该这么做。把常用对象加到Object Repository中可提高工作效率,因而成为更有价值的程序设计员。

当用户创建应用程序、窗体或其他对象后,将它存入对象库,以后需要时可以再用。当然,没有必要把创建的每个窗体都存入对象库,把经常使用的存入对象库即可。

可以在正常开发应用程序的过程中向对象库增加对象,也可以专为向对象库加入对象而创建对象。比如说,在开发应用程序的过程中创建一个About对话框,用户突然觉得要把这个About对话框保存起来以备用到所有程序中,毕竟它包含所有的公司名称、标识和全部的版权信息,没有必要为每个应用程序去重建相同的About对话框。要做到这一点很简单,把它加到对象库中即可。

要将一个窗体加到对象库中,首先保存它。然后用鼠标右键点击窗体的任何部位,从Form Designer快捷菜单选取Add To Repository菜单项,弹出如下的对话框:

0220

Add To Repository对话框左侧Forms列表框列出应用程序中当前窗体和其他对象(如数据模块)。首先,选取要加到Object Repository中的窗体。

Note

Form Designer中的当前窗体已经被选到Add To Repository对话框中的Forms列表框中。

现在输入对象的名称(Title),这个名称会显示在Object Repository中对象图标的下方。在Description编辑框中输入该对象的描述信息。当Object Repository中查看视图为Details时,会显示该信息。Author中输入对象编写的作者。

Note

Delphi对象库中大多数预建对象的作者姓名是“Borland”。

Page编辑框中选择存放对象的Object Repository页面。可以从已存在的页面中选一个,也可以在Page编辑框中输入一个新页面。如果输入的页面名不存在,Delphi将创建一个新页面。对话框下面的Browser按钮,可以为新增对象选一个图标。

填写完所有字段后并选择了图标,点击OK把该对象加到对象库中。从上述过程可以看出,往对象库中增加对象与使用对象一样容易。

Caution

当往对象库中增加一个对象时,Delphi在对象库文件中增加一个条目来描述该对象。其中包括对象的窗体和源文件所在目录的路径名。如果移动或删除一个对象的窗体或源文件的话,就不能再从对象库中使用该对象。

4、向对象库增加工程(Adding Projects to the Object Repository)

向对象库增加工程与向对象库中增加单个窗体没有太大的差别。要向对象库增加工程,从主菜单选择【Project | Add To Repository】菜单项,弹出Add ToRepository对话框(该对话框与向对象库增加对象时的对话框相似,只是没有了Forms列表框);输入要求的信息(名称、描述、作者等等),点击OK就可将工程加入到对象库中。如下图:

0221

在熟悉了Delphi之后,应该创建这样一个应用程序外壳,它包含了应用程序最常用的特性。每次开始创建标准应用程序时,从对象库中拷贝一份该应用程序外壳。可以把菜单、工具栏、About对话框及其他标准对话框都事先在应用程序外壳中创建好,以后使用起来就很方便。应用程序创建完后,可进行修改,如增加窗体,删除不想要的窗体等等。

5、对象库的内务处理(Object Repository Housekeeping)

对象库中页面和对象的管理是通过使用对象库配置对话框来进行的。

要产看对象库配置对话框,可从主菜单选择【Tools | Repository】菜单项,或者从对象库的快捷菜单选“Properties”菜单项打开,如下图:

0222

通过这个对话框,可删除对象库中的对象和页面,把对象从一个页面移到另一个页面,改变对象库中页面的顺序等等。对话框左侧标有Pages列表框列出了对象库中的页面;对话框右侧的Objects列表框列出了当前页面所包含的对象。

Note

Pages列表框有两条特别要注意,首先,New页面(当调用对象库时它总是显示在头一个位置)不在列表框中(ActiveX和Multitier页面也不在Pages列表框中)。New页面是固定的,不能作任何改动。还要注意Pages列表框中有一个[Object  Repository]项,此项实际是对象库中所有页面上的所有项目的列表。

(1)对象管理(Managing Objects)

必须先选取对象,才能标记、删除或移动对象。选取对象时,单击Objects列表框中的对象。选取对象后,单击“Edit Object…”按钮来编辑对象。编辑对象时,可以改变对象的名称、描述、作者信息及对象所在页面。如下图弹出“Edit Object Info”对话框。

0223

Tip

要快速编辑一个对象,可双击Objects列表框中的对象。

可通过选取对象并单击“Delete Object”按钮来删除对象。在对象删除之前,系统会提示“是否要删除对象”,得到确认后才真正删除。如下图:

0224

Note

从对象库中删除对象,是将对象从Object Repository文件中删除,不再出现在对象库的任何页面上。但是,对象的窗体文件和源文件并未从磁盘中删除。

要将对象从给一个页面移到另一个页面,只需用鼠标把对象从对象列表框拖动到页面列表框中某个页面位置处放下。

(2)页面管理(Managing Pages)

通过对象库配置对话框,也可以增加、删除或移动对象库页面。删除一个页面先要将该页面上的所有对象删除,然后点击页面列表框中该页面名并点击“Delete Page”按钮,Delphi先检查该页面是不是空页面,若是空页面,Delphi将从对象库中删除。

0225

点击“Add Page”按钮可向对象库增加新页面。此时会弹出一个对话框,要求输入新页面名称;输入页面名后点击OK,新增页面就会出现在页面列表框中。如下图:

0226

页面更名与此相似。选取一个页面,点击“Rename Page”按钮,弹出一个对话框提示输入新的页面名。如下图:

0227

页面在对象库内的顺序是可以改变的,要改变一个页面的次序,点击该页面名使其变亮,然后点击页面列表框下方的上箭头或下箭头按钮,将页面往上移或往下移。也可以用鼠标将页面拖到新位置。

(3)设置缺省窗体和工程(Setting Default Forms and Projects)

通过对象库配置对话框,可以设置下列三个缺省对象:

  • 从主菜单选择【File | New | Form】菜单项时使用的缺省窗体
  • 从主菜单选择【File | New | Application】菜单项时用作主窗体的缺省窗体。
  • 从主菜单选择【File | New | Application】菜单项时使用的缺省工程。

对象列表框下方根据所选对象出现不同的复选框。如果选择窗体,则出现New Form和Main Form复选框;如果选择工程,则出现New Project复选框,如下图:

0228 0229

把一个窗体或工程设置为缺省很简单。例如,要把一个主窗体设置为新建应用程序的缺省主窗体,可以从对象列表框中选取该窗体,选中“Main Form”复选框,点击OK。从此以后,这个主窗体就成为了缺省主窗体。类似地,要把一个工程设置为缺省工程,先在对象库配置对话框中找到该工程,点击它,然后选中“New Project”复选框,点击OK即可。从此以后,只要从主菜单选择【File | New | Application】,设置为缺省的工程就会显示出来。

Note

如果不小心将一个窗体设置成了新建应用程序的缺省窗体,可检查对象库配置对话框中每一个窗体,其中必有一个窗体使“Main Form”复选框处于选中状态,此时将其变为不选状态,一切都会恢复正常。这些也适用于缺省工程。检查Projects页面,查出使得“New Project”复选框选中的工程。

posted @ 2012-01-29 22:53 瓢虫Monster 阅读(747) 评论(0) 编辑

2012年1月28日

VCL组件之公用对话框组件

摘要: 公用对话框是一类非可视的组件,它们都由TDialog类继承而来,存在Dialogs组件面板上。包括: TOpenDialog——打开文件对话框组件,用它选择文件和浏览目录 TSaveDialog——保存文件对话框组件,用它类输入或选择文件名以及浏览目录 TFontDialog——字体设置对话框组件,用它可以允许用户选择字体进行设置 TColorDialog——颜色设置对话...阅读全文

posted @ 2012-01-28 19:26 瓢虫Monster 阅读(746) 评论(0) 编辑

VCL组件之TPanel

摘要: TPanel位于Standard组件面板上,也是常用的一种容器控件。面板的一个优点就是放在面板上的组件称为面板的一部分,因此它们与面板一起移动。这在设计阶段很有用。 Panel组件的大部分功能在于其Align属性。例如,想显示标题在窗体上端,更进一步假设想让它在中央,不管用户怎样设置窗口尺寸,只需设置Align属性为alTop及Alignment属性为taCenter,这样标题总是在中央的,就是...阅读全文

posted @ 2012-01-28 10:55 瓢虫Monster 阅读(734) 评论(1) 编辑

VCL组件之TScrollBar

摘要: TScrollBar类的继承关系如下: 在很多情况下,我们都不需要给控件添加滚动条,在显示不下的情况下,控件会根据其设置,自行选择是否添加滚动条。但是如果要自己控制窗体上控件的滚动,就要使用位于Standard组件面板上的ScrollBar组件。下面列出了ScrollBar组件的常用属性。 TScrollBar的常用属性 属性 含义 ...阅读全文

posted @ 2012-01-28 00:04 瓢虫Monster 阅读(713) 评论(1) 编辑

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

昵称:瓢虫Monster
园龄:2年
粉丝:22
关注:1

搜索

 
 

常用链接

随笔分类

随笔档案

最新评论

阅读排行榜

评论排行榜

推荐排行榜