亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

如何用Delphi編寫自己的可視化控件

2019-11-18 18:06:36
字體:
來源:轉載
供稿:網友
 可視化控件(Visual Component)實際上就是一個類(class),要編寫一個類,可以直接在*.pas文件中編寫。但是要編寫控件,則必須使用包(package)。從File菜單中選擇New,新建一個Package,這就是存放和安裝控件用的包。然后單擊Package窗口中的Add按鈕,添加一個元件(Unit)。

  在彈出的對話框最上方選擇New Component。因為一個控件的所有屬性、方法、事件不可能都由自己編,所以就需要選擇祖先類(或者叫做"父類"或"基類"),然后再在其上面添加自己的屬性、方法、事件。在Ancestor type后的下拉框中選擇所需的祖先類。由于編寫可視化控件必須要畫圖,所以選擇TGraphicControl作為祖先類。再在Class Name框中輸入新控件(類)的名稱,一般以"T"開頭。Palette Page是用來選擇新控件在Delphi的窗口中的控件頁面名稱,例如"Standard",這個可以自己取。在Unit File Name中添好新控件文件的路徑及文件名,單擊OK按鈕。新的控件便加入了?,F在可以為該控件編寫代碼了。

  下面以編寫一個可以自定義圖片的滾動條為例,說明編寫可視化控件的方法。   按照上面的方法,選擇TGraphicControl為祖先類,新控件的名稱是TPigHorizontalScroller(小豬水平滾動條)。選擇好文件路徑和文件名后,單擊OK按鈕,開始編寫代碼。

  每一個控件,都會被創建(Create)和刪除(Destroy),所以必須首先編寫這兩個過程。對于控件中的每一個過程,都必須在前面先定義,然后再在后面編寫。定義的過程或屬性有三種:一、在PRivate后定義的是屬于控件內部使用的,使用該控件的人無法看到;二、在protected后定義的一般是看不到的,只在別人使用該控件作為祖先類編寫其它控件時才可見;三、在public后定義的只允許別人在程序中調用;四、在published后定義的可以在屬性窗口(Object Inspector)中看到。由于創建和刪除過程除了在編程過程中建立控件時自動執行外,還可能在程序運行過程中動態創建控件時被調用,所以把它定義在public后⑴。(該序號表示次步驟在所附源程序中的代碼的位置,下同)現在也許還不知到應該在這兩個過程中編寫什么,如何去編。我們在下面將會講到。
 
  我們首先為這個控件添加一些屬性。我們定義一個Max屬性用于設置或讀取滾動條的最大值。因為在程序中一般不直接使用屬性,所以要定義一個變量,和該屬性對應起來,一邊修改或讀取其值。因為它只在控件內部使用,所以我們把它定義在private后⑵。(一般與屬性相關聯的變量都以"F"開頭,例如FMax)定義好變量后,再定義屬性。這個屬性需要再Object Inspector窗口中可見,所以把它定義再published后⑶。定義的語法是:

  property <屬性名>:<類型> read <讀取該屬性時對應的變量> write <寫入該屬性時對應的變量或過程>

  其它的變量和屬性也類似的定義(例如Min最小值、Value當前值等)。下面我們定義幾個屬性和變量,用于設置滾動條的圖片(因為圖片變量比較特殊,所以單獨講一下)。我們把LeftButtonUpPicture(向左按鈕圖片)、LeftButtonDownPicture(向左按鈕按下圖片)等定義為TBitmap類型(一定要定義相對應的變量)。

  大家一定注意到了,在所附的源程序中,定義這幾個屬性時,read后所指定的讀取屬性時對應的變量是F…,而write后指定的寫入該屬性時對應的不是一個變量,而是一個Set…之類的東西,這是一個自定義的過程。作為該功能的過程的定義為:

  procedure <過程名>(Value: <被設置的屬性的值的類型>)

  因為執行寫入該類屬性的時候需要做其它的事情,所以不能光用一個變量來處理,應該用一個過程來處理。這中過程一般定義在protected后。在該類過程中,使用一個在⑷處這樣一個語句來給TBitmap類型的變量來賦值,這是由于該類型的變量不能直接賦值而采用的。

  定義完這些TBitmap類型的變量的屬性后,上面講的create過程和destroy過程中就需要編寫代碼了。因為TBitmap也是一個類,所以在create過程中必須創建⑸,在destroy過程中必須釋放掉(free)⑹。這里⑺所指的inherited語句是用于指明該過程是從祖先類類中繼承來的。(這個一定不能掉)。

  因為我們編寫的是可視化控件,所以必須在控件上畫圖。我們這個控件的祖先類TGraphicControl中封裝有一個Canvas(畫布)對象,我們可以直接使用它來畫圖。如果你對畫布的使用還不太熟悉,最好去找一本書來看一看。

  下面要做的工作就是畫圖了。如何在控件上畫圖呢?祖先類TGraphicControl中有一個Paint事件,當控件需要重畫時便會自動觸發。我們現在要做的就是要為這個事件編寫一段程序。首先在protected后定義一個Canvas對象。由于它是祖先類中已有的,所以不需要加任何說明⑻。我們將使用這個對象來畫圖。接著,就要定義一個Paint過程,編寫繪制控件的代碼。先在public后定義Paint過程。由于它是由祖先類觸發的,而不是由用戶調用的,所以后面必須加上override,否則,該控件將會由于Paint過程永遠不會被調用而不成為可視化控件⑼。下面我們就來編寫Paint過程的代碼⑽。

  該文章所附的源程序的Paint過程中的T_Height等變量是用來保存滾動條中按鈕、滑塊等的大小的,這部分程序和普通的application中的程序差別不大,大部分都是對畫布進行操作,相信大家一看就明白。值得注意的是下面對FAutoSize變量的判斷⑾,FAutoSize是和該控件的屬性AutoSize相關聯的布爾型變量,是用來設置這個控件的大小是否隨圖片的大小而變化的。注意,在控件的代碼中,一般都不直接調用屬性,而是使用與其相對應的的變量。

  程序編到這里,就算是終于給自己的新控件做了一個外型了,不過它還不能滾動?,F在我們來編寫鼠標事件,讓我們能夠操縱它。鼠標事件的過程的定義和Paint過程很相似,只是后面要加上參數說明⑿,鼠標事件分為MouseDown、MouseMove和MouseUp三個,在定義后面都要加上override。接下來在后面編寫它的代碼。注意:這里的鼠標事件是Mouse…,而不是通常的OnMouse…??墒窃冖烟幍亩x是干什么用的呢?這里的事件定義,都是給用戶使用的,也就是說,當使用該控件時,會在Object Inspector中的Event頁面中顯示出來。

  這些鼠標事件的代碼也非常簡單,判斷鼠標的坐標,在畫布上畫出相應的圖片等,并同時觸發相應的事件。值得注意的是,在調用自定義事件時,都要先用⒁處的這樣一個語句來判斷用戶是否已經為該事件編寫代碼。這一點非常重要,否則會調用出錯。

  大家注意到了,剛才所調用的事件都是自定義的,定義的方法也很簡單,和定義屬性差不多,只是類型時TNotifyEvent罷了?!    ?/P>

  TNotifyEvent是默認事件,其定義為:

  TNotifyEvent = procedure(Sender: TObject)

  如果你要定義另外形式的事件,就必須這樣:先在type后編寫

  <事件類型名稱> = procedure(<參?gt;:<類型>)

