了解delphi类(和记录)助手

几年前(早在Delphi 2005中)添加的Delphi语言的一个称为“类助手”的功能旨在通过向类(记录)引入新方法,向现有类(或记录)添加新功能。...

几年前(早在Delphi 2005中)添加的Delphi语言的一个称为“类助手”的功能旨在通过向类(记录)引入新方法,向现有类(或记录)添加新功能。

Computer programmers

下面你将看到更多关于类助手的想法,并了解何时使用和何时不使用类助手。

类的帮助程序。。。

简单地说,类助手是通过在助手类中引入新方法来扩展类的构造。类帮助器允许您扩展现有类,而无需实际修改或继承它。

要扩展VCL的TStrings类,您需要声明并实现一个类助手,如下所示:

type TStringsHelper = class helper for TStrings public function Contains(const aString : string) : boolean; end;

上述名为“TStringsHelper”的类是TStrings类型的类帮助器。请注意,TStrings是在Classes.pas中定义的,例如,对于任何Delphi表单的单位,默认情况下,该单位在uses子句中可用。

我们使用类帮助器添加到TStrings类型的函数是“Contains”。实施过程可能如下所示:

function TStringsHelper.Contains(const aString: string): boolean; begin result := -1 <> IndexOf(aString); end;

我敢肯定,您在代码中多次使用了上述方法,以检查某些TStrings子体(如TStringList)的Items集合中是否有字符串值。

请注意,例如,TComboBox或TListBox的Items属性属于TStrings类型。

在实现了TStringsHelper和表单上的列表框(名为“ListBox1”)之后,您现在可以使用以下命令检查某些字符串是否是列表框项属性的一部分:

if ListBox1.Items.Contains('some string') then ...

班上的帮手们走吧

类助手的实现对您的编码有一些积极的和一些(您可能会想到)消极的影响。

一般来说,您应该避免扩展自己的类—好像您需要向自己的自定义类添加一些新功能—直接在类实现中添加新内容—而不是使用类助手。

因此,当您不能(或不需要)依赖于正常的类继承和接口实现时,类帮助程序更适合于扩展类。

类帮助器不能声明实例数据,例如新的私有字段(或读/写此类字段的属性)。允许添加新的类字段。

类助手可以添加新方法(函数、过程)。

在DelphiXE3之前,您只能扩展类和记录-复杂类型。从Delphi XE 3版本中,您还可以扩展简单类型,如integer、string或TDateTime,并具有如下构造:

var s : string; begin s := 'Delphi XE3 helpers'; s := s.UpperCase.Reverse; end;

在不久的将来,我将写关于DelphiXE3Simple type helper的文章。

我的班级助手在哪里

使用类帮助器来帮助您“击倒自己”的一个限制是,您可以定义多个帮助器并将其与单个类型关联。但是,在源代码的任何特定位置中,只有零个或一个帮助程序适用。将应用最近范围中定义的帮助器。类或记录助手的作用域是以正常的Delphi方式确定的(例如,在单元的uses子句中从右向左)。

这意味着您可以在两个不同的单元中定义两个TstringHelper类帮助程序,但实际使用时只有一个适用!

如果在使用引入的方法的单元中没有定义类帮助器(大多数情况下都是这样),那么您不知道实际使用的是什么类帮助器实现。Tstring的两个类帮助器,命名不同或位于不同的单元中,对于上面示例中的“Contains”方法可能有不同的实现。

使用与否?

是的,但是要注意可能的副作用。

下面是对上述TStringsHelper类的另一个方便的扩展

TStringsHelper = class helper for TStrings private function GetTheObject(const aString: string): TObject; procedure SetTheObject(const aString: string; const Value: TObject); public property ObjectFor[const aString : string]: TObject read GetTheObject write SetTheObject; end; ... function TStringsHelper.GetTheObject(const aString: string): TObject; var idx : integer; begin result := nil; idx := IndexOf(aString); if idx > -1 then result := Objects[idx]; end; procedure TStringsHelper.SetTheObject(const aString: string; const Value: TObject); var idx : integer; begin idx := IndexOf(aString); if idx > -1 then Objects[idx] := Value; end;

如果一直在向字符串列表添加对象,则可以猜测何时使用上述handy helper属性。

  • 发表于 2021-09-15 03:55
  • 阅读 ( 172 )
  • 分类:IT

你可能感兴趣的文章

