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

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

Странная работа TreeView [D7, WinXP]


Страницы:   1 2

APXi ©   (2007-09-18 08:32:00) 

Есть фрейм с деревом и одной кнопкой, а также внутреннее поле 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;
Что может быть?


  (2007-09-19 18:12:00) [1]

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


  (2007-09-19 18:12:00) [2]

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


  (2007-09-19 18:12:00) [3]

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


  (2007-09-19 18:12:00) [4]

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


  (2007-09-19 18:12:00) [5]

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


  (2007-09-19 18:12:00) [6]

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


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

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


DiamondShark   (2007-09-18 12:55:00) [8]

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


Ega23   (2007-09-18 12:43:00) [9]

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


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

>APXi

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


Ega23   (2007-09-18 12:19:00) [11]


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


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


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


> Сергей М. ©   (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:12:00) [13]

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


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

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


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


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


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


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


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


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

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


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

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


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

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


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


> APXi   (18.09.07 10:28) [7]


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


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


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

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


Страницы:   1 2

Наверх

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