请问如何将Word自然协调的嵌入Delphi? 急,高手指点~~~~~~~~~~~~~~~~~~(200分)

  • 主题发起人 主题发起人 tysea
  • 开始时间 开始时间
T

tysea

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序界面上有一个Toolbar,Toolbar上有两个button,一个“打开文档”,一个“保存文档”,一个TreeView,一个Splitter,一个OleContainer
有几个问题,查了很多资料,一直没有很好的解决,几天来一直被困扰,很是苦恼。
(1)如何在程序启动时在激活的OleContainer里Create一个空的Word文档,而不是OleContainer1.CreateObjectFromFile('C:/temp.doc',false); Container1.DoVerb(ovShow);这样打开一个指定的空文档。
(2)打开的Word工具栏是在ToolBar下独占了一行显示,怎么样才能与左边的TreeView的Top相同,不独占一行。
(3)打开两个Word文档前后Word工具栏先消失再显现出来,很不美气请问怎样才能不让工具栏刷新,一直处在正常显示状态
(4)打开文档的速度很慢,记得以前有人说启动一个Word进程(具体什么记的不是很清楚了),请问怎么启动。
单位一个老前辈的作品里这些问题都很好的处理,给人的感觉就是把Word缩小了放到OleContainer里了,可惜现在一直联系不到他,不能得到指点(555),请大家帮忙,高手指点一二,分不够我再给。
源码如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ToolWin, dxtree, ExtCtrls,
OleCtnrs, DB, ADODB;

type
TForm1 = class(TForm)
OleContainer1: TOleContainer;
Splitter1: TSplitter;
ToolBar1: TToolBar;
btnOpen: TButton;
btnSave: TButton;
ADOConnection1: TADOConnection;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
TreeView1: TTreeView;
ADOTable1: TADOTable;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnOpenClick(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
private
{ Private declarations }
function GetDocName: String;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
OleContainer1.CreateObjectFromFile('C:/temp.doc',false);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
OleContainer1.DoVerb(ovShow);
end;

function TForm1.GetDocName: String;
var
MyExePath, FileName: String;
begin
Result := '';
MyExePath := ExtractFilePath(Application.ExeName);
FileName := MyExePath + '图书文档.Doc';
try
TBlobField(ADOQuery1.FieldByName('图书文档')).SaveToFile(FileName);
Result := FileName;
except
end;
end;

procedure TForm1.btnOpenClick(Sender: TObject);
var
SqlStr: String;
begin
SqlStr := 'select * from docManager where 图书名称=' +
TreeView1.Selected.Text;
with ADOQuery1 do begin
SQL.Clear;
SQL.Add(SqlStr);
Open;
end;
if ADOQuery1.FieldByName('图书文档').AsVariant = '' then exit;
if GetDocName <> '' then begin
OleContainer1.CreateObjectFromFile(GetDocName,False);
OleContainer1.DoVerb(ovShow);
end;
end;

procedure TForm1.btnSaveClick(Sender: TObject);
var
tSaveFile, Doc_FileName: String;
begin
tSaveFile := 'C:/TempSave.DOC';
try
OleContainer1.SaveAsDocument(tSaveFile);
with ADOTable1 do begin
Edit;
Doc_FileName := TreeView1.Selected.Text;
FieldByName('图书名称').AsString:=Doc_FileName;
TBlobField(FieldByName('图书名称')).LoadFromFile(tSaveFile);
Post;
end;
except
end;
end;

end.
 
不太明白,帮你提一下
 
上面的代码,我没看出来有哪些高超的地方啊
 
你的email?发点资料给你参考一下。
 
to wuyu1981:
我的Email : lovezuere@sina.com 先谢谢你了 :)
to yubing8:
那个代码当然不是老前辈的,是我自己写的,要有他的代码,我的问题就解决了 :)
另感谢你对wjp888的帖子回复,我和他是朋友,他的号没分了,我上我的号帮他一下,
同时也想研究一下OLE这方面的知识。
 
我觉的使用olecontainer控件来嵌入word就可以实现~~~~~~~
word~程序作为服务器
delphi的olecontainer作为客户端,
你自己先试试~~~~~
word 好象支持ole2(word嵌入的效果很好的)
只要在窗体设计好,就可以不写代码就在可以完成嵌入。
 
D_V_P,我是用的Olecontainer嵌入Word,用起来很是生硬。打开文档速度慢,WORD工具条
不够听话,打开下一个文档中间会先消失一阵再显示出来。。。。。
 
最近大家都很忙吗。。。。。。。。。。。。
 
(1)打开的Word工具栏是在ToolBar下独占了一行显示,怎么样才能与左边的TreeView的Top相同,不独占一行。我尝试用frmae也不行
(2)打开两个Word文档前后Word工具栏先消失再显现出来,请问怎样才能不让工具栏刷新,一直处在正常显示状态
 
不喜欢在程序里用WORD,巨慢,那哪儿叫应用程序,整一个慢速重放。
不知道微软在里面放了什么,几年前就有人比过,一个空DOC文档19K左右,比一个空WPS文档
大了N倍。
我曾在自己的一个小程序里用RichEdit装.doc文件,是批量装入,不巧的是我装了瑞星,每
打开一个WORD文档,瑞星便查一次毒,看得我头都晕了,只好ctrl+alt+delete……
 
DELPHI下用OLE技术 控制 Word能做的很好的,我最近几天一直在研究这方面的问题
现在虽然问题还没有全部解决,不过已经有些眉目,思路也开始清晰起来。
还请这方面有经验的朋友能指点一下。
 
word是比较慢,如果太慢的话就用线程做,我推荐你用线程
 
(1)delphi中,用olecontainer控制Word,在Ole激活的时候,Word的工具栏
在程序界面上独占了一行显示,请问怎样能让这个工具栏和WORD成一个整体
显示在olecontainer的区域中?
(2)当焦点离开这个olecontainer的时候,Word的工具栏会消失,请问如何
能不让这个工具栏消失?
(3)重新打开一个文档,原先olecontainer区域里显示的那个WORD的工具栏
也消失了,等新打开的文档显示在olecontainer里的时候,工具栏才又
显示出来,请问如何能不让那个工具栏消失,一直处于正常显示状态

 
你用OLEContainer这是必然的,它只是调用word后台服务器,你关闭word文件,它自然会关闭word服务器,如果想完全操纵word,我建议你最好使用
wordapplication:=CreateOleObject('Word.Application');
//创建word服务器
wordapplication.Visible:=True;
//使word服务器可见,否则将在后天工作
if OpenDialog1.Execute then //判断是否打开文件
begin
Filename:=OpenDialog1.Filename;
worddocument:=wordapplication.Documents.Open(FileName);
//把打开文档的内容传给worddocument变量
 
时间太久了
 
多人接受答案了。
 
后退
顶部