Форум: "Основная";
Текущий архив: 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.03 c