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

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
15-1281077307
начинающая
2010-08-06 10:48
2010.12.05
добавить таблицы в *.mdb


15-1283253386
И. Павел
2010-08-31 15:16
2010.12.05
Как узнать, с какими параметрами одна программа запустила другую?


15-1283178021
@!!ex
2010-08-30 18:20
2010.12.05
Давать ли свободу скриптерам?


15-1282710435
konelev
2010-08-25 08:27
2010.12.05
Какая у вас такса за ремонт компов?


2-1284444311
ZV
2010-09-14 10:05
2010.12.05
Цикл For To Do





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