立即使用:万年历的 Tdatetime
我正在尝试为 Tdatetime
编写一个函数(但是当我打开程序时,他必须显示现在的数据)
下面我有一个 TDatetime
函数,但我有一个错误那:
(((''DecodeDateTime(data, rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda);''))))
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, Buttons;
type
TForm1 = class(TForm)
edRok: TSpinEdit;
edMiesiac: TSpinEdit;
edDzien: TSpinEdit;
lbRok: TLabel;
lbMiesiac: TLabel;
lbDzien: TLabel;
lbDT: TLabel;
btnZamknij: TBitBtn;
procedure edRokChange(Sender: TObject);
procedure edDzienChange(Sender: TObject);
procedure DecodeDate(Date: TDateTime);
function DT(Dzien, Miesiac: Byte; Rok: Integer): Byte;
function GetDzienText(Dt: Byte): String;
function Now: TDateTime;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.edRokChange(Sender: TObject);
begin
case edMiesiac.Value of
1,3,5,7,8,10,12: edDzien.MaxValue:=31;
4,6,9,11: edDzien.MaxValue:=30;
else
if edRok.Value mod 4=0 then edDzien.MaxValue:=29
else edDzien.MaxValue:=28;
end;{case}
if edDzien.Value>edDzien.MaxValue then
edDzien.Value:=edDzien.MaxValue;
edDzienChange(Sender);
end;
procedure TForm1.edDzienChange(Sender: TObject);
begin
lbDt.Caption:='Dzień tygodnia: '+GetDzienText(DT(eddzien.value, edmiesiac.value, edrok.value));
end;
procedure TForm1.DecodeDate(Date: TDateTime);
var
Now, Rok, Miesiac, Dzien: Word;
begin
DecodeDate(Now);
DecodeDate(Rok);
DecodeDate(Miesiac);
DecodeDate(Dzien);
edRok.Value:=Rok;
edMiesiac.Value:=Miesiac;
edDzien.Value:=Dzien;
end;
function TForm1.DT(Dzien, Miesiac: Byte; Rok: Integer): Byte;
var m,r,w: Byte; {deklaracja zmiennych}
begin
if Miesiac>2 then m:=miesiac-2
else
begin
m:=miesiac+10;
rok:=rok-1;
end;
r:=rok mod 100;
w:=rok div 100;
Result:=((13*m-1) div 5+dzien+r div 4+w div 4+r+5*w) mod 7;
end;
function TForm1.GetDzienText(Dt: Byte): String;
const Dni: array[0..6] of String=
('Niedziela','Poniedziałek','Wtorek','Środa',
'Czwartek','Piątek','Sobota');
begin
Result:=Dni[dt];
end;
function TForm1.Now: TDateTime;
var
dzien, miesiac, rok: Word;
godzina, minuta, sekunda, milisekunda: Word;
data: TDateTime;
begin
data := Now;
DecodeDateTime(data, rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda);
MessageBox(0,PAnsiChar(Format('Data: %d/%d/%d %d:%d:%d:%d',[rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda])), 'Data', MB_ICONINFORMATION);
end;
end.
I am trying to write a function for Tdatetime
(but when I open my program, he must show now data)
Below i have a function for TDatetime
but I have an error in that:
((((''DecodeDateTime(data, rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda);''))))
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, Buttons;
type
TForm1 = class(TForm)
edRok: TSpinEdit;
edMiesiac: TSpinEdit;
edDzien: TSpinEdit;
lbRok: TLabel;
lbMiesiac: TLabel;
lbDzien: TLabel;
lbDT: TLabel;
btnZamknij: TBitBtn;
procedure edRokChange(Sender: TObject);
procedure edDzienChange(Sender: TObject);
procedure DecodeDate(Date: TDateTime);
function DT(Dzien, Miesiac: Byte; Rok: Integer): Byte;
function GetDzienText(Dt: Byte): String;
function Now: TDateTime;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.edRokChange(Sender: TObject);
begin
case edMiesiac.Value of
1,3,5,7,8,10,12: edDzien.MaxValue:=31;
4,6,9,11: edDzien.MaxValue:=30;
else
if edRok.Value mod 4=0 then edDzien.MaxValue:=29
else edDzien.MaxValue:=28;
end;{case}
if edDzien.Value>edDzien.MaxValue then
edDzien.Value:=edDzien.MaxValue;
edDzienChange(Sender);
end;
procedure TForm1.edDzienChange(Sender: TObject);
begin
lbDt.Caption:='Dzień tygodnia: '+GetDzienText(DT(eddzien.value, edmiesiac.value, edrok.value));
end;
procedure TForm1.DecodeDate(Date: TDateTime);
var
Now, Rok, Miesiac, Dzien: Word;
begin
DecodeDate(Now);
DecodeDate(Rok);
DecodeDate(Miesiac);
DecodeDate(Dzien);
edRok.Value:=Rok;
edMiesiac.Value:=Miesiac;
edDzien.Value:=Dzien;
end;
function TForm1.DT(Dzien, Miesiac: Byte; Rok: Integer): Byte;
var m,r,w: Byte; {deklaracja zmiennych}
begin
if Miesiac>2 then m:=miesiac-2
else
begin
m:=miesiac+10;
rok:=rok-1;
end;
r:=rok mod 100;
w:=rok div 100;
Result:=((13*m-1) div 5+dzien+r div 4+w div 4+r+5*w) mod 7;
end;
function TForm1.GetDzienText(Dt: Byte): String;
const Dni: array[0..6] of String=
('Niedziela','Poniedziałek','Wtorek','Środa',
'Czwartek','Piątek','Sobota');
begin
Result:=Dni[dt];
end;
function TForm1.Now: TDateTime;
var
dzien, miesiac, rok: Word;
godzina, minuta, sekunda, milisekunda: Word;
data: TDateTime;
begin
data := Now;
DecodeDateTime(data, rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda);
MessageBox(0,PAnsiChar(Format('Data: %d/%d/%d %d:%d:%d:%d',[rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda])), 'Data', MB_ICONINFORMATION);
end;
end.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
更改
为
您正在递归调用。
Change
to
You are calling Now recursively.
您似乎有无限递归在一起,这将导致堆栈溢出(您在这里问这个问题是多么合适)。
您可以改为编写:
我必须完全限定 Now 和 DecodeDate,因为您在代码中使用相同的名称。你不应该真的这样做,应该选择不冲突的名称
我不太明白你的目标,并且这段代码中显然还存在许多其他问题。
按照另一个答案的评论轨迹我运行了以下程序:
while 导致了此输出:
如果您致电 < code>Now和
DecodeDate
结果确实是2002年,那么我只能断定你电脑上的时间是错误的!You appear to have an infinite recursion together which will lead to a stack overflow (how fitting that you ask this question here).
You could instead write:
I've had to fully qualify Now and DecodeDate because you use the same names in your code. You shouldn't really do that and should choose non-clashing names
I don't really understand your aims and there are clearly many other problems in this code.
Follow the comment trail of another answer I ran the following program:
while resulted in this output:
If your call to
Now
andDecodeDate
really results in the year 2002, then I can only conclude that the time on your computer is wrong!