![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание форм на закладках PageControl. Вопрос. [D7, WinXP]
DVM © (2006-10-06 11:54:00)Идея такова:
Есть 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.
Проблема я так полагаю в выделенном фрагменте.
Как подставить туда нужный класс формы?
atruhin (2006-10-06 20:01:00) [1]> а где хранить соответствие между названием класса и tab'ом
> ??
Например в имени таба, вроде того: tab_TfrmSampleForm1
jack128 (2006-10-06 17:43:00) [2]atruhin © (06.10.06 13:58) [18]
А почему бы не зарегистрировать класс формы и создавить по имени класса.
а где хранить соответствие между названием класса и tab'ом ?? В отдельном StringList'е ? И зачем ? Не надо изобретать себе проблемы там, где их нет.
atruhin (2006-10-06 13:58:00) [3]А почему бы не зарегистрировать класс формы и создавить по имени класса.
DVM (2006-10-06 13:56:00) [4]
> PS а в чем вообще проблема, ты же вроде нашел абсолютно
> правельное решение:
Теперь уже нет проблемы.
Всем спасибо.
jack128 (2006-10-06 13:54:00) [5]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);
clickmaker (2006-10-06 13:32:00) [6]ну можно завести список либо коллекцию со ссылками на класс (class of)
а в тэг кнопки записывать индекс в списке
т.е. тебе надо объявить некий базовый класс
TMyForm
потом ссылку на класс
TMyFormClass = class of TMyForm
все формы наследовать от TMyForm
а в коллекцию добавлять ссылки на TMyFormN
Потом
var
FC: TMyFormClass;
F: TMyForm;
FC := FormClasses.Items[tabPage.Tag];
F := FC.Create;
DVM (2006-10-06 12:45:00) [7]В общем, получилось вроде все так:
type
TMyFormClass = class of TForm;
...
var
TempForm: TForm;
TempForm := TMyFormClass(ATabsheet.Tag).Create(self);
DVM (2006-10-06 12:39:00) [8]
> ЮЮ © (06.10.06 12:37) [12]
Да, спасибо, это я уже понял.
ЮЮ (2006-10-06 12:37:00) [9]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:27:00) [10]
> Сколько у тебя ТИПОВ форм? Неужели 1000?
Да нет конечно. Но много (не считал, десятки). Вообще все это работало раньше так же, но с фреймами. Потом от фреймов отказался.
Короче говоря вопрос можно переформулировать так:
как из Tag := integer(TSampleFormClass)
вернуть обратно имя класса и создать форму указанного класса?
Просто интересно, возможно ли?
Elen (2006-10-06 12:22:00) [11]
> DVM
Сколько у тебя ТИПОВ форм? Неужели 1000?
DVM (2006-10-06 12:21:00) [12]
> значит в if проверяй типы форм и создавай по разным условиям
Так временно и сделано. Очень длинно и в лоб как-то получается.
Тогда проще для каждой закладки на OnShow свой обработчик и нет проблем. Форм много и закладок тоже.
Elen (2006-10-06 12:18:00) [13]
> DVM
значит в if проверяй типы форм и создавай по разным условиям
DVM (2006-10-06 12:17:00) [14]
> clickmaker © (06.10.06 12:08) [4]
Я забыл сказать, что обработчик OnShow один на все закладки.
DVM (2006-10-06 12:14:00) [15]
> clickmaker © (06.10.06 12:08) [4]
Так на разных закладках разные формы лежат. Классы то разные.
Попытка создать такой строкой форму другого (не TfrmSampleForm1) класса ни чем хорошим не закончится.
Elen (2006-10-06 12:14:00) [16]
> Я это, конечно, понимаю.
Не верю... см [4]...
clickmaker (2006-10-06 12:08:00) [17]type
TfrmSampleForm1Class = class of TfrmSampleForm1;
Tabsheet.Tag := integer(TfrmSampleForm1);
var
F: TForm;
F := TfrmSampleForm1Class(Tabsheet.Tag).Create(Self);
DVM (2006-10-06 12:04:00) [18]Я хотел сказать:
Но если заменить так:
TempForm := TFormClass(ATabsheet.Tag).Create(self);
То все почему то работает.
DVM (2006-10-06 12:03:00) [19]
> TForm это не TfrmSampleForm. Намек ясен?
Я это, конечно, понимаю.
Ясное дело, так как я привел писать не следует. Но если заменить так:
TempForm := TFormClass(ATabsheet.Tag).Create(self); то получаю AV.
То все почему то работает. Хотя разницу я не улавливаю что-то.
Elen (2006-10-06 11:59:00) [20]TForm это не TfrmSampleForm. Намек ясен?
Я б составила динамический массив типа TfrmSampleForm и уже с ним работать.