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

Вниз

как создать форму, имея только имя ее класса(string)?   Найти похожие ветки 

 
artko ©   (2002-07-08 14:47) [0]

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


 
Skier ©   (2002-07-08 14:49) [1]

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


 
artko ©   (2002-07-08 15:23) [2]

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


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

type
TFormClass = class of TForm;

var
MyForm: TComponent;

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


 
Skier ©   (2002-07-09 13:41) [4]

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



 
artko ©   (2002-07-11 11:26) [5]

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


 
Skier ©   (2002-07-11 11:31) [6]

>artko

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


initialization
RegisterClasses(...)

finalization
UnRegisterClasses(...)




 
artko ©   (2002-07-11 11:33) [7]

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


 
Skier ©   (2002-07-11 11:35) [8]

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


 
artko ©   (2002-07-11 11:40) [9]

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:43) [10]

>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:48) [11]

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


 
Skier ©   (2002-07-11 11:55) [12]

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 12:38) [13]



 
artko ©   (2002-07-11 12:38) [14]

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


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

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


 
Skier ©   (2002-07-11 12:44) [16]

>artko

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


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

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


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


Должно.


 
Skier ©   (2002-07-11 12:49) [17]

>artko

В догонку

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

type
TBasicFormClass = class of TBasicForm;


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

var
testform : TBasicForm;

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



 
artko ©   (2002-07-11 13:39) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2002.07.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
3-70630
den74
2002-07-01 14:09
2002.07.22
кирилица????


3-70595
jen_bond
2002-06-29 01:16
2002.07.22
Организация таблицы


3-70607
denis_tkachov
2002-06-30 17:18
2002.07.22
TThread и TQuery


14-70874
Bocman
2002-06-24 15:27
2002.07.22
Срочно, и не сложно....


1-70757
Алгоритмик
2002-07-09 15:41
2002.07.22
Компоненты FlatStyle (-FlatListBox-)