Разработчики, работающие с Delphi, часто сталкиваются с необходимостью динамического создания и отображения форм, особенно при работе с вкладками. Вопрос, поднятый в данной теме, заключается в том, как создать экземпляр формы, имя которой передается в виде строки, и отобразить его на вкладке.
Проблема
Разработчик имеет пять форм, созданных во время дизайна, и хочет динамически создавать экземпляры каждой формы для отображения на вкладках. Имена форм хранятся в массиве строк. При вызове процедуры ShowForm(FormName[3]) необходимо создать и отобразить третью форму на вкладке.
Решение
Чтобы решить проблему, необходимо определить переменную для нового экземпляра формы как TForm. Это позволит использовать одну и ту же переменную для создания разных форм. Вот пример кода, который демонстрирует это решение:
var
NewForm: TForm;
begin
NewForm := TMyForm.Create(Tab1); // компилируется корректно
NewForm := TMyOtherForm.Create(Tab2); // также компилируется корректно
end;
При этом TMyForm и TMyOtherForm должны быть производными от TForm.
Уменьшение повторяющегося кода
Для уменьшения повторения кода можно использовать переменную ссылочного типа на класс, как показано ниже:
procedure TForm1.ShowFormOnTab(pProcName:String);
var
NewForm: TForm;
ClassToUse: TFormClass;
NewTab: TTabSheet;
begin
// Создание новой вкладки и ее инициализация
// ...
// Определение класса формы на основе строки
if pProcName = 'ProcfrmSetupItemCategories' then
ClassToUse := TfrmSetupItemCategories
else if pProcName = 'ProcfrmZones' then
ClassToUse := TfrmZones
else
ClassToUse := nil;
// Проверка на валидность класса и создание формы
if Assigned(ClassToUse) then
begin
NewForm := ClassToUse.Create(NewTab);
NewTab.Caption := NewForm.Caption;
// Доступ к пользовательским свойствам или методам формы
if NewForm is TfrmZones then
TfrmZones(NewForm).ZoneInfo := 'MyInfo';
end;
end;
Регистрация классов и создание форм из строки
Для еще большей универсальности можно зарегистрировать классы форм и создать их из строки:
procedure TMainForm.FormCreate(Sender: TObject);
begin
RegisterClass(TfrmSetupItemCategories);
RegisterClass(TfrmZones);
// Регистрация других классов
end;
procedure TForm1.ShowFormOnTab(pProcName:String);
var
NewForm: TForm;
ClassToUse: TFormClass;
ClassNameToUse: string;
NewTab: TTabSheet;
begin
// Создание новой вкладки и ее инициализация
// ...
// Получение класса из строки
ClassNameToUse := 'T' + Copy(pProcName, 5, Length(pProcName));
ClassToUse := TFormClass(FindClass(ClassNameToUse));
// Проверка на валидность класса и создание формы
if Assigned(ClassToUse) then
begin
NewForm := ClassToUse.Create(NewTab);
NewTab.Caption := NewForm.Caption;
end;
end;
Это позволяет код оставаться неизменным для любого количества классов.
Закрытие вкладки при освобождении формы
Для закрытия вкладки при освобождении формы, можно использовать ссылку на вкладку из формы, и при уничтожении формы уведомить основную форму о необходимости удаления вкладки.
Выводы
При динамическом создании форм важно правильно определять переменные и использовать ссылки на классы для уменьшения повторяющегося кода. Регистрация классов и создание форм из строк позволяет упростить процесс и сделать код более гибким.
Разработчики используют в Delphi механизм динамического создания форм для отображения на вкладках, сталкиваясь с задачей эффективного управления памятью и кода при работе с перечнем различных форм.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS