如何把一个文件转成流? 我想把一个DOC文件存进数据库,在存之前要把它转成流,请问怎样转啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 保存word文档: procedure Tfrmdyqk1.BitBtn3Click(Sender: TObject); var ms:TMemoryStream; begin ms:= TMemoryStream.create; OleContainer1.SaveToStream (ms); ms.Position := 0; Query1.close; Query1.sql.clear; Query1.sql.text:= 'select * from oadbo.bw_qwb '; Query1.open; Query1.append; Query1.fieldbyname( 'wjid ').value:=77777777 ; Query1.fieldbyname( 'wjdid ').value:=7; Query1.fieldbyname( 'kzm ').value:= 'txt '; TBlobField(Query1.fieldbyname( 'qw ')).loadfromstream(ms); ms.free; Query1.post; //Query1.applyupdates; Query1.close; end; 取出word文档: procedure Tfrmdyqk1.Button2Click(Sender: TObject); var strstream:Tmemorystream; //ls_qw:string; begin OleContainer1.DestroyObject; strstream := Tmemorystream.Create; query1.Close; query1.sql.clear; query1.SQL.Add( 'select qw from oadbo.bw_qwb where wjid = ' + inttostr(77777777)); query1.open ; query1.First; Tblobfield(query1.fieldbyname( 'qw ')).savetostream(strstream); strstream.position:=0; OleContainer1.loadfromstream(strstream); strstream.free; end; var fStream:TMemoryStream;begin fStream:=TMemoryStream.Create; try fStream.LoadFromFile('c:\a.doc'); fStream.Position:=0; qry.Append TBlobField(qry.FieldByName('字段名')).LoadFromStream(fStream); qry.Post; finally fStream.Free; end; 二进制文档就是这个表名。 内容是image类型字段 用来保存word文档。 procedure towordsave(sourcetablename: string;sourceid:integer;dataset:tadodataset) ; 是一个通用过程,使用方法 towordsave( '撰写文章 ',toint(key.text),data.ADODataSet1); '撰写文章 '是指来源, toint(key.text)来源id data.ADODataSet1 数据元 需要在可执行文件目录下有一个empty.DOC文件。 如果二进制文档表的来源和 ID,与 towordsave( '撰写文章 ',toint(key.text),data.ADODataSet1); 传过来的参数相同,说明已有此文档,则自动打开! 你不要机械的用我跟你的带吗?应该理解它的原理! .......................procedure towordsave(sourcetablename: string;sourceid:integer;dataset:tadodataset) ; 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; 库存处理的问题 dephi中如何将某个目录下的所有文件的文件名通过一个按钮导出到一个下拉框中?希望提供代码,谢谢! 有没有这样的日期时间组件? 如何将TDateTimePicker置为空!!!! 如何在程序中快速清空2000下的打印作业呢?---急用 图片的存取问题 D版的Delphi开发的软件,会不会被人告?共享的,开源的? OPENDIALOG 的一个小问题 ?''''';;;; 请家帮忙! 鼠标移动到TSplitter上时,鼠标会变,这个在源码中哪里可以看到? DELPHI 强制覆盖原文件
procedure Tfrmdyqk1.BitBtn3Click(Sender: TObject);
var ms:TMemoryStream;
begin
ms:= TMemoryStream.create;
OleContainer1.SaveToStream (ms);
ms.Position := 0; Query1.close;
Query1.sql.clear;
Query1.sql.text:= 'select * from oadbo.bw_qwb ';
Query1.open;
Query1.append;
Query1.fieldbyname( 'wjid ').value:=77777777 ;
Query1.fieldbyname( 'wjdid ').value:=7;
Query1.fieldbyname( 'kzm ').value:= 'txt ';
TBlobField(Query1.fieldbyname( 'qw ')).loadfromstream(ms);
ms.free;
Query1.post;
//Query1.applyupdates;
Query1.close;
end;
取出word文档:
procedure Tfrmdyqk1.Button2Click(Sender: TObject);
var strstream:Tmemorystream;
//ls_qw:string;
begin OleContainer1.DestroyObject;
strstream := Tmemorystream.Create; query1.Close;
query1.sql.clear;
query1.SQL.Add( 'select qw from oadbo.bw_qwb where wjid = ' + inttostr(77777777));
query1.open ;
query1.First;
Tblobfield(query1.fieldbyname( 'qw ')).savetostream(strstream);
strstream.position:=0;
OleContainer1.loadfromstream(strstream); strstream.free;
end;
var
fStream:TMemoryStream;
begin
fStream:=TMemoryStream.Create;
try
fStream.LoadFromFile('c:\a.doc');
fStream.Position:=0;
qry.Append
TBlobField(qry.FieldByName('字段名')).LoadFromStream(fStream);
qry.Post;
finally
fStream.Free;
end;
二进制文档就是这个表名。
内容是image类型字段 用来保存word文档。 procedure towordsave(sourcetablename: string;sourceid:integer;dataset:tadodataset) ;
是一个通用过程,使用方法
towordsave( '撰写文章 ',toint(key.text),data.ADODataSet1);
'撰写文章 '是指来源,
toint(key.text)来源id
data.ADODataSet1 数据元 需要在可执行文件目录下有一个empty.DOC文件。 如果二进制文档表的来源和 ID,与
towordsave( '撰写文章 ',toint(key.text),data.ADODataSet1);
传过来的参数相同,说明已有此文档,则自动打开!
你不要机械的用我跟你的带吗?应该理解它的原理! .......................procedure towordsave(sourcetablename: string;sourceid:integer;dataset:tadodataset) ;
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;