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

Вниз

Проблема с property в наследнике   Найти похожие ветки 

 
mfender   (2010-09-12 13:23) [0]

Здравствуйте, товарищи!

Какая-то странная беда происходит. Есть наследник TTreeView:

 TResortItemType = (itRoot, itResort, itRegion, itCity, itObject, itRP);

 TResortItemRec = ^PItemRec;
 PItemRec = record
   Id: Integer;
   ItemType: TResortItemType;
   Title: string;
   Priority: Integer;
 end;

 TSKOResortTreeView = class(TTreeView)
 private
   FRootRec: TResortItemRec;
 protected

 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 end;


Так всё нормально. Но как только я пихаю в public     property RootData: TResortItemRec read FRootRec write FRootRec; - счастье заканчивается, и при компиляции начинается какая-то порча с пропаданием компонентов в других фреймах, открытых в IDE и заканчивается сообщением об AV в rtl70.bpl, после чего нужно всё закрыть и перезапустить Delphi.

Что это может быть, и где у меня такой значительный пробел в знаниях, кроме кода в ДНК?


 
sniknik ©   (2010-09-12 13:36) [1]

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

кстати, а нафига собственная структура, со своим рутом/деревом? дерева самого TTreeView не хватает? (указатель Data у нода например для своих данных)


 
mfender   (2010-09-12 13:50) [2]


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

Вот и не пойму, где я чего путаю... Как-то всю жизнь без подобных проблем было всё.


> кстати, а нафига собственная структура, со своим рутом/деревом?
>  дерева самого TTreeView не хватает? (указатель Data у нода
> например для своих данных)

Ну это больше мой стёб. У меня предполагаются на разных уровнях разные по содержанию ноды (TResortItemType = (itRoot, itResort, itRegion, itCity, itObject, itRP)), в зависимости от типа будут и разные попаменюшки, и соответственно разные действия. Там ещё TDataSet будет в TTreeNode.Data для всех разные, который будет создаваться в OnExpanded. А в руте тоже будут ноды, и такая же структура с датасетом. Но куда её девать? Не получается однозначности, потому что у корневых нодов нет Parent"а. Вот я и решил сделать просто такое поле, в котором будет указан их тип и датасет. Можно, конечно, упростить и сделать единственный рукой сделанный нод. Но это как-то некошерно, что-ли...


 
mfender   (2010-09-12 14:51) [3]

Кстати, вот ещё вопрос: вот эта структура в TTreeNodeData будет

 PItemRec = record
   Id: Integer;
   ItemType: TResortItemType;
   Title: string;
   Priority: Integer;
   ChildDataSet: TZQuery;
 end;

При уничтожении нода ChildDataSet самоликвидируется при условии, что его Owner - TTreeView, или нужно как-то дополнительно убивать его. А то я представил, сколько их в памяти скопится за часа три активного счёлканья по [+] ))))


 
Игорь Шевченко ©   (2010-09-12 15:15) [4]


> При уничтожении нода ChildDataSet самоликвидируется при
> условии, что его Owner - TTreeView, или нужно как-то дополнительно
> убивать его


При уничтожении Owner-а ликвидируются все его подчиненные. При уничтожении ноды не ликвидируются.


> TResortItemRec = ^PItemRec;
>  PItemRec = record
>    Id: Integer;
>    ItemType: TResortItemType;
>    Title: string;
>    Priority: Integer;
>  end;


как ты не путаешься в названиях, что T, а что P ?


> Но как только я пихаю в public     property RootData: TResortItemRec
> read FRootRec write FRootRec; - счастье заканчивается


Код использования не приведен


 
mfender   (2010-09-12 15:32) [5]


> Код использования не приведен

Так его. В том и потеха. И совсем уж становится непонятным, что за AV от него происходит.


> При уничтожении Owner-а ликвидируются все его подчиненные.
>  При уничтожении ноды не ликвидируются.

А как его уничтожить? Отдельно делать FreeAndNil(TreeNode.Data.ChlldDataSet) а потом уже нод уничтожать?


 
mfender   (2010-09-12 15:33) [6]


> > Код использования не приведен
>
> Так его. В том и потеха. И совсем уж становится непонятным,
>  что за AV от него происходит.

Всмысле, нет его вообще. Пустой класс с конструктором и деструктором, в которых только inherited, и одно поле с его property. И всё.


 
sniknik ©   (2010-09-12 16:12) [7]

> Всмысле, нет его вообще. Пустой класс с конструктором и деструктором, в которых только inherited, и одно поле с его property. И всё.
сделал по описанному тест, работает - AV нет. добавил property RootData как написано - AV нет.
???


 
sniknik ©   (2010-09-12 16:13) [8]

> Код использования не приведен
+ 1
+ код конструктора/деструктора, раз уж в описании есть значит не стандартные...


 
mfender   (2010-09-12 16:40) [9]


> + код конструктора/деструктора, раз уж в описании есть значит
> не стандартные...

Ещё нет. Споткнулся на этой стадии. На момент пресловутого AV выглядело так:

constructor TSKOResortTreeView.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
end;

destructor TSKOResortTreeView.Destroy;
begin

 inherited Destroy;
end;



> сделал по описанному тест, работает - AV нет. добавил property
> RootData как написано - AV нет.

Вот и мне кажется, что это у меня что=то не то... Сроду такого чуда не было. делал же компоненты, никакого лесапета не изобрёл и тут. А вот какая-то беда... (((


 
mfender   (2010-09-12 16:51) [10]

Чёрт возьми, а сейчас заработало... Ничего не понимаю!

> сделал по описанному тест, работает - AV нет. добавил property
> RootData как написано - AV нет.

Может порчу с меня снял? :D :D :D


 
Anatoly Podgoretsky ©   (2010-09-12 17:00) [11]

Нафиг вообще тут нужен конструктор и деструктор, если ты ничего в них не делаешь?


 
Anatoly Podgoretsky ©   (2010-09-12 17:02) [12]

Я уже молчу про это
TResortItemRec = ^PItemRec;


 
mfender   (2010-09-12 17:18) [13]


> Нафиг вообще тут нужен конструктор и деструктор, если ты
> ничего в них не делаешь?

Там ещё будет. И в деструкторе будет.


> Я уже молчу про это
> TResortItemRec = ^PItemRec;

Ну, извините. Дурацкая привычка отступать от принятых соглашений.


 
Anatoly Podgoretsky ©   (2010-09-12 17:22) [14]

Поменяй имена, наоборот.


 
Ega23 ©   (2010-09-12 20:49) [15]

Кстати. При смене парента все ноды сохраняются в стрим. Поэтому, если в своей структуре держишь ссылку на нод, то её надо "выправить" будет.



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

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

Наверх




Память: 0.51 MB
Время: 0.007 c
2-1284406232
ZV
2010-09-13 23:30
2010.12.05
Проблемы с компонентом TPanel


4-1242206475
Head
2009-05-13 13:21
2010.12.05
Захват видео потока с устройств


15-1282887776
менеджер какого-то звена
2010-08-27 09:42
2010.12.05
Ёксель


15-1282901996
Дмитрий Тимохов
2010-08-27 13:39
2010.12.05
Просветите про темы в Windows


15-1282654644
Baks
2010-08-24 16:57
2010.12.05
Как можно передать параметр-строку на кириллице в PHP скрипт?