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

从图形字段写入XML文件并读取,xml,delphi,dataset,Xml,Delphi,Dataset,我需要一些帮助…我在delphi 7中有一个带有图形字段的悖论表。有了这个:我可以从delphi的演示中创建一个类似biolife.XML的XML文件,但不需要图形字段。我添加了:ftGraphic:Result:=“bin.hex”SUBTYPE=“Graphic”在代码处,但什么都没有。。。XML文件结尾:Im=“/>在Im=”之后应该是图像代码,但它是空的,并且也没有关闭引号。对于我使用的图形字段: image1.Picture:= nil; panel1.PaintTo(image1.C

我需要一些帮助…
我在delphi 7中有一个带有图形字段的悖论表。有了这个:我可以从delphi的演示中创建一个类似biolife.XML的XML文件,但不需要图形字段。我添加了:
ftGraphic:Result:=“bin.hex”SUBTYPE=“Graphic”
在代码处,但什么都没有。。。XML文件结尾:
Im=“/>

在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文件。有什么想法吗?

你链接的文章写的是普通的XML文件,而不是像
Biolife.XML这样的文件。图形不能存储在普通的XML文件中(它们必须在写入时进行编码,在读取时进行解码)。这篇文章(由Mike Skolnik撰写)没有使用图形字段,因为图形是二进制数据,不适合标准XML(并且不能通过存储在字符串中然后写入到
TFileStream
来正确写入或读取)

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

(如果这是TLDR,只需跳到下面标有简短答案的段落即可

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

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

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

换句话说,不要混淆
Biolife.xml
文件具有
.xml
扩展名这一事实。它是一种特殊格式的文件,除了通过
TClientDataSet
访问外,几乎没有任何用处。(在记事本之类的文本编辑器中打开它;常规XML文件的结构非常清晰,可读性很强,而CDS XML文件则没有那么整洁

Cary Jensen在Borland开发者网站上发表了一些关于使用
TClientDataSet
的文章,他用Delphi写了几本关于数据库编程的书和文章。如果你想使用
TClientDataSet
比如
Biolife.xml
,他写了一个优秀的系列文章,从这开始你就应该开始了

简短回答:如果要在Paradox
tgraphic字段
中存储图形,请以支持的格式将实际图形图像存储到该字段,或创建实际图形文件并使用
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;
如果您想使用
TClientDataSet
Biolife.xml
来存储您的数据,下面是如何开始的

您可以在Delphi 7的
数据访问
选项卡的组件选项板上找到
TClientDataSet
。它的作用与任何其他
TDataSet
一样,这意味着您可以定义持久字段、插入/删除/编辑数据、筛选、创建索引等

使用它的基本方法很简单:只需将其放在表单上,并指定一个文件名。右键单击它,然后从弹出菜单中选择
字段编辑器…
。右键单击出现的
字段编辑器,然后选择
新建字段
。定义要存储的字段及其类型,就像您在任何其他字段编辑器中一样ataset。重复此操作,直到您在CD中添加了所需的所有字段。然后关闭
字段编辑器
,再次右键单击
TClientDataSet
;将出现一个以前没有的
创建数据集
选项。选择它,您将拥有新的数据集


现在,您可以像平常一样使用它:创建索引、插入、编辑和删除记录(行)、搜索(使用
定位
)、筛选,等等。它可以连接(通过
TDataSource
)与任何其他数据集一样,对任何数据感知控件(如
TDBGrid
)执行。您还可以创建图形和备注字段,这在“正常”中极为困难XML;CD负责为您编码和解码所有内容。

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

Biolife.xml
不是图形文件。它是一个
TClientDataSet
(简称CD),以xml格式存储。它有一个xml扩展名b