国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Delphi編寫高精度定時(shí)器ActiveX控件 - 電腦編程技巧與維護(hù)
摘 要 本文通過一個(gè)編程實(shí)例介紹了Delphi 7下編寫不可視ActiveX控件的方法,并給出了源代碼。為使用Delphi編寫其他類型ActiveX控件的讀者提供參考和借鑒。
關(guān)鍵詞 Delphi,ActiveX控件,定時(shí)器,VCL組件
一、前言
Delphi下有大量?jī)?yōu)秀的且提供源碼的VCL組件,如果想在其他開發(fā)環(huán)境(如VB 6.0,VC 6.0,VS.net等)中使用它們,就必須把這些VCL組件轉(zhuǎn)換成ActiveX控件。目前,關(guān)于把可視化VCL組件轉(zhuǎn)變?yōu)锳ctiveX控件的資料和例子非常多,而把不可視VCL控件轉(zhuǎn)換成ActiveX控件的資料卻很少。筆者在網(wǎng)上找到了一個(gè)優(yōu)秀且開源的高精度定時(shí)器VCL組件,經(jīng)過反復(fù)摸索終于成功將其轉(zhuǎn)換成一個(gè)ActiveX控件。該控件能夠代替VB 6.0中自帶的Timer控件,而且精度更高。在Delphi 7中,Actvieform是基于Delphi 窗體的ActiveX控件,可以像創(chuàng)建一個(gè)標(biāo)準(zhǔn)的Delphi窗體一樣創(chuàng)建ActiveForm,而不是把單個(gè)組件轉(zhuǎn)換成ActiveX控件。本文中,筆者將詳細(xì)介紹如何利用Actvieform來建立一個(gè)高精度的定時(shí)器Activex控件。
二、實(shí)現(xiàn)
1.在Delphi 7中安裝好要使用的VCL組件
本文中要轉(zhuǎn)換的高精度定時(shí)器VCL組件的名稱為THiResTimer,選擇Delphi主菜單中component菜單下的install component子菜單,彈出安裝控件窗體。在Unit file name中瀏覽選擇HIRESTIM.pas文件,并點(diǎn)擊OK即可。安裝成功后,就會(huì)看到THiResTimer控件3個(gè)重要的屬性Enabled、Interval、Resolution和一個(gè)重要的事件Ontimer。在使用Activeform建立ActiveX控件時(shí),可以不必太多關(guān)心VCL組件源碼實(shí)現(xiàn)方式,只注意要實(shí)現(xiàn)的組件屬性和事件即可。
2.創(chuàng)建一個(gè)Activeform
(1)選擇Delphi主菜單中File 菜單下的New,然后單擊New菜單的子菜單other,彈出對(duì)象庫(kù)窗體。
(2)在 ActiveX頁(yè)中雙擊ActiveForm圖標(biāo),出現(xiàn)Activeform Wizard(如圖1所示)。
圖1 Activeform Wizard 主界面
(3)如果想控制其他開發(fā)人員使用自己編寫的ActiveX控件,選擇Make control Licensed選項(xiàng)。Delphi會(huì)自動(dòng)生成擴(kuò)展名為.lic的許可文件和ActiveX控件一起發(fā)布使用。
(4)如果想顯示有關(guān)ActiveX控件的任何其他信息,請(qǐng)選擇 Include About Box選項(xiàng)。
(5)在 Project Name中輸入項(xiàng)目名稱,在 New ActiveX Name中輸入控件名稱,并點(diǎn)擊OK。本文中,項(xiàng)目名稱為mytimerprj,控件名稱為mytimer。
(6)在Delphi工具欄中點(diǎn)擊Save project圖標(biāo)。
本例中首先創(chuàng)建一個(gè)空白窗體,窗體名稱為mytimer??梢栽谠摯绑w上添加想要轉(zhuǎn)換的任何非可視化VCL組件,在這里放置的是一個(gè)名為HiResTimer1的THiResTimer類型控件。
3.Activeform文件生成以后,接下來要做的就是編輯ActiveX控件的屬性或事件。選擇Delphi主菜單中View菜單下的type library子菜單,彈出如圖2所示的Type Library editor ??梢灾苯釉谄渖暇庉媽傩曰蚴录劝严到y(tǒng)默認(rèn)生成的屬性和事件都刪除,圖2中IMyTimer的所有子項(xiàng)是屬性,IMyTimerEvents的所有子項(xiàng)是事件。然后在IMyTimer后添加下列屬性:
圖2 Type Library 屬性設(shè)置窗口
Enabled:VARIANT_BOOL
Interval:long
Resolution:long
當(dāng)改變上面屬性值時(shí),HiResTimer1控件對(duì)應(yīng)的屬性相應(yīng)改變。 程序代碼如下:
//在 保護(hù)字段聲明三個(gè)變量
protected
{ Protected declarations }
FInterval:integer;
FResolution:integer;
FEnabled:boolean;
//改寫DefineProperties虛方法,用以實(shí)現(xiàn)控件屬性值的持久化。
procedure DefineProperties(Filer: TFiler); override;
procedure TMyTimer.DefineProperties(Filer: TFiler);
begin
inherited;
filer.DefineProperty('MyProperty',LoadProperty,StoreProperty,true);
//LoadProperty 和StoreProperty 是以函數(shù)為參數(shù)
end;
// 在DefineProperties方法中需要一個(gè)寫變量函數(shù)作為參數(shù)。
procedure StoreProperty(Writer:TWriter);
procedure TMyTimer.StoreProperty(Writer:TWriter);
begin
writer.WriteInteger(FInterval);
writer.WriteInteger(FResolution);
writer.WriteBoolean(FEnabled);
//持久化三個(gè)保護(hù)字段變量
end;
//在DefineProperties方法中需要一個(gè)讀變量函數(shù)作為參數(shù)。
procedure LoadProperty(Reader:TReader);
procedure TMyTimer.LoadProperty(Reader:TReader);
begin
FInterval:=reader.ReadInteger;
FResolution:=reader.ReadInteger;
Fenabled:=reader.ReadBoolean;
hirestimer1.Interval:=FInterval;
hirestimer1.Resolution:=FResolution;
hirestimer1.Enabled:=FEnabled;
// 讀取屬性值
end;
// 當(dāng)屬性值改變時(shí),修改HiResTimer1控件對(duì)應(yīng)的屬性值。
function TMyTimer.Get_Enabled: WordBool;
begin
Result := FEnabled;
end;
procedure TMyTimer.Set_Enabled(Value: WordBool);
begin
FEnabled := Value;
hirestimer1.Enabled :=FEnabled;
//設(shè)置hirestimer1.Enabled  決定定時(shí)器是否工作。
end;
function TMyTimer.Get_Interval: Integer;
begin
result:=Finterval;
end;
function TMyTimer.Get_Resolution: Integer;
begin
result:=Fresolution;
end;
procedure TMyTimer.Set_Interval(Value: Integer);
begin
Finterval:=value;
hirestimer1.Interval:=Finterval;
// hirestimer1.Interval的作用和VB自帶的Timer定時(shí)器Interval屬性功能一致。
end;
procedure TMyTimer.Set_Resolution(Value: Integer);
begin
Fresolution:=value;
hirestimer1.Resolution:=Fresolution;
// hirestimer1.Resolution 屬性保證定時(shí)器的精度。數(shù)值越小精度越高。
end;
添加完屬性后,還要在IMyTimerEvents中加入Ontimer事件,首先在私有段中定義一個(gè)TimerEvent 函數(shù)。然后在程序Initialize段中讓HiResTimer1.OnTimer = TimerEvent;而在TimerEvent 事件中又調(diào)用FEvents.OnTimer,這樣就能在Ontimer事件中捕獲到HiResTimer1.OnTimer事件。程序?qū)崿F(xiàn)如下所示:
procedure TMyTimer.Initialize;
begin
inherited Initialize;
HiResTimer1.OnTimer:=TimerEvent;
end;
procedure TMyTimer.TimerEvent(Sender: TObject);
begin
if FEvents <> nil then FEvents.OnTimer;
end;
4.因?yàn)槲覀円帉懙氖且粋€(gè)非可視Activex 控件,所以控件在用于VB等開發(fā)環(huán)境時(shí)還應(yīng)具有如下特征即:控件在designtime 時(shí)尺寸應(yīng)固定且可見,而在 runtime時(shí)不可見。以下代碼即可實(shí)現(xiàn)尺寸固定:
constructor Create(AOwner: TComponent); override;
constructor TMyTimer.Create(AOwner: TComponent);
begin
self.AutoSize:=true;
inherited create(aowner);
self.width:=32;
self.height:=32;
self.Constraints.MaxHeight:=32;
self.Constraints.MaxWidth:=32;
self.Constraints.MinHeight:=32;
self.Constraints.MinWidth:=32;
end;
下面這行代碼即可實(shí)現(xiàn)ActiveX控件在designtime 時(shí)可見而runtime時(shí)不可見的功能。
TActiveFormFactory.Create(
ComServer,
TActiveFormControl,
TMyTimer,
Class_MyTimer,
1,
`97B151A-9D6F-4DCC-BAA8-E4B51D2DD68B}`
OLEMISC_INVISIBLEATRUNTIME, //修改后
//OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL, 默認(rèn)參數(shù)
tmApartment);
5.程序編好后,選擇Delphi主菜單中 Run 菜單下的Register ActiveX Server,編譯并注冊(cè) ActiveX控件。這樣就可以在VB等其他開發(fā)環(huán)境中使用,圖3中就是用VB 6.0調(diào)用mytimer控件的例子。用戶可以參考Delphi和VB源代碼并實(shí)際運(yùn)行。
圖 3 調(diào)用mytimer控件
三、結(jié)語
通過編寫不可視ActiveX控件基本的程序框架,便可以編寫其他類型的非可視化ActiveX控件,如加密解密,數(shù)值計(jì)算,系統(tǒng)信息,通用對(duì)話框等。使用Activeform編寫ActvieX控件的優(yōu)點(diǎn)之一是可以把那些不提供源代碼的VCL組件也能轉(zhuǎn)換成ActiveX控件,通過ActiveX控件使Delphi能夠和其他可視化開發(fā)工具一起混合編程。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Delphi筆記-ActiveX控件
activex和javascript交互(delphi版本)
九個(gè)防黑小技巧 讓IE從此變安全
WIN7系統(tǒng)中Delphi中安裝MSCOMM控件方法(保證有用)
TeeChart控件
MSComm串口控件使用出錯(cuò) - 博客文庫(kù) - 博客園
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服