Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как получить имя формы, которая была активна до открытия текущей формы, используя Delphi или Pascal?

Delphi , Программа и Интерфейс , Формы

Как получить имя предыдущей формы в Delphi/Pascal

В данной статье мы рассмотрим, как получить имя формы, которая была активна непосредственно перед открытием текущей формы в 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Формы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-23 05:47:01/0.0035190582275391/0