Где инициализировать дочерние элементы управления в TCustomControl

Я пытаюсь создать простой настраиваемый элемент управления с помощью Borland C++ Builder 6. В данном случае я пытаюсь создать TPageControl с одним листом TTabSheet. У меня возникли проблемы с определением правильного места для инициализации этих дочерних элементов управления. На данный момент я инициализирую все в конструкторе. Все компилируется нормально, но когда я пытаюсь поместить элемент управления в форму, Borland IDE выдает ошибку «У элемента управления нет родительского окна» или что-то очень похожее. Я обнаружил, что строка, которая вызывает это конкретно, является настройкой свойства PageControl TTabSheet.

Код для моего управления ниже:

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "TestControl.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TTestControl *)
{
    new TTestControl(NULL);
}
//---------------------------------------------------------------------------
__fastcall TTestControl::TTestControl(TComponent* Owner)
    : TCustomControl(Owner)
{
    pageControl = new TPageControl(this);
    pageControl->Parent = this;

    tabSheet = new TTabSheet(pageControl);
    tabSheet->Parent = pageControl;
    tabSheet->Caption = "Page 1";
    tabSheet->PageControl = pageControl;
}
//---------------------------------------------------------------------------
__fastcall TTestControl::~TTestControl()
{
    pageControl->Free();
}
//---------------------------------------------------------------------------
namespace Testcontrol
{
    void __fastcall PACKAGE Register()
    {
         TComponentClass classes[1] = {__classid(TTestControl)};
         RegisterComponents("Test", classes, 0);
    }
}
//---------------------------------------------------------------------------

Любая помощь будет очень признательна - я обнаружил, что из-за возраста этой конкретной технологии мне не очень повезло найти ресурсы по этому вопросу.


person erikjw    schedule 26.08.2016    source источник
comment
Посмотрите на один из существующих исходных кодов элементов управления VCL и посмотрите, как это делается.   -  person    schedule 27.08.2016
comment
@RawN Любые предложения по элементам управления, на которые стоит обратить внимание? Содержит ли vcl элементы управления, состоящие из других элементов управления, как я пытаюсь сделать?   -  person erikjw    schedule 27.08.2016
comment
Посмотрите на любой составной элемент управления. Да. Ctrl + щелчок мышью приведет вас к исходному коду внутри C++ Builder IDE.   -  person    schedule 27.08.2016
comment
Что ж, похоже, я действительно хотел рамку. Гораздо меньше боли за то, что я хочу делать. @RawN За последние пару дней я много искал по этой проблеме - как инициализировать PageControl, так и устанавливать свойства элемента управления. И большая часть того, что я видел, — это установка свойств в конструкторе с оговоркой, что вы не можете устанавливать свойства, требующие дескриптора окна. Я видел, как люди устанавливали эти свойства в CreateParams. В этом случае ни один из них не работает, и мне очень неудобно просто догадываться о чем-то, что может сработать. Документов катастрофически не хватает...   -  person erikjw    schedule 27.08.2016
comment
@erikjw CreateParams() - это неправильное место для инициализации свойств, зависящих от окна. Окно еще не существует. CreateWnd() больше подходит.   -  person Remy Lebeau    schedule 27.08.2016
comment
@erikjw - я с тобой согласен. Документации не хватает в изобилии. Вот мой эксперимент: stackoverflow.com/questions/56859524/   -  person Z80    schedule 13.09.2019