<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
    ?

    六、控件手拉手――控件關(guān)聯(lián)的實(shí)現(xiàn)

    控件的關(guān)聯(lián)在Delphi中也是很常見的,我們可以設(shè)定一個(gè)控件的某個(gè)屬性指向另一個(gè)控件。比如我們?cè)诖绑w上放上Tedit,TpopupMenu兩個(gè)控件,然后設(shè)定TeditPopupMenu屬性為TpopupMenu控件,運(yùn)行后在Tedit點(diǎn)擊右鍵就會(huì)彈出剛才設(shè)定的那個(gè)TpopupMenu菜單,也就是說Tedit,TpopupMenu聯(lián)手完成了任務(wù)。再比如TDBEdit控件的DataSource屬性就可以指向一個(gè)TdataSource控件,這樣就可以在TDBEdit控件中顯示TdataSource輸出的某個(gè)字段的值了。

    ? 下面我們將寫一個(gè)簡(jiǎn)單的實(shí)現(xiàn)控件關(guān)聯(lián)的控件。這個(gè)控件派生于Tedit,它可以與一個(gè)Tlabel控件關(guān)聯(lián),在控件的編輯框中輸入文字時(shí),與它關(guān)聯(lián)的Tlabel控件的文字將隨著它而變化。代碼如下:

    unit MyEdit;

    interface

    uses

    ? SysUtils, Classes, Controls, StdCtrls;

    type

    ? TMyEdit = class(TEdit)

    ? private

    ??? FLinkLabel: TLabel;

    ??? procedure FSetLinkLabel(AValue: TLabel);

    ? protected

    ??? procedure Notification(AComponent: TComponent;Operation: TOperation);

    ????????? override;

    ??? procedure Change;override;

    ? public

    ? published

    ??? property LinkLabel: TLabel read FLinkLabel write FSetLinkLabel;

    ? end;

    ?

    procedure Register;

    ?

    implementation

    procedure Register;

    begin

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

    end;

    procedure TMyEdit.Change;

    begin

    ? inherited;

    ? if LinkLabel <> nil then

    ??? LinkLabel.Caption := Text;

    end;

    ?

    procedure TMyEdit.FSetLinkLabel(AValue: TLabel);

    begin

    ? FLinkLabel := AValue;

    ? if AValue <> nil then

    ??? FLinkLabel.FreeNotification(self);

    end;

    ?

    procedure TMyEdit.Notification(AComponent: TComponent;

    ? Operation: TOperation);

    begin

    ? inherited;

    ? if (Operation = opRemove) and (AComponent = LinkLabel) then

    ??? LinkLabel := nil;

    end;

    end.

    代碼解釋:

    1)、我們只要將控件的任意一個(gè)屬性的類型設(shè)定為另外一個(gè)控件的類名稱,那么我們就可以在控件的Object Inspector中將這個(gè)屬性指向那個(gè)控件(或那個(gè)控件的派生控件)的一個(gè)實(shí)例。比如本例中我們?cè)黾恿?/SPAN>LinkLabel屬性,它的類型為 Tlabel,所以我們就可以把LinkLabel屬性指向一個(gè)標(biāo)簽控件。

    2)、請(qǐng)注意FsetLinkLabel中的這段代碼:

    ?if AValue <> nil then

    FLinkLabel.FreeNotification(self);

    如果我們將控件關(guān)聯(lián)屬性指向了一個(gè)控件,可是后來又將被指向的控件刪除了,那么我們的控件關(guān)聯(lián)屬性是不會(huì)自動(dòng)刪除的,這樣就會(huì)造成控件關(guān)聯(lián)屬性指向的控件不存在的現(xiàn)象。我們必須自動(dòng)感知被關(guān)聯(lián)控件的刪除并重新設(shè)定控件關(guān)聯(lián)屬性為不指向任何控件,這樣就避免了錯(cuò)誤的發(fā)生。

    FLinkLabel.FreeNotification(self);的作用就是這樣的。它調(diào)用控件的FreeNotification方法(在Tcomponent中定義)向被指向的控件注冊(cè)一個(gè)“消息”,當(dāng)被指向控件被刪除時(shí),會(huì)向所有向他注冊(cè)的控件發(fā)送一個(gè)它被刪除的消息,此時(shí)向他注冊(cè)的控件就會(huì)觸發(fā)Notification方法,這樣我們就可以自動(dòng)感知被指向控件的狀態(tài)了。這是設(shè)計(jì)模式中Observer(觀察者)模式的典型應(yīng)用。

    既然向他注冊(cè)的控件就會(huì)觸發(fā)Notification方法,我們就覆蓋父類的Notification方法,寫出如下的代碼:

    ? if (Operation = opRemove) and (AComponent = LinkLabel) then

    ??? LinkLabel := nil;

    這句話的意思是:如果控件被刪除并且被刪除的控件(因?yàn)槲覀兊目丶赡芟蚨鄠€(gè)控件注冊(cè)了消息)是LinkLabel,那么我們就設(shè)定LinkLabel屬性不指向任何控件。

    3)覆蓋父類的Change調(diào)度方法。在此方法里為連接的LinkLabelCaption賦值就達(dá)到我們的目的了。

    思考題:

    1、做一個(gè)Label控件,給它增加一個(gè)DataSource屬性,該屬性可以指向一個(gè)TdataSource類型的控件,它有一個(gè)GetRecordCount方法。當(dāng)調(diào)用此方法時(shí),就在Label控件中顯示這個(gè)DataSource對(duì)應(yīng)的數(shù)據(jù)集中的記錄的條數(shù)。

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 蜜芽亚洲av无码一区二区三区| 亚洲精品乱码久久久久久按摩 | 99视频精品全部免费观看| 亚洲国产av无码精品| 国产亚洲美女精品久久久久| 免费理论片51人人看电影| 亚洲一区二区影视| 99在线视频免费观看视频 | 午夜影视日本亚洲欧洲精品一区| 久久性生大片免费观看性| 久久综合亚洲色HEZYO国产| 久久免费视频一区| 亚洲AV日韩AV永久无码下载| 91香蕉国产线观看免费全集| 亚洲最大福利视频网站| 5g影院5g天天爽永久免费影院| 亚洲一区二区三区不卡在线播放 | 好爽…又高潮了毛片免费看| 无码一区二区三区亚洲人妻| 亚洲国产婷婷综合在线精品 | 亚洲小说图区综合在线| 国产免费黄色大片| 国产VA免费精品高清在线| 亚洲国产第一站精品蜜芽| 亚洲免费福利在线视频| 美女一级毛片免费观看| 国产AV无码专区亚洲AV男同| 亚洲人成免费电影| 午夜亚洲国产理论片二级港台二级 | 亚洲人成网站在线播放2019| 亚洲精品国自产拍在线观看| 免费国产成人α片| 亚洲狠狠婷婷综合久久蜜芽| 日本亚洲中午字幕乱码| 亚洲第一福利网站在线观看| 亚洲精品免费在线观看| 亚洲人成网亚洲欧洲无码| 亚洲色大成网站www永久一区| 1区2区3区产品乱码免费| 精品亚洲成A人在线观看青青| 亚洲AV无码专区在线播放中文 |