在Access数据库中,在一张表里插入了一个Word的Ole对象的字段,在编程时要怎样把它读出并且小时出来呢???
在程序中我已经嵌入了一个OleContainer的Word对象,怎把读出的文档在OleContainer的Word对象中显示???
谢谢各位!!
在程序中我已经嵌入了一个OleContainer的Word对象,怎把读出的文档在OleContainer的Word对象中显示???
谢谢各位!!
解决方案 »
- 为什么用ASProtect加壳后---------不能从外部传参数进去了?
- 通过ip获得mac地址,可以跨网段实现吗?如果可以,那mac唤醒也可以跨网段吗?
- 重賞之下,可有勇夫? 100分不夠再加! 問:如何使程序不被強行關閉?(不是說不出現在任務管理器中)
- 如何实现一个程序的多个窗体占用不同的任务栏
- dll问题
- 如何把double的变量变换为string?
- /@/@/@/看看大家期待已久的辛烷吧 Delphi.net
- 求:群发短消息
- 如何去掉pagecontrol上面的标题栏呢?
- 紧急求助:我该怎么区分当前操作系统是2000 server还是2000professional?
- 用樹形結構取數據庫數據
- 还是Twebbrowser问题,高手入!
声明一个数据流对象
Tstreams stream
adoquery1.FieldByName('byte').SaveToFile (stream);
var
sCommandLine: string;
bCreateProcess: boolean;
lpStartupInfo: TStartupInfo;
lpProcessInformation: TProcessInformation;
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TADOBlobStream;
RegF:TRegistry;
begin
RegF:=TRegistry.Create; //查看.doc文档的打开程序
RegF.RootKey:=HKEY_classes_root;
try
RegF.OpenKey('worddocument\protocol\stdfileediting\server',True);
sCommandLine:=regf.ReadString('')+' '+ExtractFilePath(Application.EXEName)+'temp.doc';
except
End;
RegF.CloseKey;
RegF.Free;
dataset.Close;
dataset.commandtext :='select * from 二进制文档 where 来源=''' +sourcetablename+''' and 来源id='+inttostr(sourceid);
dataset.open;
if not dataset.eof then
begin
MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+'temp.tmp',fmCreate);
Stream:=TADOBlobStream.Create(dataset.FieldByName('内容') as TBlobField, bmRead);
MemSize := Stream.Size;
Inc(MemSize);
Buffer := AllocMem(MemSize);
try
Stream.Read(Buffer^,MemSize);
MyFile.Write(Buffer^,MemSize);
finally
MyFile.Free;Stream.Free;
end;
if FileExists(ExtractFilePath(Application.EXEName)+'temp.DOC') then DeleteFile(ExtractFilePath(Application.EXEName)+'temp.DOC');
if FileExists(ExtractFilePath(Application.EXEName)+'temp.tmp') then RenameFile(ExtractFilePath(Application.EXEName)+'temp.tmp', ExtractFilePath(Application.EXEName)+'temp.DOC');
end
else
begin
if FileExists(ExtractFilePath(Application.EXEName)+'empty.DOC') then
copyfile(pchar(ExtractFilePath(Application.EXEName)+'empty.DOC'),pchar(ExtractFilePath(Application.EXEName)+'temp.DOC'),false)
else begin
ShowMessage('<'+ExtractFilePath(Application.EXEName)+'empty.DOC>不存在!');
dataset.close ;
exit;
end;
end;
dataset.close ;
//sCommandLine :='C:\Program Files\Microsoft Office\Office\winword.exe '+ExtractFilePath(Application.EXEName)+'temp.doc'; FillChar(lpStartupInfo, Sizeof(TStartupInfo), #0);
lpStartupInfo.cb := Sizeof(TStartupInfo);
lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow := SW_NORMAL;
bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil, nil, True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil, nil, lpStartupInfo, lpProcessInformation);
//ShellExecute(zxdcc.Handle,'save',pchar(ExtractFilePath(Application.EXEName)+'empty.doc') ,'','',SW_SHOWNORMAL); if bCreateProcess then
WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
dataset.Close;
dataset.commandtext:='select * from 二进制文档 where 来源=''' +sourcetablename+''' and 来源id='+inttostr(sourceid);
dataset.open;
if not dataset.eof then
dataset.Edit
else begin
dataset.close;
dataset.commandtext:='select * from 二进制文档';
dataset.open;
dataset.append;
end;
dataset.FieldValues['来源']:=sourcetablename;
dataset.FieldValues['来源id']:=sourceid;
MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+'temp.doc',fmOpenRead);
Stream := TADOBlobStream.Create(dataset.FieldByName('内容') 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);
finally
MyFile.Free;
Stream.Free;
end;
dataset.post;
dataset.close;
end;
我做的一个过程!
Stream = table.savetoStream;
在stream的head 上加上位置信息(TStreamHeader)
Stream = StreamHeader + Stream;
olecontain1.loadFromStream(Stream);即可
TStHead = record
biaozhi : integer; // 标志,$434F4442
yangshi : integer; //样式,1
Size : integer; //文件大小
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Ms1,MS2 : TMemoryStream;
SH : TStHead;
begin
Ms1 := TMemoryStream.Create;
Ms2 := TMemoryStream.Create;
try
TBlobField(ADOQuery1.FieldByName('content')).SaveToStream(Ms1);
with sh do
begin
biaozhi := $434F4442;
yangshi := 1;
size := ms1.Size;
end;
ms2.WriteBuffer(sh,sizeof(sh));
ms2.CopyFrom(ms1,0);
ms2.Position := 0;
OleContainer1.LoadFromStream(ms2);
OleContainer1.DoVerb(ovShow);
Finally
ms1.Free;
ms2.Free;
end;
end;