![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странная работа TreeView [D7, WinXP]
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 тоже, поэтому косяк.