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

Вниз

Странная работа TreeView   Найти похожие ветки 

 
APXi   (2007-09-18 08:32) [0]

Есть фрейм с деревом и одной кнопкой, а также внутреннее поле fRootNode.
В конструкторе фрейма создаем fRootNode

constructor TFrame2.Create(AOwner: TComponent);
begin
 inherited;
 fRootNode := TreeView1.Items.AddObject(nil, "111", nil);
 TreeView1.Items.AddChild(fRootNode, "123");
end;

А при нажатии на кнопку выводим

procedure TFrame2.Button1Click(Sender: TObject);
begin
 ShowMessage(fRootNode.Text);
end;

Данный фрейм положен на форму.
При запуске и нажатии кнопки возникает ошибка, либо Access Violation, либо при просмотре в отладчике, всякая ерунда не похожая на fRootNode;
Что может быть?


 
MBo ©   (2007-09-18 08:41) [1]

Возможно, в конструкторе фрейма еще не создано окно TreeView, отсюда и ошибка. Для формы подобные проблемы преодолеваются, например,  переносом кода  в перекрытый метод CreateWnd


 
clickmaker ©   (2007-09-18 09:35) [2]


> Возможно, в конструкторе фрейма еще не создано окно TreeView

если б так, то AV бы вылетело уже в Create


 
APXi   (2007-09-18 09:43) [3]

Если сделать кнопку №2 и в ней создавать новую Ноду и записывать ее в другое поле, а при нажатии кнопки № 3 показывать данные из этого поля то все работает нормально.
Такая же фигня, если сделать форму вместо фрейма и присвоить ей например Parent=form1.panel1.


 
APXi   (2007-09-18 09:50) [4]

Кажется косяк при присваивании Parent, у формы например меняется Handle, наверное это также влияет и на TreeView с его нодами


 
Сергей М. ©   (2007-09-18 09:56) [5]


> косяк при присваивании Parent


Фигня какая-то ...

С какого перепугу в конструкторе ты обращаешься к TreeView1, если этот контрол будет создан после завершения конструктора ?


 
DVM ©   (2007-09-18 10:26) [6]


> APXi   (18.09.07 08:32)  

Твое Create у фрейма и OnCreate формы - это совершенно разные вещи. У формы в момент вызова OnCreate она уже создана и создано все что на ней, у фрейма в Create ничего еще не создано. Отсюда AV.

И вообще, на кой ляд тебе эти фреймы - возьми форму - все то же самое, но удобнее и без глюков, которые у фреймов все же наблюдаются.


 
APXi   (2007-09-18 10:28) [7]

> С какого перепугу в конструкторе ты обращаешься к TreeView1, если этот контрол будет создан после завершения конструктора
Он будет создан при вызовет inherited, а после этого я к нему обращаюсь.

Точно косяк при смене Parenta.
Пока вижу решение в передаче Parenta в конструктор.
Может кто еще чего подскажет?


 
APXi   (2007-09-18 10:29) [8]

>DVM
Такая же фигня и у формы.
Мне форму надо внедрить в панель, при присваивании Parent, меняется Handle окна и TreeView тоже, поэтому косяк.


 
Сергей М. ©   (2007-09-18 10:36) [9]


> APXi   (18.09.07 10:28) [7]


> Он будет создан при вызовет inherited


Это с каких пор и по какому постановлению партии и правительства происходит ?)


 
APXi   (2007-09-18 10:50) [10]

> Сергей М.
А ты попробуй и узнаеш.


 
APXi   (2007-09-18 10:56) [11]

> Сергей М. & DVM
OnCreate когда вызывается по Вашему? разве не при создании формы? А если при создании, и еще нету контролов, тогда обращение Edit1.Text тоже даст ошибку, так ведь!!?? а не дает, потому что все контролы уже созданы.


 
Сергей М. ©   (2007-09-18 11:00) [12]


> OnCreate когда вызывается по Вашему?


И по-нашему и не по-нашему это событие возбуждается после создания формы и контролов на ней, а не при создании)

Разницу между "после" и "при" осюсяешь ?)


 
Ega23 ©   (2007-09-18 12:06) [13]


