程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> EXE工程和OCX工程的轉化

EXE工程和OCX工程的轉化

編輯:Delphi
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->TForm
TForm的部分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,搞定!
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved