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

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

как создать форму, имея только имя ее класса(string)? [D6, Win2k]


artko ©   (2002-07-08 14:47:00) 

Собственно, в теме вопрос. Есть строка с именем класса формы, требуется ее создать и отобразить.


artko   (2002-07-11 13:39:00) [1]

2Armen
формы конструируются в IDE, потом только неизвестно, что захочется вызвать. потому по имени и нужно создать.


Skier   (2002-07-11 12:49:00) [2]

>artko

В догонку

Нужно будет объявить

type
TBasicFormClass = class of TBasicForm;


И создавать формы так :

var
testform : TBasicForm;

...............
testform:=TBasicFormClass(FindClass("TForm2")).Create
(Application);
...............


Skier   (2002-07-11 12:44:00) [3]

>artko

> иметь стандартный набор переменных и их заполнять


В этом случае лучше объявить(создать) собственный класс-предок
(например TBasicForm = class(TForm) ) для всех остальных твоих форм и уже наследовать все свои формы
от TBasicForm. (например TForm2 = class(TBasicForm) )

В класс TBasicForm ты "вписываешь" стандартный набор переменных,
свойств и методов...


> если форма имеет обработчик собственного сообщения WM_USER,
> к ней должно, по идее, дойти даже в таком виде создания?


Должно.


artko   (2002-07-11 12:42:00) [4]

esli tvoya forma sozdana v Design Time to on imeet svoy potok .dfm i spokoyno mojesh vizvat" TForm.Create(..), no esli formu sozdaesh v Run Time to obyazatel"no vizivay TForm.CreateNew, on ne trebuet .dfm-a.

(Uzveni za latin", u menya raskladka poletela)

Armen


artko   (2002-07-11 12:38:00) [5]

как кастить я знаю. другой вопрос в том, что хотелось бы избежать этого.
то есть, иметь стандартный набор переменных и их заполнять. кстати, если форма имеет обработчик собственного сообщения WM_USER, к ней должно, по идее, дойти даже в таком виде создания?


artko   (2002-07-11 12:38:00) [6]


Skier   (2002-07-11 11:55:00) [7]

artko

> не возникнет потом траблов каких?


Нет, т.к. TForm это класс-предок для всех форм в Delphi.

Но(!) если ты захочешь использовать методы или поля твоего
класса TForm2, то тебе придётся кастить testform (потому что
этих методов нет у класса-предка TForm)

Кастить можно так :

1)

if testform is TForm2 then begin
with testform as TForm2 do begin
//здесь работаешь с testform как с
//объектом класса TForm2
end; //with
end; //if

2)

if testform.InheritsFrom(TForm2) then begin
with testform as TForm2 do begin
//здесь работаешь с testform как с
//объектом класса TForm2
end; //with
end; //if


artko   (2002-07-11 11:48:00) [8]

а нормален ли такой подход, не возникнет потом траблов каких? все-таки форма имеет другой класс.


Skier   (2002-07-11 11:43:00) [9]

>artko


var
testform : TForm;
begin
RegisterClasses([TForm2]);
testform:=TFormClass(FindClass("TForm2")).Create(Application);
testform.ShowModal;
testform.Free;
UnRegisterClasses([TForm2]);
end;


artko   (2002-07-11 11:40:00) [10]

var
testform : TComponent;
begin
RegisterClasses([TForm2]);
testform:=TFormClass(FindClass("TForm2")).CreateNew(Application);
// здесь провал. пока не нашел как показать. да и CreateNew отсутствует в хелпе., впрочем как и TFormClass - встречается только в сырцах VCL.
testform.Free;
UnRegisterClasses([TForm2]);
end;


Skier   (2002-07-11 11:35:00) [11]

>artko
Покажи код.
- как регистрируешь
- как создаёшь
- как показываешь


artko   (2002-07-11 11:33:00) [12]

найти нашел, а выдать форму как? привести класс не могу, нет его :) а просто указание ессно не находит нужных методов.


Skier   (2002-07-11 11:31:00) [13]

>artko

Лучше всего делать так :
(пишешь это в модуле главной формы приложения)


initialization
RegisterClasses(...)

finalization
UnRegisterClasses(...)



artko   (2002-07-11 11:26:00) [14]

да, еще - в доке написано, что класс формы регистрируется при старте программы если есть переменная класса. получается,
если у меня переменная формы объявляются не в модуле формы, а непосредственно перед использованием, нужно зарегистрировать с помощью RegisterClasses?


Skier   (2002-07-09 13:41:00) [15]

Можно и FindClass использовать,
но FindClass генерит exception если не находит
класс, а GetClass - нет.


armen   (2002-07-09 13:37:00) [16]

type
TFormClass = class of TForm;

var
MyForm: TComponent;

.......
MyForm:= TFormClass(FindClass("TForm")).CreateNew(Application);


artko   (2002-07-08 15:23:00) [17]

спасибо, сейчас попробую разобраться.


Skier   (2002-07-08 14:49:00) [18]

>artko
См. описание функции GetClass


Наверх

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