Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
ВнизTXMLDocument в RUNTIME Найти похожие ветки
← →
jack128_ (2008-05-26 17:08) [40]
> дык я ж сказал
это бесполезно ;-)
← →
ага0 (2008-05-26 17:10) [41]
> jack128_ (26.05.08 17:08) [40]
> это бесполезно ;-)
Понял - отстал:)
← →
Reindeer Moss Eater © (2008-05-26 17:10) [42]Да по барабану что и кто там мне вернул.
Я этот результат нигде не использую и в x остался тот самый "обычный объект"
Я же не результат AddChild передаю через LParam.
← →
Reindeer Moss Eater © (2008-05-26 17:11) [43]это бесполезно ;-)
Будет полезно, если скажешь причину AV.
← →
Reindeer Moss Eater © (2008-05-26 17:13) [44]Либо вот это объясни:
When TXMLDocument is created without an Owner, it behaves like an interfaced object.
← →
Reindeer Moss Eater © (2008-05-26 17:19) [45]Главное, что ты вызвал метод, который вернул интерфейс(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;
← →
ага0 (2008-05-26 17:27) [46]
> Либо вот это объясни:
>
> When TXMLDocument is created without an Owner, it behaves
> like an interfaced object.
Лана, последняя попытка уж извини.
"Когда TXMLDocument создается без владельца, он ведет себя как обычный объект, резализующий какой-нито интерфейс". Типа в отличии от TComponent, который пилиет на всякий подсчет сцылок. А сказано затем, что TXMLDocument - потомок TComponent и логично ожидать о нево того-ж поведения. Вот вони и указали - гляди, не нарвись!
А "фич" от дельфийской помощи в работе с интерфейсами у мене - полный чумудан.
← →
ага0 (2008-05-26 17:30) [47]
> Reindeer Moss Eater © (26.05.08 17:19) [45]
> На помедитируй:
> x := TXMLDocument.Create(Self);
Фсе, ты меня добил. Пожалте в сад - там хорошо, там яблоки. гуд бай. май фрэнд.
← →
Reindeer Moss Eater © (2008-05-26 17:37) [48]Вот вони и указали - гляди, не нарвись!
Ну ты догада. А я что говорил здесь всю дорогу?
Главное, что ты вызвал метод, который вернул интерфейс(IXMLNode), в Release этого интефейса и будет уничтожен документ.
Ага. В среду будет уничтожен, а если в четверг и луна в первой четверти то нет.
Пожалте в сад - там хорошо
Ага. А вам на йух.
← →
Reindeer Moss Eater © (2008-05-26 17:46) [49]
> 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.
← →
sniknik © (2008-05-26 17:48) [50]> Вот вони и указали - гляди, не нарвись!
т.е. указали, и в хелпе записал а на самом деле это не так?
конкретная проверка, включаешь в опциях проекта "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");, и повторить. и попробовать обьяснить разницу... хотя бы самому себе)
← →
ага0 (2008-05-26 18:04) [51]
> 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 18:16) [52]> если закомментировать строку x.AddChild("root"); - ну ведь должен-же, раз ссылка интерфейная.
он и вызывается. но только не в дельфи коде, а в интерфейсе. дельфевский деструктор нужен только после того как появились обьекты в обьекте, очистить их (ClearDocumentRef).
← →
ага0 (2008-05-26 18:31) [53]
> он и вызывается. но только не в дельфи коде, а в интерфейсе
Деструктор в интерфейсе - это ново. В общем с тобой тож все ясно, в саду места много, всем хватит
← →
sniknik © (2008-05-26 20:07) [54]> Деструктор в интерфейсе - это ново.
ну прямо мастер придирок... скажем по другому тогда. вызывается то, что вызывается при обнулении счетчика ссылок на обьект и уничтожающий(но не называющийся деструктором борцами за точность формулировок) его... вот то что там вызывается то и вызывается. (про это говорилось и имелось ввиду)
лучше скажи чем опыты кончились. и как обьяснил?
← →
ага0 (2008-05-26 21:01) [55]
> 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 21:30) [56]> Чистый код, без побочных фефектов.
ага, проверяемprocedure A1;
var
Doc: IXmlDocument;
begin
Doc:= TXmlDocument.Create(self);
end;
procedure A2;
var
Doc: TXmlDocument;
begin
Doc:= TXmlDocument.Create(self);
end;
о чем и речь. только знаки спутаны, кто и что не понимает.
← →
sniknik © (2008-05-26 21:36) [57]p.s. только не надо увиливаний, смены темы и т.д. просто скажи
> по выходе из A1 TXmlDocument.Destroy вызывается
с self в create дестрой вызывается? ... а ведь интерфейс. по твоему обязан.
← →
sniknik © (2008-05-26 21:38) [58]приведение типа это еще не все, чтобы поменялось поведение, надо еще смотреть как оно написано, то что приводится.
← →
jack128_ (2008-05-26 22:27) [59]ужос..я б сказал круче, но всё потрут модеры.
два мастера (я и сникник), 1 старожил (RME) + 1 аноним (ага0) про которого я 10 k 1 дам, что это один из мастеров под фальш. ником в течении целого дня обсуждают банальный ТЕХНИЧЕСКИЙ вопрос. Это писец полный!!!!....Full arctic fox
← →
jack128_ (2008-05-26 22:28) [60]конфа называется «Начинающим» !!!!
← →
ага0 (2008-05-27 04:46) [61]2 sniknik ©
> с self в create дестрой вызывается? ... а ведь интерфейс.
> по твоему обязан
Абзац, приплыли. Нет, не вызовется. И не должон. С какого перепугу ты взял что "по твоему обязан" я без понятия. Ты ветку перечитай хотяб с 10-го поста, вынимательно. Именно с 10-го - с него началось. На 30-й пристально глянь. Можа поймешь об чем речь шла
← →
sniknik © (2008-05-27 08:52) [62]> Именно с 10-го - с него началось.
нет, имхо, началось все с
jack128_ (26.05.08 10:54) [14]
> это с каких пор конструктор стал возвращать интефейсные ссылки ???
именно с него Reindeer Moss Eater пытался обьяснить вам разницу в созданием TXMLDocument с nil и self. разницу которая действительно есть, и по которой код в [10] вполне нормален, интерфейс там действительно освободится сам обнулением при выходе из области видимости, и потому если nil то free (на что ты похоже так коряво намекаешь) не нужен. освободится сам, без вызовов дельфевского кода, внутренним "релизом".
во всяком случае, именно это написано в хелпе (см. приведенные выдержки).
а разница в созданиях подтверждается эксперементально (повесить брекпоинт на на релиз внутри обьекта не представляется возможным. поэтому верим хелпу). чего вам (вместе с jack128_) еще надо, к чему придирки, не пойму... вот если бы ты без намеков, прямо сказал в чем претензия... но это не твой стиль верно?
← →
jack128_ (2008-05-27 09:52) [63]
> [10] вполне нормален, интерфейс там действительно освободится
> сам обнулением при выходе из области видимости, и потому
> если nil то free (на что ты похоже так коряво намекаешь)
> не нужен. освободится сам, без вызовов дельфевского кода,
> внутренним "релизом".
где ты в коде [10] увидел интерфейс ???
Ладно, хрен с ним, с xml document"ом.
Вот код:begin
TInterfacedObject.Create;
end;
Как ты считаешь - будет уничтожен объект "внутренним релизом" ???
← →
sniknik © (2008-05-27 10:36) [64]> где ты в коде [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;
← →
ага0 (2008-05-27 10:51) [65]
> sniknik © (27.05.08 08:52) [62]
> (повесить брекпоинт на на релиз внутри обьекта не представляется
> возможным. поэтому верим хелпу).
С чего вдруг? Нормально вешается. В чем проблема?
> и по которой код в [10] вполне нормален, интерфейс там действительно
> освободится сам обнулением при выходе из области видимости,
> и потому если nil то free
Ну так возьми и зупасти его. Поставь бряк в деструктор и запусти, без лишних слов.
> на что ты похоже так коряво намекаешь
Корявость у тя в мозгах. И походу беспросветная
← →
sniknik © (2008-05-27 10:52) [66]> по коду, обязательно ->
хотя нет, извини ошибся, в данном коде он не уничтожится т.к. не будет даже создан. ты привел абстрактный класс.
← →
jack128_ (2008-05-27 11:04) [67]
> т.к. не будет даже создан. ты привел абстрактный класс.
Ну собсвенно вот всё и видно, кто запускал код, а кто - нет.
← →
ага0 (2008-05-27 11:16) [68]2 jack128_
Ты был стопудово прав када сказал что объяснять беспонтово.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.042 c