用于集合(和其他简单类型)的delphi记录帮助程序

了解Delphi类(和记录)帮助程序引入了Delphi语言的一项功能,允许您通过向现有类和记录添加函数和过程(方法)来扩展类或记录类型的定义,而无需继承。...

了解Delphi类(和记录)帮助程序引入了Delphi语言的一项功能,允许您通过向现有类和记录添加函数和过程(方法)来扩展类或记录类型的定义,而无需继承。

在XE3Delphi版本中,通过允许扩展简单的Delphi类型(如字符串、整数、枚举、集合等),记录帮助程序变得更加强大。

来自Delphi XE3的System.SysUtils单元实现了一个名为“TStringHelper”的记录,它实际上是字符串的记录助手。

使用Delphi XE3,您可以编译并使用以下代码:

var s : string; begin s := 'Delphi XE3'; s.Replace('XE3', 'rules', []).ToUpper; end;

为了实现这一点,在Delphi中创建了一个新的构造“record helper For[simple type]”。对于字符串,这是“typetstringhelper=recordhelperforstring”。该名称表示“record helper”,但这并不是关于扩展记录,而是关于扩展字符串、整数等简单类型。

在System和System.SysUtils中,还有其他用于简单类型的预定义记录帮助程序,包括:TingleHelper、TDoubleHelper、TExtendedHelper、TGuidHelper(以及其他一些)。您可以从名称中获得帮助器扩展的简单类型。

还有一些方便的开源助手,比如TDateTimeHelper。

列举?枚举的助手?

enumerations sets

现在(在XE3和更高版本中)被视为简单类型的枚举和集合也可以通过记录类型可以具有的功能进行扩展:函数、过程等。

下面是一个简单的枚举(“TDay”)和一个记录助手:

type TDay = (Monday = 0, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); TDayHelper = record helper for TDay function AsByte : byte; function ToString : string; end; function TDayHelper.AsByte: byte; begin result := Byte(self); end; function TDayHelper.ToString: string; begin case self of Monday: result := 'Monday'; Tuesday: result := 'Tuesday'; Wednesday: result := 'Wednesday'; Thursday: result := 'Thursday'; Friday: result := 'Friday'; Saturday: result := 'Saturday'; Sunday: result := 'Sunday'; end; end; var aDay : TDay; s : string; begin aDay := TDay.Monday; s := aDay.ToString.ToLower; end; convert a Delphi Enum to a String Representation

布景?集合的助手?

TDays = set of TDay; var days : TDays; s : string; begin days := [Monday .. Wednesday]; days := days + [Sunday]; end;

但是,能够做到以下几点有多好:

var days : TDays; b : boolean; begin days := [Monday, Tuesday] b := days.Intersect([Monday, Thursday]).IsEmpty; type TDaysHelper = record helper for TDays function Intersect(const days : TDays) : TDays; function IsEmpty : boolean; end; ... function TDaysHelper.Intersect(const days: TDays): TDays; begin result := self * days; end; function TDaysHelper.IsEmpty: boolean; begin result := self = []; end;

对于围绕枚举构造的每个集合类型,您都需要一个单独的帮助器,因为遗憾的是,枚举和集合不符合泛型和泛型类型。

这意味着无法编译以下内容:

//NO COMPILE OF ALIKE! TGenericSet = set of <T : [?Enumeration?]>; TEnum Simple generics Enum example

记录字节集的帮助程序!

type TByteSet = set of Byte; TByteSetHelper = record helper for TByteSet

在TByteSetHelper的定义中可以有以下内容:

