• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi2007体验!

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Delphi 2007体验!

baidu

内容摘要:CodeGear(From Borland) 公司公布了最新的Delphi 2007 For Win32版本号。作为一个 Delphi 的使用者,第一时间下载、安装并进行了体验,现将一些使用感受记录例如以下

CodeGear(From Borland) 公司公布了最新的Delphi 2007 For Win32版本号。作为一个 Delphi 的使用者,第一时间下载、安装并进行了体验,现将一些使用感受记录例如以下:

注:以下的对照主要是针对Delphi7与Delphi2007,以下列出的部分功能可能在Delphi8/2005/2006中已存在。

1、下载

可在CodeGear官方站点下载试用版,或在VeryCD上寻找ISO,整个安装文件约1.2G多一些。

2、安装

Delphi 2007放弃了InstallShield,採用了InstallAware安装软件,整个安装操作非常友好。在安装结束时,会提示是否在Delphi启 动时自己主动检查更新,建议不要选择此项,由于安装完毕后无法禁用。Delphi 2007在開始菜单中建立了自己主动检查更新的快捷方式。

3、启动

Delphi 2007的启动速度没有传说中那么快,但和Delphi7相比也差不了多少,整体感觉不错。

4、界面

Delphi 2007的界面和之前的BDS 8/2005/2006界面风格是一样的,个人感觉不是太好,由于整个IDE颜色偏暗,Visual Studio 2005那种白亮色的界面应该更好一些。Splash和Welcome Page作的还是那么粗糙,CodeGear应该尽快找个好美工啊。

5、速度

IDE启动速度还不错,IDE的反映速度也非常好,尤其是程序的编译速度,个人感觉比Delphi7还快。

6、返回传统界面

习 惯了Delphi7及之前版本号的界面,对Delphi2007的这样的一体式界面多少有些难以适应,尤其是窗口设计器。尽管能够通过更改Desktop Layout为Classic Undocked让其与Delphi7有些相像,但却失去了Delphi7的那种自由设计的效果。

内容摘要:CodeGear(From Borland) 公司公布了最新的Delphi 2007 For Win32版本号。作为一个 Delphi 的使用者,第一时间下载、安装并进行了体验,现将一些使用感受记录例如以下

在Delphi2007中,更改一个选项,可让IDE的窗口设计器返回Delphi的传统风格:Tools–Options–VCL Designer,取消选中Embedded Designer。

此选项仅仅有在IDE重新启动后才会生效,生效后整个界面和Delphi7差点儿相同,但组件面板无法达到传统界面的效果。但此设计似乎有BUG,当IDE最小化的时候,窗口设计器却没有一同最小化。

7、新增属性:Application.MainFormOnTaskBar

用Delphi2007新建一project,然后查看project文件的源码,发现多一行代码:

Application.MainFormOnTaskBar := True;

Delphi2007默认已将MainForm显示于任务栏,而不是之前版本号的Application。这个功能在曾经非常多Delphier都讨论过,如今Delphi自身支持了。设计此属性非常明显,因该是为了兼容Windows Vista。

当然任务栏的右键菜单也发生了变化:

(Delphi 7 任务栏右键菜单)

(Delphi 2007 任务栏右键菜单)

8、新Project Option: Enable Runtime Themes

该project选项默认启用,用Delphi 2007编写的程序默认将启用Themes,这是一个非常好的功能,曾经必须用组件:Win32-XPManifest。

Delphi 2007 IDE本身、窗口设计器已支持操作系统Themes。

9、TeeChart升级为了TeeChart Standard 7.10

TeeChart最终升级了新版本号。

10、报表组件

Delphi 2007似乎没有附带不论什么报表组件,QuickReport和Rave消失了。

内容摘要:CodeGear(From Borland) 公司公布了最新的Delphi 2007 For Win32版本号。作为一个 Delphi 的使用者,第一时间下载、安装并进行了体验,现将一些使用感受记录例如以下

11、DBExpress

DBExpress重大升级至v4,架构已重写,使用此技术的Delphier能够试试,本人非常少使用。

12、模态窗口下的窗口闪动

在当前窗口用ShowModal显示一个模态窗口后,再次点击当前窗口,此时显示出的模态窗口会闪动,Delphi 2007编译的程序最终已能实现此效果,这也是Windows程序的标准效果。

13、Project Clean 功能

在Project Manager中右键点击project名称,选择Clean,会自己主动清除project的全部暂时文件和dcu文件。

14、实用的快捷键

最终为Build Project和Run Without Dedugging功能设置了快捷键。

15、比Delphi7超强的编辑器

Delphi2007的编辑器功能强大,这也应该是放弃Delphi7的重要理由,如输入Begin,自己主动生成End,代码重构,语法实时检查,显示行号等。

只是Delphi2007的那个代码帮助提示信息的窗口真是太丑了。

16、窗口设计器控件感应对齐

窗口设计器中的控件能够感应对齐,相当好的功能啊。

17、中文变量名

如今的Delphi已经支持中文变量名了,你能够试试。

18、新的组件

TTrayIcon、TFlowPanel、TGridPanel三个控件非常实用。Delphi2007新增Vista Dialogs组件,这些组件效果非常好,可是基于Vista API的,所以仅仅能在Windows Vista下使用。

19、TLabel控件可在内容超出范围时显示省略号

此功能非常实用,尤其是在Label中显示一个文件路径时,设置TLabel的EllipsisPosition属性就可以。

20、新增了一些实用的属性

Delphi2007对大多数常规组件增加了一些实用的属性,如Margins、Padding、TForm.PopupMode等,细致查看一些控件的属性列表,你就会发现非常多陌生的属性,但他们确实都非常实用。

用了Delphi 2007一段时间,但也发现一些小问题:

1、在Project Manager中更改PAS文件的名称后,不自己主动更新uses列表中的名称,呵呵~,这个要求不知道过只是分。

2、TMainMenu组件在窗口设计器中不可预览。

3、编辑器错误提示功能会误报,如Application.MainFormOnTaskBar属性,有时会提示不存在该属性。

4、新安装的组件,不但要在Tool–Options中设置Library Path,还必须设置Browseing Path,组件才干被正常使用。

用了N年的Delphi7了,体验了Delphi2007后觉得真应该换换了,综合来看,Delphi2007是一个非常好的版本号,IDE速度及功能性各方面都已经非常优秀,你准备使用Delphi2007吗?

Delphi 2007 初步印象

baidu

内容摘要:经过苦苦的等待,最终等来了新一代 Delphi 2007 的下载链接。昨天从 emule 上下载时,发觉有非常多的人在下载,让我非常感动。原来和我一样,对 Delphi 关注的人还不少啊。速度还算快,到夜里就下完了。接着開始了2个小时的试用,尽管不怎么细致,但从 Delphi 1 一路用过来的我,对里面的变化还比較敏感的。

经过苦苦的等待,最终等来了新一代 Delphi 2007 的下载链接。昨天从 emule 上下载时,发觉有非常多的人在下载,让我非常感动。原来和我一样,对 Delphi 关注的人还不少啊。速度还算快,到夜里就下完了。接着開始了2个小时的试用,尽管不怎么细致,但从 Delphi 1 一路用过来的我,对里面的变化还比較敏感的。

