当前位置:  开发笔记 > 编程语言 > 正文

在Delphi中将TDateTime声明为Const

如何解决《在Delphi中将TDateTime声明为Const》经验,为你挑选了5个好方法。

据我所知,没有办法做到这一点,但我会问,以防其他人知道如何做到这一点.如何在Delphi中将日期声明为const?

我发现的唯一解决方案是使用数字等价物,这是一种难以维护,因为它不是人类可读的.

const
  Expire : TDateTime = 39895; // Is actually 3/23/2009

我希望能做的是这样的:

const
  Expire : TDateTime = TDateTime ('3/23/2009');

要么

const
  Expire : TDateTime = StrToDate('3/23/2009');

所以让我知道这是一个功能请求,还是我错过了如何做到这一点(是的,我知道这似乎是一件奇怪的事情......)



1> Wouter van N..:

好吧,我的反应有点晚了,但这是新款Delphi的解决方案.

它使用隐式类重载程序,以便可以使用此类型的记录,就好像它们是TDateTime变量一样.

  TDateRec = record
    year,month,day,hour,minute,second,millisecond:word;
    class operator implicit(aDateRec:TDateRec):TDateTime;
    class operator implicit(aDateTime:TDateTime):TDateRec; // not needed
    class operator implicit(aDateRec:TDateRec):String; // not needed
    class operator implicit(aDateRec:String):TDateRec; // not needed
  end;

执行:

uses DateUtils;

class operator TDateRec.Implicit(aDateRec:TDateRec):TDateTime;
begin
  with aDateRec do // Yeah that's right you wankers. I like "with" :)
    Result := encodeDateTime(Year,Month,Day,Hour,Minute,Second,Millisecond);
end;

class operator TDateRec.Implicit(aDateTime:TDateTime):TDateRec;
begin
  with Result do
    DecodeDateTime(aDateTime,Year,Month,Day,Hour,Minute,Second,Millisecond);
end;

class operator TDateRec.Implicit(aDateRec:TDateRec):String;
begin
  Result := DateTimeToStr(aDateRec)
end;

class operator TDateRec.Implicit(aDateRec:String):TDateRec;
begin
  Result := StrToDateTime(aDateRec)
end;

现在您可以声明这样的日期:

const
  Date1:TDateRec=(Year:2009;month:05;day:11);
  Date2:TDateRec=(Year:2009;month:05;day:11;hour:05);
  Date3:TDateRec=(Year:2009;month:05;day:11;hour:05;minute:00);

要查看它是否有效,请执行以下操作:

ShowMessage(Date1); // it can act like a string
ShowMessage(DateToStr(Date1)); // it can act like a date

如果你真的想用这个替换所有的TdateTime变量,你可能还需要重载其他一些运算符(加,减,显式,......).



2> The_Fox..:

唯一的?可能的方式,但可能不是你想要的:

const
{$J+}
  Expire: TDateTime = 0;
{$J-}

initialization
  Expire := EncodeDate(2009, 3, 23);


也可以将它声明为var而不是const.

3> Disillusione..:

我倾向于使用函数模拟const日期.从技术上讲,它们比"伪常量"可分配类型const更加稳定.

function Expire: TDateTime;
begin
  Result := EncodeDate(2009, 3, 23);
end;

注意使用EncodeDate而不是StrToDate.StrToDate受区域设置的影响意味着无法保证字符串将被解释为预期的.

例如,您是否知道有一群人认为将日期部分"混乱"为不一致的重要性顺序是有意义的?他们使用中间,然后最少,然后最重要的部分(例如'3/23/2009')<厚颜无耻的笑脸>.逻辑有意义的唯一时间是当你年满102岁 - 然后你可以宣称你的年龄是021.

对于那里的过早优化器,如果频繁调用函数使得编码日期所需的纳秒时间成为一个问题 - 那么在可读,可维护的代码名称中,这个问题要比这个次要的低效率大得多.



4> François..:

没有办法这样做,因为解释日期本身不是确定性的,它取决于您遵循的约定/语言环境.
例如,对于任何法国人来说,'1/4/2009'不是在1月份,并且将编译器翻译为1月4日将使其成为傻瓜的编译器;-)
除非编译器实现了一些(记录良好的)"魔术"双射函数配对日期值和显示表示......无论如何,地球的一半不喜欢它.
我现在看到的唯一不模糊的方式就是提供价值,即使它看起来很痛苦......我的0.02美元


如果语言被定义为对语言环境敏感,则它仅取决于语言环境.浮点文字对区域设置不敏感; 他们根本不接受逗号作为小数分隔符.没有理由日期时间文字对格式没有类似的限制.

5> Rob Kennedy..:

不,德尔福不支持这一点.

您的第一个想法是请求日期时间文字与普通浮点文字不同.我找到了QC 72000,它关于TDateTime在调试器中显示值作为日期,但没有关于您的特定请求.不过,这并不像以前没有人提过的那样.这是新闻组的一个长期主题; 我在QC中找不到任何关于它的信息.

你的第二个想法需要StrToDate在编译时进行评估.我没有在QC中看到任何有关它的条目,但是对于它的价值,C++正在为显示具有必要品质的功能获得这样的功能.StrToDate但是,它不符合这些要求,因为它对当前语言环境的日期设置很敏感.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有