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

Вниз

не выполняется код в конструкторе   Найти похожие ветки 

 
umbra ©   (2008-04-14 14:52) [0]

Есть наследник 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-14 15:07) [1]


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



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


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


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


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

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

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

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

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

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


 
DrPass ©   (2008-04-14 15:23) [3]


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

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


 
umbra ©   (2008-04-14 15:46) [4]


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


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

function 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 © .


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

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

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


 
umbra ©   (2008-04-14 17:54) [6]

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

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


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


 
Ega23 ©   (2008-04-14 23:36) [7]

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


 
umbra ©   (2008-04-14 23:38) [8]


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

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


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


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

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



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

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

Наверх




Память: 0.49 MB
Время: 0.018 c
15-1206554472
@!!ex
2008-03-26 21:01
2008.05.11
Софт для работы с GSM модемом


15-1206194398
TUser
2008-03-22 16:59
2008.05.11
В чипсет


6-1185932625
Максимм
2007-08-01 05:43
2008.05.11
Сетевые принтера


2-1207753937
Омск
2008-04-09 19:12
2008.05.11
Перевод миль в километры


15-1206300829
Дмитрий С
2008-03-23 22:33
2008.05.11
Размещение Secondary DNS