熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

EXE工程和OCX工程的轉化

2013-11-23 17:38:52  來源: Delphi編程 

  從EXE到OCX工程

  此類轉化有一個常用的也可以說較笨的的方法把EXE工程主Form上的所有元素和其事件處理程序都拷貝過來此法雖說穩妥但麻煩的一塌糊塗容易讓人頭大下面著重介紹一個比較快捷省事的辦法通過類的繼承來實現轉化概括來說就是把EXE工程的主Form直接作為OCX工程的主Form並把其父類由TForm改為TActiveForm詳細介紹如下

  ()准備工作

  在開始之前最好把EXE工程的所有文件如pasdfm(工程dpr等除外)拷到一個新的目錄下如果不想這樣做也可以把OCX工程保存到同一目錄但不要和EXE工程重名以免覆蓋生成一個ActiveForm(注意此保持空白不要往其上放任何組件)為了便於說明設其name為ActiveFormX單元文件存為ActiveFormXpas同時保存OCX工程假設原來主Form的name為frmMain單元文件為MainFormpas

  ()改變繼承關系

  打開MainFormpas找到TfrmMain類的聲明部分把TfrmMain = class(TForm)改為TfrmMain = class(TActiveFormX)

  ()把frmMain作為工程的主Form

  打開ActiveFormXpas找到initialization 部分如下所示

initialization

TActiveFormFactoryCreate(

ComServer

TActiveFormControl

TActiveFormX

Class_ActiveFormX

OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL

tmApartment);

  把第五行中TActiveFormX改為TfrmMain這樣OCX工程的主Form就成了原來EXE工程的主Form即TfrmMain

  ()屬性聲明

  查看一下delphi源碼可以看到下面的繼承鏈條

TCustomForm>TCustomActiveForm>TActiveForm

TCustomForm>TForm

  TForm的部分published屬性在TActiveForm未被聲明而這些屬性存在於它們共同的父類TCustomForm中並且在public部分所以你如果在屬性編輯器中改變了frmMain的這些屬性delphi就會從當前類按TActiveFormX>TCustomActiveForm>TCustomForm順序在published部分查找並設置這些屬性而這三個父類published部分並未包含這些屬性這樣delphi將提示地址錯誤所以只要在TActiveFormX中聲明這些屬性問題即可解決以On開頭的事件屬性也是同樣的道理打開ActiveFormXpas把以下代碼拷到TActiveFormX的聲明部分即可

published

property Action;

property Align;

property AlphaBlend default False;

property AlphaBlendValue default ;

property BiDiMode;

property BorderIcons;

property BorderStyle;

property ClientHeight;

property ClientWidth;

property TransparentColor default False;

property TransparentColorValue default ;

property CtlD;

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中有處理程序的聲明一下就行了

  ()更改事件連接

  如果你在TfrmMain的OnPaint事件中寫了代碼可以發現這些代碼是不會被執行的原因何在?打開ActiveFormXpas找到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了


  從OCX到EXE工程

  ()OCX工程框架

  綜上所述OCX工程最好不要把ActiveForm作為主Form而另外生成一個普通Form作為主Form再按上面所說的方法進行處理然後其它的數據操作Form也為普通Form被主Form調用

  ()轉化到EXE工程

  只要你按()做了問題就非常好辦生成一個普通工程把OCX工程除ActiveForm以外的所有Form加進工程就行了ok搞定!


From:http://tw.wingwit.com/Article/program/Delphi/201311/24829.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.