はじめまして。
学習のために XML を扱おうと思ったのと
設定ファイルを ini ファイルではなく XML ファイルを
使いたいのですがどうすれば良いのでしょうか?
例えば、設定する項目は、
・作ったプログラムのフォームサイズ(幅と高さ)
・最近使用したファイルのパス
です。
使用環境は、Delphi XE1 Pro です。
XE 以降であれば、標準で XMLIniFile が使えますよ。
uses に XMLIniFile を追加してみてください。
つい最近まで標準添付に気付かず、
独自実装したものを XE 以降で使っていました。
http://ht-deko.minim.ne.jp/ft1212.html#121229
その独自実装した TXMLInifile はこちらになります。
[環境設定ファイルに XML を使いたい (Delphi 2009 以降)]
http://ht-deko.minim.ne.jp/tech048.html
DEKO さん、返答していただきありがとうございます。
uses に XMLIniFile を追加しましたが使い方がよくわからないです。
DEKO さんが書いた [環境設定ファイルに XML を使いたい (Delphi 2009 以降)]ページの
「XML の書き出し」、「XML の読み込み」
「階層を持つ環境設定ファイル (簡易)」
「階層を持つ環境設定ファイル (高度)」
「階層を持つ環境設定ファイル (高度) の読み込み」と
同じコードを書けば大丈夫(使える)ということでしょうか?
> uses に XMLIniFile を追加しましたが使い方がよくわからないです。
ドキュメントないですけど、TRegIniFile とほぼ同じ使い方です。
TRegIniFile のドキュメントを読んで、TXMLIniFile に読み替えてください。
[System.Win.Registry.TRegIniFile (DocWiki)]
http://docwiki.embarcadero.com/Libraries/ja/System.Win.Registry.TRegIniFile
> DEKO さんが書いた (中略) 同じコードを書けば
> 大丈夫(使える)ということでしょうか?
いいえ。
独自実装なので考え方は同じですが、使えるメソッドとかが違います。
# TRegIniFile と同等の用途であれば純正の方が簡単です。
DEKO さん
いろいろ試してみます。
いろいろググったりして長時間試した結果報告を。
uses に XMLIniFile を追加して
フォームに XMLDocument (これがないと実行時にエラーになる)を貼付けて以下のようなソースを書いて出来ました。
procedure TForm1.Button1Click(Sender: TObject);
var
Root : TXMLDocument;
settingsXML: TXMLIniFile;
RootTag : string;
SaveFolder: string;
begin
// XMLiniファイルに書き込む。
Root := XMLDocument1;
RootTag := ExtractFileName(ChangeFileExt(Application.ExeName, ''));
Root.XML.Text := '<' + RootTag + '></' + RootTag + '>'; // ルート部分をEXEファイル名に
Root.Options := [doNodeAutoIndent];
Root.Active := True;
settingsXML := TXmlIniFile.Create(Root.DocumentElement);
try
settingsXML.WriteInteger('Form', 'Width' , Form2.Width );
settingsXML.WriteInteger('Form', 'Height', Form2.Height );
settingsXML.WriteString('Path', 'TempSaveFolder', SaveFolder);
Root.SaveToFile(ChangeFileExt(Application.ExeName, '.xml'));
finally
settingsXML.Free;
end;
end;
で保存されるXMLは
<Project1>
<Form>
<Form Name="Width">651</Form>
<Form Name="Height">338</Form>
</Form>
<Path>
<Path Name="TempSaveFolder"></Path>
</Path>
</Project1>
UpdateFile 未実装とか...orz
XMLInifiles (独自実装の方です) を使った場合は
procedure TForm1.Button1Click(Sender: TObject);
var
XML: TXMLIniFile;
XMLFileName: string;
RootTag: string;
SaveFolder: string;
begin
XMLFileName := ChangeFileExt(Application.ExeName, '.xml');
RootTag := ExtractFileName(ChangeFileExt(Application.ExeName, ''));
XML := TXMLIniFile.Create(XMLFileName);
try
XML.OpenNode(RootTag + '/Form' , True);
XML.WriteInteger('Width' , Self.Width );
XML.WriteInteger('Height' , Self.Height);
XML.OpenNode(RootTag + '/Path' , True);
XML.WriteString('TempSaveFolder', SaveFolder);
XML.UpdateFile;
finally
XML.Free;
end;
end;
こんな感じになります。吐かれた XML は冗長ですけどね。
XE2ですがUpdateFile…(ぇ
XMLDoc.TXMLDocumentの代わりにXMLIntf.IXMLDocumentを使うと
フォームにTXMLDocumentを貼る必要がありません。
uses
System.IOUtils, Xml.XMLDoc, Xml.XMLIntf, Xml.XMLIniFIle;
:
var
root: IXMLDocument;
:
begin
// XMLiniファイルに書き込む。
root := NewXMLDocument();
:
// ルートノードの追加はIXMLDocumentに直接AddChildで
root.AddChild( TPath.GetFileNameWithoutExtension( Application.ExeName ) );
:
end;
DEKO さんと tok3 さんの回答を参考に書いてみました > ホームページアドレス先
ツイート | ![]() |