0

我需要一些帮助......
我在delphi 7中有一个带有图形字段的悖论表。有了这个: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文件。那么有什么想法吗?

4

1 回答 1

3

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

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

(如果这是 TLDR,只需跳到下面标记为Short Answer的段落。)

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

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

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

换句话说,不要混淆Biolife.xml文件具有.XML欺骗您的扩展名这一事实。这是一个特殊格式的文件,除了通过TClientDataSet. (在记事本之类的文本编辑器中打开它;常规的 XML 文件结构清晰易读,而 CDS XML 文件则没有那么整洁。

Borland Developer 网站上有一些关于TClientDataSetCary Jensen 使用的文章,他写了几本关于 Delphi 数据库编程的书籍和文章。他写了一个很棒的系列A ClientDataSet in Every Database Application文章,如果你想使用TClientDataSetlike的话,应该可以帮助你入门Biolife.xml

简短回答:如果您想将图形存储在 ParadoxTGraphicField中,请将受支持格式的实际图形图像存储到该字段,或者创建一个实际图形文件并使用LoadFromStreamor存储它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;

如果您想使用点TClientDataSetBiolife.xml来存储您的数据,这里是如何开始的。

您可以在 Delphi 7 选项卡中TClientDataSet的 Component Palette 上找到Data Access它。它的作用与其他任何 类似TDataSet,这意味着您可以定义持久字段、插入/删除/编辑数据、过滤、创建索引等。

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

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

于 2013-06-29T01:09:21.117 回答