2012-04-16 4 views
0

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

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

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

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

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

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

+1

Возможно, вам нужно клонировать объекты внутри листа? – CharlesB

+0

Я думал об одном и том же, потому что я делал дублирование tframe динамически, а компоненты и функции все еще работают. однако табуляция немного отличается. Я пытался дублировать его так же, как и с tframes, и он не работает. ничто в таблице не дублируется. mb Мне нужно поместить все в таблицу на tframe и добавить tframe на новый табличный лист? как бы вы посоветовали мне делать это? – livelaughlove

+0

Да, размещение 'TFrame' на' TTabSheet' было бы хорошим решением. –

ответ

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 -derived класса во время разработки, а затем создать экземпляр этого класса во время выполнения и поместите его на каждый TTabSheet, позволяя ему обрабатывать элементы управления для вас, например:

TTabSheet *NewTabSheet = new TTabSheet(pageControlMain); 
NewTabSheet->PageControl = pageControlMain; 
TMyFrame *NewFrame = new TMyFrame(NewTabSheet); 
NewFrame->Parent = NewTabSheet; 
pageControlMain->ActivePage = NewTabSheet; 
+0

здесь ты снова меня спасаешь! ty = D – livelaughlove

+0

Я не понимаю, почему это работает. Я пробовал это в форме, и это не сработало, так как имена компонентов для детей остались прежними, и вы не можете создать два компонента с тем же именем. Это поведение изменилось в Берлине? –

+1

@MikeVersteeg два компонента одного и того же Владельца не могут иметь одно и то же имя. Оба подхода, которые я показываю, создают нового владельца, поэтому дубликатов нет. Если вы пишете форму в DFM, а затем читаете ее обратно в тот же объект формы, то да, вы получите дубликаты. –