用delphi创建、解析和操作xml文档

... xml与delphi 有关将Delphi与XML配对的更多信息,请阅读: 了解如何将TTreeView组件项存储到XML(保留树节点的文本和其他属性),以及如何从XML文件填充树视图。 使用Delphi轻松读取和操作RSS提要文件探索如何使用TXMLDocument组件使...

  • 发布于 2021-09-06 15:05
  • 阅读 ( 164 )

如何将媒体文件嵌入delphi可执行文件(rc/.res)(embed media files into a delphi executable (rc/.res))

...将{$R AboutDelphi.RES}指令添加到主窗体的单元中。终于到了了解如何在Delphi应用程序中使用资源的时候了。如上所述,为了使用exe文件中存储的资源,我们必须处理API。但是,可以在Delphi帮助文件中找到启用“资源”的几种方法。 ...

  • 发布于 2021-09-06 15:08
  • 阅读 ( 190 )

将项目添加到tpopup delphi菜单

在Delphi应用程序中使用菜单或弹出菜单时,在大多数情况下,都是在设计时创建菜单项的。每个菜单项都由一个TMenuItem Delphi类表示。当用户选择(单击)一个项目时,OnClick事件将被触发,以供您(作为开发人员)获取该事件并...

  • 发布于 2021-09-06 15:10
  • 阅读 ( 164 )

使用delphi的键入文件文件创建数据库

简单地说,文件是某种类型的二进制序列。在Delphi中,有三类文件:类型化、文本和非类型化。类型化文件是包含特定类型数据的文件,例如双精度、整数或以前定义的自定义记录类型。文本文件包含可读的ASCII字符。当我们想...

  • 发布于 2021-09-06 15:11
  • 阅读 ( 170 )

了解delphi编程的基础知识

...发的概述。然后,通过创建第二个简单的Delphi应用程序来了解属性、事件和Delphi Pascal—使您能够学习如何在窗体上放置组件、设置它们的属性以及编写事件处理程序以使组件协作。 德尔菲帕斯卡 在开始使用Delphi的RAD功能开...

  • 发布于 2021-09-06 15:13
  • 阅读 ( 181 )

delphi中的sql

...形式,允许您选择、插入、更新、查找数据位置等。 delphi中的tquery 如果要在应用程序中使用SQL,您将非常熟悉TQuery组件。Delphi使您的应用程序能够通过TQuery组件直接使用SQL语法来访问Paradox和dBase表(使用本地SQL—ANSI标准SQL...

  • 发布于 2021-09-08 10:40
  • 阅读 ( 183 )

如何自定义dbnavigator(customize the dbnavigator)

... 此查询来自一位正在寻找增强DBNavigator组件功能的方法的Delphi开发人员。 DBNavigator是一个很好的组件,它提供了一个类似VCR的界面,用于在数据库应用程序中导航数据和管理记录。记录导航由第一个、下一个、上一个和最后一...

  • 发布于 2021-09-10 22:21
  • 阅读 ( 215 )

如何delphidbgrid中的multiselect(multiselect in the delphi dbgrid)

Delphi的DBGrid是数据库相关应用程序中使用最广泛的DB感知组件之一。它的主要目的是使应用程序的用户能够在表格网格中操作数据集中的记录。 DBGrid组件的一个鲜为人知的特性是,可以将其设置为允许多行选择。这意味着用...

  • 发布于 2021-09-10 22:29
  • 阅读 ( 187 )

如何delphidbgrid中的记录排序(sort records in delphi dbgrid)

...知应用程序,那么您可能每天都在使用它。下面,我们将了解如何向您的数据库应用程序中添加更多用户肯定会喜欢的功能。 按照《Delphi数据库编程初学者指南》中描述的概念,下面的示例使用ADO组件(AdoQuery/AdoTable连接到ADO...

  • 发布于 2021-09-10 22:31
  • 阅读 ( 231 )

在delphi应用程序中使用tclientdataset的指南

...。 德尔菲数据集 每个数据库应用程序中的ClientDataSet了解ClientDataSet的基本行为,并遇到在大多数数据库应用程序中广泛使用ClientDataSet的争论。 使用FieldDefs定义ClientDataSet的结构在动态创建ClientDataSet的内存存储时,必须显式...

  • 发布于 2021-09-15 03:38
  • 阅读 ( 151 )
lge38006
lge38006

0 篇文章

相关推荐