Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Вниз

TXMLDocument в RUNTIME   Найти похожие ветки 

 
Димон   (2008-05-24 13:26) [0]

Помогите разобраться ... Когда бросаю компонент 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;


 
sniknik ©   (2008-05-24 13:46) [1]

> То функция отрабатывает с ошибками ...
ошибки они не просто так, в них обычно бывает указание чего неправильно/нехватает.

> XMLDoc := TXMLDocument.Create(nil);
посмотри исходники компонента, там 2 конструктора, причем второй введен для возможности создать компонент с владельцем = nil... (имхо, но по моему там это все очевидно)


 
Димон   (2008-05-24 13:56) [2]

Да, 2 конструктора .. В моем случаи оба не работают ...


 
Плохиш ©   (2008-05-24 13:56) [3]


>    XMLDoc.LoadFromFile("C:\1.xml");
>    XMLDoc.Active := True;

Советую всё-таки прочитать справку по LoadFromFile.


 
Плохиш ©   (2008-05-24 13:57) [4]


> Димон   (24.05.08 13:56) [2]
> Да, 2 конструктора .. В моем случаи оба не работают

тебе не повезло...


 
Димон   (2008-05-24 14:07) [5]

Понял, XMLDoc := TXMLDocument.Create(Self);
Проблема решена ... ))


 
sniknik ©   (2008-05-24 14:18) [6]

> Да, 2 конструктора .. В моем случаи оба не работают ...
не может такого быть. может ты им зарплату не платишь? вот и не хотят работать. так и говорят - "не хотим работать"?
(судя по всему про написанное про ошибки было проигнорировано)

> Понял, XMLDoc := TXMLDocument.Create(Self);
> Проблема решена ... ))
хм... а от чего Self то? ->
> function <????.>fFinde (Value : WideString) : WideString;
нету.

я то как раз думал, что цель работать без владельца, т.к. это "чистая" функция а не метод класса.


 
Димон   (2008-05-24 14:20) [7]

Да вы правы, я позже понял что владельца я немогу передавать .. Сейчас сижу не знаю что делать, читаю хелп но ничего не догоняю.


 
Reindeer Moss Eater ©   (2008-05-24 14:37) [8]

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


 
Димон   (2008-05-24 14:43) [9]

Решил проблему следующим извращенным методом, иначе ничего не придумал.

dm : TDataModule;
begin
try
   dm:=tdatamodule.create(nil);
   XMLDoc := TXMLDocument.Create(dm);


 
Reindeer Moss Eater ©   (2008-05-24 14:48) [10]

with TXMLDocument.Create(nil) do
begin
 LoadFromFile("Дурилка ты картонная.xml");
 ShowMessage(xml.Text);
end;


 
sniknik ©   (2008-05-24 15:12) [11]

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


 
Димон   (2008-05-24 15:25) [12]

и как этот объект присвоить к переменной ?


 
sniknik ©   (2008-05-24 15:45) [13]

операция присвоения - :=


 
jack128_   (2008-05-26 10:54) [14]


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


> with TXMLDocument.Create(nil) do
> begin
>  LoadFromFile("Дурилка ты картонная.xml");
>  ShowMessage(xml.Text);
> end;
>

это с каких пор конструктор стал возвращать интефейсные ссылки ???


 
Reindeer Moss Eater ©   (2008-05-26 11:39) [15]

А с таких вот пор.


 
Reindeer Moss Eater ©   (2008-05-26 11:41) [16]

When TXMLDocument is created without an Owner, it behaves like an interfaced object. That is, when all references to its interface are released, the TXMLDocument instance is automatically freed. When TXMLDocument is created with an Owner, however, it behaves like any other component, and is freed by its Owner.


 
jack128_   (2008-05-26 11:56) [17]

Чесно говоря не вижу, где тут написано что конструктор возвращает интефейсную ссылку. Если бы это было так, то при выполнении этого кода:

type
 TXMLDocument_Test = class(TXMLDocument)
 public
   destructor Destroy; override;
 end;

{ TXMLDocument_Test }

destructor TXMLDocument_Test.Destroy;
begin
 ShowMessage("TXMLDocument_Test.Destroy");
 inherited;
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
 with TXMLDocument_Test.Create(nil) do
 begin

 end;
