从图形字段写入XML文件并读取

时间:2013-06-29 00:26:54

标签: xml delphi dataset

我需要一些帮助...
我在delphi 7中有一个带有图形字段的Paradox表。有了这个:http://www.swissdelphicenter.ch/torry/showcode.php?id=772我可以从delphi的演示中创建一个像biolife.xml这样的XML文件但没有图形字段。我添加了:
ftGraphic: Result := '"bin.hex" SUBTYPE="Graphic"';
在代码中,但没有... XML文件结束:

Im=" /></ROWDATA></DATAPACKET>
在Im =“之后应该是图像代码,但它是空的,也没有关闭引号。对于我使用的图形字段:

image1.Picture:= nil;
panel1.PaintTo(image1.Canvas.Handle,0,0);
table1.edit;
table1.FieldByName('Im').Assign(image1.Picture.Bitmap);    
table1.Post;

我想要的是从delphi创建类似“biolife.xml”的XML文件。那么任何想法?

1 个答案:

答案 0 :(得分:3)

您链接的文章写的是纯XML文件,而不是Biolife.xml之类的文件。图形不能存储在普通的XML文件中(它们必须在编写时进行编码,并在读取时进行解码)。帖子(由Mike Skolnik编写)不使用图形字段,因为图形是二进制数据而不适用于标准XML(并且无法通过存储在字符串中然后写入{{1来正确编写或读取}}。)

TFileStream不是图形文件。它是一个Biolife.xml(简称CDS),以XML格式存储。它有一个XML扩展,但它远不是像您链接的文章那样的简单XML文件。

(如果这是TLDR,请跳到标有简答的下一段。)

TClientDataSet是一个内存数据集,可以以二进制或XML格式保存(保存)到文件中。换句话说,它是一种特殊类型的数据库。 (有关详细信息,请参阅我的回答。)

Paradox对它可以存储并直接用于TClientDataSet的图形类型有限制,但我不记得它们是什么。 (Paradox是通过Borland数据库引擎或BDE访问的,现在已经被弃用了十多年,自从20世纪90年代中期的Delphi 1以来我就没有使用过它。)你可以看到{{} {1}}可以存储在TGraphicField方法的Delphi 7帮助文件中;它似乎接受的唯一实际图像文件是TGraphicField,这是一个位图。

Delphi 7中的TGraphicField.SetFieldType演示演示了如何使用Paradox图形,因为它使用Paradox数据库作为其存储机制IIRC。它位于Windows XP上默认安装的ftGraphic文件夹中。 FishFacts目录中还有C:\Program Files\Borland\Delphi7\Demos\DB\FishFactsBioLife.cds是二进制格式.cds存储默认扩展名)。

换句话说,不要混淆TClientDataSet文件有C:\Program Files\Borland Shared\Data扩展名愚弄你的事实。这是一个特殊的格式文件,除了通过Biolife.xml访问外,几乎没用。 (在记事本等文本编辑器中打开它;常规XML文件的结构和可读性非常清晰,而CDS XML文件并不整洁。

Borland开发者网站上有一些关于使用Cary Jensen .XML的文章,他在Delphi中编写了几本关于数据库编程的书籍和文章。如果您想使用像TClientDataSet这样的TClientDataSet,他会以#{3}}开头写一篇优秀的系列作品,让您开始使用。

简短回答:如果要在Paradox TClientDataSet中存储图形,请将支持格式的实际图形图像存储到该字段,或创建实际的图形文件和存储它与Biolife.xmlTGraphicField。它必须是一个真实的图形文件(如位图);它不仅仅是你想放在现场的任何东西。

根据您发布的代码运行的一些示例:

LoadFromStream

如果您想使用LoadFromFile var Bmp: TBitmap; BmpField: TGraphicField; begin BmpField := table1.FieldByName('Im') as TGraphicField; Bitmap := TBitmap.Create; try Bitmap.Width := Panel1.Width; Bitmap.Height := Panel1.Height; Panel1.PaintTo(Bitmap.Canvas.Handle, 0, 0); table1.Edit; BmpField.Assign(Bitmap); table1.Post; finally Bitmap.Free; end; end; 来存储您的数据,请按以下步骤操作。

您可以在Delphi 7的TClientDataSet选项卡中的Component Palette上找到Biolife.xml。它的行为与任何其他TClientDataSet一样,这意味着您可以定义持久字段,插入/删除/编辑数据,过滤,创建索引等。

使用它的基础很简单:只需将其放在表单上,​​然后指定文件名即可。右键单击它,然后从弹出菜单中选择Data Access。出现时,右键单击TDataSet,然后选择Fields Editor...。定义要存储的字段及其类型,就像您将任何其他数据集一样。重复,直到您在CDS中添加了所需的所有字段。然后关闭Fields Editor,再次右键点击New Field;将有一个Field Editor选项以前没有。选择它,您将获得新的数据集。

现在您可以正常使用它:创建索引,插入,编辑和删除记录(行),搜索(使用TClientDataSet),过滤等等。它可以(通过Create Dataset)连接到任何数据感知控件,如Locate,就像任何其他数据集一样。您还可以创建图形和备注字段,这在“普通”XML中非常难以实现; CDS负责为您编码和解码所有内容。