Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамическое создание форм на закладках 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 и уже с ним работать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо