Главная страница
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.026 c
15-1150180363
Мазут Береговой
2006-06-13 10:32
2006.07.23
Американцы не были на Луне... однозначно!


15-1150916353
Лэнгдон
2006-06-21 22:59
2006.07.23
Число Phi


2-1152001604
muha89
2006-07-04 12:26
2006.07.23
Как запустить какую-нибуть процедуру


15-1150988089
Gamer
2006-06-22 18:54
2006.07.23
Документ Word и Delphi


15-1149594374
Проходящий
2006-06-06 15:46
2006.07.23
Прорыв в математике: доказана еще одна теория