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