例如:

  TCustomEvent = procedure(a: Integer; b:String);

然后在public后定義:

   <事件名稱>:<事件類型名稱>

例如:

  AnEvent: TCustomEvent;

  看完這些,這整個程序你應該理解了吧。如果編譯或運行出錯,注意檢查以下幾點:

   ?。?、create和destroy過程中是否有inherited語句;
   ?。?、TBitmap類型的變量create和free了沒有;
   ?。?、過程前有沒有控件名,例如:TPigHorizontalScroller.MoseMove

  判斷鼠標是否進入或離開控件的方法:

定義如下的過程:

  procedure MouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
  procedure MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;

  再在下面編寫代碼就行了。這個方法用于編寫三態按鈕很有用。


上一篇:Delphi和Office程序開發

下一篇:delphi實現批量縮略圖生成工具開發代碼

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品免费播放| 亚洲精品91美女久久久久久久| 91亚洲精品一区| 欧美大片网站在线观看| 亚洲男人天堂久| 国产91在线播放九色快色| 亚洲精品国产欧美| 国产精品美女呻吟| 久久久午夜视频| 国产精品丝袜久久久久久不卡| 欧美日韩亚洲一区二区| 国产精品一区二区久久精品| 538国产精品一区二区在线| 国产不卡精品视男人的天堂| 国产精品九九久久久久久久| 亚洲一区亚洲二区亚洲三区| 久久久久久久久久久国产| 国产精品久久久久久超碰| 欧美一级视频免费在线观看| 成人疯狂猛交xxx| 在线视频精品一| 欧美成年人网站| 亚洲无亚洲人成网站77777| 日韩黄色高清视频| 97色在线视频观看| 97国产成人精品视频| 欧美性xxxx极品高清hd直播| 国产999视频| 久久躁日日躁aaaaxxxx| 91日本在线视频| 亚洲黄色www| 国内精品久久久久久久久| 亚洲国产精品视频在线观看| 中文欧美日本在线资源| 欧美专区在线视频| 92看片淫黄大片欧美看国产片| 成人乱人伦精品视频在线观看| 欧美性生交大片免网| 久久国产色av| 久久韩剧网电视剧| 亚洲精品98久久久久久中文字幕| 国产精品私拍pans大尺度在线| 亚洲第一网中文字幕| 国产极品精品在线观看| xxav国产精品美女主播| 成人激情春色网| 久久精品国产99国产精品澳门| 精品一区电影国产| 九九视频直播综合网| 国产精品色婷婷视频| 欧美人与物videos| 色综合天天狠天天透天天伊人| 久久免费福利视频| 欧美精品一区二区三区国产精品| 欧美综合第一页| 欧美日韩综合视频网址| 日韩视频免费在线| 欧美性猛交xxxxx免费看| 色一区av在线| 精品久久香蕉国产线看观看gif| 国产精品爱啪在线线免费观看| 欧美日韩国产一区中文午夜| 国产精品高潮呻吟久久av黑人| 福利视频第一区| 中文字幕欧美日韩| 国产精品国内视频| 热久久这里只有精品| 日韩中文字幕在线免费观看| 亚洲精品国产精品自产a区红杏吧| 在线播放国产一区二区三区| 欧美激情视频网址| 成人亚洲欧美一区二区三区| 狠狠久久亚洲欧美专区| 久久亚洲精品视频| 午夜精品一区二区三区在线播放| 亚洲深夜福利视频| 国产日韩精品视频| 色综合久久久888| 国产精品美女久久| 欧美性猛交xxxx黑人猛交| xxxx性欧美| 亚洲成人a级网| 国产一区二区黄| 欧美国产日韩一区| 亚洲精品久久久久中文字幕二区| 久久天天躁狠狠躁夜夜躁2014| 欧美一级免费看| 国产午夜精品一区理论片飘花| 国模gogo一区二区大胆私拍| 亚洲第一页在线| 亚洲人成电影在线播放| 欧美在线亚洲一区| 亚洲男人第一网站| 69精品小视频| 国产一区二区欧美日韩| 国产人妖伪娘一区91| 2024亚洲男人天堂| 欧美国产亚洲精品久久久8v| 久久精品国产2020观看福利| 亚洲成人网久久久| 精品国模在线视频| 亚洲字幕一区二区| 欧美性猛交xxxx乱大交3| 欧美性xxxxxxxxx| 日本aⅴ大伊香蕉精品视频| 亚洲视频免费一区| 久久的精品视频| 欧美黑人性生活视频| 欧美精品成人91久久久久久久| 孩xxxx性bbbb欧美| 欧美在线视频免费播放| 91精品啪aⅴ在线观看国产| 欧美日韩国产成人| 欧美精品电影在线| 欧美在线视频免费观看| 91精品久久久久久久久不口人| 中文字幕在线看视频国产欧美| 国产激情视频一区| 国产精品欧美在线| 久久久亚洲国产天美传媒修理工| 成人午夜激情免费视频| 日韩av电影在线免费播放| 久久久久久高潮国产精品视| 91免费综合在线| 国产精品你懂得| 亚洲自拍偷拍福利| 精品自拍视频在线观看| 日韩女优人人人人射在线视频| 欧美性在线视频| 久久精品久久久久电影| 精品国产网站地址| 在线播放国产一区中文字幕剧情欧美| 中文字幕亚洲天堂| 欧美性猛xxx| 日韩亚洲欧美成人| 夜色77av精品影院| 97国产精品视频| 欧美尺度大的性做爰视频| 日韩网站免费观看| 中文字幕日韩av综合精品| 美女视频久久黄| 青草成人免费视频| 日韩欧美成人精品| 成人午夜激情网| 91精品啪aⅴ在线观看国产| 久久精品久久久久电影| 国产精品久久久久久久av电影| 亚洲级视频在线观看免费1级| 亚洲人成在线播放| 欧美高清性猛交| 国产精品久久久久久久电影| 日韩最新中文字幕电影免费看| 日韩在线观看免费全集电视剧网站| 一区二区三区www| 国产视频久久久| 欧美精品激情在线观看| 疯狂蹂躏欧美一区二区精品| 啊v视频在线一区二区三区| 亚洲区中文字幕| 欧美乱大交做爰xxxⅹ性3| 自拍偷拍免费精品| 国产精品久久久久7777婷婷| 亚洲国产成人精品久久久国产成人一区| 91久久在线视频|