简单简单,大家帮忙安一下,可我却没法将它安上,:((100分)

  • 主题发起人 主题发起人 野芒
  • 开始时间 开始时间

野芒

Unregistered / Unconfirmed
GUEST, unregistred user!
本人在学习设计一个组件时遇到了一点麻烦,虽几经周折也不行,
组件单元是可以被装入组件包的,在pakage edit中编译是可以的,
只是不会在component palate上出现该组件,用组件向导搞出一个
新组件是没有问题的,虽反复对比两个单元的代码(结构部份)找不
出问题所在。

现给出原代码,希望大家不要介意,只看重要部份好了。大家可以
自己把它拿过去安装一下,看看怎么搞的。



unit datepas;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type

tdate=class(tcomponent)
private
fyear,fday,fmonth:integer;
fonchange:tnotifyevent;
public
procedure increase;
procedure add(numberofdays:integer);
function gettext:string;
procedure setvalue(m,d,y:integer);
function leapyear:boolean;
constructor create(aowner:tcomponent);override;
protected
procedure setyear(value:integer);
procedure setmonth(value:integer);
procedure setday(value:integer);
function daysinmonth:integer;
procedure dochange;virtual;
published
property year:integer read fyear write setyear;
property day:integer read fday write setday;
property month:integer read fmonth write setmonth;
property text:string read gettext;
property onchange:tnotifyevent read fonchange write fonchange;
end;

procedure register;

implementation

procedure register ;
begin
registercomponents('md3',[tdate]);
end;

constructor tdate.create(aowner:tcomponent);
var y,m,d:word;
begin
inherited create(aowner);
decodedate(now,y,m,d);
setyear(y);
setmonth(m);
setday(d);
end;

procedure tdate.dochange;
begin
if assigned(fonchange) then
fonchange(self);
end;

procedure tdate.setyear(value:integer);
begin
fyear:=value;
dochange;
end;
procedure tdate.setmonth(value:integer);

begin
if (value>=1)and (value<=12) then
begin
fmonth:=value;
dochange;
end
else
showmessage('月份超出范围');
end;
procedure tdate.setday(value:integer);
begin
if (value>=1) and (value<=daysinmonth) then
begin
fday:=value;
dochange;
end
else
showmessage('天超过范围');
end;


procedure tdate.increase;
begin
if fday<daysinmonth then
inc(fday)
else
if fmonth<12 then
begin
inc(fmonth);
fday:=1;
end
else
begin
inc(fyear);
fmonth:=1;
fday:=1;
end;
dochange;
end;
function tdate.daysinmonth:integer;
begin
case fmonth of
1,3,5,7,8,10,12:daysinmonth:=31;
4,6,9,11:daysinmonth:=30;
2:
if leapyear then
daysinmonth:=29
else
daysinmonth:=28;
else
daysinmonth:=0;
end;
end;
function tdate.gettext:string;
begin
gettext:=format('%.2d.%.2d.%4d',
[fmonth,fday,fyear]);
end;
procedure tdate.add(numberofdays:integer);
var n:integer;
begin
for n:=1 to numberofdays do
increase;
dochange;
end;
procedure tdate.setvalue(m,d,y:integer);
begin
setyear(y);
setmonth(m);
setday(d);
end;
function tdate.leapyear:boolean;
begin
if (fyear mod 4 <>0 ) then
result:=false
else if (fyear mod 100<>0)then
result:=true
else if (fyear mod 400<>0) then
result:=false
else
result:=true;
end;


end.

[:)][:D][:)]
 
好像你没有定义控件的图标哦,或者你直接安装试试,用Install Component的菜单。
 
要定义吗?好像是用默认的吧。
我就是用install component啊,选择含有该类定义的
单元的啊,你可以帮我试一下吗?

我在好几个论坛都发了帖了,可惜目前还没人能给与解决,
只能等了。
 
呵呵,这是个初学写控件人的常见的毛病!

写组件有一个基本要求:
所有控件的注册过程都一定要命名为:
procedure Register;
这个Register开头一定要大写!!!

我想你的书(你的好象是照《Delphi3 从入门到精通》写的东东吧!)
上也会有讲的,再好好看看吧!。

BTW,几点意见:
1、你的几个函数的封装不太好,如SetXXXX最好放在private 段中而DayInMonth的位置
也不好,如果要提供放在public段中好一点。
2、几个变量名起得不太好尤其是你的类名:TDate,可能与Delphi自定义的TDate型岐义
当然,这个东东我想你也只是练练手。
3、过程和函数命名中的单词最好大小写分开,这样可读性好!(当然,也就不会出这个
问题了)。
 
杜宝大侠果然是高手!!!
我开始以为是TDate名称冲突,后来改成别的名称试试也装不上去。原来是Register开头要大写!
感谢杜宝大侠给我上了生动的一课,十分感谢!!!
 
很感谢大家给予的帮助,尤其是杜宝朋友的帮助,的确是那个问题,
搞了我老半天,都没弄出来,我所看的书的确是那本书,只可惜没有
源码光盘,所以因没有完整代码,才搞到现在。
希望今后可以得到大家继续的帮助。[:)]
 
后退
顶部