<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

    CowNew開源團(tuán)隊(duì)

    http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks
    ?

    五、復(fù)合控件

    復(fù)合控件是Delphi控件中非常重要的一種控件,復(fù)合控件就是將兩個(gè)或兩個(gè)以上的控件重新組合成一個(gè)新的控件。例如TspinEditTlabeledEditTDBNavigator等就是復(fù)合控件,TDBNavigator其實(shí)就是在一個(gè)Panel放上若干個(gè)Button而已。制作一個(gè)復(fù)合控件時(shí),我們一般從TwinControl派生控件。

    我們這次做的控件是擁有一個(gè)Edit編輯框和一個(gè)Button按鈕的復(fù)合控件,在用戶在編輯框中輸入文字的過程中,Button將隨時(shí)顯示編輯框中文字的長(zhǎng)度。我們把控件的源碼先展示給大家。

    unit EditButton;

    interface

    uses

    ? SysUtils, Classes, Controls, StdCtrls, Messages;

    type

    ? TEditButton = class(TWinControl)

    ? private

    ??? FEdit: TEdit;

    ??? FButton: TButton;

    ??? FText: string;

    ??? procedure FSetText(AValue: string);

    ??? procedure OnEditChange(Sender: TObject);

    ? protected

    ??? procedure WMSize(var Msg: TMessage);message WM_SIZE;

    ? public

    ??? constructor Create(AOwner: TComponent);override;

    ??? destructor Destroy;override;

    ? published

    ??? property Text: string read FText write FSetText;

    ? end;

    ?

    procedure Register;

    implementation

    ?

    procedure Register;

    begin

    ? RegisterComponents('Linco', [TEditButton]);

    end;

    ?

    constructor TEditButton.Create(AOwner: TComponent);

    begin

    ? inherited;

    ? FEdit := TEdit.Create(nil);

    ? FEdit.Parent := self;

    ? FEdit.Top := 0;

    ? FEdit.Left := 0;

    ? FEdit.Height := Height;

    ? FEdit.Width := Width div 2;

    ? FEdit.OnChange := OnEditChange;

    ? FButton := TButton.Create(nil);

    ? FButton.Parent := self;

    ? FButton.Top := 0;

    ? FButton.Left := Width div 2;

    ? FButton.Height := Height;

    ? FButton.Width := Width div 2;

    end;

    ?

    destructor TEditButton.Destroy;

    begin

    ? FEdit.Free;

    ? FButton.Free;

    ? inherited;

    end;

    ?

    procedure TEditButton.FSetText(AValue: string);

    begin

    ? FEdit.Text := AValue;

    end;

    ?

    procedure TEditButton.OnEditChange(Sender: TObject);

    begin

    ? FButton.Caption := IntToStr(Length(FEdit.Text));

    end;

    ?

    procedure TEditButton.WMSize(var Msg: TMessage);

    begin

    ? FEdit.Height := Height;

    ? FEdit.Width := Width div 2;

    ? FButton.Left := Width div 2;

    ? FButton.Height := Height;

    ? FButton.Width := Width div 2;

    end;

    end.

    代碼解釋:

    1)、我們首先定義了兩個(gè)變量??

    ?? ?FEdit: TEdit;

    ??? FButton: TButton;

    ? 分別代表復(fù)合控件中的文字編輯框和按鈕。

    2)所謂復(fù)合控件說簡(jiǎn)單一點(diǎn)就是在一個(gè)共同的基板上將組成復(fù)合控件的各個(gè)控件(可以叫做子控件)畫出來。所以我們?cè)跇?gòu)造函數(shù)中建立各個(gè)子控件,然后分別設(shè)定它們的位置等屬性。

    以文字編輯框?yàn)槔?/SPAN>

    FEdit := TEdit.Create(nil);

    的作用是建立編輯框控件。如果Create的參數(shù)指定為nil,則子控件在設(shè)計(jì)狀態(tài)是可以響應(yīng)用戶的操作的;而如果設(shè)定為self(即設(shè)定子控件的父控件為基板),則子控件在設(shè)計(jì)時(shí)時(shí)不可響應(yīng)用戶操作的,如果設(shè)定為self則析構(gòu)函數(shù)中就不用Fedit.Free來銷毀對(duì)象了,對(duì)象會(huì)自動(dòng)銷毀。

    ? FEdit.Parent := self;的作用是設(shè)定子控件的父控件,如果沒有這一句則控件是無法顯示的。

    ? FEdit.Top := 0;

    ? FEdit.Left := 0;

    ? FEdit.Height := Height;

    ? FEdit.Width := Width div 2;

    這四句是設(shè)定控件在基板上的相對(duì)位置的,這里的Top,Left不是相對(duì)于窗體的,而是相對(duì)于基板的。

    ? FEdit.OnChange := OnEditChange;

    則是設(shè)定編輯框控件的OnChange(文字改變事件)的處理句柄為OnEditChange

    (1)??? 用戶有可能在設(shè)計(jì)時(shí)或運(yùn)行時(shí)通過代碼改變控件的大小,這時(shí)控件中子控件的順序就會(huì)變得亂七八糟,所以需要相應(yīng)控件的WM_SIZE事件(控件大小發(fā)生變化的事件)重新設(shè)定子控件的位置,大小等。函數(shù)WMSize的作用就是這樣的。

    安裝控件后發(fā)現(xiàn)控件已經(jīng)可以正確運(yùn)行了,但是還有一個(gè)問題,就是這個(gè)控件沒有了Onclick,Onchange等必須的屬性。我們只要為控件增加事件處理句柄屬性,然后把事件處理句柄屬性的讀寫方法都指向子控件的事件處理句柄屬性即可。例如我們?yōu)榭丶黾?/SPAN>OnClick事件,這個(gè)事件發(fā)生在用戶單擊按鈕時(shí),我么只要在Pulished部分增加如下代碼:

    property? OnClick:? TnotifyEvent read GetOnClick write SetOnClick

    Private中增加如下方法聲明:

    function GetOnclick: TnotifyEvent;

    procedure SetOnclick(AValue: TnotifyEvent);

    這兩個(gè)方法的實(shí)現(xiàn)分別為:

    function? TeditButton. GetOnclick: TnotifyEvent;

    begin

    ? result := Fbutton.Onclick;

    end;

    procedure TeditButton. SetOnclick(AValue: TnotifyEvent);

    begin

    ? Fbutton.OnClick := Avalue;

    end;

    思考題:

    1、做一個(gè)模仿播放器中的操作按鈕的復(fù)合控件,控件由三個(gè)按鈕組成,分別是“播放”、“暫停”、“停止”,請(qǐng)按照正常的邏輯關(guān)系,處理這三個(gè)按鈕的可用/不可用關(guān)系。(提示:可以參考TDBNavigator的源代碼)

    posted on 2005-10-21 23:32 CowNew開源團(tuán)隊(duì) 閱讀(3251) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 好男人视频在线观看免费看片| 亚洲日韩在线中文字幕第一页| 久久精品国产亚洲av天美18| 亚洲国产综合久久天堂| 青青草原1769久久免费播放| 亚洲午夜无码久久久久软件| 中文字幕精品无码亚洲字| 91嫩草免费国产永久入口| 黄色大片免费网站| 亚洲av网址在线观看| 国内自产拍自a免费毛片| 99re6在线精品免费观看| 国产婷婷综合丁香亚洲欧洲| 亚洲中文字幕在线乱码| 人禽杂交18禁网站免费| 99在线视频免费观看| 亚洲人成色77777在线观看| 亚洲va国产va天堂va久久| 在线观看国产情趣免费视频| 久久aa毛片免费播放嗯啊| 国产午夜亚洲精品不卡电影| 亚洲欧洲综合在线| 亚洲无线观看国产精品| 日韩电影免费在线观看视频| 国产高清不卡免费视频| 全部在线播放免费毛片| 涩涩色中文综合亚洲| 亚洲成色在线综合网站| 人人狠狠综合久久亚洲高清| 成人免费视频网站www| a毛片免费全部播放完整成| 免费看黄网站在线看| 亚洲AV无码一区二区三区人| 亚洲阿v天堂在线| 免费人成无码大片在线观看| 国产日本一线在线观看免费| 久久成人免费播放网站| 国产大片免费天天看| 国产亚洲综合一区二区三区| 亚洲精品国产日韩| 亚洲成人黄色在线|