В процессе разработки приложений на Delphi часто возникает необходимость управления множеством форм. Это может быть связано с открытием вспомогательных окон, диалогов, модальных и немодальных форм. Одной из задач такого управления является отслеживание открытых форм и их корректное закрытие. В данной статье мы рассмотрим, как можно эффективно организовать работу с формами в Delphi, используя Object Pascal.
Проблема и решение
Рассмотрим типичную ситуацию: у нас есть основная форма FormPrincipal, с помощью которой мы открываем другие формы. Нам необходимо отслеживать, какие формы в данный момент открыты, и уметь закрывать их перед открытием новых.
procedure TFormPrincipal.AbreFormBancoExecute(Sender: TObject);
begin
// Создание и отображение формы Formbanco
end;
В коде основной формы присутствует обработчик события, который открывает форму Formbanco. По мере добавления новых форм, возникает вопрос: как узнать, какие формы в данный момент открыты, и как их закрыть перед открытием других?
Подходы к решению
Использование глобальных переменных
Один из подходов - использование глобальных переменных для хранения ссылок на открытые формы.
procedure TForm1.CloseActiveForm(Formname: string);
begin
if Formname = 'Form2' then FreeAndNil(Form2) else
if Formname = 'Form3' then FreeAndNil(Form3);
end;
Однако такой подход имеет свои недостатки: использование множества условных операторов if для проверки каждой формы неэффективно и может привести к проблемам при добавлении новых форм.
Использование коллекций
Более продвинутый подход - использование коллекций, например, TList или TDictionary, для хранения ссылок на открытые формы.
var
OpenForms: TDictionary<string, TForm>;
...
procedure TForm1.OpenForm(const FormClass: TComponentClass; const FormName: string);
begin
if not OpenForms.ContainsKey(FormName) then
begin
with TForm.Create(nil) do
try
ClassType := FormClass;
Owner := Self;
Name := FormName;
OpenForms.Add(FormName, Self);
Show;
except
on E: Exception do
begin
Writeln(Format('Error creating %s: %s', [FormName, E.Message]));
E.Raise;
end;
end;
end;
end;
...
procedure TForm1.CloseForm(const FormName: string);
begin
if OpenForms.ContainsKey(FormName) then
with OpenForms[FormName] do
begin
Free;
OpenForms.Remove(FormName);
end;
end;
Отслеживание активной формы
Для отслеживания активной формы можно использовать обработчики событий OnActivate и OnDeactivate, но это может быть неэффективно, если форм очень много, и потребуется дополнительная логика для обработки всех возможных сценариев переключения фокуса.
Использование свойства Screen.Forms
Свойство Screen.Forms позволяет получить доступ ко всем формам в приложении. Можно перебрать все формы и проверить, активна ли текущая форма пользователя.
function GetActiveForm: TForm;
var
i: Integer;
begin
for i := 0 to Screen.Forms.Count - 1 do
if Screen.Forms[i].Visible and Screen.Forms[i].Active then
Exit(Screen.Forms[i]);
Result := nil;
end;
Подход с использованием событий уничтожения формы
Для более сложных сценариев можно использовать обработчик события OnDestroy формы, который будет сбрасывать глобальную переменную, указывающую на открытую форму.
procedure TFormPrincipal.FormDestroyEvent(Sender: TObject);
begin
Formbanco := nil;
end;
И в методе открытия формы проверять, не открыта ли она уже, и если да, то закрывать её.
procedure TFormPrincipal.AbreFormBancoExecute(Sender: TObject);
begin
if not Assigned(Formbanco) then
begin
CreateFormbanco;
end
else
begin
Formbanco.Destroy;
CreateFormbanco;
end;
end;
Заключение
Выбор метода управления формами зависит от конкретных требований приложения и предпочтений разработчика. Важно помнить о том, что при работе с глобальными переменными и коллекциями необходимо соблюдать осторожность, чтобы избежать утечек памяти и других проблем, связанных с управлением ресурсами.
Использование Object Pascal и возможностей Delphi позволяет гибко решать задачи управления множеством форм, делая приложение удобным и эффективным как для разработчика, так и для конечного пользователя.
Статья описывает различные методы управления множеством форм в среде разработки Delphi, включая их эффективное отслеживание и корректное закрытие.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.