Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.046 c
1-1160573603
alexvan
2006-10-11 17:33
2006.11.19
Изменение цвета


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


2-1162700654
eowl
2006-11-05 07:24
2006.11.19
Совместимость PAnsiChar и String


15-1162206003
maxmax111
2006-10-30 14:00
2006.11.19
поскажите программу, которая..


10-1124628776
teddy
2005-08-21 16:52
2006.11.19
Ошибка при вызове оле объекта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский