Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 是否可以将整个常量块标记为已弃用?_Delphi_Delphi 7 - Fatal编程技术网

Delphi 是否可以将整个常量块标记为已弃用?

Delphi 是否可以将整个常量块标记为已弃用?,delphi,delphi-7,Delphi,Delphi 7,我知道您可以使用 const NotDeprConst1 = 1; DeprConst = 2 deprecated; NotDeprConst2 = 2; 但是,您可以在不逐个标记常量的情况下将整个常量块标记为已弃用吗 我想做一些类似的事情: const deprecated DeprConst1 = 1; DeprConst2 = 2; DeprConst3 = 3; 但是,它不会编译(编译器将“弃用”视为标识符) 或者可能有一个编译器指令: {$DEPRECAT

我知道您可以使用

const
  NotDeprConst1 = 1;
  DeprConst = 2 deprecated;
  NotDeprConst2 = 2;
但是,您可以在不逐个标记常量的情况下将整个常量块标记为已弃用吗

我想做一些类似的事情:

const deprecated
  DeprConst1 = 1;
  DeprConst2 = 2;
  DeprConst3 = 3;
但是,它不会编译(编译器将“弃用”视为标识符)

或者可能有一个编译器指令:

{$DEPRECATED ON}
const
  DeprConst1 = 1;
  DeprConst2 = 2;
  DeprConst3 = 3;
{$DEPRECATED OFF}

Embarcadero的提示指令说,您可以用提示标记任何声明(如已弃用),但不需要详细说明。

这是可能的,但需要一些工作,简单地将它们全部标记为已弃用将更加容易

无论如何,这里是你可以做到的:

旧情 新形势 无论何时使用
TMyClass
TDeprecatedClass
中的一个常量,都会收到编译器警告

正如我所说,这不是一个非常快速或实用的方法,但它可以完成工作。
现在,您可以选择是否逐个标记它们:)


我希望这对您有所帮助。

正如您所发现的,const块不能一次就被弃用。也没有像您推测的那样的编译器指令。但是,您提到的

当提示指令出现在单元声明中时,表示 提示适用于单元中的所有内容。例如,Windows3.1 Windows上的style OleAuto.pas单元已被完全弃用。任何 引用该单位或该单位中的任何符号会产生 弃用消息


通过将已弃用的常量声明移动到新单元并将该单元标记为已弃用,可以一次性弃用大量声明。当然,您仍然需要修复单元引用。是否省力由您决定。

您需要单独将每个变量标记为已弃用。值得一提的是,当货币和日期/时间格式变量在RTL中被弃用时,每个变量都被单独标记

从Delphi XE RTL源:

var
  CurrencyString: string deprecated 'Use FormatSettings.CurrencyString';
  CurrencyFormat: Byte deprecated 'Use FormatSettings.CurrencyFormat';
  CurrencyDecimals: Byte deprecated 'Use FormatSettings.CurrencyDecimals';
  DateSeparator: Char deprecated 'Use FormatSettings.DateSeparator';
  TimeSeparator: Char deprecated 'Use FormatSettings.TimeSeparator';
  [...]

根据常量的布局,以及常量中实际包含的内容,可以在代码中使用一些技巧。这相当简单。突出显示整个常量块,并打开
替换文本
屏幕。对于要查找的
文本
,请输入分号
。对于
替换为
,输入
弃用(带前导空格)。然后选择“全部替换”
。它将简单地用所需的文本替换所有分号。这是假设您不打算将自定义消息与每个消息放在一起,但如果您有一条公共消息,则可以将其包含在
替换为
字段中


请注意,这在技术上并不能回答所写的问题,但它确实解决了一次否决许多常量的根本问题。

在我看来,您可以尝试一下,看看会发生什么,所花的时间比您在此处发布问题、设置格式和创建链接所花的时间要少。你为什么不呢?他可以尝试一个特定的想法,@Ken,但这并不排除实现丹尼尔没有想到的目标的其他语法。你的回答针对了这个例子,但并没有真正回答这个问题。@Ken,Daniel广泛地询问了如何反对整个区块。他提出了一个可能的解决办法。您说明了解决方案不起作用,但没有说明是否可以以任何其他方式弃用块。丹尼尔后来通过添加另一个建议的解决方案来证明这一点。我能想到更多的。我们可以集思广益地讨论语法,你可以整天为我们测试它们,但它仍然不能回答一开始是否可行的问题(除非我们碰巧猜到一个可行的方法)。@KenWhite我把这个问题理解为“是否有可能…”,但你似乎把它解释为“这段代码行得通吗…”我刚刚检查了修订历史,它包含“类似于:”从#1开始。对我来说,这意味着OP也在寻找替代品。我希望避免移动东西around@Daniel我可以理解,但除了a)单独标记,b)转移到其他单位或c)标准箱建议,似乎没有其他方法,这需要大量编辑。我们谈论的是几十个项目还是几百个项目?在一个文本文件中,大约1050个常量(通过$include)使用了110多个单位,分布在15个不同的项目中projects@Daniel这使你最初的问题与我第一次阅读时的理解完全不同。也许编辑器宏可以为你做单独的标记?@Daniel,FWIW:编辑1050个常量不需要花费很长时间。加上一点正则表达式的魔力,它应该在几分钟内完成。
type
  TDeprecatedClass = Class
  private
  public
    const
      Const1 = 1;
      Const2 = 2;
      Const3 = 3;
  end deprecated;

  TMyClass = Class
  private  
  public  
    const
      Const1 = TDeprecatedClass.Const1;
      Const2 = TDeprecatedClass.Const2;
      Const3 = TDeprecatedClass.Const3;
  end;
var
  CurrencyString: string deprecated 'Use FormatSettings.CurrencyString';
  CurrencyFormat: Byte deprecated 'Use FormatSettings.CurrencyFormat';
  CurrencyDecimals: Byte deprecated 'Use FormatSettings.CurrencyDecimals';
  DateSeparator: Char deprecated 'Use FormatSettings.DateSeparator';
  TimeSeparator: Char deprecated 'Use FormatSettings.TimeSeparator';
  [...]