Показать сообщение отдельно
  #2  
Старый 28.05.2023, 06:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

И в чем проблема?
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  sXml = '<xml><items><item><id>1</id></item><item><id>2</id></item></items></xml>';
var
  xmlDoc : IXMLDocument;
  strXml : String;
begin
  xmlDoc := TXMLDocument.Create(Nil);
  Try
    xmlDoc.LoadFromXML(sXml);
    xmlDoc.Active := True;
    xmlDoc.ChildNodes.Nodes[0].AddChild('item').AddChild('id').Text := '3';
    xmlDoc.SaveToXML(strXml);
    strXml := StringReplace(strXml,'</item>','</item>'#13#10,[rfReplaceAll]); //  Это просто для удобства просмотра
    ShowMessage(strXml);
  Finally
  End;
end;
т.е. у тебя в xmlDoc уже ссылка на интерфейс сразу после создания объекта.

Если тебе нужен именно IUnknown, то попроси его у IXMLDocument:
Код:
var
  intfUnkn : IUnknown;
begin
  ...
  intfUnkn := xmlDoc as IUnknown;
  ...

ЗЫ. Кстати, такой объект удалять не надо, он сам самоудалится как только выйдет из области видимости - это ж Com объект.

ЗЗЫ. Кстати, IXMLDocument, походу, не является OLE Automation интерфейсом, так что "засунуть" его в OleVariant не получится.
Если надо возвращать какой-то общий тип, то возвращай IUnknown:
Код:
function GetXML(Str : String) : IUnknown;
var
  xmlDoc : IXMLDocument;
begin
  xmlDoc := TXMLDocument.Create(Nil);
  xmlDoc.LoadFromXML(str);
  xmlDoc.Active := True;
  Result := xmlDoc as IUnknown;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
  sXml = '<xml><items><item><id>1</id></item><item><id>2</id></item></items></xml>';
var
  xmlDoc : IXMLDocument;
  strXml : String;
begin
  xmlDoc := GetXML(sXml) as IXMLDocument;
  xmlDoc.ChildNodes.Nodes[0].AddChild('item').AddChild('id').Text := '3';
  xmlDoc.SaveToXML(strXml);
  strXml := StringReplace(strXml,'</item>','</item>'#13#10,[rfReplaceAll]); //  Это просто для удобства просмотра
  ShowMessage(strXml);
end;
Ответить с цитированием