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

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

  1. 【特征工程】特征工程技术与方法

    引言 在之前学习机器学习技术中,很少关注特征工程(Feature Engineering),然而,单纯学习机器学习的算法流程,可能仍然不会使用这些算法,尤其是应用到实际问题的时候,常常不知道怎么提取特 ...

  2. VS2015工程转换为VS2013工程方法汇总

    一.引用 转载1:http://www.cnblogs.com/jmliao/p/5594179.html 转载2:http://blog.csdn.net/xiaoxiaoyusheng2012/a ...

  3. SVN工程转Git工程Github托管

    SVN工程转Git工程&Github托管 1. 介绍 2. autoAudioTest之SVN转Github步骤 Step 1 工作环境(ubuntu) Step 2 安装升级必要软件 Ste ...

  4. 关于工程教育和工程教育专业认证工作的思考——吴岩司长在工程教育高峰论坛上的讲话

    2020年10月20日,中国工程教育认证协会在北京举办工程教育高峰论坛,教育部高等教育司吴岩司长以<关于工程教育和工程教育专业认证工作的思考>为题作了重要讲话,100多位工程教育和行业企业 ...

  5. 【Flutter】Flutter 混合开发 ( 关联 Android 工程与 Flutter 工程 | 安卓页面中嵌入 Flutter 页面 | 安卓中启动 Flutter 页面 )

    文章目录 前言 一.创建 Android 项目 二.关联 Android 工程与 Flutter Module 工程 1.配置 Flutter Module工程 2.配置 build.gradle 3 ...

  6. 把java 工程转为 maven 工程

    2019独角兽企业重金招聘Python工程师标准>>> 1. 前言 在开发中经常要建立一个Maven的子工程,对于没有模板的同学来说从Java工程来转换也是一个不错的选择.本文就如何 ...

  7. Java工程转换为Maven工程-b

    1. 前言 在开发中经常要建立一个Maven的子工程,对于没有模板的同学来说从Java工程来转换也是一个不错的选择.本文就如何从一个Java工程创建一个Maven工程做了一个介绍,相信对于将一个Jav ...

  8. flex java 开发环境搭建_Flex+JAVA+BlazeDS开发环境配置(Java工程和Flex工程独立)

    Flex+JAVA+BlazeDS开发环境配置(Java工程和Flex工程独立) 2019年12月07日 阅读数:7 这篇文章主要向大家介绍Flex+JAVA+BlazeDS开发环境配置(Java工程 ...

  9. java工程转maven工程_Java工程转换为Maven工程

    1. 前言 在开发中经常要建立一个Maven的子工程,对于没有模板的同学来说从Java工程来转换也是一个不错的选择.本文就如何从一个Java工程创建一个Maven工程做了一个介绍,相信对于将一个Jav ...

最新文章

  1. 人工智能:第一章 绪 论
  2. OpenKruise v0.5.0 版本发布,支持无损的流式分批发布策略
  3. 检索数据_13_从表中查询空值
  4. Mybatis主线流程源码解析
  5. huffman图像编码C语言,Huffman编码的c语言实现
  6. spring——autowire自动注入
  7. 输出结果 配置_用单端仪表放大器实现全差分输出
  8. 16. 页框回收 2010-02-28 22:56 591人阅读 评论(0) 收藏...
  9. html5双日期时间选择控件,bootstrap daterangepicker双日历时间段选择控件详解
  10. DNN硬件加速器设计3 -- DNN Accelerators(MIT)
  11. SQL ifnull、nullif 等函数
  12. 中国传媒大学计算机课程表,中国传媒大学新闻学院课程表.doc
  13. java BASE64Encoder详细介绍及简单实例
  14. Polyanskiy’s bound
  15. html立体魔方图片制作,各种三D立体魔方相册制作代码
  16. USACO Training Section 1.3 Calf Flac 解题报告AC代码
  17. open-cv 读存图片
  18. 使用boostrap制作导航栏
  19. 星速配资:煤炭概念股大幅拉升 看好投资机会
  20. JS模仿腾讯微博app撕纸效果

热门文章

  1. css中 vertical-align 属性的应用和案例
  2. 广播(Broadcast)的简单用法
  3. 展会客流统计的客流统计系统,WiFi客流每时每客
  4. 同程旅行Hadoop集群跨机房迁移实践
  5. [学习经验] 考研经验略谈
  6. 设计一个程序,在顺序表中采用分块查找发查找关键字。
  7. CTF新近学习经验和疑难
  8. iOS创建沙盒账号的步骤和注意事项
  9. 虚拟机实现(C语言)
  10. 【C++】(二) 类和对象的定义与使用