Как динамически дублировать вкладку?

У меня есть TPageControl с TTabSheet, и в этом TTabSheet У меня есть куча функций и компонентов. Я хотел бы продублировать этот tabSheet во время выполнения через кнопку со всеми функциями и компонентами, которые все еще в нем и работают.

Прямо сейчас мне удалось продублировать таблицу. Однако новая вкладка полностью пуста.

Вот мой код для этой кнопки.

TTabSheet * NewTabSheet= new TTabSheet(pageControlMain);
NewTabSheet->PageControl = pageControlMain;
NewTabSheet->Caption = "TabSheet";
pageControlMain->ActivePage = NewTabSheet;

Что мне не хватает?

Что касается компонентов и функций внутри TTabSheets, то это просто скроллбоксы, правки, кнопки и панели.

1 ответ

Решение

TTabSheet сам по себе класс не имеет дочерних элементов управления, поэтому вы ничего не видите. Вы должны создать экземпляр каждого отдельного элемента управления, а также скопировать их данные.

Один из способов сделать это - использовать TStream.WriteComponent() а также TStream.ReadComponent() методы для сохранения источника TTabSheet во временный DFM, а затем загрузить его в новый TTabSheetНапример:

TMemoryStream *Strm = new TMemoryStream;
Strm->WriteComponent(SourceTabSheet);
Strm->Position = 0;
TTabSheet *NewTabSheet = new TTabSheet(pageControlMain);
NewTabSheet->PageControl = pageControlMain;
Strm->ReadComponent(NewTabSheet);
pageControlMain->ActivePage = NewTabSheet;
delete Strm;

Другой вариант - разместить ваши компоненты на TFrameкласс во время разработки, затем создайте экземпляр этого класса во время выполнения и поместите его в каждый TTabSheet, позволяя ему обрабатывать элементы управления для вас, например:

TTabSheet *NewTabSheet = new TTabSheet(pageControlMain);
NewTabSheet->PageControl = pageControlMain;
TMyFrame *NewFrame = new TMyFrame(NewTabSheet);
NewFrame->Parent = NewTabSheet;
pageControlMain->ActivePage = NewTabSheet;
Другие вопросы по тегам