В данной статье мы рассмотрим, как получить имя формы, которая была активна непосредственно перед открытием текущей формы в Delphi/Pascal. Эта задача возникает, когда у вас есть цепочка форм, открывающихся друг за другом, и вам нужно знать, какая форма была активна до открытия текущей. В контексте обсуждения на форуме, Henry Olive хотел узнать имя формы, находящейся на один уровень выше текущей (например, Form2, если текущая форма - Form3).
Существующие подходы и их объяснение
Uwe Raabe предложил два основных подхода, основанных на работе с компонентом Screen и списками Screen.CustomForms и Screen.SaveFocusedList. Давайте разберем их подробнее:
Screen.CustomForms: Этот список содержит все формы, которые были созданы и отображены на экране. Каждый раз, когда форма получает фокус (становится активной), она добавляется в начало этого списка. Таким образом, Screen.CustomForms[0] всегда будет ссылаться на текущую активную форму. Однако, этот список не сохраняет историю, поэтому он не подходит для получения информации о форме, которая была активна до текущей.
Screen.SaveFocusedList: Этот список сохраняет историю форм, которые были в фокусе. При использовании ShowModal, предыдущая форма добавляется в начало Screen.SaveFocusedList, а затем удаляется из Screen.CustomForms. Таким образом, Screen.SaveFocusedList[0] будет ссылаться на форму, которая была активна до открытия модального окна.
Пример кода с использованием Screen.SaveFocusedList
uses
Vcl.Forms;
procedure TForm3.Button1Click(Sender: TObject);
var
PreviousForm: TForm;
begin
if Assigned(Screen.SaveFocusedList[0]) then
begin
PreviousForm := Screen.SaveFocusedList[0] as TForm;
if Assigned(PreviousForm) then
begin
ShowMessage('Имя предыдущей формы: ' + PreviousForm.Name);
end else
begin
ShowMessage('Предыдущая форма не является формой.');
end;
end else
begin
ShowMessage('Нет предыдущей формы.');
end;
end;
Альтернативное решение: Использование свойства Owner
Die Holländer предложил альтернативный подход, основанный на использовании свойства Owner формы. Этот подход является более надежным и не зависит от внутренних механизмов Screen. Суть заключается в том, чтобы при создании формы указывать ее родительскую форму в качестве Owner. Затем, в любой момент времени, можно получить имя родительской формы, обратившись к свойству Owner.Name.
Пример кода с использованием свойства Owner
uses
Vcl.Forms;
procedure TForm1.Button1Click(Sender: TObject);
var
Form2: TForm2;
begin
Form2 := TForm2.Create(Self); // Self - это TForm1, поэтому Form2.Owner = TForm1
Form2.Show;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
Form3: TForm3;
begin
Form3 := TForm3.Create(Self); // Self - это TForm2, поэтому Form3.Owner = TForm2
Form3.ShowModal;
end;
procedure TForm3.Button1Click(Sender: TObject);
var
FormName: string;
begin
if Assigned(Owner) and (Owner is TForm) then
begin
FormName := TForm(Owner).Name;
if Assigned(TForm(Owner).Owner) and (TForm(Owner).Owner is TForm) then
begin
FormName := TForm(Owner).Owner.Name;
end else
begin
FormName := 'No Owner';
end;
end else
FormName := 'No Owner';
ShowMessage('Имя предыдущей формы: ' + FormName);
end;
Сравнение подходов и рекомендации
Screen.SaveFocusedList: Этот подход может быть удобен, если вы не хотите менять способ создания форм. Однако, он может быть менее надежным, так как зависит от внутренних механизмов VCL. Также, важно помнить, что список Screen.SaveFocusedList может содержать не только формы, поэтому необходимо проверять тип объекта.
Owner: Этот подход является более надежным и понятным. Он не зависит от внутренних механизмов VCL и позволяет явно определить родительскую форму. Этот подход рекомендуется, если вы можете контролировать способ создания форм.
Заключение
Получение имени предыдущей формы в Delphi/Pascal может быть полезной задачей для реализации различных сценариев, таких как отслеживание истории навигации или передача данных между формами. Использование свойства Owner является наиболее надежным и рекомендуемым способом решения этой задачи. Использование Screen.SaveFocusedList может быть удобным в некоторых случаях, но требует осторожности и проверки типов.
В данной статье рассмотрены методы получения имени предыдущей формы в Delphi/Pascal, используя компонент `Screen` и свойство `Owner`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.