Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.140.198.173] |
|
Сообщ.
#1
,
|
|
|
Ошибочная ашыпка!
Как-то я написал свой компонент для Дельфи, юзал его долго и вроде бы успешо. Но, недавно решил его использовать в Ц++ Билдере. Естественно, все компилится без проблем, но при выполнении возникает ошибка: "Component '' has no parent". При испрользовании его в Дельфях - все нормально. Я в непонятках где я накололся. Вот кусок кода: <br>constructor MTreeView.Create(AOwner: TComponent);<br> var N: TTreeNode;<br> S: MNodeStyle;<br>begin<br> inherited Create(AOwner);<br> FSortType := stNone;<br> FPrintOutTitle := '';<br> if LoadingTitle='' then LoadingTitle:='Loading...';<br> if not (csDesigning in ComponentState) then begin<br> // TTreeNode.Create(Items) - проходит без проблем<br> // а в AddChildObjectFirst - ошибка !!!!!!!!!!!!!!!<br> // MTreeInfo.Load - конструктор класса MTreeInfo<br> N:=Items.AddChildObjectFirst(TTreeNode.Create(Items),LoadingTitle,MTreeInfo.Load(-1,-1,LoadingTitle,False,nil));<br> // Установить параметры картинки<br> if Assigned(OnGetNodeStyle) then begin<br> OnGetNodeStyle(-1,S);<br> SetItemBold(N,S.Bold);<br> N.ImageIndex:=S.IdxCNor;<br> N.SelectedIndex:=S.IdxCSel;<br> N.StateIndex:=S.IdxCSta;<br> end;<br> end;<br>end;<br> ЗЫ: Для информации...Этот компонент позволяет добавить "стили" узлов (т.е. шрифт, цвет, иконку) и метод получения данных для i-го узла. |
Сообщ.
#2
,
|
|
|
Мне кажется надо выставлять Parent у создаваемого TTreeNode. То что происходит безошибочное выполнение конструктора Create вышеназванного класса, это ещё ни о чём не говорит т.к. создание TTreeNode выполняется по условию if not (csDesigning in ComponentState)...
Попробуйте, может поможет. |
Сообщ.
#3
,
|
|
|
Цитата Song, 31.07.02, 13:00:35 Мне кажется надо выставлять Parent у создаваемого TTreeNode. Parent - только для чтения. Тока читать можно. Цитата То что происходит безошибочное выполнение конструктора Create вышеназванного класса, это ещё ни о чём не говорит т.к. создание TTreeNode выполняется по условию if not (csDesigning in ComponentState)... Попробуйте, может поможет. Нет же, это условие работает всегда, когда программа выполняется, а не "рисуется" во время дизайна. Следовательно, для работающей проги этого условия вообще как бы нет, ну или оно всегда true. Сорри, сообщение об ошибке я немного неправильно написал! Правильно так: "Control '' has no parent window". Какие еще есть мысли? :-/ |
Сообщ.
#4
,
|
|
|
Цитата Song, 31.07.02, 13:00:35 Мне кажется надо выставлять Parent у создаваемого TTreeNode... Нашел, действительно надо Parent инициализировать, но у самой компоненты: <br>...<br> if not (csDesigning in ComponentState) then begin<br> N:=TTreeNode.Create(Items);<br> if AOwner is TWinControl then Parent := AOwner as TWinControl; // <<<<<<<<< тут<br> N:=Items.AddChildObjectFirst(N,LoadingTitle,MTreeInfo.Load(-1,-1,LoadingTitle,False,nil));<br>...<br> Хотя это и прикольно использовать паскалевские модули в билдере, но начинает напрягать ... Описан класс с 2-я конструкторами Load и Copy, как его в билдере юзать? : |
Сообщ.
#5
,
|
|
|
Уважаемый JoeUser, ну как же Parent только для чтения, если испокон веков во время динамического создания компонента его нужно устанавливать для видимости объекта:
With TListBox.Create(Self) Do Parent:=Self; Но тем не менее я очень рад, что проблема разрешилась. |
Сообщ.
#6
,
|
|
|
Цитата Song, 31.07.02, 19:53:24 Уважаемый JoeUser, ну как же Parent только для чтения, если испокон веков во время динамического создания компонента его нужно устанавливать для видимости объекта: With TListBox.Create(Self) Do Parent:=Self; TTreeNode - компонент невизуальный, и property Parent там означает совсем другое нежели в компонентах визуальных. Если посмотреть исходник comctrls.pas там английским по синему написано: <br>...<br> TTreeNode = class(TPersistent)<br> ...<br> property Parent: TTreeNode read GetParent;<br> ...<br> end;<br>...<br> что и говорит - "только для чтения". Цитата Но тем не менее я очень рад, что проблема разрешилась. Спасибо за участие Одна проблема не ходит. Есть еще одна - в дельфевой компоненте есть поле, которое я описАл вот так: <br> property LoadingTitle: string read FLoadingTitle write FLoadingTitle;<br> Проблема опять повторяется...В дельфях работает, в ЦБилдере нет... код вот тут (в том же конструкторе): <br> ...<br> if LoadingTitle='' then LoadingTitle:='Loading...';<br> ...<br> Как правильно - если я в Object Inspector'е заполнил это поле, то if дает false и поле LoadingTitle использует то значение, которое я и указал в Object Inspector'е. В Дельфях это так, в Билдере почему-то LoadingTitle == NULL ??? Хотя тут это поле уже видемо как поле типа AnsiString. Ни-ч-чего не понимаю! |
Сообщ.
#7
,
|
|
|
Так неужели никто ничего не подскажет ???
|