Главная страница
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.48 MB
Время: 0.027 c
2-1152016679
stud
2006-07-04 16:37
2006.07.23
сохранить текст из 20 richedit в один файл


2-1151658907
alekslep
2006-06-30 13:15
2006.07.23
вложенные циклы.... непонятка...


15-1151360686
фывсссяч
2006-06-27 02:24
2006.07.23
English


2-1151616250
TBitMap
2006-06-30 01:24
2006.07.23
Как залить градиентом BitMap от одной точки до другой?


15-1148887793
GM
2006-05-29 11:29
2006.07.23
Геннетичеси модифицированные продукты