Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.22;
Скачать: [xml.tar.bz2];

Вниз

как создать форму, имея только имя ее класса(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) [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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
14-70879
kaif
2002-06-21 04:42
2002.07.22
Любимый шрифт бухгалтера


1-70699
Rubber
2002-07-09 06:47
2002.07.22
DOS ASCII в TMemo?


14-70898
esprit_bel
2002-06-17 03:39
2002.07.22
тормоза на сетевуху


3-70652
Ptr
2002-06-25 09:01
2002.07.22
Скоросная закачка в Interbase


14-70875
Bboy
2002-06-24 16:15
2002.07.22
Проблема совместимости CeQuadrat с XP!!!!?????





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский