Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TXMLDocument в RUNTIME [D2005, XP]


Страницы:   1 2 3 4

Димон ©   (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 17:37:00) [21]

Вот вони и указали - гляди, не нарвись!

Ну ты догада. А я что говорил здесь всю дорогу?

Главное, что ты вызвал метод, который вернул интерфейс(IXMLNode), в Release этого интефейса и будет уничтожен документ.  

Ага. В среду будет уничтожен, а если в четверг и луна в первой четверти то нет.

Пожалте в сад - там хорошо

Ага. А вам на йух.


ага0   (2008-05-26 17:30:00) [22]


> Reindeer Moss Eater ©   (26.05.08 17:19) [45]


> На помедитируй:


> x := TXMLDocument.Create(Self);

Фсе, ты меня добил. Пожалте в сад - там хорошо, там яблоки. гуд бай. май фрэнд.


ага0   (2008-05-26 17:27:00) [23]


> Либо вот это объясни:
>
> When TXMLDocument is created without an Owner, it behaves
> like an interfaced object.

Лана, последняя попытка уж извини.
"Когда TXMLDocument создается без владельца, он ведет себя как обычный объект, резализующий какой-нито интерфейс". Типа в отличии от TComponent, который пилиет на всякий подсчет сцылок. А сказано затем, что TXMLDocument - потомок TComponent и логично ожидать о нево того-ж поведения. Вот вони и указали - гляди, не нарвись!

А "фич" от дельфийской помощи в работе с интерфейсами у мене - полный чумудан.


Reindeer Moss Eater   (2008-05-26 17:19:00) [24]

Главное, что ты вызвал метод, который вернул интерфейс(IXMLNode), в Release этого интефейса и будет уничтожен документ.  

На помедитируй:
Интерфейс освобождается, документ живет.

procedure TForm1.Button1Click(Sender: TObject);
var x : TXMLDocument;
begin
x := TXMLDocument.Create(Self);
x.Active := True;
x.Encoding := 'windows-1251';
x.AddChild('root');
PostMessage(Handle,WM_USER,1000,LParam(x));
end;

procedure TForm1.OnMyMsg(var Msg: TMessage);
begin
if Msg.WParam = 1000 then ShowMEssage(TXMLDocument(Msg.LParam).XML.Text);
end;


Reindeer Moss Eater   (2008-05-26 17:13:00) [25]

Либо вот это объясни:

When TXMLDocument is created without an Owner, it behaves like an interfaced object.


Reindeer Moss Eater   (2008-05-26 17:11:00) [26]

это бесполезно ;-)

Будет полезно, если скажешь причину AV.


Reindeer Moss Eater   (2008-05-26 17:10:00) [27]

Да по барабану что и кто там мне вернул.
Я этот результат нигде не использую и в x остался тот самый "обычный объект"
Я же не результат AddChild передаю через LParam.


ага0   (2008-05-26 17:10:00) [28]


> jack128_   (26.05.08 17:08) [40]


> это бесполезно ;-)

Понял - отстал:)


jack128_   (2008-05-26 17:08:00) [29]


> дык я ж сказал

это бесполезно ;-)


jack128_   (2008-05-26 17:06:00) [30]


> в x-то осталась ссылка на результаты конструктора, а не
> addchild.

в x - у тя ссылка на объект.

Главное, что ты вызвал метод, который вернул интерфейс(IXMLNode), в Release этого интефейса и будет уничтожен документ.  

Вообще - странный ты человек..  [31] - ты хошь обсуждать, так как он вроде как вписывается в твою теорию, а вот [10] - намеренно игнорируешь...


ага0   (2008-05-26 17:05:00) [31]

дык я ж сказал:( Неявная переменная для результа AddChild освобождается. компилер вызывает для нее release, у нутрях TXMLNode._release вызывается TXMLDocument._release, там счетчик ссылок обнуляитси и вызывается деструктор - че не понятно-то? Гримассы автоматизации работы с интерфейсами в дельфях.

> А вот не надо ничего менять.

А че ит не надо-то, когда с такого весь базар зачался?


Reindeer Moss Eater   (2008-05-26 16:53:00) [32]

Ты ж вызвал x.AddChild. А вона че возвращает? правильно - интерфейс.

И чо?

в x-то осталась ссылка на результаты конструктора, а не addchild.

Меняем этим кодом код из

А вот не надо ничего менять.
Надо сказать откуда в моем примере AV.


ага0   (2008-05-26 16:37:00) [33]

Ну ты даешь:)

