Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
ВнизДинамическое создание форм на закладках PageControl. Вопрос. Найти похожие ветки
← →
DVM © (2006-10-06 11:54) [0]Идея такова:
Есть TPageControl с несколькими закладками.
Закладки спрятаны, отображаются по одной.
У каждой закладки при создании в свойство Tag внесено следующее:
tbshtPage1.Tag := Integer(TfrmSampleForm1);
...
tbshtPageN.Tag := Integer(TfrmSampleFormN);
Когда закладка скрывается, форма, ей соответствующая уничтожается для экономии ресурсов.
Уничтожить форму на основании того, что лежит в Tag закладки получается легко:
TempForm := TForm(ATabSheet.Controls[0]);
TempForm.Free;
А вот с созданием проблемы:
Если я пишу при отображении закладки так:
TempForm := TForm(ATabsheet.Tag).Create(self); то получаю AV.
Проблема я так полагаю в выделенном фрагменте.
Как подставить туда нужный класс формы?
← →
Elen © (2006-10-06 11:59) [1]TForm это не TfrmSampleForm. Намек ясен?
Я б составила динамический массив типа TfrmSampleForm и уже с ним работать.
← →
DVM © (2006-10-06 12:03) [2]
> TForm это не TfrmSampleForm. Намек ясен?
Я это, конечно, понимаю.
Ясное дело, так как я привел писать не следует. Но если заменить так:
TempForm := TFormClass(ATabsheet.Tag).Create(self); то получаю AV.
То все почему то работает. Хотя разницу я не улавливаю что-то.
← →
DVM © (2006-10-06 12:04) [3]Я хотел сказать:
Но если заменить так:
TempForm := TFormClass(ATabsheet.Tag).Create(self);
То все почему то работает.
← →
clickmaker © (2006-10-06 12:08) [4]type
TfrmSampleForm1Class = class of TfrmSampleForm1;
Tabsheet.Tag := integer(TfrmSampleForm1);
var
F: TForm;
F := TfrmSampleForm1Class(Tabsheet.Tag).Create(Self);
← →
Elen © (2006-10-06 12:14) [5]
> Я это, конечно, понимаю.
Не верю... см [4]...
← →
DVM © (2006-10-06 12:14) [6]
> clickmaker © (06.10.06 12:08) [4]
Так на разных закладках разные формы лежат. Классы то разные.
Попытка создать такой строкой форму другого (не TfrmSampleForm1) класса ни чем хорошим не закончится.
← →
DVM © (2006-10-06 12:17) [7]
> clickmaker © (06.10.06 12:08) [4]
Я забыл сказать, что обработчик OnShow один на все закладки.
← →
Elen © (2006-10-06 12:18) [8]
> DVM
значит в if проверяй типы форм и создавай по разным условиям
← →
DVM © (2006-10-06 12:21) [9]
> значит в if проверяй типы форм и создавай по разным условиям
Так временно и сделано. Очень длинно и в лоб как-то получается.
Тогда проще для каждой закладки на OnShow свой обработчик и нет проблем. Форм много и закладок тоже.
← →
Elen © (2006-10-06 12:22) [10]
> DVM
Сколько у тебя ТИПОВ форм? Неужели 1000?
← →
DVM © (2006-10-06 12:27) [11]
> Сколько у тебя ТИПОВ форм? Неужели 1000?
Да нет конечно. Но много (не считал, десятки). Вообще все это работало раньше так же, но с фреймами. Потом от фреймов отказался.
Короче говоря вопрос можно переформулировать так:
как из Tag := integer(TSampleFormClass)
вернуть обратно имя класса и создать форму указанного класса?
Просто интересно, возможно ли?
← →
ЮЮ © (2006-10-06 12:37) [12]DVM © (06.10.06 12:04) [3]
Я хотел сказать:
Но если заменить так:
TempForm := TFormClass(ATabsheet.Tag).Create(self);
То все почему то работает.
Так работает или не работает?. Если работает, то к чему
DVM © (06.10.06 12:27) [11]
Работатет, потому, что TFormClass = class of TForm. И поскольку твои классы унаследованы от TForm, то такое приведение коррекино.
← →
DVM © (2006-10-06 12:39) [13]
> ЮЮ © (06.10.06 12:37) [12]
Да, спасибо, это я уже понял.
← →
DVM © (2006-10-06 12:45) [14]В общем, получилось вроде все так:
type
TMyFormClass = class of TForm;
...
var
TempForm: TForm;
TempForm := TMyFormClass(ATabsheet.Tag).Create(self);
← →
clickmaker © (2006-10-06 13:32) [15]ну можно завести список либо коллекцию со ссылками на класс (class of)
а в тэг кнопки записывать индекс в списке
т.е. тебе надо объявить некий базовый класс
TMyForm
потом ссылку на класс
TMyFormClass = class of TMyForm
все формы наследовать от TMyForm
а в коллекцию добавлять ссылки на TMyFormN
Потом
var
FC: TMyFormClass;
F: TMyForm;
FC := FormClasses.Items[tabPage.Tag];
F := FC.Create;
← →
jack128 © (2006-10-06 13:54) [16]DVM © (06.10.06 12:03) [2]
TempForm := TForm(ATabsheet.Tag).Create(self); то получаю AV.
Очень интересно, ты хранишь в Tag классовую ссылку, а приводишь почему то к объекту. с таким же успехом ты мог содержимое Tag к TStringList приводить...
PS а в чем вообще проблема, ты же вроде нашел абсолютно правельное решение:
DVM © (06.10.06 12:03) [2]
TempForm := TFormClass(ATabsheet.Tag).Create(self);
← →
DVM © (2006-10-06 13:56) [17]
> PS а в чем вообще проблема, ты же вроде нашел абсолютно
> правельное решение:
Теперь уже нет проблемы.
Всем спасибо.
← →
atruhin © (2006-10-06 13:58) [18]А почему бы не зарегистрировать класс формы и создавить по имени класса.
← →
jack128 © (2006-10-06 17:43) [19]atruhin © (06.10.06 13:58) [18]
А почему бы не зарегистрировать класс формы и создавить по имени класса.
а где хранить соответствие между названием класса и tab"ом ?? В отдельном StringList"е ? И зачем ? Не надо изобретать себе проблемы там, где их нет.
← →
atruhin © (2006-10-06 20:01) [20]> а где хранить соответствие между названием класса и tab"ом
> ??
Например в имени таба, вроде того: tab_TfrmSampleForm1
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.049 c