当前位置:主页>销售管理软件> 列表

1000分!用delphi实现可以在word里嵌入的对象。

企业管理软件版1楼: 各位大哥:
我在大富翁和K.top上,一直想和各位高手请教一些关于用delphi 实现ActiveX Document Server的问题。问题的提出是源于这样一个需求。我做了一个类似图形编辑的软体,用自己的程序生成自己定义的文件格式。但用户提出,需要将编辑好的东西嵌入到word文档里。我见到类似的软件实现了这个功能(如公式编辑器):它们在word里注册了一个可插入的对象,当我们新插入一个自己的对象,双击这个对象的时候,就可以回到我自己的软体里来编辑这个对象。编辑完成,退出程序,word里的对象也更新了。
我在网上找了很久,也请教了很多高手,但似乎用delphi难以实现这样的功能。甚至连如何注册成一个可插入的对象都让我难以下手。后来我发现borland新闻组里有人介绍一篇1999年的文章介绍过这类的实现,还有源码http://www.thedelphimagazine.com/disks/dmag43.zip,http://www.thedelphimagazine.com/disks/dmag42.zip, 在comcorn目录里)。该程序建立了一个Tmemo类型的可插入对象,并成功地实现了注册成一个可插入的对象。我把Tmemo类型换成其他类型如TButton,Tpanel都可以, 但有几个问题似乎是还没有解决:

1.双击word里的这个对象,不能回到自己的软体进行编辑。更谈不上如何将编辑后的结果再更新到word里了。(老外的这个程式里提供了一些思路,即重载SaveToStream(const Stream: IStream);和LoadFromStream(const Stream: IStream);来传递对象的信息,但似乎没起作用),各位老大,这些地方该如何改进呢?

2。老外的程序的这个TActiveXDocument对象是从TActiveXControl继承来的,在word里点击它似乎无法获得焦点,反复几次后就出错了。是不是选择从TActiveXControl继承本身就是错的?应该从哪个对象继承呢?TActiveFormControl?

