是否可以将空(零)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
的变体。
对Ken White的澄清:这里的问题主要是类型扣除和重载解析;上述'功能采取变体'只是一个特例。文字0
和0.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
的其他类型),其方式与Integer
和TSomeId
相同。上例中的class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello!!!");
}
}
,没有为此目的分配和初始化类型化的内存位置。但是,Yuriy的回答表明这只适用于序数类型。
答案 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' 这会将日期设置为空白。