1

XML との間で設定を保存および読み取るアプリケーションを開発しています。新しい機能を追加するときはもちろん、これらの機能を構成する機能も追加しますが、まだ存在しない XML から変数を読み取ろうとすると、コードがクラッシュすることがわかりました。これが発生すると、読み取る必要のある後続の変数が読み取られず、設定の一部が失われます。次のコードを例として考えてみましょう。

  xmldoc := TXMLDocument.Create(nil);
  Try
  xmldoc.LoadFromFile('c:\myxml.xml');
  xmldoc.Active := True;

  if xmldoc.ChildNodes.Count >= 1 then
    Begin
      Control := Root.ChildNodes.FindNode('Control');
      if Assigned(Control) then
      Begin
        Username.Text := Control.Attributes['Username'];
        Password.Text := Control.Attributes['Password'];
        AutoValidate.Checked := Control.Attributes['AutoValidate'];
        AutoIRC.Checked := Control.Attributes['AutoIRC'];
        Passive.Checked := Control.Attributes['Passive'];
        DoNothing.Checked := Control.Attributes['DoNothing'];
        OpenPage.Checked := Control.Attributes['OpenPage'];
        DownloadUsingBrowser.Checked := Control.Attributes['DownloadUsingBrowser'];
        RSSFeed.Checked := Control.Attributes['RSSFeed'];
        SaveToFolder.Checked := Control.Attributes['SaveToFolder'];
        SaveToFTP.Checked := Control.Attributes['SaveToFTP'];
        SavePath.Text := Control.Attributes['SavePath'];
        FTPPath.Text := Control.Attributes['FTPPath'];
      End;
    End;
  Finally
    xmldoc.Active := False;
  End;

オプションとして「AutoValidate」を追加したばかりだと仮定します。アプリケーションによってまだ保存されていないため、XML ファイルにはこのプロパティがありませんが、アプリケーションは起動時にこのプロパティを読み取ろうとします (プリファレンスを読み取ります)。

欠落しているプロパティが古き良き「例外クラス EVariantTypeCastError というメッセージを発生させないようにするにはどうすればよいですか 'タイプ (Null) のバリアントをタイプ (Boolean) に変換できませんでした'」

4

1 に答える 1

3

最初に属性の値をテストする必要があります。たとえば、次のようなユーティリティ関数を作成できます。

function xmlGetBoolAttrValue(ANode:iXMLNode; const AName:String; ADefault:boolean): boolean;
var
  V: variant;
begin
  Result := ADefault;
  if not Assigned(ANode) then
    exit;
  V := ANode.Attributes[AName];
  if VarIsNull(V) then
    exit;
  Result := V;
end;

そしてそれを使う

SaveToFTP.Checked := xmlGetBoolAttrValue(Control, 'SaveToFTP', false);
于 2013-06-24T14:32:52.430 に答える