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

Вниз

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

 
3376   (2004-04-30 09:52) [0]

Уважаемые мастера! Подскажите как создать форму зная только ее имя? Сама форма присутствует в проекте.


 
DVM ©   (2004-04-30 09:53) [1]

Погляди в dpr - файл своего проекта. Там показано как создавать формы.


 
3376   (2004-04-30 09:56) [2]

:) Классный ответ!
Application.CreateForm(TMainForm,MainForm); вот только проблема в том, что известно только ИМЯ формы ... класс ее не известен.
И имя формы это переменная.


 
[lamer]Barmaglot ©   (2004-04-30 09:58) [3]

RTFM?

http://www.delphimaster.ru/articles/bdform/index.html


 
3376   (2004-04-30 10:02) [4]

:) хорошая статья, читана, только вот не работает вариант ...понять не могу ... не находит она класс формы ...:(


 
DVM ©   (2004-04-30 10:09) [5]


> что известно только ИМЯ формы ... класс ее не известен.

а как так получается, может обойти можно проблему?


 
Gero ©   (2004-04-30 10:13) [6]


> 3376   (30.04.04 10:02)

Подумайте сами, что Вы спрашиваете.
Если класс неизвестен, то что же тогда создавать будем?


 
3376   (2004-04-30 10:16) [7]

Идея такая ... есть большой проект, формы делаются разными людьми на основании шаблона, в секции initialization формы происходит прописка данной формы в интерфейсе основной программы ... так вот в качестве ссылки прописывается имя класса формы ... вот и задача как "запустить" форму зная только имя класса формы (ну или имя формы) ...


 
YurikGl ©   (2004-04-30 10:21) [8]

К имени формы добавь T в начало :)


 
3376   (2004-04-30 10:27) [9]

:) смешно ... все дело в том, что форма то не скрейтина и естественно она присутствует только в ресурсе приложения ... предложенный вариан не работает .CollectAllClasses.SaveToFile("test.txt") .. нет формы в списке классов :(


 
Плохиш   (2004-04-30 10:31) [10]


> 3376   (30.04.04 10:27) [9]
> :) смешно ... все дело в том, что форма то не скрейтина
> и естественно она присутствует только в ресурсе приложения
> ... предложенный вариан не работает .CollectAllClasses.SaveToFile("test.txt")
> .. нет формы в списке классов :(

Совсем не смешно, может Вам для начала занятся изучением азов программирования?


 
3376   (2004-04-30 10:35) [11]

:) займусь на досуге обязательно ...

вообще копал сначала вот в этом направлении

procedure TForm1.Button1Click(Sender: TObject);
var
  F:TForm;
begin
    F := TForm.CreateNew(Application);
    ReadComponentRes("TFORM2",F);
    F.ShowModal;
end;
с "чистой" формой все естественно проходит ... но вот если на форме есть контролы то получаю сообщение о их отсутствии ... че я не так делаю?


 
Игорь Шевченко ©   (2004-04-30 10:38) [12]

TFormClass(FindClass("имя_формы")).Create(Application) ?

для этого каждую форму, создаваемую таким образом, надо зарегистрировать вызовом функции RegisterClass

Пример можно посмотреть здесь http://www.schevchenko.net.ru/SRC/QuerySystemInformation_60.zip


 
Opuhshii ©   (2004-04-30 10:40) [13]

RegisterClass и GetClass


 
3376   (2004-04-30 10:59) [14]

Все это очень хорошо ... но проблема в том (или я чет не понимаю) что зарегистрировать можно только "известный" класс ... а вот как его узнать?
Пример Игоря Шевченко, еще не изучен подробно, но на первый взгляд, там этого нет :(


 
3376   (2004-04-30 11:01) [15]

... дошел уже вообще до маразма :) ... читаю ресурс формы в поток ...парсю ..ищу имя класса ... регю ... мда :(


 
Skier ©   (2004-04-30 11:04) [16]

>3376   (30.04.04 10:16) [7]
Общий предок у форм есть ? Его класс известен ?


 
3376   (2004-04-30 11:07) [17]

да известен


 
Skier ©   (2004-04-30 11:13) [18]

>3376   (30.04.04 11:07) [17]
TBaseFormClass = class of TBaseForm;

function CreateForm(FormClass : TBaseFormClass,... ) : ...

в FormClass "заносишь" ссылку на конкретный класс формы-потомка, который можно получить по имени класса через GetClass.
Но без RegisterClass(es) не обойтись, если хочешь всё сделать "малой кровью".


 
Игорь Шевченко ©   (2004-04-30 11:17) [19]


> Пример Игоря Шевченко, еще не изучен подробно


Изучай подробно, там все есть


 
3376   (2004-04-30 11:19) [20]

Спасибо Skier за советы.
... просто замкнутый круг ... GetClass  только после RegisterClass ...


 
3376   (2004-04-30 11:32) [21]

... все идеи иссякли?
... тему специально поднимаю, что б не утонула ... уж извените :)


 
Юрий Зотов ©   (2004-04-30 11:34) [22]

> 3376

1. Все классы форм, которые Вы хотите создавать таким образом, должны быть зарегистрированы. Предположим, у нас есть три таких класса - TForm1, TForm2 и TForm3. Тогда где-то в секции initialization пишем:

RegisterClasses([TForm1, TForm2, TForm3]);

2. Теперь мы можем создать любую такую форму по имени ее класса, причем объявлять TBaseFormClass совершенно не обязательно, потому что в модуле Forms уже есть объявление TFormClass.

function CreateForm(FormClassName: string; Owner: TComponent): TForm;
begin
 Result := TFormClass(FindClass(FormClassName)).Create(Owner)
end;

Пример вызова:
MyForm := CreateForm("TForm2", Application);

3. Вот и вся проблема. Ровно 5 строчек.
:о)


 
3376   (2004-04-30 11:36) [23]

Юрий совершенно согласен с Вами ... в данный момент так и делаю ... но хотелось то ведь по другому :)


 
Юрий Зотов ©   (2004-04-30 12:45) [24]

> 3376   (30.04.04 11:36) [23]

А по-другому, это как? Вот так, что ли:

var
 F1, F2, F3, F4: TForm2;

И теперь надо создать экземпляр TForm2, зная только имя переменной, например, F3 (причем даже не в строковом виде)?

Сами подумайте - а это вообще возможно? Ведь ничто не мешает объявить и так:

var
 F1, F2, F3, F4: TCustomForm;

но при этом создавать экземпляры любых классов форм:

F1 := TForm1.Create(...);
F2 := TForm2.Create(...);
F3 := TForm3.Create(...);
F4 := TForm4.Create(...);

И как программа узнает, что для F1 надо создавать TForm1, а для F4 - TForm4? Только если Вы сделаете какую-то привязку вручную, больше никак.



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

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

Наверх




Память: 0.52 MB
Время: 0.032 c
1-1083699312
ohiio
2004-05-04 23:35
2004.05.16
checklistbox


7-1080806222
snake1977
2004-04-01 11:57
2004.05.16
Список установленных шрифтов


1-1083157764
killer
2004-04-28 17:09
2004.05.16
Сортировка в StringGrid


3-1082094273
Артем К.
2004-04-16 09:44
2004.05.16
Как связать QReport со своим окном предварительного просмотра?


1-1083224549
denpro
2004-04-29 11:42
2004.05.16
Меню и MDI