XML ファイルを ini ファイルのように使うには?

解決


arigayas  URL  2013-02-28 03:40:57  No: 43971

はじめまして。
学習のために XML を扱おうと思ったのと
設定ファイルを ini ファイルではなく XML ファイルを
使いたいのですがどうすれば良いのでしょうか?

例えば、設定する項目は、
・作ったプログラムのフォームサイズ(幅と高さ)
・最近使用したファイルのパス
です。

使用環境は、Delphi XE1 Pro です。


DEKO  2013-02-28 04:32:53  No: 43972

XE 以降であれば、標準で XMLIniFile が使えますよ。
uses に XMLIniFile を追加してみてください。


DEKO  2013-02-28 04:56:13  No: 43973

つい最近まで標準添付に気付かず、
独自実装したものを XE 以降で使っていました。
http://ht-deko.minim.ne.jp/ft1212.html#121229

その独自実装した TXMLInifile はこちらになります。

[環境設定ファイルに XML を使いたい (Delphi 2009 以降)]
http://ht-deko.minim.ne.jp/tech048.html


arigayas  URL  2013-02-28 05:19:59  No: 43974

DEKO さん、返答していただきありがとうございます。

uses に XMLIniFile を追加しましたが使い方がよくわからないです。
DEKO さんが書いた [環境設定ファイルに XML を使いたい (Delphi 2009 以降)]ページの
「XML の書き出し」、「XML の読み込み」
「階層を持つ環境設定ファイル (簡易)」
「階層を持つ環境設定ファイル (高度)」
「階層を持つ環境設定ファイル (高度) の読み込み」と
同じコードを書けば大丈夫(使える)ということでしょうか?


DEKO  2013-02-28 06:40:58  No: 43975

> uses に XMLIniFile を追加しましたが使い方がよくわからないです。
ドキュメントないですけど、TRegIniFile とほぼ同じ使い方です。
TRegIniFile のドキュメントを読んで、TXMLIniFile に読み替えてください。

[System.Win.Registry.TRegIniFile (DocWiki)]
http://docwiki.embarcadero.com/Libraries/ja/System.Win.Registry.TRegIniFile

> DEKO さんが書いた (中略) 同じコードを書けば
> 大丈夫(使える)ということでしょうか?
いいえ。
独自実装なので考え方は同じですが、使えるメソッドとかが違います。

# TRegIniFile と同等の用途であれば純正の方が簡単です。


arigayas  2013-02-28 10:11:16  No: 43976

DEKO さん
いろいろ試してみます。


arigayas  URL  2013-03-01 18:37:52  No: 43977

いろいろググったりして長時間試した結果報告を。

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>


DEKO  2013-03-01 21:50:13  No: 43978

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 は冗長ですけどね。


tok3  2013-03-01 23:16:39  No: 43979

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;


arigayas  URL  2013-03-02 19:43:57  No: 43980

DEKO さんと tok3 さんの回答を参考に書いてみました > ホームページアドレス先


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加