在這篇文章中我們將建立一個和時間有關的組件
這是一個簡單的例子
·組件和組件包
·組件的屬性類別
·組件的屬性編輯器
·組件編輯器
一
組件和組件包的關系就如同普通工程中unit和工程文件的關系一樣
package ClockPackage;
{$R *
{$ALIGN
{$ASSERTIONS ON}
……
……
{$DESCRIPTION
{$IMPLICITBUILD OFF}
requires
rtl;
end
這個文件其實就是組件開發中的工程文件
了解了組件和組件包
二
了解了上面的知識後
在代碼中我們需要注意在interface部分的一個新的過程
procedure Register;
begin
RegisterComponents(
//這個過程注冊組件本身
//這裡在後面還會出現一些新的過程
end;
組件的代碼由於假設你已經熟悉delphi開發(它和一般開發沒什麼不同)
unit Clock;
interface
uses
SysUtils
type
TState=(StClock
TClock = class(TCustomLabel)
private
fState:TState;
fTimer:TTimer;//為什麼使用這個組件作為我們組件的私有成員就不用說了吧
RCD:array[
fBeginTime:string;//到計時時的開始時鐘
fWakeTime:string;//鬧鐘時間
fAllowWake:boolean;//是否開啟鬧鐘功能
fOnWakeUp:TNotifyEvent;//為了使組件更加完美
fOnTimeUp:TNotifyEvent;//同上能夠響應倒計時種完成時的事件
function GetActive:boolean;//控制Timer是否工作以控制
procedure SetActive(Value:boolean);
procedure SetState(Value:TState);
procedure SetBeginTime(Value:string);
procedure SetWakeTime(Value:string);
protected
procedure WalkClock(sender:TObject);//作為時鐘時走種的事件
procedure RunClock(sender:TObject); //跑表
procedure BackClock(sender:TObject);//倒計時
public
constructor Create(AOwner:TComponent);override;//完成一些初始化工作
procedure ReSetRunClock; //跑表和倒計時都需要一個復位方法給組件使用者調用
procedure ReSetBackClock;
published
property State:TState read fState write SetState default StClock;//默認為時鐘狀態
property Active:boolean read GetActive write SetActive;//控制
property BeginTime:string read fBeginTime write SetBeginTime;
property WakeTime:string read fWakeTime write SetWakeTime;
property AllowWake:boolean read fAllowWake write fAllowWake;
property OnWakeUp:TNotifyEvent read fOnWakeUp write fOnWakeUp;
property OnTimeUp:TNotifyEvent read fOnTimeUp write fOnTimeUp;
//最後我們再發布一些被TCustomLabel所隱藏而我們又需要的屬性
property Align;
property Alignment;
property Color;
property Font;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property Visible;
property Transparent;
property OnClick;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(
end;
{ TClock }
constructor TClock
begin
inherited Create(AOwner);
//設置默認值
fTimer:=TTimer
//將它屬於我們的組件
Active:=false;
AllowWake:=false;
State:=StClock;
BeginTime:=
WakeTime:=
end;
function TClock
begin
result:=fTimer
end;
procedure TClock
begin
fTimer
end;
procedure TClock
var
i:integer;
begin
case Value of
StClock:
begin
Active:=false;
fTimer
fTimer
Active:=true;
end;
StRunClock://由於Time類型不好處理微秒操作
begin
Active:=false;
for i:=
Caption:=IntToStr(RCD[
Caption:=Caption+IntToStr(RCD[
fTimer
//經過測試
//實際上這麼頻繁(
//這並不是一個好注意
//這需要更加靈活和復雜的編程
fTimer
end;
StBackClock:
begin
Active:=false;
Caption:=BeginTime;
fTimer
fTimer
end;
end;
fState:=Value;
end;
procedure TClock
begin
try
StrToTime(Value);
fBeginTime:=Value;
if State=StBackClock then
begin
Active:=false;
Caption:=Value;
end;
except
on Exception do
begin
fBeginTime:=
if State=StBackClock then Caption:=
end;
end;
end;
procedure TClock
begin
try
StrToTime(Value);
fWakeTime:=Value;
except
on Exception do
begin
fWakeTime:=
end;
end;
end;
procedure TClock
begin
Caption:=TimeToStr(Time);
if AllowWake and (StrToTime(Caption)=StrToTime(WakeTime)) then
begin
Beep;//蜂鳴器
if Assigned(fOnWakeUp) then
fOnWakeUp(self);
end;
end;
procedure TClock
begin
RCD[
if RCD[
if RCD[
if RCD[
if RCD[
if RCD[
if RCD[
if RCD[
if RCD[
Caption:=IntToStr(RCD[
Caption:=Caption+IntToStr(RCD[
end;
procedure TClock
begin
if StrToTime(Caption)<>StrToTime(
Caption:=TimeToStr(StrToTime(Caption)
else
begin
Active:=false;
Beep;
if Assigned(fOnTimeUp) then
fOnTimeUp(self);
end;
end;
procedure TClock
var
i:integer;
begin
if State=StRunClock then
begin
Active:=false;
for i:=
Caption:=
end;
end;
procedure TClock
begin
if State=StBackClock then
begin
Active:=false;Caption:=BeginTime;
end;
end;
end
為了測試我們的組件
然而這個組件到目前為止仍然不夠完善
From:http://tw.wingwit.com/Article/program/Delphi/201311/24840.html