【问题标题】:How to create an enum with explicit values in Delphi 5如何在 Delphi 5 中创建具有显式值的枚举
【发布时间】:2021-08-09 12:25:54
【问题描述】:

目前我正在将高版本的 Delphi (XE) 项目重新编译为低版本 5。

我有多个具有如下明确值的枚举:

type 
  TSize = (ftSmallSize=10, ftMediumSize=15, ftLargeSize=20, ftExtralarge=24)

当我编译这段代码时,出现错误消息:

',' 或 ')' 预期但 '=' 找到

如何在 Delphi 5 中重新编译这段代码?

【问题讨论】:

  • 我在Delphi 4中试过这个,确实被认为是语法错误。一种解决方法是:type TSize = Byte; const ftSmallSize = 10; ftMediumSize = 15; ftExtraLarge = 24;

标签: delphi enums


【解决方案1】:

是的,在 Delphi 6 中的枚举 was added 中指定固定(序数)值的选项。

可能最简单的解决方法是这样做

type
  TSize = Byte;

const
  ftSmallSize = 10;
  ftMediumSize = 15;
  ftExtraLarge = 24;

显然,您会失去一些类型安全性,但它会(很可能)在没有任何进一步更改的情况下编译。

在定义TSize 时,请确保选择正确大小的整数类型。您应该将其设置为与原始代码中的SizeOf(TSize) 相同。

【讨论】:

  • 琐事:我什至从未尝试用固定值声明枚举类型,而是立即在 D7 中声明常量。很高兴知道我可以。
  • 在 Delphi 6 中添加了可以将特定值添加到枚举器的此功能是我正在搜索的确切信息,很难用谷歌搜索,但 ',' or ')' expected but '=' found [delphi] 确实做到了。
【解决方案2】:

您可以将值与枚举类型解耦:

type
  TSize = (ftSmallSize, ftMediumSize, ftLargeSize, ftExtralarge);
const
  cSizeValues: array[TSize] of Integer = (10, 15, 20, 24);

或者用case ASize of 定义一个函数GetSizeValue(ASize: TSize) - 这样会更灵活。

这样使用:

 Edit1.Height := cSizeValues[ftMediumSize];

 Edit1.Height := GetSizeValue(ftMediumSize);

【讨论】:

  • 一般来说,您还需要一个对逆变换执行简单线性搜索的函数。 (当然,使用这个解决方案你仍然有完整的类型安全,但是很多代码可能需要微小的调整:ftMediumSize -> cSizeValues[ftMediumSize]。)
  • @AndreasRejbrand:你是对的,对于现有代码降级它可能不值得麻烦。对于新类型,我更喜欢它而不是具有显式值和常量的枚举类型。
  • 如果访问是一种通用的标准调用,那么可以考虑覆盖操作符。 [docwiki.embarcadero.com/RADStudio/XE/en/Operator_Overloading]
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 2013-11-21
  • 2021-04-11
  • 2019-05-26
  • 2011-09-22
相关资源
最近更新 更多