Форум: "Основная";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
ВнизСтранная работа 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.054 c