OLEContainer操控MS Word的问题! ( 积分: 200 )

  • 主题发起人 主题发起人 grjs_2004
  • 开始时间 开始时间
G

grjs_2004

Unregistered / Unconfirmed
GUEST, unregistred user!
在网上搜了一些资料,但都觉得很零乱,也没有找到很好方法,请给出好的完整解决方法来,最好有成功的代码例子,重分酬谢!


在delphi 7里用OLEContainer控件连接好MS Word后,Word工具栏的[文件]部分不见了,我是用自己加的Menu控件设置了[文件]部分,但是就要对它进行写[新建]、[打开]、[保存]、[另存]、[页面设置]、[打印]及[打印预览]等部分,我已经做好了[保存]和[打开]部分,其他部分还没有做出来。请高手不吝赐教,谢谢!

还有希望跟数据库连接在一起,作出来的文档可以保存在数据库里,也可以从数据库里调出来编辑等。

谢谢!
很紧迫的问题,希望今天晚上10点之前有圆满的回复。

如果觉得分太少,我可以另开贴给分,但是只要你做出来就给分!
谢谢关注!!!
 
OLEContainer加载WORD是对人类耐心的考验,最后我选择了放弃.
OLEContainer可以保存为流,将流存入数据库,加载时从数据库读出流.这是可以实现的.不过,这流有个数据头.
OLEContainer加载WORD,文件部分似乎就是不可以操作的.你要求完全控制,好像还是采用创建WordApplication比较好.
 
好贴不要沉
顶顶顶顶顶顶顶顶顶顶顶
 
我已经做好了一些功能,但是希望可以把OLEContainer的激活的WORD文档保存到数据库里,
我试过几次都不行,我是以流的方式存入的,执行没有问题,但是数据库里对应的字段为空。代码如下:
pro......
Var
W_Stream:TStream;
begin
W_Stream:=TMemoryStream.Create;
OLEContainer1.SaveToStream(W_Stream);
W_Stream.Position:=0;
......
TBlodFileName(ADOQuery1.FieldByName('OLEWord')).LoadfromStream(W_Stream);
ADOQuery1.Post;
.....
//'OLEWord'为IMAGE字段类型
end;

请有这方面经验的高手不吝赐教!
谢谢!
 
存取图片是很简单的,网上代码很多,下面是转自DelphiFans的代码

uses jpeg;
保存Image1中的图象至数据库 :
var
Ms:TmemoryStream;
jpg:Tjpegimage;
begin
ms:=TmemoryStream.Create;
Jpg.Assign(Image1.Picture.Graphic);
Jpg.SaveToStream(Ms) ;
Ms.Position :=0;
ADOquery1.append;
TBlobField(ADOquery1.FieldByName('img')).LoadFromStream(Ms);
ADOquery1.Post;
Ms.Free ;
jpg.free;
end;
从数据库中读取图象到image2中:
Var
Ms:TStringStream;
jpg:Tjpegimage;
begin
Ms:=TstringStream.Create('');
TBlobField(ADOquery1.FieldByName('img')).SaveToStream(Ms);
Ms.Position :=0;
Jpg.LoadFromStream(Ms);
Image2.Picture.Assign(Jpg);
Ms.Free;
jpg.free;
end;

例子2:

procedure TForm1.Button1Click(Sender: TObject); //插入圖片過程
var
testStream:TMemoryStream;
begin
try
testStream := TMemoryStream.Create; //創建內存流
Image1.Picture.Graphic.SaveToStream(testStream); //將圖片保存至內存流中
adoquery1.Close;
adoquery1.SQL.Clear;
adoQuery1.SQL.Add('Insert into test (id,photo) values (:id,:photo)'); //進行插入操作
adoquery1.Parameters.ParamByName('id').Value := '003';
adoQuery1.Parameters.ParamByName('photo').LoadFromStream(testStream,ftBlob); //讀取保存的內存圖
adoquery1.ExecSQL;
finally
testStream.Free; //釋放內存流
end;
end;

