Delphi:如何表达一个空的TDateTime?

时间:2015-11-25 22:13:30

标签: delphi-7 delphi

是否可以将空(零)TDateTime值表示为常量?我尝试了TDateTime(0)TDateTime(0.0)等等,但编译器(Delphi 7)并没有给人留下深刻的印象。

目前我正在使用初始化的全局变量:

const
   TDateTime_0: TDateTime = 0.0;

这种作品。但是,我刚刚继承了一大堆Delphi 7代码,并且我还没有使用Turbo Pascal ...这意味着我真的需要刷新我的Delphi fu,这让我想知道。

相比之下,编译器对Integer(0)之类的东西非常满意。它对变量的赋值导致类型为ftInteger的值为0,而赋值为纯文字0将导致类型为ftSmallInt的变体。

澄清:目标是通过一个空的'特定类型的值对于采用变量的函数(包括编译器管理的变量数组,称为' const'以及TParameter.Value之类的setter)。

对Ken White的澄清:这里的问题主要是类型扣除和重载解析;上述'功能采取变体'只是一个特例。文字00.0可隐式转换为TDateTime,这就是为什么可以将它们分配给该类型的容器(变量,记录字段),并且它们可用于初始化此类容器(即函数参数)没有进一步的麻烦。但是,当编译器需要进行类型推导时,事情会发生变化:

procedure foo (value: Double); overload; 
procedure foo (value: TDateTime); overload;

在这两种情况下,底层类型都是Double,这意味着编译器需要显式地键入参数(即,使用普通文字的调用被拒绝为不明确的)。对于基于序数的类型,显式类型没有问题,但类型Double是有问题的,并且需要在可以使用之前将值填充到类型的容器中。可编译的例子(要求Delphi比Delphi 7更新):

type
   TSomeId = type Integer;

procedure foo (value: Integer  ); overload;  begin  WriteLn('Integer   ', value);  end;
procedure foo (value: TSomeId  ); overload;  begin  WriteLn('TSomeId   ', value);  end;
procedure foo (value: Double   ); overload;  begin  WriteLn('Double    ', value);  end;
procedure foo (value: TDateTime); overload;  begin  WriteLn('TDateTime ', value);  end;

procedure test_TYPE_Double;
var
   d: Double;
   t: TDateTime;
begin
   foo(Integer(0));
   foo(TSomeId(0));
   d := 0;  foo(d);
   t := 0;  foo(t);
end;

我的问题是/是否可以形成TDateTime类型的表达式(或基于Double的其他类型),其方式与IntegerTSomeId相同。上例中的class Program { static void Main(string[] args) { Console.WriteLine("Hello!!!"); } } ,没有为此目的分配和初始化类型化的内存位置。但是,Yuriy的回答表明这只适用于序数类型。

2 个答案:

答案 0 :(得分:3)

编译器可以将序数类型转换为其他序数类型,但拒绝将浮点类型相互转换,即使它们完全相同:

TMyOwnDouble = type double;
...
var a,b: TMyOwnDouble;
...
a:=MyOwnDouble(0.0); //invalid typecast
b:=0.0;  //no problem

你到底想要什么?如果需要这个TDateTime常量只是为了将它传递给需要TDateTime的某个函数,那么你可以传递0.0并且它将起作用:

caption:=DateTimeToStr(0.0); //it shows 30.12.1899

有两个功能可以派上用场:

function FloatToDateTime(const Value: Extended): TDateTime; //sysUtils unit

它检查Value的边界,如果可以,则进行单一分配。

function VarFromDateTime(DateTime: TDateTime): Variant;  //Variants unit

这个显式创建DateTime变体。 我在这样的代码中尝试了它们,它们的工作原理相同:

var V: Variant;
...
V:=VarFromDateTime(0.0);
//V:=FloatToDateTime(0.0);  //works as well
Caption:=V;  //shows 0:00:00
像这样的代码可能比使用TDateTime_0常量更容易理解,但它更笨重。

答案 1 :(得分:-5)

将日期设置为' gg' 这会将日期设置为空白。