“类的定义及数据和方法的引用”问题(50分)

H

hualng

Unregistered / Unconfirmed
GUEST, unregistred user!
我编写了一个单元文件:
unit TDateUnit;

interface
uses sysutils;
type
TDate=class
private
fDate:TDateTime;
procedure SetYear(const y:word);
procedure SetMonth(const m:word);
procedure SetDay(const d:word);
function GetYear:word;
function GetMonth:word;
function GetDay:word;
function GetText:string;
public
constructor Create;overload;
constructor Create(y,m,d:integer);overload;
procedure SetDate(y,m,d:integer);overload;
procedure SetDate(aDate:TDateTime);overload;
function Leapyear:boolean;
function DaysAfter(y,m,d:integer):TDateTime;
property Year:word read GetYear write SetYear;
property Month:word read Getmonth write Setmonth;
property Day:word read GetDay write SetDay;
property Text:string read GetText;
end;

implementation
procedure TDate.SetYear(const y:word);
begin

fDate:=EncodeDate(y,Month,Day);
end;

procedure TDate.SetMonth(const m:word);
begin

if (m<=12) then

fDate:=EncodeDate(Year,m,Day)
//else
showmessage ('月份超出范围,请重新输入!');为什么这句不能用?
end;

procedure TDate.SetDay(const d:word);
begin

fDate:=EncodeDate(Year,Month,d);
end;

function TDate.GetYear:word;
begin

GetYear:=Year;
end;

function TDate.GetDay:word;
begin

GetDay:=Day;
end;

function TDate.GetMonth:word;
var y,m,d:word;
begin

DecodeDate(fDate,y,m,d);
result:=m;
end;

function TDate.GetText:string;
begin

GetText:=FormatDateTime('dddddd',fDate);
end;

function TDate.DaysAfter(y,m,d:integer):TDateTime;
var newmon:integer;
begin

year:=year+y+(month+m-1) div 12;
if m>=0
then
month:=(month+m-1) mod 12+1
else
begin

newmon:=(month+m-1) mod 12+1;
while newmon<=0 do

begin

newmon:=(newmon+12-1) mod 12+1;
year:=year-1;
end;

month:=newmon;
end;

fDate:=fDate+d;
result:=fDate;
end;

constructor TDate.Create;
begin

fDate:=Date;
end;

constructor TDate.Create(y,m,d:integer);
begin

fDate:=EncodeDate(y,m,d);
end;

procedure TDate.SetDate(y,m,d:integer);
begin

Year:=y;
Month:=m;
Day:=d;
fDate:=EncodeDate(y,m,d);
end;

procedure TDate.SetDate(aDate:TDateTime);
begin

fDate:=aDate;
end;

function TDate.Leapyear:boolean;
begin

leapyear:=(year mod 400=0) or not (year mod 100=0) and (year mod 4=0);
end;

end.

程序执行时做如下调用:
MonthCalendar1.Date:=aDay.DaysAfter(y,m,d);
可是程序提示“堆栈移出”,怎么办?
 
TDate命名好像有冲突吧,
因为delphi里已经有这个类型了
建议换个名字试试
 
我是按照“电子工业出版社”的《Delphi程序实用教程》编写的。这是个例题,
从前面的源码一直累加到这一步。TDate命名没有问题。程序是每次执行时好像
陷入了一个到循环中,最后在
function TDate.GetYear:word;
begin

GetYear:=Year;
end;

出错!
 
1.你的showmessage('月份超出范围,请重新输入!');不能用,是因为你要
use dialogs.pas
 
2.有些书的源码照样有错,不可全信。
function TDate.DaysAfter(y,m,d:integer):TDateTime;
你这个函数的代码逻辑很不清晰,说明一下,要完成什么功能;
建议:
在类中不要直接使用诸如year,month ,day 这样的属性值,而要定义private直
Fyear,FMonth,Fday;
GetYear函数就应该是:
Result:=Fyear;
这样所有用到year的地方可以用Fyear代替。
当然,不这样做也可以。
 
谢谢!我换了命名后,问题解决了,给分了。
 
顶部