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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.198 c
6-1080647659
SAG
2004-03-30 15:54
2004.05.16
UDPSocket не получает сообщение


3-1082380121
Term
2004-04-19 17:08
2004.05.16
Можно ли в запросе три поля VARCHAR объеденить в одно


3-1082474947
Koba
2004-04-20 19:29
2004.05.16
Результат запроса


1-1083228255
Senator
2004-04-29 12:44
2004.05.16
MDI


7-1080727290
-+= Evgeney =+-
2004-03-31 14:01
2004.05.16
Извращения с сотовым телефоном





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