当前位置: 首页 > news >正文

html做音乐网站山东广饶县建设局网站

html做音乐网站,山东广饶县建设局网站,福州 网站开发,网站的地图要怎么做Delphi面向对象编程的20条规则 作者简介 Marco Cantu是一个知名的Delphi专家#xff0c;他曾出版过《精通Delphi》系列丛书#xff0c;《Delphi开发手册》以及电子书《精通Pascal》(该电子书可在网上免费获得)。他讲授的课题是Delphi基础和高级开发技巧。你可以通过他…Delphi面向对象编程的20条规则 作者简介       Marco   Cantu是一个知名的Delphi专家他曾出版过《精通Delphi》系列丛书《Delphi开发手册》以及电子书《精通Pascal》(该电子书可在网上免费获得)。他讲授的课题是Delphi基础和高级开发技巧。你可以通过他的网站www.marcocantu.com获得更多关于他的信息你也可以他的公共新闻组和他联系详情请参见他的网站。           前言       大多数Delphi程序员都像使用Visual   Basic   那样使用他们手头上开发工具而丝毫没有意识到Delphi的强大功能更谈不上使用这些功能了。(写到这里编辑惶恐的举起了手怎么可能呢)Delphi和Visual   Basic不同Delphi完全建立在面向对象结构上,这不仅影响到VCL的结构而且影响到使用Delphi开发的每一个程序。       在本文中我不想涉及到面向对象编程OOP的所有理论,只是提出一些简单的经验规则。希望这些规则能够帮助改善你的程序结构。无论你开发的是何种类型的程序这些经验规则都是适用的。你应当把他们当作一些建议记住他们并把他们应用到你开发的程序中去。       关于面向对象编程我想强调的一个关键原理是封装。我们都希望创建一些灵活而且强健的类因为这样的类允许我们以后修改他们的实现方法而不影响到程序中的其他部分这正是封装给我们带来的好处。虽然封装不是创建一个好的面向对象程序的唯一标准但是它构成了面相对象编程的基础所以在本文中我也许会过多的强调封装性请不要感到奇怪我有足够充分的理由这么做。       最后我想说明这样一个事实本文将主要集中说明窗体Forms的开发虽然其中的一些规则对于组件的开发同样适用因此这些规则对于所有的Delphi程序员都是适用的。那些编写组件的程序员必须把面相对象编程和类Class作为核心的元素但是对于那些使用组件编程的程序员他们时常会忘记面向对象。对于他们本文可以当作一个提示提醒他们始终记住面向对象编程           第一部分窗体是类A   Form   is   A   Class(rule   1-rule   15)       程序员常常将窗体看作是对象而事实上窗体是类。两者的差别在于你创建基于相同的窗体类的多个窗体对象。令人感到疑惑的是Delphi为你定义的每一个窗体类创建了一个默认的全局对象。这对于新手来说是相当方便的但是这同样会使他们形成坏习惯。           第二部分继承Inheritance(rule   15-rule   20)       在讲述了一系列关于类特别是关于窗体类的规则后第二部分将是一些关于类的继承性以及可视化窗体继承的建议和技巧。           关于代码       本文中所有的代码段都可以在本期杂志《The   Delphi   Magazine》   Issue   47附带的磁盘中的OopDemo工程中找到。你特别应该查看例程中的frm2   单元unit和inher单元。如果你想使用这些代码请注意构造器必要的初始化设置以及私有组件参照同时有必要设置好窗体的OldCreateOrder属性。否则带有组件的窗体构造器的初始化代码将在窗体的OnCreate事件之前得到执行。       在这张磁盘上你还可以找到OOP   窗体向导的第一版的编译包不过我更希望你访问我的网站获得该程序的更完整的版本。       规则一为每一个类创建一个单元One   Class,One   Unit       请始终牢记这一点类的私有(private)和保护(protected)的部分只对于其他单元中的类和过程procedure才是隐藏的.因此如果你想得到有效的封装性你应该为每一个类使用一个不同的单元。对于一些简单的类比如那些继承其他类的类你可以使用一个共享的单元。不过共享同一个单元的类的数目是受到限制的不要在一个简单的单元里放置超过20个复杂的类虽然Borland公司的VCL代码曾经这样做过。       如果你使用窗体的时候Delphi会默认的遵循“一个类使用一个单元”的规则这对于程序员来说也是十分方便的。当你向你的项目中添加一个没有窗体的类时Delphi也会创建一个新的独立的单元。           规则二为组件命名Name   Components       为每一个窗体和单元给出一个有意义的名字是十分重要的。窗体和单元的名字必须是不同的不过我趋向于为他们两者使用相似的名字如对于关于窗体和单元可以为他们使用AboutForm   和About.pas.       为组件使用带有描述性的名字同样十分重要。最常见的命名方式是使用类的小写字母开头再加上组件的功能如BtnAdd   或者editName。采用这样的命名方式为组件命名可能会有很多相似的名字而且也没有一个最好的名字到底应该选择那一个应该依据你的个人爱好而定。           规则三为事件命名Name   Events       对于事件处理方法给出合适的名字更加重要。如果你对于组件给出了一个合适的名字那么系统默认的名字ButtonClick将变成BtnAddClick。虽然从这个名字中我们可以猜到这个事件处理程序的功能但是我认为使用一个能够描述该方法的作用的名字而不是采用Delphi附加的名字是一种更好的方式。例如BtnAdd按钮的OnClick事件可以命名成AddToList。这会使得你的程序可读性更强特别是当你在这个类的其他方法中调用这个事件处理程序时而且这会帮助程序员为类似的事件或是不同的组件选用相同的方法。不过我必须声明使用动作Actions是目前开发重要的程序时我最喜欢的方法。           规则四使用窗体方法Use   Form   Methods       窗体都是一些类因此窗体的代码是以方法组织的。你可以向窗体中添加事件处理程序这些处理程序完成一些特别的功能而且他们能被其他方法调用。除了事件处理方法外你还可以向窗体添加完成动作的特别定义的方法以及访问窗体状态的方法。在窗体中添加一些公共的Public方法供其他窗体调用要比其他窗体直接操作他的组件要好。           规则5添加窗体构造器Add   Form   Constructors       在运行时创建的第二个窗体除了一个默认的构造器从Tcomponent   类继承而来外还会提供其他特殊的构造器。如果你不需要考虑和Delphi4以前的版本的兼容性问题我建议你重载OverloadCreate方法添加必要的初始化参数。具体代码可参见下面的代码:       Public       Constructor   Create(Text:string):   reintroduce   ;   overload;       Constructor   TformDialog.Create(Text:string);       Begin       Inherited   Create(Application);       Edit1.Text:Text;       End;       规则6避免全局变量Avoid   Global   Variables       应该避免使用全局变量就是那些在单元的interface   部分定义的变量。下面将会有一些建议帮助你如何去做。       如果你需要为窗体存储额外的数据你可以向窗体类中添加一些私有数据。这种情况下每一个窗体实例都会有自己的数据副本。你可以使用单元变量在单元的implementation部分定义的变量声明那些供窗体类的多个实例共享的数据。       如果你需要在不同类型的窗体之间共享数据你可以把他们定义在主窗体里来实现共享或者使用一个全局变量使用方法或者是属性来获得数据。           规则7永远不要在Tform1类中使用Form1(Never   Use   Form1   in   Tform1)       你应该避免在类的方法中使用一个特定的对象名称换句话说你不应该在TForm1类的方法中直接使用Form1.如果你确实需要使用当前的对象你可以使用Self关键字。请牢记大多数时候你都没有必要直接使用当前对象的方法和数据。       如果你不遵循这条规则当你为一个窗体类创建多个实例的时候你会陷入麻烦当中。           规则8尽量避免在其他的窗体中使用Form1(Seldom   Use   Form1   In   Other   Forms   )       即使在其他窗体的代码中你也应该尽量避免直接使用全局变量如Form1.定义一些局部变量或者私有域供其他窗体使用会比直接调用全局变量要好。       例如程序的主窗体能够为对话框定义一个私有域。很显然如果你计划为一个派生窗体创建多个实例这条规则将是十分有用。你可以在主窗体的代码范围内保持一份清单也可以更简单地使用全局Sreen对象的窗体数组。           规则9移除Form1(Remove   Form1)       事实上我的建议是在你的程序中移除Delphi自动创建的全局窗体对象。即使你禁止了窗体的自动添加功能这也有可能是必要的因为在Delphi随后仍然可能添加这样的窗体。我给你的建议是应该尽量避免使用全局窗体对象。       我认为对于Delphi新手而言移除全局窗体对象是十分有用的这样他们不至于对类和全局对象两者的关系感到疑惑。事实上在全局窗体对象被移除后所有与它有关的代码都会产生错误。         问题点数0、回复次数112Top 1 楼ZyxIp绝望中...回复于 2003-09-02 14:28:22 得分 0 规则10添加窗体属性Add   Form   Properties       正如我已经提到过的当你需要为你的窗体添加数据时请添加一个私有域。如果你需要访问其他类的数据可以为你的窗体添加属性。使用这种方法你就能够改变当前窗体的代码和数据(包含在它的用户界面中)而不必改变其他窗体或类的代码。       你还应该使用属性或是方法来初始化派生窗体或是对话框或是访问他们的最终状态。正如我前文所说的你应该使用构造器来完成初始化工作           规则11显示组件属性Expose   Components   Properties       当你需要访问其他窗体的状态时你不应该直接访问它的组件。因为这样会将其他窗体或其它类的代码和用户界面结合在一起而用户界面往往是一个应用程序中最容易发生改变的部分。最好的方法是为你需要访问的组件属性定义一个窗体属性。要实现这一点可以通过读取组件状态的Get方法和设置组件状态的Set方法实现。       假如你现在需要改变用户界面用另外一个组件替换现有的组件那么你只需做的是修改与这个组件属性相关的Get方法和Set方法而不必查找修改所有引用这个组件的窗体和类的源码。详细实现方法请参见下面的代码       private       function   GetText:String;       procedure   SetText(const   Value:String);       public       property   Text:String;       read   GetText   write   SetText;       function   TformDialog.GetText:String;       begin       Result:Edit1.Text;       end;       procedure   TformDialog.SetText(const   Value:String);       begin       Edit1.Text;Value;       end;           规则12属性数组Array   Properties       如果你需要处理窗体中的一系列变量你可以定义一个属性数组。如果这些变量是一些对于窗体很重要的信息你还可以把他们定义成窗体默认的属性数组这样你就可以直接使用SpecialForm[3]来访问他们的值了。       下面的代码显示了如何将一个listbox组件的项目定义成窗体默认的属性数组。       type       TformDialog   class(TForm)       private       listItems:TlistBox;       function   GetItems(Index:Integer):String;       procedure   SetItems(Index:Integer:const   Value:String);       public       property   Items[Index:Integer]:string;       end;       function   TFormDialog.GetItems(Index:Integer):string;       begin       if   Index   ListItems.Items.Count   then       raise   Exception.Create(‘TformDialog:Out   of   Range’);       Result:ListItems.Items[Index];       end;       procedure   TformDialog.SetItems(Index:Integer;const   alue:string);       begin       if   Index   ListItems.Items.Count   then       raise   Exception.Create(‘TformDialog:Out   of   Range’);       ListItems.Items[Index]:Value;       end;           规则13使用属性的附加作用Use   Side-Effects   In   Properties       请记住使用属性而不是访问全局变量参见规则10、11、12的好处之一就是当你设置或者读取属性的值时你还可能有意想不到的收获。       例如你可以直接在窗体界面上拖拉组件设置多个属性的值调用特殊方法立即改变多个组件的状态或者撤销一个事件如果需要的话等等。           规则14隐藏组件Hide   Components       我经常听见那些面向对象编程的狂热追求者抱怨Delphi窗体中包含一些在published部分声明的组件这是和面向对象思想的封装性原理不相符合的。他们确实提出了一个重要的议题但是他们中的大多数人都没有意识到解决方法其实就在他们手边完全不用重写Delphi代码也不用转向其他语言。       Delphi向窗体中添加的组件参照可以被移到private部分使得其他窗体不能访问他们。如果你这样做你就有必要设置一些指向组件的窗体属性请参见规则11并且使用它们来访问组件的状态。       Delphi将所有的这些组件都放在published部分这是因为使用这种方式能够保证这些域一定是在.DFM文件中创建的组件。当你改变一个组件的名称时VCL能够自动地将这个组件对象与它在窗体中的参照关联起来。因为delphi使用RTTI和Tobject方法来实现这种功能所以如果想要使用这种自动实现功能就必须把参照放置在published部分这也正是为什么delphi将所有的组件都放在published部分的缘故。       如果你想知道的更详细一点可以参看下面的代码           procedure   Tcomponent.SetReference(Enable:Boolean);       var       Field:^Tcomponent;       begin       If   Fowner   nil   then   begin       Field:Fowner.FieldAddress(Fname);       If   Fieldnil   then       Field^:Self       else       Field^:nil;       end;       end;           上面的代码是Tcomponent类的SetReference方法这个方法可以被InserComponentRemoveComponent和SetName等方法调用。       当你理解了这一点后你应该不难想到如果你将组件参照从published部分移到了private段你将失去VCL的自动关联功能。为了解决这个问题你可以通过在窗体的OnCreate事件中添加如下代码解决       Edit1:FindComponent(‘Edit1’)   as   Tedit;       你接下来应该做的就是在系统中注册这些组件类当你为他们注册过后就能使RTTI包含在编译程序中并且能够被系统所使用。当你将这些类型的组件参照移到private部分时对于每一个组件类你只需为他们注册一次。即使为他们注册不是一定必要的时候你也可以这样做因为对于RegisterClasses的额外调用有益无害。通常你应该在单元中负责生成窗体的初始化部分添加以下的代码       RegisterClass[TEdit];           规则15面向对象编程的窗体向导The   OOP   Form   Wizard       为每一个窗体的每一个组件重复上述两个操作不仅十分的烦人而且相当的浪费时间。为了避免额外的负担我已经为此写了一个简单的向导程序。这个程序将会生成一些可以完成以上两步工作的代码你需要做的仅仅是做几次复制和粘贴就行了。       遗憾的是这个向导程序不能自动将代码放置到单元中合适的地方我目前正在修改这个向导程序希望能实现这个功能。你可以到我的网站www.marcocantu.com查找更加完善的程序。           规则16可视化窗体继承Visual   Form   Inheritance       如果应用得当这将是一个强大的工具。根据我的经验你所开发的项目越大越能体现它的价值。在一个复杂的程序中你可以使用窗体的不同等级关系来处理一组相关窗体的多态性polymorphism。       可视化窗体继承允许你共享多个窗体的一些公共的动作你可以使用共享的方法公用的属性甚至是事件处理程序组件组件属性组件事件处理方法等等。           规则17限制保护域数据的使用Limit   Protected   Data       当创建一些具有不同分级体系的类时一些程序员趋向于主要使用保护域因为私有数据不能被子类访问。我不能说这没有其合理性但是这肯定是和封装性不相容和的。保护数据的实现能够被所有继承的窗体所共享而且一旦这些数据的原始定义发生改变你必须更改所有的相关部分。       请注意如果你遵循隐藏组件这样一条规则Rule   14继承窗体就不可能访问基类的私有组件。在一个继承窗体中类似Edit1.Text’’的代码就不会被编译。虽然这是相当的不方便但是至少在理论上这是值得肯定的事情而不是否定的。如果你感觉到实现封装性是最主要最需要的就请将这些组件参照放在基类的私有段。           规则18保护域中的访问方法Protected   Access   Methods       在基类中将组件参照放置在私有域中而为这些组件添加一些访问函数来得到他们的属性这将是一种更好的方法。如果这些访问函数仅仅在这些类内部使用而且不是类接口的一部分你应该在保护域声明他们。例如Rule   11中描述过的GetText和SetText方法就可以声明成protected并且我们可以通过调用SetText’’来编辑文本。       事实上当一个方法被镜像到一个属性时我们可以简单地采用如下代码就可以达到编辑文本地目的Text:’’;           规则19保护域中的虚拟方法Protected   Virtual   Methods       实现一个灵活的分级制度的另一个关键点是定义一些你可以从外部类调用的虚拟方法来得到多态性。如果这个方法使用得当将会很少出现其他公共的方法调用保护域中的虚拟方法的情况。这是一个重要的技巧因为你可以定制派生类的虚拟方法来修改对象的动作。           规则20用于属性的虚拟方法Virtual   Methods   For   Properties       即使是访问属性的方法也能定义成virtual这样派生类就能改变属性的动作而不必重定义他们。虽然这种方法在VCL当中很少使用但是它确实十分灵活、强大。为了实现这一点仅仅需要将Rule   11当中的Get   和Set   方法定义成Virtual。基类的代码如下所示       type       TformDialog      class   (   TForm)       Procedure   FormCreate(Sender:Tobject);       Private       Edit1:Tedit;       Protected       function   GetText:String;virtual;       procedure   SetText(const   Value:String);virtual;       public       constructor   Create(Text   :String):reintroduce;overload;       property   Text:String   read   GetText   write   SetText;       end;           在继承窗体中你可以添加一些额外的动作来重载虚拟方法SetText       procedure   TformInherit.SetText(const   Value:String);       begin       inherited   SetText(Value);       if   Value’’   then       Button1.Enabled:False;       end;转载于:https://www.cnblogs.com/bjxsky/articles/2816842.html
http://www.yutouwan.com/news/185058/

