На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Компонент от Дельфи
    Ошибочная ашыпка! ;)

    Как-то я написал свой компонент для Дельфи, юзал его долго и вроде бы успешо. Но, недавно решил его использовать в Ц++ Билдере. Естественно, все компилится без проблем, но при выполнении возникает ошибка: "Component '' has no parent". При испрользовании его в Дельфях - все нормально. Я в непонятках где я накололся.  Вот кусок кода:
    ExpandedWrap disabled
      <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-го узла.
      Мне кажется надо выставлять Parent у создаваемого TTreeNode. То что происходит безошибочное выполнение конструктора Create вышеназванного класса, это ещё ни о чём не говорит т.к. создание TTreeNode выполняется по условию if not (csDesigning in ComponentState)...
      Попробуйте, может поможет.
        Цитата Song, 31.07.02, 13:00:35
        Мне кажется надо выставлять Parent у создаваемого TTreeNode.

        Parent - только для чтения. Тока читать можно.
        Цитата

        То что происходит безошибочное выполнение конструктора Create вышеназванного класса, это ещё ни о чём не говорит т.к. создание TTreeNode выполняется по условию if not (csDesigning in ComponentState)...
        Попробуйте, может поможет.

        Нет же, это условие работает всегда, когда программа выполняется, а не "рисуется" во время дизайна. Следовательно, для работающей проги этого условия вообще как бы нет, ну или оно всегда true.

        Сорри, сообщение об ошибке я немного неправильно написал! Правильно так: "Control '' has no parent window".

        Какие еще есть мысли?  :-/
          Цитата Song, 31.07.02, 13:00:35
          Мне кажется надо выставлять Parent у создаваемого TTreeNode...

          Нашел, действительно надо Parent инициализировать, но у самой компоненты:
          ExpandedWrap disabled
            <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, как его в билдере юзать? ::)
            Уважаемый JoeUser, ну как же Parent только для чтения, если испокон веков во время динамического создания компонента его нужно устанавливать для видимости объекта:
            With TListBox.Create(Self) Do Parent:=Self;
            Но тем не менее я очень рад, что проблема разрешилась. :)
              Цитата Song, 31.07.02, 19:53:24
              Уважаемый JoeUser, ну как же Parent только для чтения, если испокон веков во время динамического создания компонента его нужно устанавливать для видимости объекта:
              With TListBox.Create(Self) Do Parent:=Self;

              TTreeNode - компонент невизуальный, и property Parent там означает совсем другое нежели в компонентах визуальных. Если посмотреть исходник comctrls.pas там английским по синему написано:
              ExpandedWrap disabled
                <br>...<br>   TTreeNode = class(TPersistent)<br>     ...<br>     property Parent: TTreeNode read GetParent;<br>     ...<br>   end;<br>...<br>

              что и говорит - "только для чтения".
              Цитата

              Но тем не менее я очень рад, что проблема разрешилась. :)


              Спасибо за участие ;)

              Одна проблема не ходит. Есть еще одна - в дельфевой компоненте есть поле, которое я описАл вот так:
              ExpandedWrap disabled
                <br>    property  LoadingTitle: string read FLoadingTitle write FLoadingTitle;<br>

              Проблема опять повторяется...В дельфях работает, в ЦБилдере нет... код вот тут (в том же конструкторе):
              ExpandedWrap disabled
                <br>  ...<br>  if LoadingTitle='' then LoadingTitle:='Loading...';<br>  ...<br>

              Как правильно - если я в Object Inspector'е заполнил это поле, то if дает false и поле LoadingTitle использует то значение, которое я и указал в Object Inspector'е. В Дельфях это так, в Билдере почему-то LoadingTitle == NULL ??? Хотя тут это поле уже видемо как поле типа AnsiString. Ни-ч-чего не понимаю!
                Так неужели никто ничего не подскажет  ???
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0370 ]   [ 16 queries used ]   [ Generated: 3.05.24, 13:34 GMT ]