在這篇文章中我們將建立一個和時間有關的組件
組件和組件包
組件的屬性類別
組件的屬性編輯器
組件編輯器
一
組件和組件包的關系就如同普通工程中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;
三
在前面的文章中我們已經完成了組件的基本功能的開發
打開delphi自帶的Image Editor(ToolsàImage Editor)
接下來我們將為我們開發的組件的屬性進行分類並介紹一個組件開發中重要的特性
為了讓我們組件的一些和時鐘有關的屬性注冊成一個新的類別把它們和label的屬性分開開來
uses
DesignIntf;//delphi
///////////這部分代碼如果是delphi
type
TClockGategory=class(TpropertyCategory)//建立一個新的屬性類別
Class function Name:string;override;//屬性類別的名稱
Class function Description:string;override;//屬性類別的描述
End;
……
Class function TClockGategory
Begin
Result:=
End;
Class function TClockGategory
Begin
Result:=
End;
////////////////////////////////////////////////////////////////////////////////////
接下來我們要做的就是修改register過程
procedure Register;
begin
RegisterComponents(
////////////這是delphi
RegisterPropertyInCategory(
RegisterPropertyInCategory(
RegisterPropertyInCategory(
RegisterPropertyInCategory(
RegisterPropertyInCategory(
RegisterPropertyInCategory(
RegisterPropertyInCategory(
//////////////////////////////////////////////////////////
///////////////這是delphi
{
RegisterPropertyInCategory(TClockGategory
RegisterPropertyInCategory(TClockGategory
RegisterPropertyInCategory(TClockGategory
RegisterPropertyInCategory(TClockGategory
RegisterPropertyInCategory(TClockGategory
RegisterPropertyInCategory(TClockGategory
RegisterPropertyInCategory(TClockGategory
}
////////////////////////////////////////////////////////
end;
重新編譯後
然而
在接下來的文章裡
通過上面的努力我們的組件似乎已經比較完美了
在之前開發組件核心功能時我們曾設置了兩個屬性BeginTime和WakeTime
在定制完屬性編輯器以後
首先來編寫屬性編輯器
TTimeEditFrm = class(TForm)
DateTimePicker
Button
Button
private
{ Private declarations }
public
{ Public declarations }
end;
以下是屬性編輯器的代碼
TClockProperty=class(TStringProperty)
public
function GetAttributes:TPropertyAttributes;override;
procedure Edit;override;
end;
實現部分
procedure TClockProperty
var
TimeEditFrm:TTimeEditFrm;
begin
TimeEditFrm:=TTimeEditFrm
try
TimeEditFrm
if TimeEditFrm
SetValue(TimeToStr(TimeEditFrm
//GetValue和SetValue是TStringProperty的基類方法
finally
TimeEditFrm
end;
end;
function TClockProperty
begin
result:=[paDialog
//paDialog表示屬性編輯器將顯示一個對話框
//除此之外如果你想讓屬性編輯器顯示下拉列表
end;
最後我們用RegisterPropertyEditor方法注冊屬性編輯器:
procedure Register;
begin
……
RegisterPropertyEditor(TypeInfo(string)
RegisterPropertyEditor(TypeInfo(string)
end;
重新編譯更新組件後我們就可以測試了
接下來我們來實現組件編輯器
組件編輯器需要繼承TcomponentEditor並覆蓋一些重要的方法
TClockEditor=class(TComponentEditor)
public
function GetVerbCount:integer;override;
function GetVerb(index:integer):string;override;
procedure ExecuteVerb(index:integer);override;
procedure Edit;override;
end;
實現部分
procedure TClockEditor
begin
ExecuteVerb(
end;
procedure TClockEditor
begin
case index of
//第一個顯示名字的菜單什麼都不做顯示
end;
end;
function TClockEditor
begin
case index of
end;
end;
function TClockEditor
begin
result:=
end;
同樣最後我們注冊組件編輯器
procedure Register;
begin
……
RegisterComponentEditor(TClock
end;
From:http://tw.wingwit.com/Article/program/Delphi/201311/8400.html