熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

基於Delphi的組件設計之簡單實例

2013-11-23 17:30:23  來源: Delphi編程 
這是一個可以計數的組件為了簡單我以秒為單位當開始時他就從開始增加並顯示出來它又回到如此循環當然它也可以停止暫停繼續另外他還有一個時間事件即可以設定每隔多少時間來觸發這個事件這倒是一個好的功能我們可以設半個小時觸發事件在事件處理函數中來一個聲音然後睡個覺半個小時後就由這個聲音來提醒你起床了
  
  我們一開始不要新建組件單元而是把它當成一個工程中的一個類來應用這樣更易於調試於是我們新建一個工程又新建一個空白單元用於放置這個類
  
  一確定父類
  
  接下來給這個類起名叫TTimeCount那麼它的父類應該是什麼呢它要能顯示出來得有一個容量來讓他顯示TPanel是個不錯的選擇我看了一下源碼發覺TPanel什麼也沒有做只是把它的父類TCustomPanel的屬性顯化出來(這個等一下講)TCustomPanel把好多的屬性聲明為Protected為他的子類提供了選擇他的子類如果要使這些屬性能在對象察看器中看到可以在Published重新聲明一下如果不想則不用去理會他而我們的計數器組件正好不用那麼多屬性正好合適於是我決定用TCusomPanel為父類
  
  類建立如下
  TTimeCount=class(TCustomPanel)
  private
  protected
  public
  published
  end;
  
  二確定成員方法和屬性和事件
  
  FCount; 只讀私有成員保存計數值
  FActive:Boolean; /確定是否發生類的時間間隔事件
  FInterval:TInterval; 這個可以設置時間事件觸發間隔本來用整型值會好一些但會了學習起見這裡用了一個枚舉形的在Type中聲明如下
  TInterval=(TenMTwentyMThirtyMFortyMFiftyMSixtyM);
  分別表示十分鐘到六十分鐘
  TimeLenTimeNum:integer;這兩個用在類的時間事件發生的確定上與外界隔絕
  FTimeOut:TNotifyEvent;時間間隔事件的方法指針通過調度方法實現他與外部的處理函數關聯
  我們要它能以秒為單位來計數則要涉及到時間的應用所以就有了這個最重要的成員
  FTimer:TTimer;
  這個成員對象要在類構造函數中實例化它並賦與他的屬性值還要在析構函數在釋放它
  如下
  //構造函數繼承父類的構造函數並初始化類中的成員
  constructor TTimeCountCreate(AOwner:TComponent);
  //創建時間控件並設置相關的參數
  procedure CreateTimer;
  begin
  FTimer:=TTimerCreate(self);
  FTimerEnabled:=False;
  FTimerInterval:=;
  FTimerOnTimer:=FTimerTimer;
  end;
  begin
  inherited Create(AOwner);
  CreateTimer;
  end;
  //析構函數先釋放時間控件再繼承父類的析構函數
  destructor TTimeCountDestroy;
  begin
  FTimerFree;
  inherited Destroy;
  end;
  構造函數中還要設置該組件的外觀和默認值這裡把它刪去到源代碼再貼出來
  其中
  FTimerTimer;是很重要的函數在該類中有聲明
  procedure FTimerTimer(Sender:Tobject);//時間控件的事件處理函數
  在這個處理函數中實現了計數值的遞增並顯示到容器中此外還在判斷類的時間事件是否有足夠條件觸發了如果有則調用DoTimeOut;過程這個就是事件的調度函數啦
  //事件調度函數將外部的事件處理函數和該類的事件方法指針聯系起來
  procedure TTimeCountDoTimeOut;
  begin
  if Assigned(FTimeOut) then
  FTimeOut(Self);
  end;
  而屬性則是根據私有成員來設定了
  public
  property Count:Integer read FCount default ; //計數值的只讀屬性這個屬性不能聲明在Published中因為它是只讀的只在程序運行時通過它來得到計數值
  published
  property Interval:TInterval read FInterval write SetInterval Default TenM;
  property Active:boolean read FActive write SetActive default false;
  property OnTimeOut:TNotifyEvent read FTimeOut write FTimeOut;
  此外還有幾個自定義方法即
  procedure pause; //暫停計數
  procedure Resume;//從暫停的計數開始計數
  procedure stop;//停止
  procedure start;//開始計數
  都比較簡單
  
  三父類屬性的顯化
  
  TCustomPanel及其父類有好多的屬性設為Protected使其子類可以有更靈活的選擇是否把這些屬性顯示到對象察看器中如果想則到Published中重新聲明這些屬性就可以我參考了一下TPanel的源碼並按需要選擇了其中的一些屬性聲明到Published中注意哦事件也是屬性只要你把它顯化出來就可以設置處理事件了
  以下是計數組件的源碼相信有了上面的講解應該不會很難了
  unit CountUnit;
  interface
  uses
  SysUtilsClassesGraphicsControlsExtCtrls;
  type
  //用於設置時間事件發生的間隔
  TInterval=(TenMTwentyMThirtyMFortyMFiftyMSixtyM);
  TTimeCount=class(TCustomPanel)
  private
  FTimer:TTimer;
  FCount:integer; //只讀私有成員計數值
  FInterval:TInterval; //時間事件發生的間隔
  FActive:Boolean; //決定是否發生間隔事件
  TimeLen:Integer;//發生事件的時間長度以秒為單位
  TimeNum:integer;//計數值和TimeLen一起有用以判斷是否事件該發生了
  FTimeOut:TNotifyEvent;//事件的方法指針
  procedure SetInterval(I:TInterval);
  procedure SetActive(A:boolean);
  procedure FTimerTimer(Sender:Tobject);//時間控件的事件處理函數
  protected
  procedure DoTimeOut;dynamic; //調度方法用於關聯事件
  public
  procedure pause; //暫停計數
  procedure Resume;//從暫停的計數開始計數
  procedure stop;//停止
  procedure start;//開始計數
  constructor Create(AOwner:TComponent);override;
  destructor Destroy;override;
  property Count:Integer read FCount; //計數值的只讀屬性
  published
  property Interval:TInterval read FInterval write SetInterval Default TenM;
  property Active:boolean read FActive write SetActive default false;
  property OnTimeOut:TNotifyEvent read FTimeOut write FTimeOut;
  //顯式祖先類的一些屬性在對象察看器中
  property BevelInner;
  property BevelOuter;
  property BevelWidth;
  property Color;
  property Font;
  property PopupMenu;
  property ShowHint;
  property TabOrder;
  property TabStop;
  property Visible;
  property OnClick;
  property OnDblClick;
  property OnMouseDown;
  property OnMouseMove;
  property OnMouseUp;
  end;
  implementation
  //構造函數繼承父類的構造函數並初始化類中的成員
  constructor TTimeCountCreate(AOwner:TComponent);
  //創建時間控件並設置相關的參數
  procedure CreateTimer;
  begin
  FTimer:=TTimerCreate(self);
  FTimerEnabled:=False;
  FTimerInterval:=;
  FTimerOnTimer:=FTimerTimer;
  end;
  //以下是設置外觀的
  procedure setView;
  begin
  Width:=;
  Height:=;
  Color:=$;
  FontColor:=$FFFFFF;
  FontSize:=;
  FontStyle:=[fsBoldfsUnderline];;
  BevelOuter := bvLowered ;
  Caption:=;
  end;
  begin
  inherited Create(AOwner);
  FCount:=;
  FInterval:=TenM;
  FActive:=False;
  TimeLen:=;//十分鐘六百秒
  TimeNum:=;
  CreateTimer;
  setView;
  end;
  
  //析構函數先釋放時間控件再繼承父類的析構函數
  
  destructor TTimeCountDestroy;
  begin
  FTimerFree;
  inherited Destroy;
  end;
  //設置時間事件發生間隔財時要賦相應的間隔秒數
  procedure TTimeCountSetInterval(I:TInterval);
  begin
  if FInterval<>I then
  begin
  FInterval:=I;
  case FInterval of
  TenM: TimeLen:=;
  TwentyM:TimeLen:=;
  ThirtyM: TimeLen:=;
  FortyM: TimeLen:=;
  FiftyM:TimeLen:=;
  SixtyM:TimeLen:=;
  end;
  end;
  end;
  
  procedure TTimeCountSetActive(A:boolean);
  begin
  if FActive<>A then
  begin
  FActive:=A;
  TimeNum:=;
  end;
  end;
  
  procedure TTimeCountpause;
  begin
  if FTimerEnabled then
  FTimerEnabled:=False;
  end;
  
  procedure TTimeCountResume;
  begin
  if not FTimerEnabled then
  FTimerEnabled:=True;
  end;
  
  procedure TTimeCountstop;
  begin
  FTimerEnabled:=False;
  FCoun
From:http://tw.wingwit.com/Article/program/Delphi/201311/24697.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.