procedure TForm1.Button2Click(Sender: TObject); //讀取圖片過程
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
if not ADOQuery1.FieldByName('photo').IsNull then begin ;
mStream:=TMemoryStream.Create ;
JpgFile:=TjpegImage.Create ;
TBlobField(ADOQuery1.FieldByName('photo')).SaveToStream(mStream); //顯示的轉換為BlobFiled並保存至內存流
mStream.Position :=0;
jpgfile.LoadFromStream(MStream);
image2.Picture.Assign(JpgFile);
end
else begin
image2.Picture :=nil;
end;
end;

----------------------------------------------------------------

Var
OleStream : TMemoryStream;
begin
// OleContainer1
OleStream := TMemoryStream.Create;
try
(Table1.FieldByName('Text') as TBlobField).SaveToStream(OleStream);
OleStream.Position := 0;
OleContainer1.LoadFromStream(OleStream);
OleContainer1.DoVerb(1); //显示
finally
OleStream.Free;
end;

end;

----------------------------------
我们这里就比较简单了,OleContainer1.SaveToStream(MS); 然后把这个MS存到数据库就行了

读取的时候OleContainer1.LoadFromStream(MS);

只是第一次打开word的时候,也就是你从文件读取放到OleContainer的时候不能OleContainer1.LoadFromStream(MS);
而只能用如下的方法
procedure TOleContainer.LoadAsDocument(const FileName: string);
var
Stream: TFileStream;
DataHandle: HGLOBAL;
Buffer: Pointer;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
try
DataHandle := GlobalAlloc(GMEM_MOVEABLE, Stream.Size);
if DataHandle = 0 then OutOfMemoryError;
try
Buffer := GlobalLock(DataHandle);
try
Stream.Read(Buffer^, Stream.Size);
finally
GlobalUnlock(DataHandle);
end;
OleCheck(CreateILockBytesOnHGlobal(DataHandle, True, FLockBytes));
DataHandle := 0;
OleCheck(StgOpenStorageOnILockBytes(FLockBytes, nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE, nil, 0, FStorage));
OleCheck(OleLoad(FStorage, IOleObject, Self, FOleObject));
FDrawAspect := 1;
InitObject;
UpdateView;
except
if DataHandle <> 0 then GlobalFree(DataHandle);
DestroyObject;
raise;
end;
finally
Stream.Free;
end;
end;

实际上就是多了一个文件头,如果还有问题就qq联系,
 
请问如何控制菜单显示问题 我要让视图菜单下的工具菜单项不显示?
我这里采用的是OLE
 
一个完整的单元,直接控制Word,保持到数据库
-不要用oleContainer 啦

unit pdWord;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WordXP, OleServer, DB, ADODB;

type
TfrpdWord = class(TFrame)
qry: TADOQuery;
app: TWordApplication;
wd: TWordDocument;
procedure appDocumentBeforeSave(ASender: TObject; const Doc: _Document;
var SaveAsUI, Cancel: WordBool);
procedure wdClose(Sender: TObject);
private
{ Private declarations }
FptNo: String;
isFirstCreate: boolean;
wdoc : _Document;
fileName: oleVariant;
procedure CMRelease(var Message: TMessage); message CM_RELEASE;
procedure SaveDoc;
public
{ Public declarations }
constructor openByPtNo(ptNo, ptName: string);
end;

implementation

{$R *.dfm}

{ TFrame1 }

uses myfunctions, CommX, frmMain;

