http://princed.mblogger.cn/posts/11886.aspxsql数据库中存取word文件的实现 procedure TsampleForm.OpenDOCClick(Sender: TObject); var MemSize: Integer; Buffer: PChar; MyFile: TFileStream; Stream: TBlobStream; begin OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC' ;{从对话窗选择文件} if OpenDialog1.Execute then begin MyFile:=TFileStream.Create (OpenDialog1.FileName,fmOpenRead); with table1 do {‘table1’为含BLOB字段的表名} begin Open; Edit; Stream := TBlobStream.Create(FieldByName('Doc') as TBlobField, bmWrite); {‘Doc’为BLOB字段名} MemSize := MyFile.Size; Inc(MemSize); {Make room for the buffer's null terminator.} Buffer := AllocMem(MemSize); {Allocate the memory.} try Stream.Seek(0, soFromBeginning); {Seek 0 bytes from the stream's end point} MyFile.Read(Buffer^,MemSize); Stream.Write(Buffer^,MemSize); finally MyFile.Free; Stream.Free; end; try Post; except on E: EDatabaseError do if HandelException(E)< >0 then exit else raise; end; end; Doc_ole.CreateObjectFromFile (OpenDialog1.FileName,False); Doc_ole.Run;{Doc_ole为ToleContainer构件名} end; end;---- 以上为向数据库中写入的程序,应用中从对话窗取出文件在ToleContainer构件中显示的同时存入数据库。 procedure TsampleForm.GetDocClick (Sender: TObject); var MemSize: Integer; Buffer: PChar; MyFile: TFileStream; Stream: TBlobStream; begin MyFile:=TFileStream.Create('c:\temp.tmp',fmCreate); with Query1 do begin Stream := TBlobStream.Create (FieldByName('Doc') as TBlobField, bmRead); MemSize := Stream.Size; Inc(MemSize); {Make room for the buffer's null terminator.} Buffer := AllocMem(MemSize); {Allocate the memory.} try Stream.Read(Buffer^,MemSize); MyFile.Write(Buffer^,MemSize); finally MyFile.Free; Stream.Free; end; end; if FileExists('c:\temp.DOC') then DeleteFile('c:\temp.DOC'); if FileExists('c:\temp.tmp') then begin RenameFile('c:\temp.tmp', 'c:\temp.DOC'); Doc_ole.CreateObjectFromFile ('c:\temp.DOC',False); Doc_ole.Run; end; end;---- 以上程序为从数据库从将WORD文档取出,并放在temp.doc的临时文件上并在ToleContainer构件中显示。 ---- 在程序的其他部份应准确控制表记录指针,使WORD文档的存取发生在正确的记录位置。
procedure Tfrm_wlblx.DOC1Click(Sender: TObject); var MemoryStream:TMemoryStream; i:integer; begin try if datasource1.DataSet.IsEmpty then exit; MemoryStream:=TMemoryStream.Create; if opendialog1.Execute then begin opendialog1.Filter:='*.doc'; MemoryStream.LoadFromFile(opendialog1.FileName); end else exit; //MemoryStream.LoadFromFile('f:\b.doc'); if DBGrid1.SelectedRows.Count<=1 then begin dm.ADOQry1.Close; dm.ADOQry1.SQL.Clear; dm.ADOQry1.SQL.Add('update make_item set mi_doc=:content where mi_no=:ls_no'); dm.ADOQry1.Parameters.ParamByName('ls_no').Value:=dbgrid1.Fields[0].AsString;//ps_no; dm.ADOQry1.Parameters.ParamByName('content').LoadFromStream(MemoryStream,ftgraphic); dm.ADOQry1.ExecSQL; end else begin for i := 0 to DBGrid1.SelectedRows.Count-1 do begin DBGrid1.DataSource.DataSet.GotoBookMark(Pointer(DBGrid1.Selectedrows.Items[i])); dm.ADOQry1.Close; dm.ADOQry1.SQL.Clear; dm.ADOQry1.SQL.Add('update make_item set mi_doc=:content where mi_no=:ls_no'); dm.ADOQry1.Parameters.ParamByName('ls_no').Value:=dbgrid1.Fields[0].AsString;//ps_no; dm.ADOQry1.Parameters.ParamByName('content').LoadFromStream(MemoryStream,ftgraphic); dm.ADOQry1.ExecSQL; end; end; //dm.ADOQry1.ExecSQL; showmessage('保存DOC文件成功!'); except end;end;
上面的是写: 这是读:procedure Tfrm_wlblx.DOC2Click(Sender: TObject); var TempMemory:TStream; Memory:TMemoryStream; fname:string; a:OleVariant; begin if datasource1.DataSet.IsEmpty then exit; dm.ADOQry1.CLOSE; dm.ADOQry1.SQL.CLEAR; dm.ADOQry1.SQL.ADD('select mi_doc from make_item where mi_no=:ls_no'); dm.ADOQry1.Parameters.ParamByName('ls_no').Value:=ps_no; dm.ADOQry1.OPEN; fname:='c:\3.doc'; dm.ADOQry1.Edit; Memory:=TMemoryStream.Create; TempMemory:=dm.ADOQry1.CreateBlobStream(dm.ADOQry1.fieldbyname('mi_doc'),bmReadWrite); Memory.CopyFrom(TempMemory,TempMemory.Size); Memory.SaveToFile(fname); /// a:=fname; WordApplication1.Connect; WordApplication1.Visible:=true; WordDocument1.Connectto(WordApplication1.Documents.Open(a,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam)); WordApplication1.Disconnect; ///end;
OleContainer1.SaveToStream();
如何在Delphi 程序里显示呢?
procedure TsampleForm.OpenDOCClick(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TBlobStream;
begin
OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC'
;{从对话窗选择文件}
if OpenDialog1.Execute then begin
MyFile:=TFileStream.Create
(OpenDialog1.FileName,fmOpenRead);
with table1 do {‘table1’为含BLOB字段的表名}
begin
Open;
Edit;
Stream := TBlobStream.Create(FieldByName('Doc')
as TBlobField, bmWrite);
{‘Doc’为BLOB字段名}
MemSize := MyFile.Size;
Inc(MemSize); {Make room for the
buffer's null terminator.}
Buffer := AllocMem(MemSize);
{Allocate the memory.}
try
Stream.Seek(0, soFromBeginning);
{Seek 0 bytes from the stream's end point}
MyFile.Read(Buffer^,MemSize);
Stream.Write(Buffer^,MemSize);
finally
MyFile.Free;
Stream.Free;
end;
try
Post;
except
on E: EDatabaseError do
if HandelException(E)< >0 then exit
else
raise;
end;
end;
Doc_ole.CreateObjectFromFile
(OpenDialog1.FileName,False);
Doc_ole.Run;{Doc_ole为ToleContainer构件名}
end;
end;---- 以上为向数据库中写入的程序,应用中从对话窗取出文件在ToleContainer构件中显示的同时存入数据库。 procedure TsampleForm.GetDocClick
(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TBlobStream;
begin
MyFile:=TFileStream.Create('c:\temp.tmp',fmCreate);
with Query1 do
begin
Stream := TBlobStream.Create
(FieldByName('Doc') as TBlobField, bmRead);
MemSize := Stream.Size;
Inc(MemSize);
{Make room for the buffer's null terminator.}
Buffer := AllocMem(MemSize);
{Allocate the memory.}
try
Stream.Read(Buffer^,MemSize);
MyFile.Write(Buffer^,MemSize);
finally
MyFile.Free;
Stream.Free;
end;
end;
if FileExists('c:\temp.DOC')
then DeleteFile('c:\temp.DOC');
if FileExists('c:\temp.tmp')
then begin
RenameFile('c:\temp.tmp', 'c:\temp.DOC');
Doc_ole.CreateObjectFromFile
('c:\temp.DOC',False);
Doc_ole.Run;
end;
end;---- 以上程序为从数据库从将WORD文档取出,并放在temp.doc的临时文件上并在ToleContainer构件中显示。 ---- 在程序的其他部份应准确控制表记录指针,使WORD文档的存取发生在正确的记录位置。
有没有人用过RxRichEdit?或者RichView 之类的呢?
如果用这种控件会不会好控制一点呢?提到OLE,就有点感冒,不太会用,经常搞的机器很慢的样子。
其实我只是想实现能够在一个窗体里显示或编辑可以带图片、表格、文字、及背景的小程序,然后可以
把相关的内容保存到数据库中就可以了?
有高人知道吗?
在此等待
我以前做的一个就是这样子做的.
var
MemoryStream:TMemoryStream;
i:integer;
begin
try
if datasource1.DataSet.IsEmpty then exit;
MemoryStream:=TMemoryStream.Create;
if opendialog1.Execute then
begin
opendialog1.Filter:='*.doc';
MemoryStream.LoadFromFile(opendialog1.FileName);
end
else exit;
//MemoryStream.LoadFromFile('f:\b.doc');
if DBGrid1.SelectedRows.Count<=1 then
begin
dm.ADOQry1.Close;
dm.ADOQry1.SQL.Clear;
dm.ADOQry1.SQL.Add('update make_item set mi_doc=:content where mi_no=:ls_no');
dm.ADOQry1.Parameters.ParamByName('ls_no').Value:=dbgrid1.Fields[0].AsString;//ps_no;
dm.ADOQry1.Parameters.ParamByName('content').LoadFromStream(MemoryStream,ftgraphic);
dm.ADOQry1.ExecSQL;
end
else
begin
for i := 0 to DBGrid1.SelectedRows.Count-1 do
begin
DBGrid1.DataSource.DataSet.GotoBookMark(Pointer(DBGrid1.Selectedrows.Items[i]));
dm.ADOQry1.Close;
dm.ADOQry1.SQL.Clear;
dm.ADOQry1.SQL.Add('update make_item set mi_doc=:content where mi_no=:ls_no');
dm.ADOQry1.Parameters.ParamByName('ls_no').Value:=dbgrid1.Fields[0].AsString;//ps_no;
dm.ADOQry1.Parameters.ParamByName('content').LoadFromStream(MemoryStream,ftgraphic);
dm.ADOQry1.ExecSQL; end;
end; //dm.ADOQry1.ExecSQL;
showmessage('保存DOC文件成功!');
except
end;end;
这是读:procedure Tfrm_wlblx.DOC2Click(Sender: TObject);
var
TempMemory:TStream;
Memory:TMemoryStream;
fname:string;
a:OleVariant;
begin
if datasource1.DataSet.IsEmpty then exit;
dm.ADOQry1.CLOSE;
dm.ADOQry1.SQL.CLEAR;
dm.ADOQry1.SQL.ADD('select mi_doc from make_item where mi_no=:ls_no');
dm.ADOQry1.Parameters.ParamByName('ls_no').Value:=ps_no;
dm.ADOQry1.OPEN;
fname:='c:\3.doc';
dm.ADOQry1.Edit;
Memory:=TMemoryStream.Create;
TempMemory:=dm.ADOQry1.CreateBlobStream(dm.ADOQry1.fieldbyname('mi_doc'),bmReadWrite);
Memory.CopyFrom(TempMemory,TempMemory.Size);
Memory.SaveToFile(fname);
///
a:=fname;
WordApplication1.Connect;
WordApplication1.Visible:=true;
WordDocument1.Connectto(WordApplication1.Documents.Open(a,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam));
WordApplication1.Disconnect;
///end;