• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-60  評論-111  文章-0  trackbacks-0

            自己開發(fā)DelphiVCL

            Delphi為何成為廣大程序員愛好的開發(fā)工具,其中一個(gè)原因就是它有大量的共享的VCL庫,打打擴(kuò)展了Delphi的功能。但是在實(shí)際的開發(fā)過程中,有時(shí)候根據(jù)項(xiàng)目的需要要開發(fā)自己的VCL控件,我就有過不少這樣的需求,因此自己也開發(fā)了多個(gè)VCL控件,由于水平有限,功能也不是很強(qiáng)大,下面將自己的一些經(jīng)驗(yàn)介紹一下。?
            1
            選擇File | New,在對話框中選擇
            ComponentAncestor Type中選擇你的控件是從那個(gè)類繼承下來的,然后在 "Class Name"輸入你的類的名稱,在Palette Page 中選擇要把你的控件放到哪一個(gè)頁面中。輸入完畢后點(diǎn)擊OK,生成pas文件。?
            2
            在控件中添加屬性:?
            首先,控件的屬性要存儲在一個(gè)類變量中,比如一個(gè)類型為string的變量,就可以存儲在一個(gè)可以存儲string的類變量,比如一個(gè)stringTStringList等。因此首先要在類的private區(qū)域聲明一個(gè)私有的類變量,為了防止名字重復(fù),一般在私有的類變量前加一個(gè)"F"。如?
            private
            ??Fname:String
            我們假設(shè)這個(gè)屬性的名字叫 FieldName,那我們就需要在published區(qū)域加上如下語句:
            property FieldName:String read Fname write Fname;
            這樣的屬性你可以訪問,但是不在 "Object Inspector"中出現(xiàn),如果想如此,應(yīng)這樣寫:
            property FieldName:String read Fname write Fname stored true;
            這樣的方法只實(shí)用于一些基本的數(shù)據(jù)類型,如integer, double ,String等等,對一些類,如Tstringlist,就不適合,對這些類應(yīng)該怎么辦呢?首先,還是要聲明一個(gè)私有的變量存儲該屬性,以 Tstringlist為例子:?
            private?Fnames:Tstringlist;
            同時(shí)要寫兩個(gè)方法來對此類變量進(jìn)行存取:
            protected?
            ??Function getNames:Tstringlist;?
            ??Procedure setNames(value:Tstringlist);?
            getName的函數(shù)體中,應(yīng)這樣寫:
            begin?
            result:=Fname;?
            end;?
            setNames的方法中,應(yīng)這樣寫:?
            begin?
            Fname.assign(value);?
            end;?
            published中寫:?
            property Names:Tstringlist read getNames write setNames;?
            同樣如果想要這個(gè)屬性在 "Object Inspector"中出現(xiàn),要在后面加 stored true.?
            當(dāng)然,你也可以通過其他類型的類對這個(gè)屬性進(jìn)行存取,比如通過Tlistbox來存取Tstringlist,因?yàn)轭?/span>Tlistbox也包含有一個(gè)Tstringlist類。?
            3
            在控件中添加方法?
            添加方法比較簡單,在published中聲明方法,然后寫方法體就可以。?
            4
            在控件中添加事件?
            添加事件之前,首先要聲明一個(gè)事件類,如TnotifyEvent?
            private??
            ??MyEvent:TnotifyEvent;?
            聲明事件?
            published?
            ??property OnMyEvent:TnotifyEvent read MyEvent write MyEvent stored true;?
            然后在特定的條件下調(diào)用這個(gè)事件:?
            OnMyEvent(owner);?
            5
            寫數(shù)據(jù)敏感的控件:?
            數(shù)據(jù)敏感的控件和普通控件基本相同,只是有一個(gè)類TdatalinkTdatalink有一個(gè)onDatachange事件,你可以聲明一個(gè)事件,然后將事件指向TdatalinkonDatachange事件,然后在事件中寫下程序就可以實(shí)現(xiàn)數(shù)據(jù)敏感了。?
            ??FDataLink.OnDataChange := DataChange;?
            然后在Datachange中寫程序。?
            6
            重載構(gòu)造器和構(gòu)析器。在publicpublished中寫:?
            構(gòu)造器:?
            constructor Create(Aowner:Tcomponent); override;?
            構(gòu)析器:?
            destructor Destory; override;?
            在構(gòu)造時(shí)對一些類變量進(jìn)行初始化,有的需要調(diào)用類變量的類構(gòu)造方法進(jìn)行構(gòu)造,如?
            ??Fnames:=Tstirnglist.create;?
            在構(gòu)析時(shí)對類變量進(jìn)行釋放?
            ??Fnames.Free;?
            7
            對于一些界面有關(guān)的控件,如果有特殊的界面需要,需要重載onpaint事件,在重畫時(shí)對自己的canvas進(jìn)行操作,當(dāng)然,也可以對別的類的canvas進(jìn)行操作,比如寫一個(gè)控件,在重畫時(shí)對它的容器用一個(gè)畫進(jìn)行平鋪處理。?
            8
            對于從哪些類繼承,根據(jù)自己的需要選擇,盡可能選擇功能接近,已經(jīng)實(shí)現(xiàn)部分功能的類,這樣寫比較方便。?
            以上是自己的一些心得,還望多多指正。

            posted on 2011-01-12 09:12 shaker(太子) 閱讀(1112) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久综合伊人77777| 亚洲国产二区三区久久| 99久久精品国产一区二区| 亚洲欧洲日产国码无码久久99| 久久久久亚洲精品天堂久久久久久| 嫩草影院久久99| 91久久精品国产成人久久| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 国产精品久久久久影院嫩草 | 亚洲第一极品精品无码久久| 久久久国产视频| 午夜精品久久久久久久| 久久久久久国产精品免费无码 | 久久99精品国产麻豆蜜芽| 国产精品99久久不卡| 欧美麻豆久久久久久中文| 日本WV一本一道久久香蕉| 亚洲中文久久精品无码| 国产婷婷成人久久Av免费高清 | 亚洲国产精品久久久久婷婷老年| 国产99精品久久| 99久久无码一区人妻| 思思久久99热只有频精品66| 少妇久久久久久久久久| 青青热久久综合网伊人| 久久青青草原精品国产软件| 久久国产色av免费看| 日本免费一区二区久久人人澡| 久久人人爽人人精品视频| 性高湖久久久久久久久| 狠狠精品久久久无码中文字幕 | 久久99精品久久久久久动态图| 国产高潮国产高潮久久久91 | 国产一级持黄大片99久久| 久久一本综合| 99久久精品国产高清一区二区| 内射无码专区久久亚洲| 97超级碰碰碰久久久久| 久久午夜免费视频| 日韩一区二区久久久久久| 亚洲中文精品久久久久久不卡|