簡體   English   中英

從圖形字段寫入XML文件並讀取

[英]Write XML file from graphic field and read

我需要一些幫助...
我在帶有圖形字段的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創建一個XML文件,例如“ biolife.xml”。 有什么想法嗎?

您鏈接的文章寫的是純XML文件,而不是Biolife.xml文件。 圖形不能存儲在純XML文件中(寫入時必須進行編碼,讀取時必須進行解碼)。 該帖子(由Mike Skolnik撰寫)不使用圖形字段,因為圖形是二進制數據並且不適合標准XML(並且不能通過存儲在字符串中然后寫入TFileStream來正確地編寫或讀取。)

Biolife.xml不是圖形文件。 它是一個TClientDataSet (簡稱CDS),以XML格式存儲。 它具有XML擴展名,但與鏈接的文章所創建的簡單XML文件相去甚遠。

(如果這是TLDR,只需跳到標記為Short Answer的下一段。)

TClientDataSet是一個內存中數據集,可以以二進制或XML格式保存(保存)到文件中。 換句話說,這是一種特殊的數據庫。 (有關更多信息,請參見我的答案的更下方。)

悖論對其可以存儲並直接在TGraphicField使用的圖形類型有限制,但是我不記得它們是TGraphicField使用的。 (可以通過Borland數據庫引擎或BDE訪問Paraadox,並且它已經被棄用了十多年了,自1990年代中期Delphi 1起我就沒有使用它。)您可以看到TGraphicField的可能類型。可以在Delphi 7幫助文件中存儲TGraphicField.SetFieldType方法; 似乎可以接受的唯一實際圖像文件是ftGraphic ,這是一個位圖。

Delphi 7中的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文件卻不那么整潔。

在Borland Developer網站上有一些有關使用Cary Jensen的TClientDataSet的文章,他寫了幾本關於在Delphi中進行數據庫編程的書籍和文章。 如果您想使用像Biolife.xml這樣的TClientDataSet ,他寫了一個很棒的系列文章,從A ClientDataSet in Every Database Application中的A ClientDataSet in Every Database Application開始,應該會讓您入門。

簡短答案 :如果要將圖形存儲在Paradox TGraphicField ,請以支持的格式將實際圖形圖像存儲到該字段,或者創建一個實際圖形文件並將其與LoadFromStreamLoadFromFile一起存儲。 但是它必須是一個實際的圖形文件(如位圖)。 它不能只是您想放入該字段中的任何內容。

根據您發布的代碼可以工作的示例:

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;

如果您想使用像Biolife.xml這樣的TClientDataSet來存儲數據,那么這里是開始的方法。

您可以在Delphi 7的“ Data Access選項卡上的“組件面板”上找到TClientDataSet 。它的作用與其他TDataSet ,這意味着您可以定義持久字段,插入/刪除/編輯數據,過濾,創建索引等。

使用它的基礎很簡單:只需將其放在表單上,​​然后分配文件名即可。 右鍵單擊它,然后從彈出菜單中選擇“ Fields Editor... ”。 出現時,右鍵單擊“ Fields Editor ”,然后選擇“ New Field 定義要存儲的字段及其類型,就像定義其他任何數據集一樣。 重復進行,直到將所有想要的字段添加到CDS中為止。 然后關閉“ Field Editor ,然后再次右鍵單擊“ TClientDataSet 會有一個以前沒有的“ Create Dataset選項。 選擇它,您將擁有新的數據集。

現在,您可以正常使用它:創建索引,插入,編輯和刪除記錄(行),搜索(使用Locate ),過濾器等等。 它可以(通過TDataSource )連接到任何數據感知控件(如TDBGrid ,就像其他任何數據集一樣。 您還可以創建圖形和備注字段,這在“常規” XML中很難做到; CDS會為您編碼和解碼所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM