在C++Builder中使用Delphi控件

2016-02-19 16:34 13 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的在C++Builder中使用Delphi控件,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

  Delphi的出现将一大批程序员带入了Windows下的可视化编程,为一些C&C++的死党程序员所羡慕、感叹。直到C++Builder的出现这些Programer才用到了梦寐以求的编程工具,也将一些不得已"投敌"到Delphi下的程序员又拉回到C++的怀抱。她正真将Windows下的可视化编程和面向对象编程语言有机的融合在一起。但是由于C++Builder面市时间较短固而可用的控件不多,而且控件的使用也只针对某一版本,相互之间的可互用性不好,除非你有SourceCode;对于Delphi就更不用说了,C++Builder根本不能用,当然如果你有SourceCode那么你可以转写成C++Builder的控件,不过你还得经过n遍的Compliem遍的Step&Go。

  Delphi拥有强大的控件群,如何使用这些控件一直苦恼着我们这些C++Builder的追随者,我通过一些项目的实践掌握了一些如何在C++Builder中使用Delphi控件的方法。

  我的使C++Builder使用DelphiVCL类库的方法基于Windows中较通用的DLL方式。在实际应用中找到了将VCL控件转化为DLL库,在C++Builder动态调用DLL。此法适用于非可视VCL控件。

  假令在Delphi中有一Sample控件,有属性Actived、Pro1、Pro2,欲将这个控件转到C++Builder中使用。

  一:Delphi中DLL的制作

  1.在Delphi中新建一DLL项目SampleDLL,时在此项目中Create一个新的类TTtempcomp基类为TComponent即也为一个控件,在其中加入一个constructorCreate1,但不作任何动作;

  2.在DLL中加入要导出的属性的Function(Actived、Pro1、Pro2)&Create、Destroy的框架,Exports中加入导出的Function、Procdure名称;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  3.在DLL的主过程中对TTempcomp的实例temp1进行Create1,另外保存出口和设置ExitProc;

  4.在OpenSample的函数中加入HwCtrl:=Sample1.Create(temp1)对Sample进行实例化,对CloseSample和其它属性加入相应的语句;

  二:C++Builder中DLL的使用

  1.将Delphi中生成的DLL用implib生成LIB文件加入C++Builder的工程文件;

  2.在头文件中加入

  

extern "C" __declspec(dllimport) bool _stdcall OpenSample(void);
extern "C" __declspec(dllimport) void _stdcall CloseSample(void);
extern "C" __declspec(dllimport) bool _stdcall Actived(void);
extern "C" __declspec(dllimport) int _stdcall Pro1(void);
extern "C" __declspec(dllimport) int _stdcall Pro2(void);
3.在OpenSample后你就可以使用Delphi中的属性Actived、Pro1、Pro2

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  三:参考DLLSource如下:

  

librarySampleDLL;
uses SysUtils,Classes,Sample;
TYPE
  TTempcomp=class(TComponent)
  private
  public
   constructorCreate1;
  published
end;
var
Sample1:Sample;
SaveExit:Pointer;
temp1:TTempcomp;
constructorTTempcomp.Create1;
begin
//inheritedCreate(self);
end;
/==============================================
functionOpenSample:Boolean;stdcall;export;
begin
  HwCtrl:=Sample1.Create(temp1);
  IfSample1.Activedthenresult:=true;
end;
procedureCloseSample;stdcall;export;
begin
  Sample1.Destroy;
end;
functionActived:Boolean;stdcall;export;
begin
  result:=Sample1.Actived;
end;
functionPro1:Interger;stdcall;export;
begin
  result:=Sample1.Pro1;
end;
functionPro2:Interger;stdcall;export;
begin
  result:=Sample1.Pro2;
end;
/==============================================
procedurelibexit;far
begin
  if Sample1.Actived=true then
   Sample1.Destroy;
  ExitProc:=SaveExit;
  temp1.Destroy;
end;
exports
OpenSample,CloseSample,Actived,Pro1,Pro2;
begin
  temp1:=TTempcomp.Create1;
  SaveExit:=ExitProc;
  ExitProc:=@libexit;
end.

  解释:

  因为VCL控件都继承于TComponent,TComponent的构造函数需要一个AOwner并且也是Component,VCL控件的Create、Destroy都由控件的拥有者来动作,也就是AOwner;所以我在此DLL中新设置了一个TTempcomp类继承于Tcomponent且性设置了一个constructor(构造函数)Create1,而实际构造时什么都不做,以次作为要Create的Aowner;

  其他还有一种办法就是用Application作为Aowner但是它是基于Tform的作出来的DLL太大;

  其实,Inprise(原Borland)尽可以象MicroSoft一样用一些象DCOM类似的组件形式使得产品在同一产品时代保持一定的互用性,来增加产品群的生命力.

来源:https://www.tulaoshi.com/n/20160219/1612457.html

延伸阅读
************************************************************************************** * [翻文转字]C++ Builder控件版 * * V1.0 正式版 使用说明 * * 2000-04-30 * ************************************************************************************** 版权说明: ------------- 作者:周...
怎样在vc、delphi、vb等程序中使用mysql呢(mysql odbc驱动程序的使用) 我们经常会遇到这样问题,怎样在非web程序或asp程序中使用mysql数据库呢?对于这个问题有两个解决方案: 1.使用mysql提供的api函数库。 很多有名的mysql客户端工具就是这样实现的,大名鼎鼎的winmysql工具就是这样的。这在大部分的开发工具中都可以实现。比如...
异形按钮非常有趣,就是按钮的形状不是标准的长方形或正方形,而有一丝叛逆异形嘛,是不是?怎样才能实现异形按钮呢?由于Window 95增加了对窗口区域概念的支持,使得窗口区域就是所定义的窗口看上去的形状,窗口区域作为窗口的实际边界区域,这样窗口区域不仅定义了窗口的可画区域,而且定义了窗口下隐含区域和响应鼠标击键事件的响应窗口...
在信息爆炸式增长的今天,每天都有大量新的网站诞生,每时每刻网上都传递着难以计数的信息。建立网站来进行自我宣传和信息交流已成为一种新潮的媒体宣传方式,多姿多彩的网页也成为Internet中最为绚丽的部分。您也许已经注意到,在网络速度不断提高的今天,网站的站主们为了留住访问者的视线,开始越来越多地在网页中使用精美的动画、交互...
标签: Delphi
  Delphi不仅可调用C++产生的DLL模块,同样C++程序也可调用Delphi所产生的DLL部件。这样交互调用,无须重复开发,大大缩短了生产周期。…… Delphi与VisualBasic、VisualFoxPro等软件一样,属于RAD工具(快速应用开发工具)。适合开发32位或16位/32位混合应用程序。Delphi所使用的程序语言是ObjectPascal,是结构化...

经验教程

840

收藏

67
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部