相关文章:

  • php商城网站建设多少钱北京网络营销招聘
  • 网站百度不到验证码怎么办啊做网站有什么不好
  • php网站开发外包太仓网站建设有限公司
  • 网站建设的意义与目的如何在人力资源网站做合同续签
  • wordpress怎么加入站长统计代码实时网站制作
  • 更换wordpress后台登陆地址360优化大师下载
  • 广告投放跟网站建设一样吗网站建设需求分析文档
  • 大气公司网站源码肯尼亚网站域名
  • 有没有做淘宝网站的免费seo搜索优化
  • 推广型网站如何建站ic电子网站建设
  • 常宁市网站建设1+x数字营销网站
  • 淘客网站如何做推广网站开发技术方案实验报告
  • 多语言网站(如何实现网站的多语言版本 )牡丹江定制软件开发
  • 网站建设吴江服务器 空间 虚拟主机 网站需要备案吗
  • 广州seo网站开发国家高职示范校建设网站
  • 三合一网站指的是什么意思网站制作 优帮云
  • 网站安全优化seo优化人员
  • 自己做公司网站成本成都水高新区建设局官方网站
  • wordpress更换域名后登陆不了后台做网站优化需要多少钱
  • 网站做外链的具体步骤电商网站设计与制作论文
  • 九江网站建设排行榜做外贸找产品上哪个网站好
  • 网站建设gzzctyi廊坊网站排名优化公司哪家好
  • 南宁网站建设公司哪家专业网站栏目描述
  • 做教育业网站安卓应用开发环境
  • 淘宝网站怎么做有什么网站是做名片印刷的
  • 做百度网站每年的费用多少钱正规app软件开发报价
  • 简洁 手机 导航网站模板下载手机网站开发要哪些人
  • 手机网站建设案例网站建设教程pdf百度云
  • 网站建设项目规划书目录nian.so是国外还是国内网站
  • 做普通网站价格wordpress 软件价格