Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.23;
Скачать: CL | DM;

Вниз

Access Violations в TTreeView   Найти похожие ветки 

 
mfender ©   (2006-07-01 13:51) [0]

Здравствуйте.
Всю голову сломал - не пойму в чём тут беда:


type
 TForm1 = class(TForm)
 public
   TV: ThsTreeView;
 end;

 ThsTreeView = class(TTreeView)
 private
   procedure CreateNodeClass(Sender: TCustomTreeView;
     var NodeClass: TTreeNodeClass);
 end;

 ThsNode = class(TTreeNode)
 private
   FConnect: TZConnection;
   FDataSet: TZQuery;
   FBookmark: TBookmark;
   function GetConnect: TZConnection;
   function GetBookmark: TBookmark;
   procedure SetBookmark(const Value: TBookmark);
   function GetDataSet: TZQuery;
   procedure SetDataSet(const Value: TZQuery);
 protected
   function GetQuery(Query: string; var DataSet: TZQuery): TZQuery;
   procedure SetConnect(const Value: TZConnection); virtual;
 public
   constructor Create(AOwner: TTreeNodes);
   property Connect: TZConnection read GetConnect write SetConnect;
   property Bookmark: TBookmark read GetBookmark write SetBookmark;
   property DataSet: TZQuery read GetDataSet write SetDataSet;
 end;

 ThsDomainNode = class(ThsNode)
 private
 protected
   procedure SetConnect(const Value: TZConnection); override;
 public
   constructor Create(AOwner: TTreeNodes);
   function GetNode(Connection: TZConnection; DS: TZQuery;
     Bkmrk: TBookmark): ThsDomainNode;
 end;

implementation

{Здесь всё создаётся и showmessage() показывает то, что от него и требуется. Дубуггер сообщает, что DataSet, Connect и Bookmark создаются и есть}
function ThsDomainNode.GetNode(Connection: TZConnection; DS: TZQuery;
 Bkmrk: TBookmark): ThsDomainNode;
begin
 Connect := Connection;
 DataSet := DS;
 Bookmark := Bkmrk;
 showmessage(DataSet.FieldValues["domain_title"]);
 Result := Self;
end;

{Вся беда начинается потом...}
procedure TForm1.TVDblClick(Sender: TObject);
var
 MessageStr: string;
begin
 showmessage(TV.Selected.ClassName); {Здесь всё нормально - ThsDomainNode}
 if TV.Selected is ThsDomainNode then
 begin
   showmessage(ThsDomainNode(TTreeView(Sender).Selected).Text); {И здесь всё нормально}
   showmessage(ThsDomainNode(TTreeView(Sender).Selected).DataSet.ClassName); {А вот здесь - Access Violations}
 end;
end;


Ну почему?! Что за наказание мне такое?


 
Юрий Зотов ©   (2006-07-01 14:14) [1]

Похоже, где-то между вызовами этих двух методов DataSet уничтожается.

Поставьте брейкпойнты в 2-х местах: в TForm1.TVDblClick и в деструкторе DataSet". Если в деструктор Вы придете раньше, чем TForm1.TVDblClick - значит, предположение верное. Тогда останется лишь пройти обратно по стеку вызовов и найти причину, по которой уничтожается DataSet.


 
mfender ©   (2006-07-01 14:54) [2]


> Юрий Зотов ©   (01.07.06 14:14) [1]
> Похоже, где-то между вызовами этих двух методов DataSet
> уничтожается.

Спасибо, Юрий.
в DblClick получается (если верить дебуггеру) ThsDomainNode(TTreeView(Sender).Selected).DataSet = nil. Загадка природы.
Действительно, уничтожается сразу после создания нода. Вот только где - не пойму. Буду разбираться...


 
Юрий Зотов ©   (2006-07-01 15:01) [3]

Если равно nil, а не случайному "мусорному" значению, то больше похоже на то, что не уничтожается, а не был создан. Либо все же уничтожается, но не просто через Free, а через FreeAndNil (или с "ручным" обнулением).


 
mfender ©   (2006-07-01 15:31) [4]


> больше похоже на то, что не уничтожается, а не был создан

Он создаётся. В методе ThsDomainNode.GetNode он работает, дебуггер и showmessage() показывают правильное значение (т.е., то, чего я от них и жду). Кстати, создаётся он раньше, ещё до создания узла, а туда только передаётся. Я уже попробовал передать его и просто, и как const - результат тот же - после TV.Add() он внезапно пропадает, равно как и ThsDomainNode.Connect и ThsDomainNode.Bookmark.


> Либо все же уничтожается, но не просто через Free, а через
> FreeAndNil (или с "ручным" обнулением).

А вот это для меня - тёмный лес... :( Это как?

Кстати, по случаю вопрос: "Variable "<тут бывает либо Sender, либо Self>" inaccessible here due to optimization" - что это обозначает? Я старательно вчитывался в help, но ни-че-го не понял... Обычно понимаю, но этого не понял.


 
mfender ©   (2006-07-01 16:02) [5]

Поставил рядом TDBGrid и связал его с создаваемым DataSet... Удивительное рядом - у него ничего не отмирает. DataSet есть. not nil. В то же время дебуггер его описывает как nil и всё заканчивается на "Access Violations"... Мистика!



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

Текущий архив: 2006.07.23;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.011 c
15-1150829013
DillerXX
2006-06-20 22:43
2006.07.23
Вы случано не знаете,


15-1150808033
syte_ser78
2006-06-20 16:53
2006.07.23
Абзац в Word


15-1151317046
Юный падаван
2006-06-26 14:17
2006.07.23
Уважаемый мэтр Anatoly Podgoretsky


15-1150912243
X9
2006-06-21 21:50
2006.07.23
Вызов подключения к Интернет по сети


1-1149771296
Urvin
2006-06-08 16:54
2006.07.23
принтер - точное позиционирование





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский