Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Клонирование вкладок


Автор: artsb 8.4.2009, 16:09
Всем привет.

Мне нужно добавлять в PageControl вкладки (TabSheet) аналогичные первой (т.е., те же компоненты, то же их расположение и т.д., только нужно, чтобы они были в исходном состоянии, например, ListBox без итемов, Memo без строк и т.д.).
Есть идея сохранить на этапе разработки вкладку в файл, и потом просто подгружать её оттуда. Но может есть вариант получше...

Автор: Klin 9.4.2009, 06:55
Название темы немного не отражает сути ситуации.. ну да ладно. Думаю вы знаете, что компоненты можно создавать динамически. Достаточно хранить информации о классе, расположению и размерах. Думаю в данной ситуации больше информации и не нужно... а где ее хранить... все зависит от задачи, если вам нужно просто создавать все новые одинаковые вкладки - то это вообще фигня вопрос, а если... стоп, впрочем, другой ситуации я не вижу… кроме формирования вкладок из каких-то условий и дальнейшего их использования. Так, т.е. получается, что программа будет сохранять настройки отображения для каждой вкладки. В этом случае, вы можете хранить данные в реестре или в текстовом файле, думаю здесь речь о безопасности, не идет.

Автор: xvr 9.4.2009, 13:18
Оформите все ваши контролы в виде Frame, и вставляйте его целиком в каждый новый TabSheet

Автор: artsb 9.4.2009, 14:46
Klin, вы не совсем поняли видать.
Вот как я хочу сделать:
Сначала сохранить в файл шаблон вкладки. Приблизительно так:
Код

TFileStream* fsTab = new TFileStream("mytabsheet.dtd", fmCreate);
fsTab->WriteComponent(TabSheet1);
fsTab->Free();

А потом добавлять вкладки. Приблизительно так:
Код

TFileStream* fsNewTab = new TFileStream("mytabsheet.dtd", fmOpenRead);
TTabSheet* tsNewTab = NULL;
fsNewTab->ReadComponent(tsNewTab);
tsNewTab->PageControl = PageControl1;
tsNewTab->Name = "Page" + IntToStr(i); // i - какой-нибудь счётчик
i++;
fsNewTab->Free();


Код писал прямо тут, поэтому могут быть ошибки.
Также не проверял его на работоспособность. Всё это чисто теоритически.
Так вот, я и думаю, может есть вариант получше...

xvr, тоже вариант. Спасибо.

Автор: xvr 9.4.2009, 17:52
Есть большие сомнения в реализуемости такого. Куда будут читаться компоненты из потока? В смысле в какие переменные - при загрузке основной формы они записывались в поля самой формы, и теперь они захотят куда то записаться, но некуда - поля уже заняты  smile Какие обработчики event'ов подставятся загруженным компонентам? Даже если он их и найдет на основной форме (что вряд ли), не факт, что их так и надо подсоединять. Как добираться к конкретным контролам, загруженным на страницу? Можно, конечно их искать по имени, но это несколько через задницу  smile 
Думаю, что будут и другие проблемы

Хотя чтение потока сделать можно, я это делал (правда еще на 3м Борланде), но это весьма нетривиальная задача  smile 

Автор: artsb 9.4.2009, 23:01
xvr, попытаюсь ещё подумать над своим вариантом smile Если не получится буду развивать вашу идею smile

Автор: THandle 10.4.2009, 09:33
artsb, если вдруг собирешься записывать компоненты в некий поток, то не пиши их в ручную, нет. Гораздо удобнее использовать классы TReader/Twriter, с которыми жизнь становится легкой и веселой, да и к тому же один добрый человек(йа), написал на их тему маленькую статейку, которую он(добрый человек), почему то в последнее время очень сильно рекламирует, как впрочем и предыдущие свои труды...

http://forum.vingrad.ru/forum/topic-250409.html

ЗЫ: оффтопик... а не перевести ли мне свои статьи на Builder?

Автор: artsb 10.4.2009, 13:31
THandle, спасибо за статью. Пошёл читать...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)