Форум: "Начинающим";
Текущий архив: 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