3。我所见过的可以实现上述需求的软体(如公式编辑器)是这样操作的,在word里单击对象,则选中,双击对象则调出程式主界面,开始编辑,存盘后退出,更新word里的对象显示。这个在程序里,我想是要重载DOverb方法来实现吧,但我一直没有成功。:(,怎么样能找到并响应这个双击事件呢?



也许,关注这个问题的朋友会在http://www.evocorp.com/Delphi/ADDActiveDocuments.htm里找到另外的线索,我比较了它和comcorn的区别,很明显的是,他们之间有很类似的地方(作者在2004年才做的更新),而且,它没有demo,根据它提示的方法,我花了9牛2虎的力气建立了一个sample,但效果和dmag42.zip,comcorn有同样的问题。

我自己写的demo,基本上是沿袭了dmag42.zip的框架(想要的大哥说一声,email给您),注意,不要用它给的AxCtrls.pas(delphi自己有),在uses里要加入Variants,omgw.[1] := 1;改成omgw.width[1] := 1;就可以编译成功了。运行一次程序,在word里,你就会发现,在插入--对象里有一项“delphi activex Document object”了。


这个问题很有挑战性,我研究了很久,但始终不得要领,希望各位大哥齐心协力,能在此基础上有所突破,让小弟寝食能安。
这真是一个难于归类的问题,但希望其他版的版主也能关注,尝试一下如何解决这个问题,小弟不甚感激。

2楼: 老兄,帮你顶一下,顺便看看我的
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3221466 如进销存文档

3楼: 还没做过,帮你顶下吧。

4楼: 高手,高手呢?高手高手之高高手呢?[:(]

5楼: 我是初学者来这里学习 !谢谢!

6楼: 我了想向里面导出图像就是dbchart之类的图形,一块儿探讨了。我QQ:99399546

企业管理软件版7楼: 其实我觉得上面的问题都不是问题,我前段时间也在研究着方面,怎么让WORD保存ACTIVEX的属性才是最重要的,似乎delphi的接口有问题。我怀疑MS在这个地方把BROLAN耍了

8楼: WORD的接口似乎跟其他的可编程软件(例如VB)不同,用DELPHI写出来的OCX在VB里能够很顺利的调用到SAVE和LOAD两个方法,把属性保存和取出来,但是WORD只能调用到SAVE方法,而且是在WORD文档刚被打开的时候就调用了2次SAVE方法,其实在这里应该最先调用到LOAD方法的。所以即使在WORD文档关闭时顺利的执行了SAVE PROPERTIES,重新打开文档还是会发生所有属性被重置的情况
如果有谁解决了这一点,请给大家讲讲怎么实现的,如果没有,我劝LZ还是转用VB来做这个东西,VB在上面我说的那点上做得很好,比VC、DELPHI都要好

9楼: pl5th2001大哥:我也注意到WORD只能调用到SAVE方法,打开时没有调用到LOAD方法,kao,borland的大侠们难道没有注意到这一点吗?
另:delphi里是不是只能通过这种activex的方法来实现这一需求吗?还有没有其他方法呢?

10楼: 我也注意到load后,以前的属性和编辑的内容都没有了,只是又重新初始化了一遍:(

11楼: 关键是WORD虽然是个万能容器,但我们一般有只能用OCX文件在里面使用,其他的方法有是有,都不方便,比如VBA就很麻烦,不够灵活。也许在DELPHI8或者2005中已经解决了呢。最主要的原因还是做这方面的人太少,即使有会的也肯定作为公司机密不肯透露出来。BROLAND在做测试的时候肯定做不到那么细致,没人报告错误也就这么算了。

去年年低的时候有个人告诉我他已经解决了,不过代码不肯给,要钱才肯,我花了好几百把代码买过来,结果一看并不是我想要的,那种方法虽然能保存属性,但并不安全,而且在大量运用的时候问题也多多

12楼: 能不能发个编译后的sample给我,如果可以,我愿意花300块RMB给你买代码。现在,我必须解决这个问题。 如金蝶财务软件论坛

13楼: 我也只能说 顶

企业管理软件版14楼: 楼主,帮你顶。
另,你的链接我下载不了,能不能发个给我?(我的email: Jonson_sunshine@126.com)
谢谢

15楼: 帮你顶下吧。

16楼: 使用CreateOleObject的方式吧,并且,将Word以SetParent的方式嵌进你的程序里面去。要不,你要累死,并且,很难得到满意的结果。

17楼: 不要使用OleContainer,这个东西问题多多。

18楼: 其实我所说的方式是使用了动态com接口,创建word后,得到word的句柄,再设置word的父窗口为你程序的一个窗口(或者容器)

19楼: ChaseSun兄似乎曲解了我的需求。

20楼: 我最近做了与你类似的一个OCX,是用来在WORD里画矢量图的。序列化问题用Delphi的代码是有问题。我是自己从写的TActiveControl类,把ActiveX要求 实现的接口重新都实现一回,这样就可以解决了你们上面所出现的问题

企业管理软件版21楼: ycguser兄,能否发个可运行的demo,我想证实一下你的程序的实现是否实现了我的需求。。。

22楼: 国庆节回老家了,没上网看过,今天才上来。我觉得做这个还是用VB或者VC来写,VB的话很简单,VC的话要自己写接口,不过MS的网站上有个现成的例子,不用白不用吧:))

ChaseSun讲的太泛泛了,其实在《DELPHI深度编程》(好象是这本,书在公司里)里就有讲到如何在WORD里使用ACTIVEX技术,有部分要修改注册表的,用来设置ACTIVEX的启动的 如管家婆管理软件

23楼: 我曾经想过在WORD里添加宏,不过这个问题实在太多了

24楼: 老吴~~```这个问题我其实已经测试很久了,查询了很多的资料。几乎你留过影子的地方(例如google group、yahoo group)我都又去看了一遍,只有网上有"OLE/AcitveX/Document/COM/InPlace/..."这些关键字的网页我都看了一个遍,手上现在有的关于ActiveX的资料下载、阅读了约30多个M~~~~`````



结果,还是无解。在delphi中,要实现这个“过时的技术”,花费的功夫是难以想见的。:(

昨天就收到你的mail了。本来也想一早就给你回复,但是总觉得没做完,不好意思交差,于是又拖了一天、又拖了一天,但现在还是没有答案。而邮件被MMM(Magic Mail Monitor)给误删除了。哎~~````所以这里想给你回mail的时候,就跑到delphibbs里来找你了。

我现在想你所需要的功能,难道一定是要用向word里加和一个AcitveX Document才能解决的吗?有没有可能绕过它。此外,我想我们能联系一下,交换一下资料,或者更有宜于下一步的分析。你看呢?