相比 Delphi 2006 来说,我觉得这个版本号的 Delphi 2007 是个超强的优化版,功能方面,仅仅有少些改变。说她是优化版,那是由于她的启动速度,编译效率,IDE 速度是相当的快(PS:我的电脑是PM1.4G,512MB)。李维先生所说的比 Delphi 7 快一点也不为过。近期用 VS2005,打开一个 C++ 控制台程序,要经过相当长的时间,编译就更不用说了。Welcome Page 里的“Where developers matter”真是让人感动啊。

至于其它方面的改进,对我来说,并不是非常有吸引力。Help 系统改用 MSDN 的那套最新的 help,支持了VISTA,可是我的电脑是不能跑了。对 Together 的集成,这个非常实用。控件多了几个。IntraWeb 变成了 CodeGear 的 VCL 部分了,但却不支持调试,这点有些奇怪。数据库接口统一了。特别的一点就是,原来 Borland 的标识,如今全变成了 CodeGear。

事实上,我并不了解多少开发,更不知道开发者究竟须要 Delphi 2007 增加些什么功能。我中心一直觉得 Delhpi 发展到今天,变化的可能已经越来越少。就像 VC 一样,非常少变动。Win32 RAD 的开发王者,应该还是属于 Delphi(C++上的RAD工具非常少,即便有,也是对语言进行了一些恶心扩展),速度,效率,谁能相比。如今唯一的希望是 Delphi 2007 的语言再加强一些,如 template。近期用 C++,一直在学习 template,所以也希望 Delphi 能跟上时代。

内容摘要:本文介绍delph i2007学习笔记

如今学的是delphi 的类,原D7的类我不就不记了,记下与D7不同的地方

a.class abstract 纯虚类,不能实例化的类

type
TAbstractClass = class abstract
procedure SomeProcedure;
end;

曾经的做法是在 procedure 的后面与 abstract ,如今仅仅移类的说明上,仅仅是意思一样,就是直观点少打字 呵呵.

b.class sealed 这个我眼下不知是什么意思,可能是不能继承的类

type
TAbstractClass = class sealed
procedure SomeProcedure;
end;

c.class const 类的常量,这个地方在D7内能够定类的方法一样能实现

type
TClassWithConstant = class
public
const SomeConst = 'This is a class constant';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(TClassWithConstant.SomeConst); //引用时,仅仅写类名就可能引用,不必实例化
end;
d.class type 类的类型, 在类的层次下能够定record,class子类什么的,这个将数据的集中体现....
type
TClassWithClassType = class
private
type
TRecordWithinAClass = record
SomeField: string;
end;
public
class var
RecordWithinAClass: TRecordWithinAClass;
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
TClassWithClassType.RecordWithinAClass.SomeField := 'This is a field of a class type declaration';
ShowMessage(TClassWithClassType.RecordWithinAClass.SomeField);
end;
type
TOuterClass = class
strict private
MyField: Integer;
public
type
TInnerClass = class
public
MyInnerField: Integer;
procedure InnerProc;
end;
procedure OuterProc;
end;
procedure TOuterClass.TInnerClass.InnerProc;
begin
...
end;

让人期待的Delphi 2007 for Win32

baidu

内容摘要:从李维的Blog和一些网友的反馈来看,D2007确实是比較让人期待的一个版本号。作为Delphi的忠实支持者,我期待着Delphi的逐步回归,希望她能重登昔日的王者地位!