end;


Мы бы увидели сообщение "TXMLDocument_Test.Destroy"  чего не наблюдается...
А вот если мы бы написали так:

 with TXMLDocument_Test.Create(nil) as IXMLDocument do
 begin

 end;


то это совершенно другое дело.


 
Reindeer Moss Eater ©   (2008-05-26 12:05) [18]

Если что-то ведет себя как интерфейсная ссылка, лает как интерфейсная ссылка и пахнет как интерфейсная ссылка, то это что-то и есть интерфейсная ссылка
:)


 
ага0   (2008-05-26 12:16) [19]


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

:-)))) Че тут тока не узнаешь

Там написано что ежель без овнера, то подсчет ссылок работает, а ежель с овнером то отключен.

> Если что-то ведет себя как интерфейсная ссылка, лает как
> интерфейсная ссылка и пахнет как интерфейсная ссылка, то
> это что-то и есть интерфейсная ссылка

Да нифига она себя не ведет как интерфейс, как была объектом так им и осталась. А неявное преобразование оно преобразование и есть


 
ЮЮ ©   (2008-05-26 12:18) [20]

> Если что-то ведет себя как интерфейсная ссылка


в [17] же не ведет.


 
Reindeer Moss Eater ©   (2008-05-26 12:23) [21]

Но при выходе из области видимости она же освобождается.


 
Reindeer Moss Eater ©   (2008-05-26 12:34) [22]

Да нифига она себя не ведет как интерфейс

я и не говорил, что это интерфйес


 
ага0   (2008-05-26 12:41) [23]


> Но при выходе из области видимости она же освобождается.

Кто? Вот это?

>  XMLDoc : TXMLDocument;
> begin
> try
>    XMLDoc := TXMLDocument.Create(nil);

С каких пирогов?


 
jack128_   (2008-05-26 12:46) [24]


> Но при выходе из области видимости она же освобождается.

я же в 17 привел пример - не освобождается.  Так как конструктор вернет объект, а не интерфейс..

К интерфейсу мы должны явно его кастить.


 
ага0   (2008-05-26 12:54) [25]


> К интерфейсу мы должны явно его кастить.

Явно кастить не обязательно. Ежель в вопросе заменить

> XMLDoc : TXMLDocument;

на

> XMLDoc : IXMLDocument;

то будет автоматный релиз, компилер кастанет


 
jack128_   (2008-05-26 12:58) [26]


> то будет автоматный релиз, компилер кастанет

оператор присваивания - мы всё равно сами должны будем - явно написать :-) Хотя формально это и подпадает под опредление явного каста, согласен. Но вобщем то неважно...


 
Reindeer Moss Eater ©   (2008-05-26 13:54) [27]

я же в 17 привел пример - не освобождается.  Так как конструктор вернет объект, а не интерфейс..

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

это я и называю интефейсной ссылкой.


 
Reindeer Moss Eater ©   (2008-05-26 13:58) [28]

С каких пирогов?

что, снова цитировать здесь description из хелпа?


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


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


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

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

?


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


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

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


 
Reindeer Moss Eater ©   (2008-05-26 14:37) [30]

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


 
Reindeer Moss Eater ©   (2008-05-26 14:51) [31]

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:57) [32]

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

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;


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

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 15:32) [34]

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


 
Reindeer Moss Eater ©   (2008-05-26 15:50) [35]

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


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

Ну ты даешь:)

Ты ж вызвал 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 16:53) [37]

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

И чо?

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

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

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


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

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

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

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


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


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

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

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

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


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


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

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



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.038 c
2-1211624301
AlexeyMir
2008-05-24 14:18
2008.06.22
Показывалось окно или нет


1-1194606499
misha_gr
2007-11-09 14:08
2008.06.22
ParamStr()


2-1211698255
may be I am noob...
2008-05-25 10:50
2008.06.22
Юлианов День


2-1211793123
123-ий
2008-05-26 13:12
2008.06.22
Parameter not found


11-1189431471
ElectriC
2007-09-10 17:37
2008.06.22
GroupBox в GroupBox e





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский