更改TXMLDocument.SaveToFile

时间:2019-04-14 16:26:32

标签: delphi exception delphi-xe

在生产中,有时会出现“访问被拒绝”类型的异常。 调用堆栈来自此行

vXML.SaveToFile(Filename);

其中vXML是IXMLDocument。

这里的问题是未记录文件名。 我尝试了这个小的测试程序。

implementation

uses
  xmldoc, Unit12;

{$R *.dfm}

procedure TForm11.FormShow(Sender: TObject);
const
  cnFile = 'C:\Program Files (x86)\test.xml';
var
  vXML: TAttracsXMLDoc;
begin
  vXML := TAttracsXMLDoc.Create(nil);
  try
    vXML.Active := True;
    // Process vXML
    vXML.SaveToFile(cnFile);
  finally
    vXML.Free;
  end;
end;

和其他单位

unit Unit12;

interface

uses
  xmldoc,
  xml.xmldom,
  Xml.XMLIntf;

type
  TAttracsXMLDoc = class(TXMLDocument)
    procedure SaveToFile(const AFileName: DOMString); override;
  end;

implementation

uses
  Sysutils;

procedure TAttracsXMLDoc.SaveToFile(const AFileName: DOMString);
begin
  try
    inherited SaveToFile(AFileName);
  except
    on E: Exception do
    begin
      E.Message := E.Message + ' ' + AFileName + ' cannot be saved';
      raise;
    end;
  end;
end;

end.

它按预期工作。但是问题在于不再使用接口IXMLDocument。我想使用这样的代码:

procedure TForm11.FormShow(Sender: TObject);
const
  cnFile = 'C:\Program Files (x86)\test.xml';
var
  vXML: IXMLDocument;
begin
  vXML := NewXMLDocument;
  // Process vXML
  vXML.SaveToFile(cnFile);
end;

在对现有代码进行的最小更改下,上面捕获了异常,并带有明显的原因错误。最佳途径是什么?

1 个答案:

答案 0 :(得分:2)

只需将NewXMLDocument()替换为TAttracsXMLDoc,即可获得所需的行为:

function NewAttracsXMLDocument: IXMLDocument;
begin
  Result := TAttracsXMLDoc.Create(nil);
end;

procedure TForm11.FormShow(Sender: TObject);
const
  cnFile = 'C:\Program Files (x86)\test.xml';
var
  vXML: IXMLDocument;
begin
  vXML := NewAttracsXMLDocument; //NewXMLDocument;
  // Process vXML
  vXML.SaveToFile(cnFile);
end;