![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с property в наследнике [D7]
mfender © (2010-09-12 13:23:00)Здравствуйте, товарищи!
Какая-то странная беда происходит. Есть наследник 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 propertyRootData: TResortItemRec readFRootRec writeFRootRec; - счастье заканчивается, и при компиляции начинается какая-то порча с пропаданием компонентов в других фреймах, открытых в IDE и заканчивается сообщением об AV в rtl70.bpl, после чего нужно всё закрыть и перезапустить Delphi.
Что это может быть, и где у меня такой значительный пробел в знаниях, кроме кода в ДНК?
Ega23 (2010-09-12 20:49:00) [1]Кстати. При смене парента все ноды сохраняются в стрим. Поэтому, если в своей структуре держишь ссылку на нод, то её надо "выправить" будет.
Anatoly Podgoretsky (2010-09-12 17:22:00) [2]Поменяй имена, наоборот.
mfender (2010-09-12 17:18:00) [3]
> Нафиг вообще тут нужен конструктор и деструктор, если ты
> ничего в них не делаешь?
Там ещё будет. И в деструкторе будет.
> Я уже молчу про это
> TResortItemRec = ^PItemRec;
Ну, извините. Дурацкая привычка отступать от принятых соглашений.
Anatoly Podgoretsky (2010-09-12 17:02:00) [4]Я уже молчу про это
TResortItemRec = ^PItemRec;
Anatoly Podgoretsky (2010-09-12 17:00:00) [5]Нафиг вообще тут нужен конструктор и деструктор, если ты ничего в них не делаешь?
mfender (2010-09-12 16:51:00) [6]Чёрт возьми, а сейчас заработало... Ничего не понимаю!
> сделал по описанному тест, работает - AV нет. добавил property
> RootData как написано - AV нет.
Может порчу с меня снял? :D :D :D
mfender (2010-09-12 16:40:00) [7]
> + код конструктора/деструктора, раз уж в описании есть значит
> не стандартные...
Ещё нет. Споткнулся на этой стадии. На момент пресловутого AV выглядело так:
constructor TSKOResortTreeView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
destructor TSKOResortTreeView.Destroy;
begin
inherited Destroy;
end;
> сделал по описанному тест, работает - AV нет. добавил property
> RootData как написано - AV нет.
Вот и мне кажется, что это у меня что=то не то... Сроду такого чуда не было. делал же компоненты, никакого лесапета не изобрёл и тут. А вот какая-то беда... (((
sniknik (2010-09-12 16:13:00) [8]> Код использования не приведен
+ 1
+ код конструктора/деструктора, раз уж в описании есть значит не стандартные...
sniknik (2010-09-12 16:12:00) [9]> Всмысле, нет его вообще. Пустой класс с конструктором и деструктором, в которых только inherited, и одно поле с его property. И всё.
сделал по описанному тест, работает - AV нет. добавил property RootData как написано - AV нет.
???
mfender (2010-09-12 15:33:00) [10]
> > Код использования не приведен
>
> Так его. В том и потеха. И совсем уж становится непонятным,
> что за AV от него происходит.
Всмысле, нет его вообще. Пустой класс с конструктором и деструктором, в которых только inherited, и одно поле с его property. И всё.
mfender (2010-09-12 15:32:00) [11]
> Код использования не приведен
Так его. В том и потеха. И совсем уж становится непонятным, что за AV от него происходит.
> При уничтожении Owner-а ликвидируются все его подчиненные.
> При уничтожении ноды не ликвидируются.
А как его уничтожить? Отдельно делать FreeAndNil(TreeNode.Data.ChlldDataSet) а потом уже нод уничтожать?
Игорь Шевченко (2010-09-12 15:15:00) [12]
> При уничтожении нода 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 14:51:00) [13]Кстати, вот ещё вопрос: вот эта структура в TTreeNodeData будет
PItemRec = record
Id: Integer;
ItemType: TResortItemType;
Title: string;
Priority: Integer;
ChildDataSet: TZQuery;
end;
При уничтожении нода ChildDataSet самоликвидируется при условии, что его Owner - TTreeView, или нужно как-то дополнительно убивать его. А то я представил, сколько их в памяти скопится за часа три активного счёлканья по [+] ))))
mfender (2010-09-12 13:50:00) [14]
> где то путаешь с выделением памяти(созданием объекта) или
> некорректно удаляешь.
Вот и не пойму, где я чего путаю... Как-то всю жизнь без подобных проблем было всё.
> кстати, а нафига собственная структура, со своим рутом/деревом?
> дерева самого TTreeView не хватает? (указатель Data у нода
> например для своих данных)
Ну это больше мой стёб. У меня предполагаются на разных уровнях разные по содержанию ноды (TResortItemType = (itRoot, itResort, itRegion, itCity, itObject, itRP)), в зависимости от типа будут и разные попаменюшки, и соответственно разные действия. Там ещё TDataSet будет в TTreeNode.Data для всех разные, который будет создаваться в OnExpanded. А в руте тоже будут ноды, и такая же структура с датасетом. Но куда её девать? Не получается однозначности, потому что у корневых нодов нет Parent'а. Вот я и решил сделать просто такое поле, в котором будет указан их тип и датасет. Можно, конечно, упростить и сделать единственный рукой сделанный нод. Но это как-то некошерно, что-ли...
sniknik (2010-09-12 13:36:00) [15]где то путаешь с выделением памяти(созданием объекта) или некорректно удаляешь.
кстати, а нафига собственная структура, со своим рутом/деревом? дерева самого TTreeView не хватает? (указатель Data у нода например для своих данных)