用Dephi的Tolecontainer操纵word制作ocx,为何word菜单无法显示??? ( 积分: 200 )

  • 主题发起人 主题发起人 Devillyd
  • 开始时间 开始时间
D

Devillyd

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ActiveForm,在上面放了一个ToleContainer控件
在运行时用 OleContainer1.CreateObjectFromFile(.....)方法内嵌一个word文档
现有如下问题:
1。内嵌的word没有菜单(文件、编辑等等),但如果用form不用ActiveForm,放个MainMenu控件,做成exe就有,不知如何解决;
2。做成控件后如何传参指定当前用户?(因为我要用户修改文档后在修改痕迹出显示是哪个用户修改的,我调用了部分VBA);
求高手给于解决,急~
 
我用ActiveForm,在上面放了一个ToleContainer控件
在运行时用 OleContainer1.CreateObjectFromFile(.....)方法内嵌一个word文档
现有如下问题:
1。内嵌的word没有菜单(文件、编辑等等),但如果用form不用ActiveForm,放个MainMenu控件,做成exe就有,不知如何解决;
2。做成控件后如何传参指定当前用户?(因为我要用户修改文档后在修改痕迹出显示是哪个用户修改的,我调用了部分VBA);
求高手给于解决,急~
 
就那么难么,200分没人来答???
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1711676
来自:小雨哥, 时间:2003-4-4 0:50:00, ID:1737109
看 http://www.wushuang.net/ 里的 http://www.wushuang.net/develop/upfile.zip


来自:ChildSound, 时间:2003-4-4 13:48:00, ID:1737211
具体的解决方案:
(我正在为一个学校做的远程教育服务)
Word教材文件以字节流的形式保存在数据库中,用ASP将这些Word文件数据从数据库中取出并在网页中显示
前提:服务器/客户端装有Word97以上版本(或者相关组件)

工作原理:

利用 Response对象contenttype的属性,它定义服务器发送给客户端内容的MIME类型。MIME全称Multipurpose Internet Mail Extensions,即多功能Internet邮件扩展。定义了MIME后将超链接指向一个Word或Excel文件,当用户点击这个链接时浏览器会自动调用OLE方法将这个文件打开。之所以能做到这点就是因为用户机器上安装office后会在浏览器中注册对应的MIME资源类型。比如说word文件的MIME类
型是Application/msword(前者是MIME类型,后者是MIME子类),Excel文件的MIME资源类型是Application/msexcel。事实上,凡是浏览器能处理的所有资源都有对应的MIME资源类型,比如说html文件的MIME类型是Text/html,JPG文件的MIME类型是Image/JPG。在与服务器的交互中,浏览器就是根据所接受数据的MIME类 型来判断要进行什么样的处理,对html、JPG等文件浏览器直接将其打开,对Word、Excel等浏览器自身不能打开的文件则调用相应方法打开。对没有标记MIME类型的文件,浏览器则根据其扩展名和文件内容猜测其类型。如果浏览器无法猜出 ,则将它作为application/octet-stream。要了解各种文件的MIME类型,我的电脑->查看->文件夹选项->文件类型 中查看。
在ASP中可以先将WORD数据以字节流方式取出,接着 将其conntenttype属性标记为Application/msword,再将它发送给客户机,客户 机收到这个资源后,根据其MIME类型,会自动调用客户机上的Word(当然,前提是客户机上装了Word,否则会将其作为一个不能识别的资源,提示用户保存起来 ,而不是打开它)将它打开。经试验效果很好,方法简单且速度很快,而且在IE 5中浏览器使用内嵌方式(类似于OLE方式)打开,效果更佳。以下是程序内容。
  
假设有一些Word文件以字节流的形式保存在数据库中,用ASP将这些Word文件数据从数据库中取出并在网页中显示出来
假设表名tab_word,表中有两个字段,一个是整型,名id,用作Word数据的
唯一标识,另一个Blob型,名worddata,里面存放Word数据。现在要在页面上显
示id等于1的Word文件内容, ASP程序如下:

