Как динамически дублировать вкладку?
У меня есть 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;