2013-11-26 2 views
1

Im пытается загрузить удаленный XML-файл с использованием Delphi. Я предполагаю, что могу загрузить его из Stream. У меня есть класс FetchRemote, который извлекает поток URL:Возвращение XML-документа из функции

function TFetchRemote.StreamFromUrl(filename : String) : TMemoryStream; 
var 
    memStream : TMemoryStream; 
    http : TIdHttp; 
begin 
    http := TIdHttp.Create(); 
    memStream := TMemoryStream.Create; 
    http.Get(url + filename, memStream); 
    Result := memStream; 
end; 

Я пытаюсь использовать возвращаемый поток памяти для загрузки удаленного XML:

function TFetchRemoteXML.XMLFromUrl(filename : string) : TXMLDocument; 
var 
    memStream : TMemoryStream; 
begin 
    memStream := fetchRemote.StreamFromURL(filename); 
    try 
    memStream.Position := 0; 
    Result := TXMLDocument.LoadFromStream(memStream); 
    finally 
    memStream.Free; 
    end; 
end; 

ошибка, что я получаю, когда я пытаюсь компиляции это: (на обратном Результат линии)

[dcc32 Error] FetchRemoteXML.pas (31): E2076 Эта форма вызова метода допускается только для методов класса или конструктора

У меня есть аналогичный класс/метод для извлечения удаленного растрового изображения, и он отлично работает. Я просто не вижу, что я делаю неправильно, чтобы получить XML. Я пробовал следовать некоторым примерам в помощи Delphi и пытался получить некоторые подсказки от этого StackOverflow question, но не повезло. Любые предложения были бы очень благодарны, я новичок в Delphi (с фона Ruby). Я использую RAD Studio XE 5.

Заранее спасибо!

+0

Ваш код указывает, что вы можете не знать о правилах управления жизненным циклом объекта в Delphi. Возможно, вам понадобится немного времени и узнать это сейчас. –

ответ

4

Метод LoadFromStream - метод экземпляра. Это означает, что вам нужно создать экземпляр экземпляра TXMLDocument и позвонить по телефону LoadFromStream.

Result := TXMLDocument.Create(Owner); 
Result.LoadFromStream(...); 

Вам нужно будет поставить владельца для объекта, как описано в documentation для конструктора.

Или пройти nil к конструктору и переключиться на IXMLDocument вместо TXMLDocument.

function TFetchRemoteXML.XMLFromUrl(filename : string) : IXMLDocument; 
var 
    memStream : TMemoryStream; 
begin 
    memStream := fetchRemote.StreamFromURL(filename); 
    try 
    Result := TXMLDocument.Create(nil); 
    Result.LoadFromStream(memStream); 
    finally 
    memStream.Free; 
    end; 
end; 
+0

Я пробовал вызывать 'xml: = TXMLDocument.Create (nil); Результат: = xml.LoadFromStream (memStream); 'но он возвращает другое сообщение об ошибке: [dcc32 Error] FetchRemoteXML.pas (33): E2010 Несовместимые типы:« TXMLDocument »и« процедура, нетипизированный указатель или нетипизированный параметр » – jbmoon

+0

не будет работать. Компилятор объясняет, почему нет. Делайте то, что я говорю в ответ. –

+0

Работал как шарм! Спасибо! – jbmoon

Смежные вопросы