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

            自己開發DelphiVCL

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

            posted on 2011-01-12 09:12 shaker(太子) 閱讀(1126) 評論(0)  編輯 收藏 引用
            中文精品99久久国产 | 一本久久免费视频| 亚洲欧美国产日韩综合久久| 2021国内久久精品| 国产精品久久久久久久久免费| 久久久久久国产a免费观看不卡| 99蜜桃臀久久久欧美精品网站 | 久久久WWW成人免费精品| 久久午夜福利无码1000合集| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 国产精品久久久久久五月尺| 97久久精品人妻人人搡人人玩| 久久99精品久久久久久秒播| 亚洲日韩中文无码久久| 久久成人精品| 亚洲综合精品香蕉久久网97| 亚洲色婷婷综合久久| 老司机午夜网站国内精品久久久久久久久 | 亚洲国产成人精品无码久久久久久综合| 狠狠色狠狠色综合久久| 婷婷久久综合九色综合九七| 久久精品国产亚洲一区二区三区| 99久久婷婷国产综合亚洲| 久久九九兔免费精品6| 无码乱码观看精品久久| 国产精品青草久久久久福利99| 久久国产精品一国产精品金尊| 中文字幕乱码人妻无码久久| 麻豆精品久久久久久久99蜜桃| 久久涩综合| 久久综合九色欧美综合狠狠| 人妻精品久久久久中文字幕| 久久天天日天天操综合伊人av| 国产成人综合久久久久久| 伊人久久综在合线亚洲2019| 精品免费久久久久久久| 精品无码久久久久国产| 久久精品免费观看| 亚洲国产精品久久久久| 中文字幕亚洲综合久久| 久久国产精品波多野结衣AV|