procedure TMainForm.ButtonUpClick(Sender: TObject);
var
FN: String;
begin
with OpenDialog do
if Execute then
begin
UPData:=False; //打开文件
FN := ExtractFileName(FileName);
OleContainer.CreateObjectFromFile(FileName, False); //创建OLE对象
OleContainer.SaveToFile('tmp');
with DataSetBrokerAffix.DataSet do
begin
Append;
FieldByName('FName').AsString := FN;
FieldByName('FFileName').AsString := FN;
FieldByName('FSourceFile').AsString := FN;
TBlobField(FieldByName('FFile')).LoadFromFile('tmp');
FieldByName('FFKID').AsInteger := IID;
Post;
ApplyUpdates;
end;
UPData:=true;
end;
end;
procedure TMainForm.DataSetBrokerAffixAfterScroll(DataSet: TDataSet);
var lStream: TMemoryStream;
begin
if UPData then
begin
lStream := TMemoryStream.Create;
TBlobField(DataSetBrokerAffix.DataSet.FieldByName('FFile')).savetostream(lStream);
lStream.Position := 0;
showmessage(inttostr(lstream.size));
OleContainer.LoadFromStream(lStream);
end;
end;
http://topic.csdn.net/t/20050113/19/3723832.html
zz:
----------
终于搞定了:OleContainer1的LoadFromStream加载的流不是所有的流文件,而OleContainer1加载的流必须是用它的SaveToStream方法保存的一个流文件才可以加载的。所以在导入数据库中的时候先选择文件显示在OleContainer1中,再用OleContainer1的SaveToStream方法保存的一个流,然后保存到数据库中,若直接从文件读到流中(未经OleContainer)则在读流时候会出现Invalid stream format流格式不正确错误!因为若用文件流去加载一个.doc文件,但是doc文件本身不是一个COM组件。
保存:
procedure TFrmWord.Button9Click(Sender: TObject);
var
FileName:string;
sm:TstringStream;
begin
try
if opendialog1.Execute then begin
FileName:=opendialog1.FileName;
olecontainer1.CreateObjectFromFile(FileName,true);
olecontainer1.DoVerb(ovPrimary);
sm := tstringstream.create('');
olecontainer1.savetostream(sm);
with dm.qryTemp do
begin
append;
TBlobFIELD(Fieldbyname('data')).LoadFromStream(sm);
post;
end;
finally
sm.free;
end;
end;
显示:
procedure TFrmWord.Button5Click(Sender: TObject);
var
srm:Tstream;
begin
try
srm := dm.qryTemp.CreateBLOBSTREAM(dm.qryTemp.fieldbyname('data'),bmRead);
if srm.Size = 0 then
begin
srm.Free;
Exit;
end;
OleContainer1.CreateObject('word.document',true)
olecontainer1.loadfromstream(srm);
finally
srm.free;
end;
end;