国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

EXE工程和OCX工程的轉化

2019-11-18 18:40:14
字體:
來源:轉載
供稿:網友
EXE工程和OCX工程的轉化(2002/5/30 三金 版權所有)1 從EXE到OCX工程    此類轉化有一個常用的也可以說較笨的的方法,把EXE工程主Form上的所有元素和其事件處理程序都拷貝過來。此法雖說穩妥,但麻煩的一塌糊涂。容易讓人頭大。下面著重介紹一個比較快捷省事的辦法,通過類的繼承來實現轉化。概括來說,就是把EXE工程的主Form直接作為OCX工程的主Form,并把其父類由TForm改為TActiveForm。詳細介紹如下。(1)準備工作    在開始之前,最好把EXE工程的所有文件如.pas、.dfm(工程.dPR等除外)拷到一個新的目錄下。如果不想這樣做,也可以把OCX工程保存到同一目錄,但不要和EXE工程重名,以免覆蓋。生成一個ActiveForm(注意:此保持空白,不要往其上放任何組件),為了便于說明,設其name為ActiveFormX,單元文件存為ActiveFormX.pas,同時保存OCX工程。假設原來主Form的name為frmMain,單元文件為MainForm.pas.(2)改變繼承關系    打開MainForm.pas,找到TfrmMain類的聲明部分:把TfrmMain = class(TForm)改為TfrmMain = class(TActiveFormX)(3)把frmMain作為工程的主Form    打開ActiveFormX.pas,找到initialization 部分,如下所示:initialization  TActiveFormFactory.Create(    ComServer,    TActiveFormControl,    TActiveFormX,    Class_ActiveFormX,    1,    '',    OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,    tmApartment);把第五行中TActiveFormX改為TfrmMain,這樣OCX工程的主Form就成了原來EXE工程的主Form,即TfrmMain。(4)屬性聲明     查看一下delphi源碼,可以看到下面的繼承鏈條:  TCustomForm->TCustomActiveForm->TActiveForm  TCustomForm->TFormTForm的部分published屬性在TActiveForm未被聲明,而這些屬性存在于它們共同的父類TCustomForm中,并且在public部分。所以,你如果在屬性編輯器中改變了frmMain的這些屬性,delphi就會從當前類按TActiveFormX->TCustomActiveForm->TCustomForm順序在published部分查找并設置這些屬性,而這三個父類published部分并未包含這些屬性。這樣,delphi將提示地址錯誤。所以,只要在TActiveFormX中聲明這些屬性,問題即可解決。以On開頭的事件屬性也是同樣的道理。打開ActiveFormX.pas,把以下代碼拷到TActiveFormX的聲明部分即可。  published    property Action;    property Align;    property AlphaBlend default False;    property AlphaBlendValue default 255;    property BiDiMode;    property BorderIcons;    property BorderStyle;    property ClientHeight;    property ClientWidth;    property TransparentColor default False;    property TransparentColorValue default 0;    property Ctl3D;    property UseDockManager;    property DefaultMonitor;    property DockSite;    property DragKind;    property DragMode;    property Enabled;    property ParentFont default False;    property FormStyle;    property HelpFile;    property Icon;    property Menu;    property ObjectMenuItem;    property ParentBiDiMode;    property Position;    property Visible;    property WindowState;    property WindowMenu;    property OnCanResize;    property OnClose;    property OnCloseQuery;    property OnConstrainedResize;    property OnDockDrop;    property OnDockOver;    property OnEndDock;    property OnGetSiteInfo;    property OnHide;    property OnHelp;    property OnMouseWheel;    property OnMouseWheelDown;    property OnMouseWheelUp;    property OnResize;    property OnShortCut;    property OnShow;    property OnStartDock;    property OnUnDock;對于上面所列的事件屬性,也不必全部都聲明。frmMain中有處理程序的聲明一下就行了。(5)更改事件連接    如果你在TfrmMain的OnPaint事件中寫了代碼,可以發現,這些代碼是不會被執行的。原因何在?打開ActiveFormX.pas,找到TActiveFormX的Initialize過程,可以發現如下代碼:  inherited Initialize;  OnActivate := ActivateEvent;  OnClick := ClickEvent;  OnCreate := CreateEvent;  OnDblClick := DblClickEvent;  OnDeactivate := DeactivateEvent;  OnDestroy := DestroyEvent;  OnKeyPress := KeyPressEvent;  OnPaint := PaintEvent;原來問題出在這里,OnPaint事件被delphi吃掉了,改成了執行PaintEvent。怎么搞?把次行注釋掉吧,然后再寫一個你自己的OnPaint事件處理過程,不要忘了帶參數sender。如:procedure MyPaint(Sender:TObject);然后在TfrmMain的OnCreat事件中賦給OnPaint就行了。如:OnPaint:=MyPaint; 上面列舉的幾個事件都和OnPaint類似。模仿OnPaint就ok了。2 從OCX到EXE工程(1)OCX工程框架    綜上所述,OCX工程最好不要把ActiveForm作為主Form,而另外生成一個普通Form作為主Form,再按上面所說的方法進行處理。然后其它的數據操作Form也為普通Form,被主Form調用。(2)轉化到EXE工程   只要你按(1)做了,問題就非常好辦。生成一個普通工程,把OCX工程除ActiveForm以外的所有Form加進工程就行了。ok,搞定!
 

上一篇:Windows通知欄圖標高級編程概述

下一篇:如何實現API鉤子

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片
猜你喜歡的新聞
猜你喜歡的關注

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 通海县| 张家口市| 新龙县| 大同市| 蓬莱市| 泗洪县| 康乐县| 天柱县| 静乐县| 汉中市| 临朐县| 聊城市| 梧州市| 马边| 尼勒克县| 汨罗市| 嘉义市| 延长县| 田东县| 卫辉市| 兴化市| 嘉鱼县| 阿拉善左旗| 清镇市| 宁国市| 大渡口区| 淳安县| 剑阁县| 张家口市| 靖州| 商河县| 大方县| 曲靖市| 茶陵县| 德安县| 牙克石市| 漳平市| 秦皇岛市| 卢氏县| 建瓯市| 镇安县|