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;


ага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.


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

Наверх

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