![]() |
| ||
|
|
Новости |
Поиск |
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 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] я так понимаю тоже искуственный? в нем ведь тоже объект не уничтожается.
Тогда можно чёткий критерий, по которому мона отличить искуственный пример от неискуственного ??