> OnCreate когда вызывается по Вашему? разве не при создании
> формы? А если при создании, и еще нету контролов, тогда
> обращение Edit1.Text тоже даст ошибку, так ведь!!?? а не
> дает, потому что все контролы уже созданы.
>


"Иногда лучше жевать, чем говорить" (с)


 
Ega23 ©   (2007-09-18 12:09) [14]

Есть вот какое подозрение. Посмотри, как реализованы TCustomTreeView.CreateWnd и TCustomTreeView.DestroyWnd
Вполне может оказаться, что ссылка fRootNode уже инвалидная.


 
Ega23 ©   (2007-09-18 12:12) [15]

Там суть такая - все ноды на DestroyWnd в стрим сохраняются, а на CreateWnd - восстанавливаются из него. И адрес после восстановления уже другой.


 
DiamondShark ©   (2007-09-18 12:13) [16]


> Сергей М. ©   (18.09.07 11:00) [12]

Ямщик, не гони.
OnCreate тут не при делах, речь о создании контролов.
А контролы создаются в конструкторе.

constructor TCustomForm.Create(AOwner: TComponent);
begin
 GlobalNameSpace.BeginWrite;
 try
   CreateNew(AOwner);
   if (ClassType <> TForm) and not (csDesigning in ComponentState) then
   begin
     Include(FFormState, fsCreating);
     try
       if not InitInheritedComponent(Self, TForm) then // вот тута создаюццо контролы
         raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
     finally
       Exclude(FFormState, fsCreating);
     end;
     if OldCreateOrder then DoCreate;
   end;
 finally
   GlobalNameSpace.EndWrite;
 end;
end;

constructor TCustomFrame.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
   csSetCaption, csDoubleClicks];
 if (ClassType <> TFrame) and not (csDesignInstance in ComponentState) then
 begin
   if not InitInheritedComponent(Self, TFrame) then  // вот тута создаюццо контролы
     raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
 end
 else
 begin
   Width := 320;
   Height := 240;
 end;
end;

Т.о., в перекрытом конструкторе после inherited все контролы созданы.


 
Ega23 ©   (2007-09-18 12:19) [17]


> Т.о., в перекрытом конструкторе после inherited все контролы
> созданы.


Пардон, не въехал, о чём речь. [13] снято.


 
Lacmus ©   (2007-09-18 12:25) [18]

>APXi

Создание в Loaded не подходит ?


 
Ega23 ©   (2007-09-18 12:43) [19]

Короче, я бы у фрейма SetParent перекрыл. И там бы создавал, если Parent<>nil


 
DiamondShark ©   (2007-09-18 12:55) [20]

А я бы обращался к TreeView1.Items[0]
Зачем его запоминать в переменной?


 
APXi   (2007-09-18 20:48) [21]

> DiamondShark
Спасибо что вразумил и помог.
> А я бы обращался к TreeView1.Items[0]
Так наверное проще всего.


 
имя   (2007-09-19 18:12) [22]

Удалено модератором


 
имя   (2007-09-19 18:12) [23]

Удалено модератором


 
имя   (2007-09-19 18:12) [24]

Удалено модератором


 
имя   (2007-09-19 18:12) [25]

Удалено модератором


 
имя   (2007-09-19 18:12) [26]

Удалено модератором


 
имя   (2007-09-19 18:12) [27]

Удалено модератором



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

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

Наверх




Память: 0.53 MB
Время: 0.024 c
2-1195284173
datorn
2007-11-17 10:22
2007.12.09
wm_gettext


2-1194784127
timekiller
2007-11-11 15:28
2007.12.09
Обработчик ошибок DomDocument


15-1194613990
авыф
2007-11-09 16:13
2007.12.09
как сделать так, чтобы контролы, расположенные на форме нельзя


2-1194868661
cosy
2007-11-12 14:57
2007.12.09
найдите ошибку пожалуста уже 2 часа на этот сорц смотрю


1-1189288423
Dr. Andrew
2007-09-09 01:53
2007.12.09
Чем можно заменить GetTickCount? Нужна точность до 1 мсек!