<%
' conn - 已创建的数据库连接
' rs -- 结果集
rs = conn.execute("select
worddata from tab_word where id = 1")
response.contenttype = "Application/msword"
response.writebinary(rs("worddata"))
'注意将结果集中的数据直接用writebinary发送出去,不要用变量
'接收这个数据,否则系统会报错
%>

你也可以通过DELPHI写WEB服务来封装以上ASP代码
客户端以DLL的形式调用
 
to app2001
多谢你的回复
但好像你说的与我的问题有点出入,我不是想实现文件上传,而是如何调出ActiveForm中内嵌的word的菜单
 
我只是提供这个链接网址你参考,并把其中一段贴与你看,希望对你有帮助。
 
寒自己一个,本来到4W就不来了
-------------------------------------------
我用ActiveForm,在上面放了一个ToleContainer控件
在运行时用 OleContainer1.CreateObjectFromFile(.....)方法内嵌一个word文档
现有如下问题:
1。内嵌的word没有菜单(文件、编辑等等),但如果用form不用ActiveForm,放个MainMenu控件,做成exe就有,不知如何解决;
照理说应该是放一个主菜单,OleContainer会自动去融合的,但是以前看过的资料显示这个菜单取不出来,正常取出来的效果菜单是竖着的,也就是右键菜单,而不是主菜单,但是文件菜单是需要自己做的,
以前workjie发布了一个,现在找不到了,
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2597952
另外
http://www.delphibbs.com/delphibbs/dispq.asp?LID=113260
标题: ole菜单合并问题 (200分)
看看有没有什么帮助
2。做成控件后如何传参指定当前用户?(因为我要用户修改文档后在修改痕迹出显示是哪个用户修改的,我调用了部分VBA);
------------------------------
这个也是使用VBA做的,设置Application的UserName就可以了,也就是说楼主需要自己在Activex里面提供一个属性,然用户传入这个参数,然后在里面设置嵌入那个Word的Application的UserName,怎么添加属性楼主应该知道吧
---------------------------------
该属性返回或设置用户姓名,Word 将其用于信封和文档的“作者”属性。String 类型,可读写。

expression.UserName

expression 必需。该表达式返回一个 Application 对象。

示例
本示例设置用户姓名。

Application.UserName = "Andrew Fuller"


-----------------------------------------------------------------
其实楼主需要解决的东西还是比较多的,
1 如果使用OleContainer,需要实现LoadFromStream的那个格式,这样才能实现在内存中打开,而不下载临时文件,而OleContainer默认的格式是BDOC开头的,而且好像还做了一些编码
2 把Word修改的内容传回服务器的时候做压缩加密处理,显示的时候解密解压缩
3 支持标准的HTTP协议,特别是RFC 1867,直接通过HTTP通道传入,这样就可以支持多种Web服务器,
4 获得当前IE框架甚至整个Document的所有的html元素,并获得他们的值,自动提交所有内容

以上个人看法,楼主到时候分点分给我就成了
 
to楼上的
谢谢回复
现在就是不知道怎么取出word菜单了,只要能取出,画个toolbar代替也可以阿。
 
OleWord时一些用用的代码
yzhshi@263.net
一、Delphi程序启动Word
采用CreateOleObjects的方法来启动Word,调用VBA代码,具体实现过程为:
首先使用GetActiveOleObject('Word.Application')判断当前内存中是否存在Word程序,如果存在,则直接连接,如果没有Word程序,则使用CreateOleObject('Word.Application')启动Word
二、Delphi程序新建Word文稿
格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)
Template: 使用模板的名称,
NewTemplate: 新建文档的类型,True表示为模板,False表示为文档
DocumentType: 文档类型,默认为空白文档
Visible: 打捞的窗口是否可见
举例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:/Temlate.dot',NewTemplate:=False);
三、Delphi程序打开Word文稿
格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocument,
PasswordTemplate,Revent,WritePasswordDocument,WritePassWordTemplate,
Format,Encoding,Visible)
FileName: 文档名(包含路径)
Confirmconversions: 是否显示文件转换对话框
ReadOnly: 是否以只读方式打开文档
AddToRecentFiles: 是否将文件添加到"文件"菜单底部的最近使用文件列表中
PassWordDocument: 打开此文档时所需要的密码
PasswordTemplate: 打开此模板时所需要的密码
Revert: 如果文档已经,是否重新打开文档
WritePasswordDocument: 保存对文档更改时所需要的密码
WritePasswordTemplate: 保存对模板进行更改时所需要的密码
Format: 打开文档时所需使用的文件转换器
Encoding: 所使用的文档代码页
Visible: 打开文档的窗口是否可见
举例:
Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False,
AddToRecentFiles:=False);
这个是一些基本操作。另外还有2个以前看到的例子,不过一直都没有调试,你要的话,我就帖出来
 
to gameboyda
谢谢回复,不过这些功能我都能实现了
关键是菜单
 
顶,我也在头疼这个问题
 
另外,如何在插入一个图片后设置它的格式页中的“Web”页中的内容?
 
觉得chenybin说的很实际,
用这个函数可以实现取出word菜单
OleContainer1.DoVerb(ovShow)

现在在头痛word文档内容存回服务器的问题。
大家如有好建议与参考资料可说出来讨论下.
我的email:wind2000sz@sohu.com
 
TActiveForm把property Menu去掉了.

我想了个办法,你们试试,应该没问题
做个有菜单的窗体.然后用
windows.SetParent(FrmMain.Handle, Panel1.Handle);
FrmMain.Width := Panel1.Width;
FrmMain.Height := Panel1.Height;
MoveWindow(FrmMain.Handle, 0, 0, Panel1.Width, Panel1.Height, TRUE);
方法嵌入到activeform的panel中
 
后退
顶部