Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

не выполняется код в конструкторе [D7, 95/98]


umbra ©   (2008-04-14 14:52:00) 

Есть наследник TTreeView, у которого ноды - наследники TTreeNode. Соответствеено, в наследнике TTreeViewперекрыт метод CreateNode, ответственный за добавление новых нодов. Он вызывает конструктор наследника TTreeNode, который имеет вид

constructor TTreeNodeSp.Create(Owner: TTreeNodes);
var
chldinfo: PChldInfoRec;// указатель на структуру, нужную мне

begin
 inherited;
 New(chldinfo);
 FillChar(chldinfo^, sizeof(TChldInfoRec), 0);
 Data := chldinfo;

end;


При добавлении такого нода в тривью поле Dataостается равным nil, в отладчике точки останова в конструкторе при запуске приложения становятся неактивными, в общем, такое впечатление, что компилятор этот код просто выбрасывает.
Но если перенести выделение памяти под структуру в CreateNode, то поле инициализируется.

Почему так? Что я упускаю из виду?


Ega23   (2008-04-15 00:25:00) [1]


> так он же статический. а мне тут в компонентах прочли лекцию,
>  что статические методы перекрывать не есть гут.
>

Не, не перекрывать, а добавить метод в твоём наследнике TTreeView


umbra   (2008-04-14 23:38:00) [2]


> тупо AddNode и там уже прописываешь
>

так он же статический. а мне тут в компонентах прочли лекцию, что статические методы перекрывать не есть гут.


Ega23   (2008-04-14 23:36:00) [3]

Я бы не стал это дело в конструкторе перекрывать.
тупо AddNode и там уже прописываешь


umbra   (2008-04-14 17:54:00) [4]

2 umbra ©   (14.04.08 16:05) [5]

> все это можно, если вы напишете еще и наследника TTreeNodes


к счастью, оказалось, что это не совсем так :)
это можно сделать, если перекрыть TTreeView.Added.
Соответственно, освободить память при удалении нода можно, перекрыв TTreeView.Delete


umbra   (2008-04-14 16:05:00) [5]

мораль сей басни такова: если вы хотите инициализировать свойство TTreeNode.Dataпри создании нода, то это бесполезно делать в конструкторе наследника. Бесполезно это делать и в перекрытом TTreeView.CreateNode . Т.е. все это можно, если вы напишете еще и наследника TTreeNodes:) А без этого надо добавлять новые ноды в тривью исключительно методом TTreeNodes.AddNode

Такая вот печальная история :)


umbra   (2008-04-14 15:46:00) [6]


> Слова надо подкреплять делом, хотя бы, и кодом.


> что он вызывает конструктор наследника?

f unction TTreeViewSp.CreateNode: TTreeNode;
var
 LClass: TTreeNodeClass;
 chldinfo: PChldInfoRec;

begin
 LClass := TTreeNodeSp;
 if Assigned(OnCreateNodeClass) then
   OnCreateNodeClass(Self, LClass);
 Result := LClass.Create(Items);
 New(chldinfo);
 FillChar(chldinfo^, sizeof(TChldInfoRec), 0);
 Result.Data := chldinfo;

end;


Но причину правильно указал Ega23 © .


DrPass   (2008-04-14 15:23:00) [7]


>  Он вызывает конструктор наследника TTreeNode , который
> имеет вид

Эээ, а почему ты так уверен, что он вызывает конструктор наследника? Он у тебя чем-то отличается от родного конструктора TTreeNode? Или ты где-то его перегружаешь?


Плохиш   (2008-04-14 15:19:00) [8]


> umbra ©   (14.04.08 14:52)  
> Есть наследник TTreeView, у которого ноды - наследники TTreeNode.
>  Соответствеено, в наследнике TTreeView перекрыт метод CreateNode,
>  ответственный за добавление новых нодов. Он вызывает конструктор
> наследника TTreeNode , который имеет вид

Слова, слова...

> в отладчике точки останова в конструкторе при запуске приложения
> становятся неактивными, в общем, такое впечатление, что
> компилятор этот код просто выбрасывает.

И компилятор не верит словам...

> Что я упускаю из виду?

Слова надо подкреплять делом, хотя бы, и кодом.


Ega23   (2008-04-14 15:07:00) [9]


> Почему так? Что я упускаю из виду?



function TTreeNodes.AddNode(Node, Relative: TTreeNode; const S: string;
 Ptr: Pointer; Method: TNodeAttachMode): TTreeNode;


Посмотри, что делается с Ptr


Наверх

Титульная страница Поиск, карта сайта Написать письмо