![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TXMLDocument в RUNTIME [D2005, XP]
Димон © (2008-05-24 13:26:00)Помогите разобраться ... Когда бросаю компонент TXMLDocument на форму и выполняю эту функцию, функция отрабатывает нормально. Когда убираю компонент из формы и создаю его в ручную, через XMLDoc := TXMLDocument.Create(nil) - То функция отрабатывает с ошибками ...
Ошибка при чтении записей ...
function fFinde (Value : WideString) : WideString;
Var
i:integer;
XMLDoc : TXMLDocument;
begin
try
XMLDoc := TXMLDocument.Create(nil);
XMLDoc.LoadFromFile('C:\1.xml');
XMLDoc.Active := True;
for i := 0 to XMLDoc.ChildNodes['Records'].ChildNodes.Count - 1 do
begin
ShowMessage(XMLDoc.ChildNodes['Records'].ChildNodes[i].ChildNodes['Item'].Text);
end;
finally
XMLDoc.Free;
end;
end;
Reindeer Moss Eater (2008-05-26 13:58:00) [41]С каких пирогов?
что, снова цитировать здесь description из хелпа?
Reindeer Moss Eater (2008-05-26 13:54:00) [42]я же в 17 привел пример - не освобождается. Так как конструктор вернет объект, а не интерфейс..
1. Я не говорил, что конструктор вернет интерфейс.
2. В реальном случае (не с искуссвенным примером где используется наследник) объект будет освобожден как только выйдет из области видимости.
это я и называю интефейсной ссылкой.
jack128_ (2008-05-26 12:58:00) [43]
> то будет автоматный релиз, компилер кастанет
оператор присваивания - мы всё равно сами должны будем - явно написать :-) Хотя формально это и подпадает под опредление явного каста, согласен. Но вобщем то неважно...
ага0 (2008-05-26 12:54:00) [44]
> К интерфейсу мы должны явно его кастить.
Явно кастить не обязательно. Ежель в вопросе заменить
> XMLDoc : TXMLDocument;
на
> XMLDoc : IXMLDocument;
то будет автоматный релиз, компилер кастанет
jack128_ (2008-05-26 12:46:00) [45]
> Но при выходе из области видимости она же освобождается.
я же в 17 привел пример - не освобождается. Так как конструктор вернет объект, а не интерфейс..
К интерфейсу мы должны явно его кастить.
ага0 (2008-05-26 12:41:00) [46]
> Но при выходе из области видимости она же освобождается.
Кто? Вот это?
> XMLDoc : TXMLDocument;
> begin
> try
> XMLDoc := TXMLDocument.Create(nil);
С каких пирогов?
Reindeer Moss Eater (2008-05-26 12:34:00) [47]Да нифига она себя не ведет как интерфейс
я и не говорил, что это интерфйес
Reindeer Moss Eater (2008-05-26 12:23:00) [48]Но при выходе из области видимости она же освобождается.
ЮЮ (2008-05-26 12:18:00) [49]> Если что-то ведет себя как интерфейсная ссылка
в [17] же не ведет.
ага0 (2008-05-26 12:16:00) [50]
> Если в конструктор передан нил то возвращается чисто интерфейсная
> ссылка а не объектная
:-)))) Че тут тока не узнаешь
Там написано что ежель без овнера, то подсчет ссылок работает, а ежель с овнером то отключен.
> Если что-то ведет себя как интерфейсная ссылка, лает как
> интерфейсная ссылка и пахнет как интерфейсная ссылка, то
> это что-то и есть интерфейсная ссылка
Да нифига она себя не ведет как интерфейс, как была объектом так им и осталась. А неявное преобразование оно преобразование и есть
Reindeer Moss Eater (2008-05-26 12:05:00) [51]Если что-то ведет себя как интерфейсная ссылка, лает как интерфейсная ссылка и пахнет как интерфейсная ссылка, то это что-то и есть интерфейсная ссылка
:)
jack128_ (2008-05-26 11:56:00) [52]Чесно говоря не вижу, где тут написано что конструктор возвращает интефейсную ссылку. Если бы это было так, то при выполнении этого кода:
type
TXMLDocument_Test = class(TXMLDocument)
public
destructor Destroy; override;
end;
{ TXMLDocument_Test }
destructor TXMLDocument_Test.Destroy;
begin
ShowMessage('TXMLDocument_Test.Destroy');
inherited;
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
with TXMLDocument_Test.Create(nil) do
begin
end;
end;
Мы бы увидели сообщение "TXMLDocument_Test.Destroy" чего не наблюдается...
А вот если мы бы написали так:
with TXMLDocument_Test.Create(nil) as IXMLDocument do
begin
end;
то это совершенно другое дело.
Reindeer Moss Eater (2008-05-26 11:41:00) [53]When TXMLDocument is created without an Owner, it behaves like an interfaced object. That is, when all references to its interface are released, the TXMLDocument instance is automatically freed. When TXMLDocument is created with an Owner, however, it behaves like any other component, and is freed by its Owner.
Reindeer Moss Eater (2008-05-26 11:39:00) [54]А с таких вот пор.
jack128_ (2008-05-26 10:54:00) [55]
> Если в конструктор передан нил то возвращается чисто интерфейсная
> ссылка
> with TXMLDocument.Create(nil) do
> begin
> LoadFromFile('Дурилка ты картонная.xml');
> ShowMessage(xml.Text);
> end;
>
это с каких пор конструктор стал возвращать интефейсные ссылки ???
sniknik (2008-05-24 15:45:00) [56]операция присвоения -
:=
Димон (2008-05-24 15:25:00) [57]и как этот объект присвоить к переменной ?
sniknik (2008-05-24 15:12:00) [58]> Reindeer Moss Eater © (24.05.08 14:48) [10]
или
with TXMLDocument.Create('Дурилка ты картонная.xml') do
ShowMessage(xml.Text);
Reindeer Moss Eater (2008-05-24 14:48:00) [59]with TXMLDocument.Create(nil) do
begin
LoadFromFile('Дурилка ты картонная.xml');
ShowMessage(xml.Text);
end;
Димон (2008-05-24 14:43:00) [60]Решил проблему следующим извращенным методом, иначе ничего не придумал.
dm : TDataModule;
begin
try
dm:=tdatamodule.create(nil);
XMLDoc := TXMLDocument.Create(dm);