[英]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
,請以支持的格式將實際圖形圖像存儲到該字段,或者創建一個實際圖形文件並將其與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;
如果您想使用像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.