![]() |
| ||
|
|
Новости |
Поиск |
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;
ага0 (2008-05-27 11:16:00) [1]2 jack128_
Ты был стопудово прав када сказал что объяснять беспонтово.
jack128_ (2008-05-27 11:04:00) [2]
> т.к. не будет даже создан. ты привел абстрактный класс.
Ну собсвенно вот всё и видно, кто запускал код, а кто - нет.
sniknik (2008-05-27 10:52:00) [3]> по коду, обязательно ->
хотя нет, извини ошибся, в данном коде он не уничтожится т.к. не будет даже создан. ты привел абстрактный класс.
ага0 (2008-05-27 10:51:00) [4]
> sniknik © (27.05.08 08:52) [62]
> (повесить брекпоинт на на релиз внутри обьекта не представляется
> возможным. поэтому верим хелпу).
С чего вдруг? Нормально вешается. В чем проблема?
> и по которой код в [10] вполне нормален, интерфейс там действительно
> освободится сам обнулением при выходе из области видимости,
> и потому если nil то free
Ну так возьми и зупасти его. Поставь бряк в деструктор и запусти, без лишних слов.
> на что ты похоже так коряво намекаешь
Корявость у тя в мозгах. И походу беспросветная
sniknik (2008-05-27 10:36:00) [5]> где ты в коде [10] увидел интерфейс ???
не в коде, сдесь
TXMLDocument = class(TComponent, IInterface, IXMLDocument, IXMLDocumentAccess)
> Как ты считаешь - будет уничтожен объект "внутренним релизом" ???
а ты проверь, я же не предлагал поверить. см. sniknik © (26.05.08 17:48) [50]
или ты как и ага0 не занимаешься "детскими играми" ака "проверками" ([55])?
по коду, обязательно ->
function TInterfacedObject._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
jack128_ (2008-05-27 09:52:00) [6]
> [10] вполне нормален, интерфейс там действительно освободится
> сам обнулением при выходе из области видимости, и потому
> если nil то free (на что ты похоже так коряво намекаешь)
> не нужен. освободится сам, без вызовов дельфевского кода,
> внутренним "релизом".
где ты в коде [10] увидел интерфейс ???
Ладно, хрен с ним, с xml document'ом.
Вот код:
begin
TInterfacedObject.Create;
end;
Как ты считаешь - будет уничтожен объект "внутренним релизом" ???
sniknik (2008-05-27 08:52:00) [7]> Именно с 10-го - с него началось.
нет, имхо, началось все с
jack128_ (26.05.08 10:54) [14]
> это с каких пор конструктор стал возвращать интефейсные ссылки ???
именно с него Reindeer Moss Eater пытался обьяснить вам разницу в созданием TXMLDocument с nil и self. разницу которая действительно есть, и по которой код в [10] вполне нормален, интерфейс там действительно освободится сам обнулением при выходе из области видимости, и потому если nil то free (на что ты похоже так коряво намекаешь) не нужен. освободится сам, без вызовов дельфевского кода, внутренним "релизом".
во всяком случае, именно это написано в хелпе (см. приведенные выдержки).
а разница в созданиях подтверждается эксперементально (повесить брекпоинт на на релиз внутри обьекта не представляется возможным. поэтому верим хелпу). чего вам (вместе с jack128_) еще надо, к чему придирки, не пойму... вот если бы ты без намеков, прямо сказал в чем претензия... но это не твой стиль верно?
ага0 (2008-05-27 04:46:00) [8]2 sniknik ©
> с self в create дестрой вызывается? ... а ведь интерфейс.
> по твоему обязан
Абзац, приплыли. Нет, не вызовется. И не должон. С какого перепугу ты взял что "по твоему обязан" я без понятия. Ты ветку перечитай хотяб с 10-го поста, вынимательно. Именно с 10-го - с него началось. На 30-й пристально глянь. Можа поймешь об чем речь шла
jack128_ (2008-05-26 22:28:00) [9]конфа называется «Начинающим» !!!!
jack128_ (2008-05-26 22:27:00) [10]ужос..я б сказал круче, но всё потрут модеры.
два мастера (я и сникник), 1 старожил (RME) + 1 аноним (ага0) про которого я 10 k 1 дам, что это один из мастеров под фальш. ником в течении целого дня обсуждают банальный ТЕХНИЧЕСКИЙ вопрос. Это писец полный!!!!....Full arctic fox
sniknik (2008-05-26 21:38:00) [11]приведение типа это еще не все, чтобы поменялось поведение, надо еще смотреть как оно написано, то что приводится.
sniknik (2008-05-26 21:36:00) [12]p.s. только не надо увиливаний, смены темы и т.д. просто скажи
> по выходе из A1 TXmlDocument.Destroy вызывается
с self в create дестрой вызывается? ... а ведь интерфейс. по твоему обязан.
sniknik (2008-05-26 21:30:00) [13]> Чистый код, без побочных фефектов.
ага, проверяем
procedure A1;
var
Doc: IXmlDocument;
begin
Doc:= TXmlDocument.Create( self);
end;
procedure A2;
var
Doc: TXmlDocument;
begin
Doc:= TXmlDocument.Create( self);
end;
о чем и речь. только знаки спутаны, кто и что не понимает.
ага0 (2008-05-26 21:01:00) [14]
> sniknik © (26.05.08 20:07) [54]
Ты мя извини, но ет на бред похоже.
> вызывается то, что вызывается при обнулении счетчика ссылок
> на обьект и уничтожающий(но не называющийся деструктором
> борцами за точность формулировок) его
Ты об чем? Нетути у интерфейса никакого волшебного кода - вот что написано в объекте ентот интерфейс реализующем, то и вызывается. Интерфейс - ваще абстракция, без всякого кода. Если ет интерфейс реализован TXmlNode, то че написано в TXmlNode._addref и TXmlNode._Release, то и вызывается. Буде то код в самом объекте аль унаследованный от предка. И не волшебным образом эти функции вызываются, а компилятором подставляется - о нас, сирых, заботится. блин. Вызывается, если ссылка интерфейсная - все, без всяких вариантов. Конструктор объектов таковую не возвращает в принципе.
> лучше скажи чем опыты кончились
Да ничем они не кончились - делать мне нефиг акромя как детскими играми заниматься. А ет я сотни раз делал и знаю как отче наш. И че там будет я уже в [36] и [38] заяснил. Читай вникай, не поймешь еще читай. Вкури разницу промеж
procedure A1;
var
Doc: IXmlDocument;
begin
Doc:= TXmlDocument.Create(nil);
end;
procedure A2;
var
Doc: TXmlDocument;
begin
Doc:= TXmlDocument.Create(nil);
end;
Чистый код, без побочных фефектов.
Поймешь почему по выходе из A1 TXmlDocument.Destroy вызывается, а по выходе из A2 нет, поймешь и остальное. Типа надеюсь. А пережевывать элементарщину мне надоело.
sniknik (2008-05-26 20:07:00) [15]> Деструктор в интерфейсе - это ново.
ну прямо мастер придирок... скажем по другому тогда. вызывается то, что вызывается при обнулении счетчика ссылок на обьект и уничтожающий(но не называющийся деструктором борцами за точность формулировок) его... вот то что там вызывается то и вызывается. (про это говорилось и имелось ввиду)
лучше скажи чем опыты кончились. и как обьяснил?
ага0 (2008-05-26 18:31:00) [16]
> он и вызывается. но только не в дельфи коде, а в интерфейсе
Деструктор в интерфейсе - это ново. В общем с тобой тож все ясно, в саду места много, всем хватит
sniknik (2008-05-26 18:16:00) [17]> если закомментировать строку x.AddChild('root'); - ну ведь должен-же, раз ссылка интерфейная.
он и вызывается. но только не в дельфи коде, а в интерфейсе. дельфевский деструктор нужен только после того как появились обьекты в обьекте, очистить их (ClearDocumentRef).
ага0 (2008-05-26 18:04:00) [18]
> sniknik © (26.05.08 17:48) [50]
>>>т.е. указали, и в хелпе записал а на самом деле это не так?
А такое заключение интересно откуда?
Ну хорошо - я дурак. Объясни мне, дурню, почему это, если "возвращается чисто интерфейсная ссылка а не объектная" (c) Reindeer Moss Eater © (24.05.08 14:37) [8], то деструктор не вызывается в варианте Reindeer Moss Eater © (24.05.08 14:48) [10], хотя по утверждению в
Reindeer Moss Eater © (26.05.08 14:37) [30]вызываться должен. И ведь должен, если ссылка интерфейсная. И почему он не вызывается в варианте Reindeer Moss Eater © (26.05.08 14:51) [31], если закомментировать строку x.AddChild('root');- ну ведь должен-же, раз ссылка интерфейная.
> (после можно убрать x.AddChild('root');, и повторить. и
> попробовать обьяснить разницу... хотя бы самому себе)
Да себе-то я уж да-а-вным-давно объяснил. И другим здесь пытался. Но кому не дано - тому не дано, тут уж я бессилен.
sniknik (2008-05-26 17:48:00) [19]> Вот вони и указали - гляди, не нарвись!
т.е. указали, и в хелпе записал а на самом деле это не так?
конкретная проверка, включаешь в опциях проекта "use debug dcus", в модуле XMLDoc ставишь точку останова на строке
destructor TXMLDocument.Destroy;
begin
Destroying; //сдесь например
if FOwnerIsComponent and Active and Assigned(FDocumentNode) and (FRefCount > 1) then
(FDocumentNode as IXMLNodeAccess).ClearDocumentRef;
SetActive(False);
FreeAndNil(FXMLStrings);
inherited;
end;
выполняешь код, в двух вариантах (nil/Self).
procedure TForm1.Button1Click(Sender: TObject);
var x : TXMLDocument;
begin
x := TXMLDocument.Create(nil/Self);
x.Active := True;
x.Encoding := 'windows-1251';
x.AddChild('root');
end;
говоришь в какой момент вызывается "дестрой" в обоих случаях.
(после можно убрать x.AddChild('root');, и повторить. и попробовать обьяснить разницу... хотя бы самому себе)
Reindeer Moss Eater (2008-05-26 17:46:00) [20]
> Reindeer Moss Eater © (26.05.08 17:19) [45]
> На помедитируй:
> x := TXMLDocument.Create(Self);
Фсе, ты меня добил. Пожалте в сад - там хорошо, там яблоки. гуд бай. май фрэнд.
Ты это своему коллеге скажи, который объясняет AV только тем, что был интефейс и он при смерти убивает документ.
Я привел два случая, в одном убивает, в другом нет.
Почему?
Да потому что (в сотый раз):
When TXMLDocument is created without an Owner, it behaves like an interfaced object.