大侠阿,救救我把!——dwg文件的数据库保存和显示问题?(100分)

  • 主题发起人 主题发起人 qhchen77
  • 开始时间 开始时间
Q

qhchen77

Unregistered / Unconfirmed
GUEST, unregistred user!
我得程序中,需要显示cad的图纸,并将他保存在数据库中。

我使用ole显示cad图纸,并使用memorystream将文件保存到sqlsever2000的image字段中。
这一切都很顺利,但是当我读取这个数据时,有问题了。

当我用memorystream将image字段读出,ole打开时,出错了,系统说文件的格式不对。
用blobstream读出,并且保存在硬盘上再打开时,cad提示这个文件坏了,不能打开。

救救我把。
我希望获得理想的效果是左边一颗树,右边是图纸,当点到相应的节点时,
右边显示相应的图纸(图纸都是保存在数据库中的)。
 

procedure TfProject.tbdwgClick(Sender: TObject);
var tempStream:TMemoryStream;
begin
if opendialog1.Execute=false then exit;
tempStream:=TMemoryStream.Create;
tempStream.Clear;
//将cad图纸显示在image上
oledraw.CreateObjectFromFile(opendialog1.FileName ,false);
oledraw.SaveToStream(tempStream);//这儿是将TIF文件保存到内存流中
with dproject.dmProject do begin
begin //如果点在项目上
//再Load进BlobFields中
cdsproject.Edit ;
tblobfield(cdsproject.FieldByName('p_draw')).LoadFromStream (tempstream);
cdsproject.Post ;
cdsproject.applyupdates(-1);
end;
tempstream.Clear ;tempstream.Destroy ;
end;

procedure tfproject.DrawShow();
{var tempStream:TMemoryStream;
begin
tempStream:=TMemoryStream.Create;
tempStream.Clear;
//将cad图纸显示在image上
with dproject.dmProject do begin
if cdsproject.FieldByName('p_draw').IsNull then
oledraw.DestroyObject
else begin
tblobfield(cdsproject.FieldByName('p_draw')).SaveToStream(tempstream);
oledraw.LoadFromStream(tempstream);
end;
end;
tempstream.Clear ;tempstream.Destroy ;end;}
end;
 
关注!学习!
 
各位大虾,有资料也给我一份,谢谢!
 
===所有这一切都建立在【那个“流”比实际的文件好像仅仅多一个“头”】基础上===。
如果这个假设不成立的话,那么下面的讨论=废话。

那个文件头很短,好像也就10几个字节,大概是固定长度的,很久以前实验的,忘记了,过一会给你看一下
其实就是使用OLE将数据保存起来,然后读取出来再次使用文件方式打开,这是就需要将这个文件头去掉。
去掉这个文件头很简单,注意我下面★注释的那句话,将那个“0”改称文件头的长度就OK了。
找出这个文件头的长度也很简单,将那个流保存成文件,然后使用UltraEdit对比一下就出来了。}

function TForm1.DBToDisk(Query_String, Column_Name, Target_Name: string): Boolean;
var
l_FileStream: TFileStream;
begin
{从数据库中取出文稿}
with Query1 do
begin
Close;
SQL.Text := Query_String;
Open;
end;

{将数据库中Image字段保存到硬盘下,存为文件}
l_FileStream := TFileStream.Create(Target_Name, fmOpenWrite or fmCreate);

{★★★★★注意下面这句话★★★★★}
l_FileStream.Position := 0;

TBlobField(Query1.FieldByName(Column_Name)).SaveToStream(l_FileStream);
l_FileStream.Free;

Query1.Close;
Result := True; //所有任务彻底完成,Function返回True
end;
 
刚才使用文本实验了一下,似乎【那个“流”比实际的文件好像仅仅多一个“头”】真的
站不住脚。它不仅在前面填了很多东西,而且还在后面填写了很多东西。
我使用
OleContainer1.SaveToFile

OleContainer1.LoadFromFile
倒是实验成功了,可以正常读取、保存流格式的doc文档。

===还存在的问题是使用SaveToStream和SaveToFile是否保存的东西是否相同。如果不同,还有戏。[:)]====
请继续等待。
 
很不幸的消息:
两个的结构相同,就是说除了有“头”以外,还有个“尾”
不过以前我曾经真的从流读出了东西,删除“文件头”,保存后,再次使用文件打开,成功的。
当初是Word的Doc文档。
不过现在使用txt做实验,发觉确实不仅写了前面,还写了后面呀。。。
======使用Stream打开吧,或者将Ole的文档保存到硬盘成为真的dwg文件再save到数据库中去=========
 
看一下LoadFromStream和SaveToStream的VCL代码,它确实有一个头Header,主要是使用OLESave和OleLoad
进行文件读取和写入的。
仔细研究一下这个,也许还真的有戏吆。
 
用TdrDwg 组件很容易做到,但是这是一个ActiveX组件没有原码,如果你舍得放血的话,我愿意帮你写一个demo程式
 
问题解决了,果然是position的问题。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
后退
顶部