Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.056 c
15-1194857454
Voluntarist
2007-11-12 11:50
2007.12.09
Борьба со злом


1-1190197939
ari_9
2007-09-19 14:32
2007.12.09
как получить событие смены пользователем языка ввода ?


2-1195012746
Brave
2007-11-14 06:59
2007.12.09
Интересно, реально ли такое...


1-1190205924
SamProf
2007-09-19 16:45
2007.12.09
Как очистить cookie в TwebBrowser


15-1194793273
Kick
2007-11-11 18:01
2007.12.09
В моем классе не видно...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский