小探 Delphi8 for .net 的 VCL 类库
2024-07-10 13:04:07
供稿:网友
borland工程师好辛苦啊!首先得感叹这么一句!
前两天,看了一篇delphi8的介绍,于是下来一个装上看看(可能是盗版的,不过我不会用于商业用途!),我使了5年的delphi,从3到6,6以后就开始用.net了。前段时间出了个c#builder,兴奋的装上看了看,而已!
前段时间听说borland要推出"超级"的vcl framework,着有兴趣,因为总觉得microsoft不会真的推出for linux的framework,那么mono更是遥遥无期(估计万不得已,ms会花一些money收掉他)。
装好delphi8后,一启动以为和c#builder差不多(一样启动界面风格,现在我还不解那个黑灰的设计,预示着什么?),根据前面看到的delphi8的介绍,一直对vcl控件不能兼容.net控件不解,探个究竟!见了一个vcl forms的工程一看,还傻不啦叽相硬拖.net控件,门都没有!
还好,vcl类库是开放源码的(跟了ms一段时间,这样的习惯已经没了),一看才知道怎么回事事儿!vcl的控件都是从system.componentmodel.component写下来的,怪不得与.net控件不相容了。就拿tform举例,其是从:system.componentmodel.component —〉tcomponent —〉tcontrol —〉twincontrol —〉tscrollingwincontrol —〉tcustomform一路过来的,当然和system.windows.forms.control下的.net控件不是一路货了,tcontrol和control分道扬镳。不过还好从类库的结构看上去,他们的组件还是可以兼容的,具体的就不一定了!
再看看borland工程师写的vcl源码,就好像开始说的那句话,好辛苦啊!既要完全兼容以前delphi源码,又要支持.net,不能再像以前那样无所忌惮的用api,用汇编,把system.runtime.interopservices.marshal类用的个透熟!不知道还能不能跨平台,估计在什么linux上,这帮borland工程师们又要“好辛苦”了。再写一遍,反正我们比ms的men强,怕什么!
说了半天,两边的控件能不能互调,怎么互调啊?怎么让tcontrol包含control,让control包含tcontrol?
delphi8安装后,发现程序菜单中有一个winforms controls的导入工具,哇,赶紧试一下!转了一个简单的控件,自己写的一个button,没问题,工作的很好!先来看看怎么完成的:
timprulerpanel = class(tnetcontrolwrapper)
private
function getrulerpanel: hose.winform.rulerpanel;
protected
procedure initcontroldata; override;
procedure hooknetevents(acontrol: system.windows.forms.control); override;
procedure unhooknetevents(acontrol: system.windows.forms.control); override;
public
property rulerpanel: hose.winform.rulerpanel read getrulerpanel;
(我删除了不必要的部分)
在.net中调用过activex控件的朋友一定知道,在.net调用activex控件时,dotnet会自动生成一个包装类,就像上面timprulerpanel一样,只不过com对象的包装类是从axhost继承的,这里的包装是从tnetcontrolwrapper继承的,手法很相像。axhose通过getocx或得com控件,这里直接可以获得,都是“一家”,自然要方便一些。我想将来,将vcl控件包装到.net中使用也不是什么难事。
但是在转换其他一些复杂一点的控件,比如包含自定义事件时,就会有一些问题,甚至产生莫名奇妙的错误,我会加强研究,在后来文章中的给大家介绍及其解决的方法。
现在用.net ide开发的同志我不推荐使用delphi for .net,但现在使用老版本delphi的同志,我强烈推荐。既可以保留delphi的一些工程、编程习惯,又可以逐步过渡到.net,使用.net类库的强大功能,真是鱼和熊掌可以兼得阿,只是目前的界面控件的兼容上稍差一点。
另外delphi8也比老版本的delphi有一些其他方面的小进步,比如以前在编译时无法检验含有虚方法的类,现在则可以等。
总的来说,delphi8还是非常值得使用.net开发工具。只看了一小会儿,有什么谬论,希望大家指出和原谅,我也会不断地学习进步!