EXE工程和OCX工程的转化(2002/5/30 三金 版权所有)

原创 2002年12月02日 09:42:00
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->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,搞定!
更好更多文章尽在三金主页-天铭心草堂
http://vip.6to23.com/tianmingxin

ocx工程及不显示椭圆的方法

建立ocx工程步骤: 一,新建MFC ActiveX控件工程,输入工程名,一路默认至完成。 二,建好工程后会自动添加很多东西。自己想要封装进ocx的函数右击类视图中xxxLib下的  _Dxxx,添加...
  • ligongdaxiaoxue
  • ligongdaxiaoxue
  • 2016年04月13日 17:11
  • 583

如何将VS向导生成的DLL工程切换到EXE配置

如何将VS向导生成的DLL工程切换到EXE配置 问题现象 操作步骤 问题现象调试一个大的工程时手动对编写的代码进行单元测试,已经在工程属性对话框中将“配置”生成模式从“DLL”切换到“应用程序(即EX...
  • bensnake
  • bensnake
  • 2016年08月16日 17:44
  • 2482

将java工程导出为jar包并转换成exe执行文件

将java工程导出为jar包 1.在工程上右键,选择export,选择java-jar file,选择Runnable JAR file可以把依赖库也自动添加到jar中。 2.选择需要导出的文件和...
  • linchaolong
  • linchaolong
  • 2014年07月06日 23:50
  • 1660

畅通工程之最低成本建设问题

Think: 看了输入样例,目测是 最小生成树 问题。。而且还是模板题。。。既然是最小生成树问题,所以我就直接用了Prim算法。。初始化什么的还是老套路,直接写就可以了。。。因为最后在判断是否存在...
  • zb756999355
  • zb756999355
  • 2017年02月22日 11:31
  • 693

在VS中如何把exe关联到DLL工程中

调试dll工程时关联外部exe 在调试DLL工程项目时,需要把外部的exe文件关联到本项目中,VC和VS具体操作如下: 在VC中: 鼠标右键点击工程名》设置》调试》可执行调试对话:(在下面输入你要...
  • s18754992795
  • s18754992795
  • 2016年06月01日 10:34
  • 1769

我的欧拉工程之路简介

欧拉工程是一个在线解题网站。目前有563题,由简入难。每个题目都可以用计算机在1分钟内出结果,不过这句话是写在03年左右的,现在的电脑不需要那么久。如果你在解题过程中发现你的程序跑了半个小时,那么你就...
  • chen595572
  • chen595572
  • 2016年10月13日 15:46
  • 526

OCX制作CAB(一) -- OCX工程的创建

第一章:OCX工程的创建,及生成相应的OCX文件1、创建简单的OCX文件并调试调用 这里不再对该种情况做详细介绍,网络上有许多类似的文档2、OCX封装dll 2.1、创建OCX工程 2.2、添加...
  • nodototao
  • nodototao
  • 2017年07月24日 11:11
  • 82

ffmpeg.exe移植到vs2010编译步奏

1、概述 跟ffmpeg源码有很多方式,但是用eclipse的时候,顺序老是乱跳,很不方便,于是想到把ffmpeg.exe移植到vs下,只移植了exe,库文件这些还是用mingw编译的,相当于一个调...
  • dancing_night
  • dancing_night
  • 2015年05月20日 10:19
  • 1622

STM32工程在MDK5.13中新建工程步骤

------------------------------------------------------------------------------- 申明:本文只是为了方便自己查看收藏...
  • dm12mail
  • dm12mail
  • 2017年04月11日 10:19
  • 265

Activex、OLE、COM、OCX、DLL之间的区别(转)

熟悉面向对象编程和网络编程的人一定对ActiveX、OLE和COM/DCOM这些概念不会陌生,但是它们之间究竟是什么样的关系,对许多们还是比较模糊的。在具体介绍它们的关系之间,我们还是先明确组件(Co...
  • u012513234
  • u012513234
  • 2015年09月12日 15:17
  • 759
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EXE工程和OCX工程的转化(2002/5/30 三金 版权所有)
举报原因:
原因补充:

(最多只允许输入30个字)