给你一个我曾经作过的例子:
{ System 面板中有OleContainer组件,可以通过它显示各种类型的文件,当然包括图形文件、
Word文件等。而用文件流(TFileStream)和Blob流(TBlobStream)可以将任何格式的文件
保存到数据库中}
unit UWord;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons, OleCtnrs, Db, DBTables;type
TFrmWord = class(TForm)
Panel1: TPanel;
Doc_Ole: TOleContainer;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Label1: TLabel;
Label2: TLabel;
OpenDialog1: TOpenDialog;
Table1: TTable;
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
FrmWord: TFrmWord;implementation{$R *.DFM} {向数据库中写入OpenDialog1指定的Doc文文件,并在ToleContainer构件中显示出来,
若出错,有相应的异常捕获}
procedure TFrmWord.BitBtn2Click(Sender: TObject);
var
MemSize : integer;
Buffer : Pchar;
MyFile : TFileStream;
Stream : TBlobStream;
FileName : string;
begin
OpenDialog1.Filter := 'WORD文档(*.DOC)|*.DOC'; //过滤,只显示DOC文件格式
if OpenDialog1.Execute then
begin
FileName := OpenDialog1.FileName ;
MyFile := TFileStream.Create(FileName,fmOpenRead);
//以只读方式创建文件流,以后对流的读入也就是从文件读取数据
with table1 do
begin
Open;
Edit;
//编辑数据库,这种方法会冲掉以前保存的数据,只允许保存一条记录,如保存多条记录,
// 可以用Insert 或 Append方法.
Stream := TBlobStream.Create(FieldByName('DOC') as TBlobField,bmWrite);
// 以写入方式创建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);
Label1.Caption := '文件名:'+ ExtractFileName(FileName);
Label2.Caption := '文件大小:' + InttoStr(MemSize-1) + '字节';
Finally
MyFile.Free;
Stream.Free;
End; // Try...Finally
Try
Table1.Post;
Except
ShowMessage('保存失败!');
halt;
End; // Try...Except
ShowMessage('保存成功,正在加载文档!');
//下面开始在Doc_Ole容器中显示Doc文件
Doc_Ole.CreateObjectFromFile(FileName,False);
Doc_Ole.Run;
end; // with Table1 do
end;
end; {从数据库中将Word文档取出,保存到建立的临时文件Temp.doc中,并将此文件在Doc_Ole容器中显示}
procedure TFrmWord.BitBtn1Click(Sender: TObject);
var
MemSize : integer;
Buffer : Pchar;
MyFile : TFileStream;
Stream : TBlobStream;
begin
MyFile:= TFileStream.Create('c:\temp.tmp',fmCreate);
//以快捷方式建立文件流
with table1 do
begin
Open;
Stream := TBlobStream.Create(FieldbyName('Doc') as TBlobFIELD,BMRead);
//以只读方式建立Blob流
MemSize := Stream.Size;
Inc(MemSize);
Buffer := AllocMem(MemSize);
Try
Stream.Read(Buffer^,MemSize);
MyFile.Write(Buffer^,MemSize);
Label1.Caption := '文件名:'+ FieldByName('Name').Asstring;
Label2.Caption := '文件大小:' + FieldByName('Size').Asstring + '字节';
Finally
MyFile.Free;
Stream.Free;
End; // Try...Finally
end; // with table1 do
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容器中显示从数据库中取出的DOC文件
Doc_Ole.CreateObjectFromFile('c:\temp.DOC',False);
Doc_Ole.Run;
end;
end;procedure TFrmWord.BitBtn3Click(Sender: TObject);
begin
//清除Doc_Ole中显示的Doc文件
Doc_Ole.CleanupInstance;
Doc_Ole.Refresh;
Label1.Caption := '';
Label2.Caption := '';
end;procedure TFrmWord.FormCreate(Sender: TObject);
begin
Table1.DatabaseName := 'Word文档\';
Table1.TableName := 'Doc_Ole';
end;end.
{ System 面板中有OleContainer组件,可以通过它显示各种类型的文件,当然包括图形文件、
Word文件等。而用文件流(TFileStream)和Blob流(TBlobStream)可以将任何格式的文件
保存到数据库中}
unit UWord;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons, OleCtnrs, Db, DBTables;type
TFrmWord = class(TForm)
Panel1: TPanel;
Doc_Ole: TOleContainer;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Label1: TLabel;
Label2: TLabel;
OpenDialog1: TOpenDialog;
Table1: TTable;
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
FrmWord: TFrmWord;implementation{$R *.DFM} {向数据库中写入OpenDialog1指定的Doc文文件,并在ToleContainer构件中显示出来,
若出错,有相应的异常捕获}
procedure TFrmWord.BitBtn2Click(Sender: TObject);
var
MemSize : integer;
Buffer : Pchar;
MyFile : TFileStream;
Stream : TBlobStream;
FileName : string;
begin
OpenDialog1.Filter := 'WORD文档(*.DOC)|*.DOC'; //过滤,只显示DOC文件格式
if OpenDialog1.Execute then
begin
FileName := OpenDialog1.FileName ;
MyFile := TFileStream.Create(FileName,fmOpenRead);
//以只读方式创建文件流,以后对流的读入也就是从文件读取数据
with table1 do
begin
Open;
Edit;
//编辑数据库,这种方法会冲掉以前保存的数据,只允许保存一条记录,如保存多条记录,
// 可以用Insert 或 Append方法.
Stream := TBlobStream.Create(FieldByName('DOC') as TBlobField,bmWrite);
// 以写入方式创建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);
Label1.Caption := '文件名:'+ ExtractFileName(FileName);
Label2.Caption := '文件大小:' + InttoStr(MemSize-1) + '字节';
Finally
MyFile.Free;
Stream.Free;
End; // Try...Finally
Try
Table1.Post;
Except
ShowMessage('保存失败!');
halt;
End; // Try...Except
ShowMessage('保存成功,正在加载文档!');
//下面开始在Doc_Ole容器中显示Doc文件
Doc_Ole.CreateObjectFromFile(FileName,False);
Doc_Ole.Run;
end; // with Table1 do
end;
end; {从数据库中将Word文档取出,保存到建立的临时文件Temp.doc中,并将此文件在Doc_Ole容器中显示}
procedure TFrmWord.BitBtn1Click(Sender: TObject);
var
MemSize : integer;
Buffer : Pchar;
MyFile : TFileStream;
Stream : TBlobStream;
begin
MyFile:= TFileStream.Create('c:\temp.tmp',fmCreate);
//以快捷方式建立文件流
with table1 do
begin
Open;
Stream := TBlobStream.Create(FieldbyName('Doc') as TBlobFIELD,BMRead);
//以只读方式建立Blob流
MemSize := Stream.Size;
Inc(MemSize);
Buffer := AllocMem(MemSize);
Try
Stream.Read(Buffer^,MemSize);
MyFile.Write(Buffer^,MemSize);
Label1.Caption := '文件名:'+ FieldByName('Name').Asstring;
Label2.Caption := '文件大小:' + FieldByName('Size').Asstring + '字节';
Finally
MyFile.Free;
Stream.Free;
End; // Try...Finally
end; // with table1 do
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容器中显示从数据库中取出的DOC文件
Doc_Ole.CreateObjectFromFile('c:\temp.DOC',False);
Doc_Ole.Run;
end;
end;procedure TFrmWord.BitBtn3Click(Sender: TObject);
begin
//清除Doc_Ole中显示的Doc文件
Doc_Ole.CleanupInstance;
Doc_Ole.Refresh;
Label1.Caption := '';
Label2.Caption := '';
end;procedure TFrmWord.FormCreate(Sender: TObject);
begin
Table1.DatabaseName := 'Word文档\';
Table1.TableName := 'Doc_Ole';
end;end.
解决方案 »
- delphi的几个问题,考验一个高手
- 如何使用DBGridEH.STFilter?(过滤)
- 求救:哪位熟悉fastreport?
- 错误提示:No parentchart to validate DataSource.谁能帮我?Thanks!
- 请帮忙看一下问题出在哪里?
- 为什么serversocket1.socket.localAddress的返回值总是'0.0.0.0',疑惑中???
- fastrepot的乱码现象,急!!!!
- 求助:delphi+sqlsever2000,数据库问题!!!急
- Treeview控件能够多选吗?
- delphi&oracle的select语句问题!
- 急!!!关于TStringGrid的问题。
- 两个简单问题,急切请教!!!谢谢!!!
loadfromfile