public procedure Clear; procedure Include(const value : Byte); overload; inline; procedure Include(const values : TByteSet); overload; inline; procedure Exclude(const value : Byte); overload; inline; procedure Exclude(const values : TByteSet); overload; inline; function Intersect(const values : TByteSet) : TByteSet; inline; function IsEmpty : boolean; inline; function Includes(const value : Byte) : boolean; overload; inline; function Includes(const values : TByteSet) : boolean; overload; inline; function IsSuperSet(const values : TByteSet) : boolean; inline; function IsSubSet(const values : TByteSet) : boolean; inline; function Equals(const values : TByteSet) : boolean; inline; function ToString : string; inline; end; { TByteSetHelper } procedure TByteSetHelper.Include(const value: Byte); begin System.Include(self, value); end; procedure TByteSetHelper.Exclude(const value: Byte); begin System.Exclude(self, value); end; procedure TByteSetHelper.Clear; begin self := []; end; function TByteSetHelper.Equals(const values: TByteSet): boolean; begin result := self = values; end; procedure TByteSetHelper.Exclude(const values: TByteSet); begin self := self - values; end; procedure TByteSetHelper.Include(const values: TByteSet); begin self := self + values; end; function TByteSetHelper.Includes(const values: TByteSet): boolean; begin result := IsSuperSet(values); end; function TByteSetHelper.Intersect(const values: TByteSet) : TByteSet; begin result := self * values; end; function TByteSetHelper.Includes(const value: Byte): boolean; begin result := value in self; end; function TByteSetHelper.IsEmpty: boolean; begin result := self = []; end; function TByteSetHelper.IsSubSet(const values: TByteSet): boolean; begin result := self <= values; end; function TByteSetHelper.IsSuperSet(const values: TByteSet): boolean; begin result := self >= values; end; function TByteSetHelper.ToString: string; var b : Byte; begin for b in self do result := result + IntToStr(b) + ', '; result := Copy(result, 1, -2 + Length(result)); end; var daysAsByteSet : TByteSet; begin daysAsByteSet.Clear; daysAsByteSet.Include(Monday.AsByte); daysAsByteSet.Include(Integer(Saturday); daysAsByteSet.Include(Byte(TDay.Tuesday)); daysAsByteSet.Include(Integer(TDay.Wednesday)); daysAsByteSet.Include(Integer(TDay.Wednesday)); //2nd time - no sense daysAsByteSet.Exclude(TDay.Tuesday.AsByte); ShowMessage(daysAsByteSet.ToString); ShowMessage(BoolToStr(daysAsByteSet.IsSuperSet([Monday.AsByte,Saturday.AsByte]), true)); end;

有一个问题,但是:(

请注意,TByteSet接受字节值,并且这里将接受任何此类值。上面实现的TByteSetHelper不是严格的枚举类型(即,您可以为其提供非TDay值)。。。但只要我知道。。它确实对我有用。

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

你可能感兴趣的文章

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

... 资源脚本文件只是一个简单的文本文件,扩展名为.rc,用于列出资源。脚本文件的格式如下: ResName1 ResTYPE1 ResFileName1 ResName2 ResTYPE2 ResFileName2 ... ResNameX ResTYPEX ResFileNameX ... RexName指定标识资源的唯一名称或整数值(ID)。ResTy...

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

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

...将当前文件位置移动到指定的组件。FilePos和FileSize函数可用于确定当前文件位置和当前文件大小。 {go back to the beginning - the first record} Seek(F, 0) ; {go to the 5-th record} Seek(F, 5) ; {Jump to the end - "after" the last record} Seek(F, F...

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

了解delphi编程的基础知识

...检索信息。Delphi为我们提供了一系列丰富的可视化工具,用于创建表单并确定其属性和行为。我们可以在设计时使用属性编辑器设置它们,并且可以编写代码在运行时动态地重新设置它们。查看简单SDI窗体,并考虑一些不允许您...

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

理解delphi项目和单元源文件

...phi项目只是组成由Delphi创建的应用程序的文件集合。DPR是用于Delphi项目文件格式的文件扩展名,用于存储与项目相关的所有文件。这包括其他Delphi文件类型,如表单文件(DFM)和单元源文件(.PASs)。 由于Delphi应用程序共享代...

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

delphi中的sql

SQL(结构化查询语言)是一种标准化的语言,用于定义和操作关系数据库中的数据。根据数据的关系模型,数据库被视为一组表,关系由表中的值表示,通过指定可从一个或多个基表派生的结果表来检索数据。查询采用命令语...

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

德尔福单元剖析(德尔福初学者版)

...元都无法访问这些声明。这里声明的任何Delphi对象都只能用于单元内的代码(全局到单元)。可选uses子句可以出现在实现部分中,并且必须紧跟在实现关键字之后。 初始化和定稿部分 这两个部分是可选的;创建单元时,不...

  • 发布于 2021-09-10 20:53
  • 阅读 ( 187 )

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

...地扩展了这个想法。 首先,我们想以某种方式标记当前用于排序顺序的列。接下来,如果我们单击一个列标题,并且数据集已经按照该列进行了排序,那么我们希望将排序顺序从ASC(升序)更改为DESC(降序),反之亦然。最...

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

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

...内存中独立于数据库的数据集。无论您是将客户机数据集用于基于文件的数据、缓存更新、来自外部提供者的数据(例如使用XML文档或在多层应用程序中),还是在“公文包模型”应用程序中使用这些方法的组合,都要利用客户...

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

优化delphi程序的内存使用

...phi将把表单插入到项目单元(DPR文件)中,并包含一行,用于在应用程序启动时创建所有表单(application.CreateForm(…) 项目单元中包含的行是由Delphi设计的,对于不熟悉Delphi或刚刚开始使用Delphi的人来说非常有用。这既方便又...

  • 发布于 2021-09-15 03:43
  • 阅读 ( 205 )

理解delphi中的内存分配

... 堆栈与堆 在Windows上运行应用程序时,内存中有三个区域用于存储数据:全局内存、堆和堆栈。 全局变量(其值/数据)存储在全局内存中。全局变量的内存在程序启动时由应用程序保留,并在程序终止前保持分配状态。全局...

  • 发布于 2021-09-15 03:47
  • 阅读 ( 198 )
wnyc54197
wnyc54197

0 篇文章

相关推荐