Ты ж вызвал x.AddChild. А вона че возвращает? правильно - интерфейс. А че делает компилятор, получив интерфейсную сцылку? Правильно - вызывает для нее addRef. А где он ее хранит? Опять правильно - в неявно созданной локальной переменной. А че деет компилер, когда интерфейсная ссылка выходит из области видимости? Ну эт и ежу известно - вызывает для нее release. А что делает реализация TXMLNode._release? А она у своей ссылки на объектFDocument: TXMLDocument вызывает релиз! Вот ведь падла, а? Ну дальше понятно, ага?

Теперь вертаемся взад.

> Reindeer Moss Eater ©   (26.05.08 14:37) [30]
> в примере из [10] объект будет освобожден механизмом подсчета
> ссылок после выхода из локальной процедуры.


> Reindeer Moss Eater ©   (24.05.08 14:48) [10]
> with TXMLDocument.Create(nil) do
> begin
>  LoadFromFile('Дурилка ты картонная.xml');
>  ShowMessage(xml.Text);
> end;

Меняем этим кодом код из
> Reindeer Moss Eater ©   (26.05.08 14:51) [31]
и...где исключение? Исключение-то где?


Reindeer Moss Eater   (2008-05-26 15:50:00) [34]

ау!
куда делся объект, если никто явно не вызывал free и если он якобы не освобождается при выходе из области видимости?


Reindeer Moss Eater   (2008-05-26 15:32:00) [35]

Ну давай, разъясняй, дядька.


ага0   (2008-05-26 15:26:00) [36]

2 Reindeer Moss Eater

Ты че, прикалываешься?

procedure TForm1.Button1Click(Sender: TObject);
var x : TXMLDocument;
begin
x := TXMLDocument.Create(nil);
x.Active := True;
x.Encoding := 'windows-1251';
//x.AddChild('root');
PostMessage(Handle,WM_USER,1000,LParam(x));
end;

Разницу сам вкуришь аль разъяснить?


Reindeer Moss Eater   (2008-05-26 14:57:00) [37]

Точнее так:
:)

procedure TForm1.OnMyMessage(var Msg: TMessage);
begin
if Msg.WParam = 1000 then
try
 ShowMessage(TXMLDocument(Msg.LParam).XML.Text);
except
 on E: Exception do
 ShowMessage('Ой! а где же наш самый обыкновенный неинтерфейсный объект?!'#13#10 + E.Message);
end;
end;


Reindeer Moss Eater   (2008-05-26 14:51:00) [38]

procedure TForm1.Button1Click(Sender: TObject);
var x : TXMLDocument;
begin
x := TXMLDocument.Create(nil);
x.Active := True;
x.Encoding := 'windows-1251';
x.AddChild('root');
PostMessage(Handle,WM_USER,1000,LParam(x));
end;

procedure TForm1.OnMyMessage(var Msg: TMessage);
begin
if Msg.WParam = 1000 then ShowMessage(TXMLDocument(Msg.LParam).XML.Text);
end;


Reindeer Moss Eater   (2008-05-26 14:37:00) [39]

в примере из [10] объект будет освобожден механизмом подсчета ссылок после выхода из локальной процедуры.


jack128_   (2008-05-26 14:23:00) [40]


> . Я не говорил, что конструктор вернет интерфейс.


Ты это говорил:

> Если в конструктор передан нил то возвращается чисто интерфейсная
> ссылка а не объектная

?


> В реальном случае (не с искуссвенным примером где используется
> наследник) объект будет освобожден как только выйдет из
> области видимости.


Твой пример из [10] я так понимаю тоже искуственный? в нем ведь тоже объект не уничтожается.

Тогда можно чёткий критерий, по которому мона отличить искуственный пример от неискуственного ??


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо