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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
8-1179150403
Moritron
2007-05-14 17:46
2008.05.11
DSPack - видеоналожение.


11-1188700319
KOLBoss
2007-09-02 06:31
2008.05.11
Чтение из файла по байтно


2-1207979954
German
2008-04-12 09:59
2008.05.11
На что рассчитывать от ADO + Access ?


2-1207606761
иван8511
2008-04-08 02:19
2008.05.11
Защита программы от запуска на других компьютерах


2-1208023431
xex32
2008-04-12 22:03
2008.05.11
Как отключить кнопку Alt





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