constructor TfrpdWord.openByPtNo(ptNo, ptName: string);
var
Fname: string;
vis: oleVariant;
begin
inherited Create(nil);
FptNo:=ptNo;
vis:=true;
Filename:=safeTmpFile('eOAS-产品注意事项-['+ptNo+']', 'doc');
qry.SQL.Text:='select * from pdinf_comm where ptNo = '+quotedStr(ptNo);
qry.Open;
if qry.FieldByName('Comment').IsNull then
begin
isFirstCreate:=True;
qry.SQL.Text:='select Content from templet where templetname = '
+quotedStr('产品注意事项');
qry.Open;
TblobField(qry.FieldByName('Content')).SaveToFile(filename);
qry.Close;
WDoc:=app.Documents.Open(filename, emptyparam, emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,
emptyparam, emptyparam, emptyparam, emptyparam, vis, emptyparam, emptyparam, emptyparam);
wd.ConnectTo(Wdoc);
wd.Sections.Item(1).Headers.item(1).Range.Tables.item(1).Cell(1,2).Range.Text:=ptNo+'/'+ptName;
wd.Tables.Item(1).cell(1,3).range.text:=CuserInfo.user;
wd.Tables.Item(1).cell(2,3).range.text:=DateToStr(date);
end
else
begin
isFirstCreate:=False;
TblobField(qry.FieldByName('comment')).SaveToFile(filename);
WDoc:=app.Documents.Open(filename, emptyparam, emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,
emptyparam, emptyparam, emptyparam, emptyparam, vis, emptyparam, emptyparam, emptyparam);
wd.ConnectTo(Wdoc);
wd.Sections.Item(1).Headers.item(1).Range.Tables.item(1).Cell(1,2).Range.Text:=ptNo+'/'+ptName;
wd.Tables.Item(1).cell(1,5).range.text:=qry.fieldbyname('last_mod').AsString;
wd.Tables.Item(1).cell(2,5).range.text:=qry.fieldbyName('mod_date').AsString;
end;
app.Visible:=true;
end;

procedure TfrpdWord.appDocumentBeforeSave(ASender: TObject;
const Doc: _Document; var SaveAsUI, Cancel: WordBool);
begin
if Doc = WDoc then SaveDoc;
end;

procedure TfrpdWord.wdClose(Sender: TObject);
var
s: string;
wnd: Thandle;
begin
wnd:=getActiveWindow;
// showWindow(wnd, SW_MAXIMIZE);
setForeGroundWindow(wnd);
s:='产品注意事项-['+ FptNo+']已经修改,是否保存? ';
if not wd.Saved then
begin
enableWindow(fmMain.Handle,false);
try
beep;
if messageBox(Wnd, pchar(s),'保存提示', MB_YESNO or MB_ICONQUESTION
or MB_SYSTEMMODAL)=Id_Yes then wd.Save;
wd.Saved:=true;
finally
enableWindow(fmMain.Handle,true)
end;
end;
postMessage(handle, CM_RELEASE, 0, 0);
end;

procedure TfrpdWord.SaveDoc;
var
stream: TFileStream;
begin
QRY.Close;
qry.SQL.Text:='select * from pdinf_comm where ptNo = '+quotedStr(FptNo);
Stream:=TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);
try
WDoc.Save;
qry.Open;
qry.Edit;
TBlobField(qry.FieldByName('Comment')).LoadFromStream(stream);
if isFirstCreate then
begin
qry.FieldByName('ptNo').AsString:=FptNo;
qry.FieldByName('New_Date').AsDateTime:=Date;
qry.FieldByName('Creator').AsString:=Cuserinfo.user;
end;
qry.FieldByName('Mod_Date').AsDateTime:=Date;
qry.FieldByName('last_mod').AsString:=Cuserinfo.user;
qry.Post;
finally
stream.Free;
qry.Close;
end;
end;

procedure TfrpdWord.CMRelease(var Message: TMessage);
begin
Free;
end;

end.
 
谢谢关注!
请继续帮顶!
说出你的建议和想法!
谢谢!
 
请问各路大侠:
怎样才能将OLEContainer中显示的Word文档做一个滚动条来浏览?
 
多人接受答案了。
 
后退
顶部