Карта сайтаСсылкиКонтакты

Создание формы Delphi из строки

PDF Печать
Статьи

Есть способ создания экземпляра формы из строки из ее имени. Например, если есть строка TMyForm, то будет создана новая форма типа TMyForm...


function Proba
var 
  i: integer;  
begin  
  i:= 100000;  
  ShowMessage('Proverka koda');  
end;
  

Предположим, что у Вас имеется несколько связанных форм в Вашем приложении (как, вероятно, все делают). Конечно, многие из этих форм создаются динамически во время выполнения (удалены из списка "Автосоздаваемых форм" в окне свойств проекта).

Скажем, у Вас есть форма по имени MyForm класса TMyForm, которую Вы хотите создать. Чтобы создать экземпляр формы MyForm во время выполнения, Вы могли бы использовать следующий код (чтобы показать ее модально и освобождать ее, когда она закрывается).


var
  myForm :   TMyForm;
begin
  myForm := TMyForm.Create(nil);
  try
    myForm.ShowModal;
  finally
    myForm.Free;
  end;
end;

Или Вы могли бы сделать приложение владельцем формы MyForm и описать команду, подобно этой:


var
  myForm : TMyForm;
begin
  Application.CreateForm(TMyForm, myForm);
  my.Show;
end;

Теперь, что если Вы "не знаете" точно тип класса объекта формы? Что, если, мало того, строковая переменная имеет перенос имени класса формы, как TMyForm? Вы не сможете использовать образцы кода, показанных выше. Application.CreateForm ожидает переменную типа TFormClass, а не строку.

Вы, вероятнее всего не сможете использовать TMyForm.Create(...)!

Новый экземпляр формы из строки

Обратите внимание, что процедура Application.CreateForm() ожидает переменную типа TFormClass своим первым параметром. Если мы сможем передать типовую переменную TFormClass (из строки), мы сможем создавать форму по ее имени!

Функция FindClass() Delphi получает тип класса из строки. В поиске участвуют все зарегистрированные классы. Чтобы зарегистрировать класс, может быть запущена процедура RegisterClass(). Когда функция FindClass возвращает значение TPersistentClass, мы передаем его в TFormClass и новый объект TForm может быть создан!

Пример

Создайте новый проект Delphi и назовите главную форму MainForm (TMainForm). Добавьте три новых формы в проект и назовите их: FirstForm (TFirstForm), SecondForm (TSecondForm) и ThirdForm (TThirdForm).
Удалите их из автосозданных форм в свойствах проекта. Затем поместите ListBox на MainForm и добавьте в него три строки (TFistForm, TSecondForm, TThirdForm).

Главная форма

В событии OnCreate MainForm регистрируются классы:


procedure TMainForm.FormCreate(Sender: TObject);
begin
  RegisterClass(TFirstForm);
  RegisterClass(TSecondForm);
  RegisterClass(TThirdForm);
end;

Как только мы щелкаем кнопкой, мы находим имя выбранной формы и вызываем процедуру CreateFormFromName:


procedure TMainForm.CreateFormButtonClick(Sender: TObject);
var
  s : string;
begin
  s := ListBox1.Items[ListBox1.ItemIndex];
  CreateFormFromName(s);
end;

Если будет выбран первый пункт из списка, то переменная "s" будет содержать значение "TFirstForm". Событие CreateFormFromName создаст экземпляр формы TFirstForm:


procedure CreateFormFromName(const FormName : string);
var
  fc : TFormClass;
  f : TForm;
begin
  fc := TFormClass(FindClass(FormName));
  f := fc.Create(Application);
  f.Show;
end;{ CreateFormFromName }

И это все!

Итоговое изображение
 

Комментарии   

 
+1 #1 Маша 27.03.2011 15:11
почти то что нужно :-| :lol:
Цитировать
 

Добавить комментарий


Защитный код
Обновить