另外问个问题:同样我在设计的时候已经在ole中Insert了Word文档对象,
现在我打开一个文档,以下方法有什么不同OleContainer1.CreateObjectFromFile('c:\XXX.doc',false);
与
OleContainer1.LoadFromFile('c:\XXX.doc');
不同之处是什么? 后面的方法总是出错:磁盘读取操作错误! 怎么使用
OleContainer1.LoadFromFile('c:\XXX.doc',false);?
现在我打开一个文档,以下方法有什么不同OleContainer1.CreateObjectFromFile('c:\XXX.doc',false);
与
OleContainer1.LoadFromFile('c:\XXX.doc');
不同之处是什么? 后面的方法总是出错:磁盘读取操作错误! 怎么使用
OleContainer1.LoadFromFile('c:\XXX.doc',false);?
我现在是做成一个ocx(用ActiveForm,以上代码做为一个控件的方法调用)
才出现上面的问题,如果是写成一个Application直接运行,则结果又是正确的————能嵌入到oleContainer中,何故?急求解!
做办公自动化公文管理,需要把一个Word嵌入到Web中,我用Delphi的ActiveForm做个控件:一个OleContainer,其内嵌入一个Word,然后我在ASP(.Net)调用的时候要把一个数据库字段的内容读取出来显示在Word中,当然编辑后还要把她保存回原来的字段中。因为某些特殊原因,我把操作数据表的操作全部封装在此控件内(其实是个不合理的设计)——通过在接口中的两个方法GetData 与SaveData .另外,我也需要通过Word对象来做一些VBA编程控制,比如,保留笔迹,是否只读,文档合并等操作……说远了,我还是把代码贴出来吧:
var tAbs:TADOBlobStream; try
//取出tABS的代码省略 tAbs.position:=0;
OleContainer1.LoadFromStream(tAbs);
OleContainer1.doVerb(ovShow);//显示文档
finally
tAbs.Free ;
end; WordApp.Connect;//WordApp为一个Server中的WordApplication对象
WordDoc.ConnectTo(WordApp.ActiveDocument);//WordDoc为一个Server中的WordDocument对象//以下为对word控制
WordApp.UserName:=UserName;
//控制笔迹
WordDoc.ShowRevisions:=IsShowRevisions; WordDoc.TrackRevisions:=IsTrackRevisions ;
WordDoc.PrintRevisions:=false;//打印时不能打印出笔迹的!
……………………
以上为Getdata的部分代码,其中省略从数据表中取出数据赋给tABS的代码,当此控件在Delphi,VB,C#等中调用时,执行Getdata能正确达到我预期效果————取出tAbs的内容显示在被嵌入到Form的Word中,但是当我在web中调用时,总是出现一个新的Word而不是在oleContainer中打开…… 另外,当我在个控件在web中调用后,关闭此web页面后在进入时,切不能在使用了,总是提示此控件的内存地址有关的错误…… 我已经在web的unLoad中调用了一个控件的FreeObject方法,在其中有如下代码(): WordDoc.Close ;
WordApp.Quit ;
// WordApp.Free ;
oleContainer1.Close ;
// oleContainer1.destroyobject
"//"的语句加上也是同样的结果,包括oleContainer1.free等语句 应该是没释放对象的原因吧,怎么处理呢?
OleContainer1.LoadFromFile(path);
先在OLE中嵌入WORD,
这样使用的,现在还没出现问题,不知道你的BUTTONCLICK是怎么写的。。
另外,我有个问题,就是怎么把嵌入的WORD的打印功能给屏蔽?
当我在个控件在web中调用后,关闭此web页面后在进入时,切不能再使用了,总是提示此控件的内存地址有关的错误…… 我已经在web的unLoad中调用了一个控件的FreeObject方法,在其中有如下代码(): WordDoc.Close ;
WordApp.Quit ;
// WordApp.Free ;
oleContainer1.Close ;
// oleContainer1.destroyobject
"//"的语句加上也是同样的结果,包括oleContainer1.free等语句
应该是没释放对象的原因吧,怎么处理呢?但是,如果我不关闭有此控件的Web而直接在打开一个(或多个),运行正常,只有当关闭一个有此控件的web后再打开时才出现错误! 真的很急!!
你帮我看看也可以。
如果想要源程序的话,可以到ftp://qqpp.myip.org下载(不一定经常开)。procedure TForm1.Button2Click(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TBlobStream;
filename:string;
begin
OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC';
if OpenDialog1.Execute then
begin
filename:=OpenDialog1.FileName;
MyFile:=TFileStream.Create(fileName,fmOpenRead);
with table1 do
begin
Open;insert;
// edit;
Stream := TBlobStream.Create(FieldByName('Doc') as TBlobField, bmWrite);{‘Doc’为BLOB字段名}
MemSize := MyFile.Size;
Inc(MemSize);
//增加的一字节给结尾的null
Buffer := AllocMem(MemSize);
try
Stream.Seek(0, soFromBeginning);
//流指针位置放到最前
MyFile.Read(Buffer^,MemSize);
Stream.Write(Buffer^,MemSize);
FieldByName('Name').Asstring:=ExtractFileName(fileName);
FieldByName('Size').Asstring:=inttostr(MemSize-1);
statictext1.caption:='文件名:'+ExtractFileName(fileName);
statictext2.caption:='文件大小:'+inttostr(Memsize-1)+'字节';
finally
MyFile.Free;
Stream.Free;
end;
try
Post;
except
showmessage('保存失败!');
halt;
end;
showmessage('保存成功,正在加载文档!');
Doc_ole.CreateObjectFromFile(fileName,False);
Doc_ole.Run;
end;
end;
end;
提示保存成功,可是程序关闭后重新启动,原先的数据就没了。不知道什么原因,请路过的高手赏个脸吧~~~~~~~~~~~~~~~~
好象要image(sqlserver )或blob类型(Oracle)类型很简单的代码
OleStream : TMemoryStream;
OleContainer1.SaveToStream(OleStream);
OleStream.Position := 0; //找回零点
Tblobfield(FieldByName('Content')).LoadFromStream(OleStream);
Post;
UpdateBatch //缓冲模式
提示保存成功,但是实际上并没有保存到数据库。应用程序一退出,DOC就丢了。
要不麻烦你帮我写一个完整简单的保存、导出DOC的程序好哇?我的信箱是
[email protected]
可能是你的控件的线程模型没有设置对,我以前写过一个控件,
出现的问题和你的差不多。
我把线程模型改为single就搞定了。没有仔细研究
你可以试试看。
我也想做delphi控制word的工作,和你的性质差不多
多交流。
我的电子邮件 [email protected]