Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.19;
Скачать: CL | DM;

Вниз

Динамическое создание форм на закладках 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.067 c
15-1162052130
TUser
2006-10-28 20:15
2006.11.19
Клавиатура ноутбука


2-1162638407
l|l|l|l|
2006-11-04 14:06
2006.11.19
"Блокирующие" вызовы функций.


2-1162652140
susergey
2006-11-04 17:55
2006.11.19
PageControl


11-1121340015
Barloggg
2005-07-14 15:20
2006.11.19
Хочу избавиться от MCK


15-1162507884
Ketmar
2006-11-03 01:51
2006.11.19
какими только извращениями люди не страдают...