自从D7之后,Delphi似乎開始走了下坡路,到D2005时,让非常多人感到了失望,而D2006也是非常不easy才挽回了一点局面。大家都知道如今Delphi跟Borland分家,归属于CodeGear继续发展了。只是分出去或许会是好事,这能让一帮人更为专注地发展IDE的技术。Delphi 2007 for Win32的公布会(包括Delphi for PHP和InterBase 2007)前几天正在密锣紧鼓地进行着,从李维的Blog和一些网友的反馈来看,D2007确实是比較让人期待的一个版本号。作为Delphi的忠实支持者,我期待着Delphi的逐步回归,希望她能重登昔日的王者地位!(这次不要当VB杀手了,来当当C#和Java杀手吧.... XD)

Delphi2007 for Win32一些技术亮点:

1、IDE工具採用.Net2.0来编写,安装时候须要.Net FrameWork2.0,但编译出来的Exe是纯正的Win32程序,公布不须要.Net FrameWork2.0。新IDE採用.Net FrameWork2.0是为了更好的统一IDE平台,利用.Net的反射、泛型等高级特性,节省编写IDE时间。新的IDE确实比D7启动还要快,大概是五六秒时间左右就启动,跟VS.Net2005差点儿相同。演示中,新的IDE编译新建project比D7还要快一点。

2、Delphi2007支持Vista界面,封装了Vsita的新API函数。

3、Delphi2007有一个功能非常有意思,支持D2006的全部BPL组件。意思是,假设你用D2006编译过的BPL,没有源码和DCU,也能够直接安装在Delphi2007。哈哈,这个是delphi版本号上的史无前例,即使第三方控件包来不及支持Delphi2007,也最好还是碍开发者从D2006升级到Delphi2007做项目开发。

4、支持MS Build。比方支持Debug、Release。也支持编译前和编译后事件,可调用BAT文件。比方,你编译前邮件告诉老板,你要给我加薪50%,否则十分钟后销毁源码。另外,也能够改动其XML格式,仅仅编译特定的程序代码。

5、Delphi2007 for Win32数据集控件全面支持Unicode。比方,你的数据库表字段可採用中文名称作字段。Filter也支持Unicode。唉,为了这个filter支持Unicode,有些人在delphiBBS上苦苦守候了六七年。但delphi2007的UI(可视化界面)还不是全面支持Unicode。比方,你的DBGrid就不能支持中文、韩文(不说狗屁日文)、阿拉伯文等同一时候显示。原有的Vcl框架大量採用string声明而不是WideString,据李维讲,CodeGear会将Vcl全面支持Unicode,但要考虑一种最佳的平衡方法。

6、非常棒的DBX4。dbExpress将要统一混乱的数据库连接组件,底层全部改写。无论在Win32还是Win64上,可兼容本机代码和托管代码。呵呵,举个样例,DBX4可支持ADO,也能够支持ADO.Net。这一点,M$也做不到。DBX4新增加了Connection Pool高级组件。更令人心动的是,开放Driver Source,可自行扩展属性和方法,哈哈,ColreLab公司这回可高价卖不出去dbExpress驱动了。DBX4也全面支持Uicode。

7、Delphi2007 for Win32支持Ajax技术—Intraweb9.0。Intraweb9.0组件封装了Ajax,以事件方式来驱动程序。Intraweb9.0的Ajax技术支持断点跟踪调试,简单到跟你调试其它delphi程序一样。Intraweb9.0不愧是封装javascript的上乘之作。事实上,话又说回来了,这一两年流行的Ajax技术,事实上无非就是javascript封装而已。而Intraweb已经在六七年将javascript技术做得炉火纯青。更令人汗颜的是,很多所谓的web2.0新技术调试Ajax时候,仿佛又回到20多年前的C编程时代,不停地用Printf打印调试。Ajax技术也并不是是什么高级技术,仅仅是web编程一种无奈的选择。不久未来,应该是属于智能client平台。

个人的几点看法:

1、说实话这里我经历过大喜->大悲->大喜的三次变化。最初听说Delphi重回Win32,当然是大喜,个人比較不爽.Net,由于给别人敲代码还要别人装无用的东西才干运行(当然对象是企业的话,没什么所谓);之后在CSDN听到一些残缺不全的消息说D2007又要装.Net了?转而失望;幸而从这里看,仅仅是装.Net的开发时环境而已,运行库并不须要,至此疑虑全消。并且听说D2007还能针对2000、XP和Vista多种系统公布不同的程序?这个功能太棒了!曾经写的程序,总是部分人能用部分人不能,想出多版本号的话,自己多装个系统在那个系统下编译吧,这不是一般的麻烦。希望此功能是真的。

2、启动和编译速度比D7还快,这个也非常吸引人。Delphi的编译速度本来就非常有名了(用过C系列的就能对照出来)。之后听说D2006又用一种新技术改进了内存管理,可惜D2006还没装,没能体验。这下D2007竟然比D7还快了,希望不是仅仅针对特殊项目弄出来的“演示效果”。

3、关于Unicode,强烈期待实现整个IDE环境的Unicode化,某次写跟韩文有关的程序已经被整慘过了.... -_,- 这点Delphi须要向C#靠拢。

4、尽管IntraWeb自上次写日志来,还暂时没安排到学习时间。只是偶还是相信那位Delphi达人的话,相信它的前途。如今都出到9.0了,我觉得假设Delphi在B/S上面能抢回份额,微软将会面临非常大的挑战。

Delphi 2007 下安装 Shell 组件

baidu

内容摘要:本文介绍Delphi 2007 下安装 Shell 组件

Delphi 2007 中没有 Shell 组件,但在Delphi的lib文件夹存在相关的源文件,并且在C:WindowsSystem32文件夹下存在vclshlctrls100.bpl的运行时包,只有没有设计时包。

但在Delphi的Demo中有一个ShellControls,安装其文件夹下的 dclshlctrls.dpk 就可以安装成功Shell组件。

注1:Shell组件安装后还是在组件面板的Sample页中;

注2:Delphi2007的Demo文件夹在:我的电脑-共享文档-RAD Studio-Demos-DelphiWin32-VCLWin32;

在 使用Shell这样的组件时,程序编译后都会出现以下的警告:[DCC Warning] Unit1.pas(7): W1005 Unit ‘ShellCtrls’ is specific to a platform ,假设您不想让他显示的话,能够在你project相关源文件的开头加上以下代码:

{$WARN UNIT_PLATFORM OFF}

Delphi归来,重燃开发者的信心

baidu

内容摘要:江元麟表示:「眼下仅仅有Microsoft Visual C++支持64位,但我们累积了非常多Delphi的Library和组件,基于稳定度及开发时效的考虑,并不希望换开发环境,眼下做法是花非常多力气和C++整合。……我今天就是来问Delphi什么时候支持64Bit?」

CodeGear 台@@湾 区产品经理李维介绍完新产品,听众迫不及待的走向讲台,纷纷问起新产品的兼容问题,知网生物识别科技技术长江元麟也是当中一位,他特地来问一个问题,由于这将影响到公司未来产品的开发效率。

Windows Vista出现带来64位新挑战。知网生物识别科技去年面临客户要求在Vista的Content Menu技术上支持64位档案指纹加密。江元麟表示:「眼下仅仅有Microsoft Visual C++支持64位,但我们累积了非常多Delphi的Library和组件,基于稳定度及开发时效的考虑,并不希望换开发环境,眼下做法是花非常多力气和C++整合。……我今天就是来问Delphi什么时候支持64Bit?」

从1995年发表1.0版后,12年来,Delphi历经11个版本号更迭,从16位的1.0到.NET平台的BDS 2006。开发部门独立成立CodeGear 后,又回到原生Win32环境下的Delphi 2007 for Win32。江元麟24年程序开发经验,一路见证了Delphi的变化。

从1987年開始接触Borland,江元麟用过Turbo Pascal和Turbo C。1995年,由于工作须要開始使用Delphi。2000年,他投入生物识别产业,继续使用Delphi 5开发,他指出:「Delphi有一个非常好的长处是能够开发自己的组件,它的组件让我们的产品开发加速非常快。新进project师能立即就作一些简单的开发,这是Delphi最优秀的地方。」

相较于当时其它开发工具,他觉得:「VB当时没办法全然用对象导向的方式去开发组件,比較不是给Engineer用,而是给Power User使用。而C++要客制化组件难度颇高,它的平台没有那么灵活。」

为何一直用Delphi?江元麟解释说:「是由于它的平台,非常多Source Code都有释出,所以你能够开发一些真的是自己会用到的基层组件。我们公司的组件已经累积5年到10年都有,一个组件能够撑那么久,代表它非常稳定了,相对的我们公司的产品出来质量是非常好的,这也是Delphi的贡献……这也是为什么,我们宁可在Delphi上花力气结合C++来处理新挑战。」3年前,知网的识别软件能让Pentium 4 处理器在1秒内辨识十万枚指纹,是当时国外最高速度的3倍,他说:「这当中有一部份是由Delphi编译出来的程序代码效率相当好的贡献。」

尽管当天江元麟的问题没有立即的解决方式,但对于脱离Borland后的GodeGear,他表示:「蛮喜欢分割出来的CodeGear,曾经步调非常慢,如今步调非常快,我比較喜欢,听李维传递的讯息,感觉比較有活力,但希望能维持曾经的速度和质量。两年前看到Borland公司非常乱,觉得非常遗憾,周围的人两年前已经慢慢转到C#去了。」,他接着说:「我们本来去年要考虑转成C#,如今要又一次考虑了

编码的艺术

baidu

我在本文中要谈的不是编码的技术实现,我所关注的是关于编码的风格的问题。我在编写了e速的编码规范之后,产生了要写一些关于程序编码风格的念头;因此,就有了以下的文章,这些仅仅是本人的想法,可能在文章中还有一些未尽如人意的地方,所以肯请大家能够给与谅解。

非常多人在谈到编码的艺术时,总会说我的程序怎么怎么的厉害,功能多么的强大,好像什么事情都能完毕一样;可是去运行他的程序,bug不断;连他自己都不知道错在了什么地方。打开他的程序一看,代码写的凌乱不堪;命名上不规范,为了偷懒和简便有些命名干脆就用一个字母或者其它的简单符号取代,甚至于有些代码连他自己也搞不清是干什么了,更不要说怎样让别人去改动了….本人编码也快4个年头了,像上述的样例遇见过不少,整个程序改动起来实在是头疼。

的确,一件好的艺术品不在于其功能是多么的完好,而在于别人赞赏起来是否有它内在的美和是否非常easy就把它从杂货堆里一眼就能辨认出来;毕竟它是艺术品而非日用品。我们敲代码也是同样,假设程序中的格式非常随意,比如对数组做循环,一会儿採用下标变量从下到上的方式,一会儿又用从上到下的方式;对字符串一会儿用s t r c p y做复制,一会儿又用f o r循环做复制;等等。这些变化就会使人非常难看清实际上究竟是怎么回事了。

写好一个程序,当然须要使它符合语法规则、修正当中的错误和使它运行得足够快,可是实际应该做的远比这多得多。程序不仅须要给计算机读,也要给程序猿读。一个写得好的程序比那些写得差的程序更easy读、更easy改动。经过了怎样写好程序的训练,生产的代码更可能是正确的。

凝视:凝视是帮助程序读者的一种手段。可是,假设在凝视中仅仅说明代码本身已经讲明的事情,或者与代码矛盾,或是以精心编排的形式干扰读者,那么它们就是帮了倒忙。最好的凝视是简洁地点明程序的突出特征,或是提供一种概观,帮助别人理解程序。在标注凝视的同一时候,应该注意以下的问题:

不要大谈明显的东西。凝视不要去说明明确白的事,比方i + +能够将i值加1等等。凝视应该提供那些不能一下子从代码中看到的东西,或者把那些散布在很多代码里的信息收集到一起。当某些难以捉摸的事情出现时,凝视能够帮助澄清情况。假设操作本身非常明了,反复谈论它们就是画蛇添足了;给函数和全局数据加凝视。凝视当然能够有价值。对于函数、全局变量、常数定义、结构和类的域等,以及不论什么其它加上简短说明就能够帮助理解的内容,我们都应该为之提供凝视。全局变量常被分散使用在整个程序中的各个地方,写一个凝视能够帮人记住它的意义,也能够作为參考。放在每个函数前面的凝视能够成为帮人读懂程序的台阶。假设函数代码不太长,在这里写一行凝视就足够了。有些代码原本非常复杂,可能是由于算法本身非常复杂,或者是由于数据结构非常复杂。在这些情况下,用一段凝视指明有关文献对读者也非常有帮助。此外,说明做出某种决定的理由也非常有价值。

职业程序猿也常被要求凝视他们的全部代码。可是,应该看到,盲目遵守这些规则的结果却可能是丢掉了凝视的真谛。凝视是一种工具,它的作用就是帮助读者理解程序中的某些部分,而这些部分的意义不easy通过代码本身直接看到。我们应该尽可能地把代码写得easy理解。在这方面你做得越好,须要写的凝视就越少。好的代码须要的凝视远远少于差的代码。

编码的风格:全局变量应该採用具有描写叙述意义的名字,局部变量用短名字。函数採用动作性的名字。给神奇的数起个名字。现实中存在很多命名约定或者本地习惯。常见的比方:指针採用以p结尾的变量名,比如n o d e p;全局变量用大写开头的变量名,比如G l o b a l;常量用全然由大写字母拼写的变量名,如C O N S T A N T S等。命名约定能使自己的代码更easy理解,对别人写的代码也是一样。这些约定也使人在写代码时更easy决定事物的命名。对于长的程序,选择那些好的、具有说明性的、系统化的名字就更加重要。

保持一致性。要准确。以缩行形式显示程序结构。使用表达式的自然形式。利用括号排除歧义。分解复杂的表达式。要清晰。当心副作用。使用一致的缩行和加括号风格。为了一致性,使用习惯使用方法。用else-if 处理多路选择。避免使用函数宏。给宏的体和參数都加上括号。这些都是非常琐碎的事情,但却又是非常有价值的,就像保持书桌整洁能使你easy找到东西一样。与你的书桌不同的是,你的程序代码非常可能还会被别人使用。

用缩行显示程序的结构。採用一种一致的缩行风格,是使程序呈现出结构清晰的最省力的方法。

用加括号的方式排除二义性。括号表示分组,即使有时并不必要,加了括号也可能把意图表示得更清晰。在混合使用互相无关的运算符时,多写几个括号是个好主意。C语言以及与之相关的语言存在非常险恶的优先级问题,在这里非常easy犯错误。比如,由于逻辑运算符的约束力比赋值运算符强,在大部分混合使用它们的表达式中,括号都是必需的。

利用语言去计算对象的大小。不要大谈明显的东西。给函数和全局数据加凝视。不要凝视不好的代码,应该重写。不要与代码矛盾。澄清情况,不要添乱。

界面的风格:隐蔽实现的细节。不要在用户背后搞小动作。在各处都用同样方式做同样的事。释放资源与分配资源应该在同一层次进行。在低层检查错误,在高层处理。仅仅把异经常使用在异常的情况。

写良好的代码更easy阅读和理解,差点儿能够保证当中的错误更少。进一步说,它们通常比那些马马虎虎地堆起来的、没有细致推敲过的代码更短小。在这个拼命要把代码送出门、去赶上最后期限的时代,人们非常easy把风格丢在一旁,让将来去管它们吧。可是,这非常可能是一个代价非常昂贵的决定。上面的一些陈述性的言语充分的说明了,假设对好风格问题重视不够,程序中哪些方面可能出毛病。草率的代码是非常坏的代码,它不仅难看、难读,并且经常崩溃。好风格应该成为一种习惯。假设你在開始写代码时就关心风格问题,假设你花时间去审视和改进它,你将会逐渐养成一种好的编程习惯。一旦这样的习惯变成自己主动的东西,你的潜意识就会帮你照料很多细节问题,甚至你在工作压力下写出的代码也会更好

Delphi面向对象的编程方法

baidu

Delphi的编程语言是以Pascal为基础的。Pascal语言具有可读性好、编写easy的特点,这使得它非常适合作为基础的开发语言。同一时候,使用编译器创建的应用程序仅仅生成单个可运行文件(.EXE),正是这样的结合,使得Pascal成为Delphi这样的先进开发环境的编程语言。

本章中,我们将讨论Object Pascal的主要特点,并解说怎样在事件处理过程和其它应用程序中,使用它来编制程序代码。本章将解说Delphi应用程序中最经常使用的Object Pascal语法,而不是Pascal语言的一切细节。假设您全然不熟悉Pascal编程,请參阅一些基础的Pascal教程。假设您具有编程经验,并能熟练地使用其它流行程序语言,您将在本章的Object Pascal中发现一些同样的概念。假设您已经熟悉了Borland Pascal,就能够高速浏览或跳过本章。

2.1 编写Object Pascal程序代码

在前边的章节中,我们通过例程,已经编写了几行简单的代码。在本章中,我们将从熟悉Pascal编程的角度,配合实例,解说Object Pascal编程的基本方法。

在编写自己的Object Pascal程序时,要注意程序的可读性。Pascal语言是英式结构语言,在程序中选择合适的缩排、大写和小写风格,并在须要时将程序代码分行,会使得程序代码能够非常easy地被自己和他人读懂。一般的程序猿都有这样的体验:假设不给程序加上适当的注解,一段时间后,自己也难以理清程序的流程。给程序及时地加上凝视是良好的编程习惯。Delphi的凝视须要加注在{}之间,编辑器会把它们处理成为空白。Delphi保留了Borland Pascal编辑器的风格,keyword採用黑体字,被凝视的部分会变暗,这使得编程风格良好,易读易写。

2.1.1 编写赋值语句

在事件处理过程中,最经常使用到的工作就是把一个新值赋给一个属性或变量。在设计用户界面时,能够使用Object Inspector(Object Inspector)来改变其属性;但有时须要在程序运行时改变属性的值,并且有些属性仅仅能在运行时改变,这些属性在Delphi的在线帮助的“Proprety”主题中被标为运行期属性。进行这样的改变,就必须使用赋值语句。

下文的赋值语句表征一个OnClick事件。当button按动后,将编辑框部件Edit1的Color属性置为clRed:

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Color := clRed;
end;

当按动button后赋值语句被运行,编辑框变成红色。

在语句中,部件的名称在属性前,中间用“.”表示属性的所属关系。这样就准确地指定了要将clRed值赋给哪一部件的哪一属性。赋值号为“:=”,不论给属性还是给变量赋值,都是将右边的值赋给左边的属性或变量。

当将一个属性值、变量、常量或文本数据赋给属性或变量时,所赋值的类型和接受此值的属性或变量的类型应同样或兼容。一个属性或变量的类型定义了此属性或变量的可能值集合,也定义了程序代码能够运行的运算。在前边的例程中,编辑框部件的Color属性和clRed的类型都是TColor。能够在在线帮助中找到一个属性的类型;第二种方法是在Object Inspector中选定该属性值段,并按下F1键,则类型将在属性说明的结尾处列出,比如Color属性列出下边的语句:

Property Color : TColor;

有些属性是仅仅读(Read Only)的,它们仅仅能被读取,不能被改变。请查阅在线帮助,在Delphi中这些仅仅读属性都有注解。

2.1.2 标识符的说明与使用

标识符是Delphi应用程序中一些量的名称,这些量包括变量(var)、常量(const)、类型(type)、过程(procedure)、方法(Method)及其它,Object Pascal 在应用标识符时,必须首先说明它们。Object Pascal是强类型语言,它的编译器能够检查确保赋给变量或属性的值是正确的类型,以便于您改正错误。由于Object Pascal是编译语言,所以Delphi的运行速度要比使用解释语言快得多。在使用标识符前说明它们,能够降低程序错误并增加代码的效率。

2.1.2.1 变量

变量是程序代码中代表一个内存地址的标识符,而此地址的内存内容在程序代码运行时能够被改变。在使用变量前必须对它进行说明,即对它进行命名,并说明它的类型。在全部变量说明曾经加上保留字var。变量说明左边是变量的名称,右边则是该变量的类型,中间用(:)隔开。

var
Value ,Sum : Integer;
Line : String;

在窗口中增加一个名称为Edit1的编辑框,再增加一个名称(属性Name)为Add的button部件,并建立例如以下的事件处理过程:

procedure TForm1.addClick(Sender: TObject);
var
X , Y: Integer;
begin
X := 100;
Y := 20;
Edit1.Text := IntToStr(X + Y);
end;

在本例中,当按动ADDbutton时,编辑框中显示值120。在Object Pascal中,必须确保变量或属性被赋予类型同样或兼容的值。您能够尝试将赋给X的值改为100.0,或去掉IntToStr函数,在编译时会出现类型不匹配的错误,这也说明了Object Pascal强类型语言的特点。

2.1.2.2 提前定义类型

Object Pascal有多个提前定义的数据类型,您能够说明不论什么这些类型的变量:

整形:Integer的范围是-32768到32767,占2字节的内存;Shortint从-128到127,占1字节内存;Longint从-2147443648到2147483647 占4字节内存;Byte从0到255,占1字节;Word从0到65535,占2字节内存。它们都是没有小数部分的数字。

实型:Single能够包括7到8位有效小数部分,占用4字节的内存;Double类能够包括15到16位有效小数部分,占用8字节的内存;Extended类型包括19到20位有效小数部分,占用10字节内存;Comp能够包括19到20位有效小数部分,占用8字节内存。以上实数类型仅仅有在8087/80287选项[N+]打开才干够使用。Real能够包括11到12位有效小数部分,占用6字节内存。它仅仅有在和曾经Borland Pascal兼容的情况下才使用,否则应使用Double或Extended。

布尔型:Boolean,仅仅包括true或False两个值,占用1字节内存。

字符型:Char,一个ASCII字符;字符串类型String一串最长可达255个ASCII字符。

指针型:Pointer,能够指向不论什么特定类型。

字符串型:PChar,是一个指向以零结尾的字符串的指针。

除了提前定义类型外,Delphi还有自行定义的类型。上述例程的TColor就是这样的类型。此外,用户还能够定义自己的数据类型,这部分内容将在下文中具体讲述。

整型类别和实型类别都各有五种类型,同一类别中,全部的类型与其它同类别的都相容,您能够将一种类型的值赋给同样类别中不同类型的变量或属性,而仅仅须要这个值的范围在被赋值的变量或属性的可能值范围内。比如,对于一个Shortint型的变量,能够接受在-128到127范围内的随意整数,比如Shortint类型的7;您不能将300赋给它,由于300已经超出了Shortint的范围了。将范围检查功能打开(选用Options|Project,并在Compiler Options Page中选择Range Checking),将会检查出一个范围错误;假设Range Checking没有被打开,那么程序代码将能够运行,但被赋值的值将不是您期望的值。

在一些情况下,您能够进行不同类型的变量或属性的赋值。一般来说,能够将一个较小范围的值赋给一个较大范围的值。比如,您能够将整型值10赋给一个接受实型值的Double属性而使得值成为10.0,但假设将一个Double类型的值赋给整形变量,则会出现类型错误。假设您不清晰类型的兼容性,能够參阅Delphi的在线帮助中“Type Compatibility and Assignment Compatibility”主题。

2.1.2.3 常量

常量在说明时就被赋予了一个值,在程序运行过程中是不可改变的。以下的样例说明了三个常量:

const
Pi = 3.14159;
Answer = 342;
ProductName = "Delphi";

象变量一样,常量也有类型。不同的是,常量假设其类型就是常量说明中其所代表的值的类型。上文的三个常量的类型各自是real型、整形、字符串型。常量用“= " 表示两边的值是相等的。

2.1.3 过程与函数

过程与函数是程序中运行特定工作的模块化部分。Delphi的运行库包括很多过程与函数以供您的应用程序调用。您不必了解过程与函数的逻辑,但要知道过程与函数的用途。在对象中说明的过程和函数称为方法(Method)。全部的事件处理过程都是过程,以保留字procedure开头。每个事件处理过程仅仅包括了当这一事件发生时须要运行的程序代码。在事件处理过程中使用Delphi已经存在的过程与函数,仅仅需在程序代码中调用它们就可以。

2.1.3.1 一个调用Delphi方法的简单例程

下文将通过对一个Memo部件的文本进行剪切、拷贝、粘贴、清除等编辑的应用程序编制,介绍使用Delphi过程和函数的调用方法。

Memo(备注)部件有一个CutToClipboard方法,实现将用户在memo中选择的文本移到剪贴板上去。由于这个功能已经被建立在此方法中了,所以您仅仅需知道这种方法做什么以及怎样使用它就可以。

以下的语句表明怎样调用一个名为Memo1的memo部件的CutToClipboard方法:

Memo1.CutToClipboard;

通过指定Memo1的名称,说明调用哪一个部件的CutToClipboard方法。假设不指明对象名称,Delphi会显示Unknown identifier错误。当该事件处理过程被触发,程序会运行CutToclipboard中的语句,将Memo1中的文本剪贴到剪贴板上去。

下文的例程展示了怎样调用Delphi的方法,实现将备注部件的文本信息剪切、复制到剪贴板上;将剪贴板上的标记文本粘贴到备注中,清除备注部件中的全部文本等四个功能。

打开一个新的空窗口,增加一个memo部件和四个button,并排列整齐。改变button部件的Name属性,分别命名为Cut,Copy,Paste,Clear。您会发现,当Name属性发生改变时,Caption属性将发生对应的变化。在Caption属性前加标“&”号设立加速键

将memo部件的ScrollBars属性设为ScVertical,以便加上滚行条。将WordWrap属性设置为True,这样当用户输入文本到达Memo部件的右边缘时会自己主动回行。将Line属性第一行的Memo1文本删除,使得memo部件在初始显示时为空的。

为每个button建立例如以下的事件处理过程:

procedure TForm1.CutClick(Sender: TObject);
begin
Memo1.CutToClipboard;
end;
procedure TForm1.CopyClick(Sender: TObject);
begin
Memo1.CopyToClipboard;
end;
procedure TForm1.PasteClick(Sender: TObject);
begin
Memo1.PasteFromClipboard;
end;
procedure TForm1.ClearClick(Sender: TObject);
begin
Memo1.clear;
end;

运行此程序。您能够在备注部件中输入文本,在进行了文本的标记后,能够随意地进行剪切、拷贝、粘贴和清除。当button被按动时,就调用对应的过程进行处理。用户能够通过查阅在线帮助进行Memo部件的Topic Search,在Memo Component项中查阅Method,会得到以上过程的具体说明。

2.1.3.2 调用Delphi的含參过程

有些过程要求用户指明參数。被调用的过程会在运行时使用传入的參数值,这些值在过程中被觉得是已经被说明的变量。比如,LoadFromFile方法在TString对象中被说明为:

Procedure LoadFromFile(const FileName: String);

在调用这一过程时,应指明FileName參数是要装入的文件名。以下的程序将先打开Open对话框,当您选择了一个文件后,Delphi将把该文件读入一个Memo部件:

begin
OpenDialog.Execute;
Memo1.lines.LoadFromFile(OpenDialog.FileName);
end;

2.1.3.3 使用Delphi函数

与过程一样,函数的程序代码也运行特定的工作。它和过程的差别为:函数运行时会返回一个值,而过程则没有返回值。函数能够用来赋给一个属性或变量;也能够使用返回值来决定程序的流程。

前文中我们实际上已经接触过了函数。在讲述变量时,曾用到过以下的程序段: Edit1.Text := IntToStr(X + Y);当中,IntToStr(Value)把一个LongInt类型的数值转化为字符串的值,Value是IntToStr唯一的參数,它能够是一个整形的值、变量、属性或产生整形值的表达式。调用函数,必须把返回值赋给和此返回值类型兼容的变量或属性。

有些函数返回一个True或False的布尔量,用户的程序能够依据返回值来决定跳转。下文的例程讲述了函数返回值为Boolean的推断使用方法:

在窗口中增加一个ColorDialog对象和一个Name属性为ChangeColor的button。为button的OnClick事件建立事件处理步骤例如以下:

procedure TForm1.ChangeColorClick(Sender: TObject);
begin
if ColorDialog1.Execute then
Form1.Color := ColorDialog1.Color
else
Form1.Color := clRed;
end;

此事件处理过程使用一个返回Boolean值的Execute方法。按动button,并在颜色对话框中选择一个颜色。假设按动OKbutton,ColorDialog.Execute方法将返回True,则Form1.Color将被赋值为ColorDialog1.Color,窗口显现您选用的颜色;假设按动颜色对话框的Cancelbutton,方法将返回False值,窗口将变为红色。

2.1.4 跳转语句

Object Pascal的跳转语句有if和case两个。

2.1.4.1 if语句

if语句会计算一个表达式,并依据计算结果决定程序流程。在上文的例程中,依据ColorDialog.Execute的返回值,决定窗口的背景颜色。if保留字后尾随一个生成Boolean值True或False的表达式。一般用“=”作为关系运算符,比較产生一个布尔型值。当表达式为True时,运行then后的语句。否则运行else后的代码,if语句也能够不含else部分,表达式为False时自己主动跳到下一行程序。

if语句能够嵌套,当使用复合语句表达时,复合语句前后需加上begin…end。else保留字前不能加“;”,并且,编译器会将else语句视为属于最靠近的if语句。必要时,须使用begin…end保留字来强迫else部分属于某一级的if语句。

2.1.4.2 case语句

case语句适用于被推断的变量或属性是整形、字符型、枚举型或子界型时(LongInt除外)。用case语句进行逻辑跳转比编写复杂的if语句easy阅读,并且程序代码整形较快。

以下的例程显示一个使用case语句的窗口:

建立例如以下的事件处理过程:

procedure TForm1.Button1Click(Sender: TObject);
var
Number : Integer;
begin
Number := StrToInt(Edit1.Text);
case Number of
1,3,5,7,9: Label2.Caption := '奇数';
0,2,4,6,8: Label2.Caption := '偶数';
10..100:
begin
Label2.Caption := '在10到100之间';
Form1.Color := clBlue;
end;
else
Label2.Caption := '大于100或为负数';
end;
end;

运行程序,当Edit1部件接受到一个值,并按动“OK”button触发程序后,Number便被赋值为用户输入的数值。case语句依据Number的值推断该运行哪一条语句。象if语句一样。case语句也有可选择的else部分。case语句以end结尾。

2.1.5 循环语句

Object Pascal的循环语句有三种:repeat、while和for语句。

2.1.5.1 repeat语句

repeat语句会反复运行一行或一段语句直到某一状态为真。语句以repeat開始,以until结束,其后尾随被推断的布尔表达式。參阅以下的例程:

i := 0;
repeat
i := i+1;
Writen(i);
until i=10;

当此语句被运行时,窗口的下方会出现1到10的数字。布尔表达式 i=10 (注意,与其它语言不同的是,“=”是关系运算符,而不能进行赋值操作)直到repeat..until程序段的结尾才会被计算,这意味着repeat语句至少会被运行一次。

2.1.5.2 while语句

while语句和repeat语句的不同之处是,它的布尔表达式在循环的开头进行推断。while保留字后面必须跟一个布尔表达式。假设该表达式的结果为真,循环被运行,否则会退出循环,运行while语句后面的程序。

以下的例程达到和上面的repeat例程达到同样的效果:

i := 0;
while i<10 do
begin
i := i+1;
writeln(i);
end;

2.1.5.3 for语句

for语句的程序代码会运行一定的次数。它须要一个循环变量来控制循环次数。您须要说明一个变量,它的类型能够是整形、布尔型、字符型、枚举型或子界型。

以下的程序段会显示1到5的数字,i为控制变量:

var
i : integer;
for i := 1 to 5 do
writeln(i);

以上介绍了三种循环语句。假设您知道循环要运行多少次的话,能够使用for语句。for循环运行速度快,效率比較高。假设您不知道循环要运行多少次,但至少会运行一次的话,选用repeat..until语句比較合适;当您觉得程序可能一次都不运行的话,最好选用while..do语句。

2.1.6 程序模块

程序模块在Object Pascal中是非常重要的概念。它们提供了应用程序的结构,决定了变量、属性值的范围及程序运行的过程。它由两个部分组成:可选择的说明部分和语句部分。假设有说明部分,则必在语句部分之前。说明部分包括变量说明、常量说明、类型说明、标号说明、程序,函数,方法的说明等。语句部分叙述了可运行的逻辑行动。

在Delphi中,最常见的程序模块便是事件处理过程中的程序模块。以下的事件处理过程是含有变量说明部分的程序模块:

procedure TForm.Button1Click(Sender Tobject);
var {程序模块的说明部分}
Name : string;
begin {程序模块的语句部分}
Name := Edit1.Text;
Edit2.Text := 'Welcome to Delphi'+Name;
end; {程序模块结束}

库单元也是程序模块。库单元的interface部分含有库函数、类型、私有,公有域的说明,也能够含有常量、变量的说明。这一部分能够作为程序模块的说明部分。在库单元的implementation部分中通常含有各种事件处理过程,它们能够视为模块的语句部分,是事件处理模块。库单元模块结束于库单元结束的end.处。

程序模块中能够包括其它的程序模块。上文库单元模块中含有事件处理模块。而库单元模块实际是在project程序模块中。

全部的Delphi应用程序都有同样的基本结构。当程序逐渐复杂时,在程序中增加模块就可以。比如在库单元模块中增加事件处理模块,向project中增加库单元模块等。模块化编程使得程序结构良好,并且对数据具有保护作用。

2.1.7 关于作用范围

2.1.7.1 标识符的作用范围

一个变量、常量、方法、类型或其它标识符的范围定义了这个标识符的活动区域。对于说明这个标识符的最小程序模块而言,此标识符是局部的。当您的应用程序在说明一个标识符的程序模块外运行时,该标识符就不在此范围内。这意味着此时运行的程序无法訪问这个标识符,仅仅有当程序再度进入说明这个标识符的程序模块时,才干够訪问它。

以下的示意图表示一个含有两个库单元的project,每个库单元中又各有三个过程或事件处理过程。

2.1.7.2 訪问其它程序模块中的说明

您能够在当前的程序模块中訪问其它程序模块中的说明。比如您在库单元中编写一个事件处理过程来计算利率,则其它的库单元能够訪问这个事件处理过程。要訪问不在当前库单元中的说明,应在这个说明之前加上其它应用程序的名称和一个点号(.)。比如,在库单元Unit1中有事件处理过程CalculateInterest过程,如今您想在库单元Unit2中调用这一过程,则能够在Unit2的uses子句中增加Unit1,并使用以下的说明:

Unit1.CalculateInterest(PrincipalInterestRate : Double);

应用程序的代码不能在一个模块外訪问它说明的变量。事实上,当程序运行跳出一个模块后,这些变量就不存在于内存中了。这一点对于不论什么标识符都是一样的,无论事件处理过程、过程、函数还是方法,都具有这一性质。这样的标识符称为局部变量。

2.1.7.3 依照作用范围说明标识符

您能够在应用程序的不同地方说明一个标识符,而仅仅需保证它们的有效范围不同就可以。编译器会自己主动訪问最靠近当前范围的标识符。

库单元的全局变量一般能够说明在保留字implementation后面。比如,以下的例程实现将两个编辑框中的整数相加,显示在第三个编辑框中。用到了一个整形的全局变量Count:

…implememntation
var
Count : Integer;
procedure TForm1.AddClick(Sender:TObject);
var
FirstNumber,SecondNumber:Integer;
begin
Count := Count + 1;
Counter.Text := IntToStr(Count);
FirstNumber := StrToInt(Edit1.Text);
SecondNumber := StrToInt(Edit2.Text);
Edit3.Text := IntToStr(FirstNumber+SecondNumber);
end;

为了实现每按动一次buttonCount增加一次,必须对全程变量Count进行初始化处理。在程序库单元的结尾处,最后一个end.保留字之前,增加保留字initialization和初始化Count的代码:


initialization
Count := 0;

这样当事件处理过程AddClick被触发时,Count就会被增加一次,以表征计算次数。假设用面向对象编程,则Count能够说明成窗口的一个域,这在下一节中将有讲述。

2.1.8 编写一个过程或函数

在您开发Delphi应用程序时,所需的大部分代码都编写在事件处理过程中,但有时仍然须要编写不是事件处理过程的函数或过程。比如,您能够把在多个事件处理过程中用得到语句编写成过程,然后不论什么事件处理过程、过程、函数都能够象调用已经存在的过程或函数一样直接调用它。长处是您仅仅需编写一次代码,并且程序代码会比較清晰。

2.1.8.1 一个自行编写的函数例程

在上文两个数相加的程序中,假设编辑框中无值,则会使得程序出错中断。为避免这样的情况,编写以下的函数,检查编辑框中是否有值,如无值,则提醒用户输入:

function NoValue(AnEditBox:TEdit):Boolean;
begin
if AnEditBox.Text='' then
begin
AnEditBox.Color := clRed;
AnEditBox.Text := '请输入整数值';
Result := True;
end
else
begin
AnEditBox.Color := clWindow;
Result := False;
end;
end;

NoValue函数会检查编辑框是否为空,假设是,编辑框颜色变红,并提醒用户输入一个整数,然后函数返回真值;Result保留字在Delphi中用来专指函数返回值。在上文的例程中增加NoValue函数:

procedure TForm1.AddClick(Sender: TObject);
var
FirstNumber,SecondNumber : Integer;
begin
if NoValue(Edit1)or NoValue(Edit2) then
exit;
Count := Count + 1;
Counter.Text := IntToStr(Count);
FirstNumber := StrToInt(Edit1.Text);
SecondNumber := StrToInt(Edit2.Text);
Edit3.Text := IntToStr(FirstNumber+SecondNumber);
end;

假设当中的不论什么一个返回真值,则表示有编辑框空,会运行exit过程,使得当前的程序模块停止运行,并使得编辑框出现输值提示。当新值被输入后,再运行程序时,红色提示被隐去,恢复正常的计算状态。

2.1.8.2 过程和函数的标题

每个过程或函数都以标题開始,当中包括过程或函数的名称和它使用的參数。过程以保留字procedure開始,函数以保留字function開始。參数位于括号中面,每个參数以分号分隔。比如:

procedure validateDate(Day : Integer; month : Integer; Year : Integer);

您也能够将同样类型的參数组合在一起,则上述过程头写作:

procedure ValidateDate(Day, Month, Year : Integer);

函数在标题中还多了一项:返回值的类型。以下是一个返回值为Double型的函数标题:

function CalculateInterest(principal,InterestRate:Double):Double;

2.1.8.3 函数和过程中的类型说明

一个过程或函数程序模块也含有说明部分和语句部分。说明部分能够包括类型说明、变量说明、常量说明等。除了Object Pascal语言中已经定义的类型之外,Delphi的应用程序还能够建立新的数据类型。类型说明部分有保留字type開始。以下是一些类型的说明:

type
Tcount = Integer;
TPrimaryColor = (Red,Yellow,Blue);
TTestIndex = 1..100;
TTextValue = -99..99;
TTestList = array [TTestIndex] of TTestValue;
TCharVal = Ord('A')..Ord('Z') ;
Today = (Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,
Sunday) ;

在类型标识符后面,用“=”号定义了新的类型。类型界定了变量的取值范围,比如,TCount类型的变量必须是整形值;一个TPrimaryColor类型的变量仅仅能是red、yellow或blue等等。每个类型的名称都是由字母T開始,这并不是必须的,但它是Delphi的惯例,在差别类型名和标识符时非常实用。类型说明能够是局部的,也能够是全局的。假设您把它放在implementation后面,则表明对于库单元来讲,它是全局的,全部的事件处理过程和其它的过程、函数都能够调用它。假设类型是在过程中被说明的,则是局部的,离开这一过程,该类型将失效。

一般来讲,在过程和函数中,不论什么类型说明都在变量说明之前,而不论什么变量说明都在常量之前。可是,仅仅要遵从说明必须在过程与函数的标题之后,并且在程序代码之前,即是有效的。

2.1.8.4 过程和函数的语句部分

过程或函数的语句部分由begin開始,end结束。函数须要一个返回值。能够将返回值赋给函数名称,也能够将返回值赋给Result变量。以下的例程将返回值赋给函数名称:

function CalculateInterest(Principal,InterestRate: Double):Double;
begin
CalculateInterest := Principal * InterestRate;
end;

将返回值赋给Result变量也是能够的,则上面的程序改为:

Result := Principal*InterestRate;

以下是这个函数的调用方法:

InterestEarned :=CalculateInterest(2000,0.012);

在Implementation后面的过程和函数,能够且仅仅能被此库单元的事件处理过程使用。要让过程和函数能够被其它的程序库单元使用,则须要将过程或函数的标题部分放在库单元中的interface部分,而把含标题的整个过程或函数放在库单元的inplementation部分,并在要訪问这个过程或函数的库单元的uses子句中增加说明这个过程或函数的库单元名称。

2.1.8.5 函数的递归调用

在Object Pascal中,过程或函数必须先说明再调用。上文的NoValue函数必须在使用它的事件处理过程之前说明和运行,否则程序会报告一个未知标识符的错误。

以上规则在递归调用时是例外情况。所谓递归调用,是指函数A调用函数B,而函数B又调用函数A的情况。在递归调用中,函数要进行前置,即在函数或过程的标题部分最后加上保留字forword。下文的例程是一个递归调用的典型样例:


implementation
var
alpha:Integer;
procedure Test2(var A:Integer):forword;
{Test2被说明为前置过程}
procedure Test1(var A:Integer);
begin
A :=A-1;
if A>0 then
test2(A); {经前置说明,调用未运行的过程Test2}
writeln(A);
end;
procedure Test2(var A:Integer);{经前置说明的Test2的运行部分}
begin
A :=A div 2;
if A>0 rhen
test1(A); {在Test2中调用已运行的过程Test1}
end;
procedure TForm1.Button1Click(Sender:TObject);
begin
Alpha := 15; {给Alpha赋初值}
Test1(Alpha); { 第一次调用Test1,递归開始}
end;

button的OnClick事件处理过程给Alpha赋初值,并实现先减1再除2的循环递归调用,直到Alpha小于0为止。

2.1.8.6 过程和函数的參数

当您的程序代码在调用一个过程或函数时,通经常使用參数传递数据到被调用的过程或函数中。最经常使用的參数有数值參数、变量參数和常量參数三种。

由被调用过程或函数定义的參数为形參,而由调用过程或函数指明的參数叫实參。在NoValue函数中,说明函数体中的AnEditBox是形參,而调用时在if NoValue(Edit1)…中,Edit1是实參。

数值參数在运行过程中仅仅改变其形參的值,不改变事实上參的值,即參数的值不能传递到过程的外面。试看以下的例程:

procedure Calculate(CalNo:Integer);
begin
CalNo := CalNo*10;
end;

用以下例程调用Calculate函数:


Number := StrToInt(Edit1.Text);
Calculate(Number);
Edit2.Text := IntToStr(Number);

Number接受由编辑框1输入的数值,经Calculate过程运算。它是一个数值型实參。在进入Calculate函数后,会把Number实參拷贝给形參CalNo,在过程中CalNo增大十倍,但并未传递出来,因此Number值并未改变,在编辑框2中显示仍然是编辑框1中的输入值。形參和实參占用不同的内存地址,在过程或函数被调用时,将实參的值复制到形參占用的内存中。因此出了过程或函数后,形參和实參的数值是不同的,但实參的值并不发生变化。

假设您想改变传入的參数值,就须要使用变量參数,即在被调用程序的參数表中的形參前加上保留字var。比如:

procedure Calculate(var CalNo : Integer);

则CalNo并不在内存中占领一个位置,而是指向实參Number。当一个变參被传递时,不论什么对形參所作的改变会反映到实參中。这是由于两个參数指向同一个地址。将上一个例程中过程头的形參CalNo前面加上var,再以同样的程序调用它,则在第二个编辑框中会显示计算的结果,把第一个编辑框中的数值放大十倍。这时形參CalNo和实參Number的值都是Nnmber初始值的10倍。

假设当过程或函数运行是要求不改变形參的值,最保险的办法是使用常量參数。在參数表的參数名称前加上保留字const能够使一个形參成为常量參数。使用常量參数取代数值參数能够保护您的參数,使您在不想改变參数值时不会意外地将新的值赋给这个參数。

2.1.9 定义新的数据类型

Object Pascal有一些系统提前定义的数据类型,在2.1.2中已经对它们作了介绍。您能够利用这些数据类型以建立新的数据类型来满足程序的特定须要。以下简单地叙述了您能建立的主要数据类型,如枚举型、子界型、数组型、集合型、记录型、对象型等。

2.1.9.1 枚举类型

一个枚举型的说明列出了全部这样的类型能够包括的值:

type
Tdays=( Sunday ,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);

能够定义上述枚举类型的变量:

var
DayOfWeek:TDays;

在枚举型中,括号中的每个值都有一个由说明它的位置决定的整形值。比如Sunday有整形值0,Monday有整形值1等。您能够把DayOfWeek说明为一个整形变量,并将一星期的每一天赋一个整形值以达到同样的效果,但用枚举型会使得程序可读性好,编写easy。当您在枚举型中列出值时,您同一时候说明了这个值是一个标识符。比如您的程序中假设已经含有TDays类型且说明了DayOfWeeks变量,则程序中便不能使用Monday变量,由于它已经被说明为标识符了。

2.1.9.2 子界类型

子界型是下列这些类型中某范围内的值:整形、布尔量、字符型或枚举型。在您想限制一个变量的取值范围时,子界型是非常实用的。

type
Thours = 0..23;
TValidLetter = 'A' .. 'F';
TDays = ( Sunday ,Monday,Tuesday,Wednesday,Thursday,
Friday,Saturday); {枚举型}
TWorkDay = Monday..Friday; {一个TDays型的子界}

子界型限定了变量的可能取值范围。当范围检查打开时,(在库单元的Implementation后面有{$R*.DFM}字样表示范围检查打开,否则您能够在Options|Project|Complier Options中选择Range Cheking来打开范围检查),假设变量取到子界以外的值,会出现一个范围检查错误。

2.1.9.3 数组类型

数组是某种数据类型的有序组合,当中每个元素的值由其相对位置来指定,您能够在数组的某个位置上放置数据,并在须要时使用这些数据。以下的类型说明了一个Double型的数组变量:

var
Check : array [1..10] of Double;

它表示Check指向一个含有10个Double型元素的数据串列,代表每个元素的是1到10之间的数字,称为索引。数组的每一项由数组名称加上[]中的索引来表示。Check包括10个变量,Check[1]表示第一个变量。您也能够把数组定义成类型:

type
TCheck = array[1..10] of Double;

则变量说明改为:

var
Check :TCheck;

您能够通过给数组赋值等方法来使用数组。以下的语句将0.0赋给Check数组中的全部元素:

for J := 1 to 10 do
Ch


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap