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事件中写了代码,可以发现,这些代码是不会被执行的。原因