はじめまして。
学習のために 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 さんの回答を参考に書いてみました > ホームページアドレス先
| ツイート | 
        
         |