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

Восстановление активной формы после закрытия в FireMonkey: устранение проблемы переключения форм

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

Разработка приложений с использованием FireMonkey в среде Delphi может сопровождаться различными проблемами, одной из которых является неправильное восстановление активной формы после её закрытия. В данной статье мы рассмотрим, как решается проблема с переключением форм, когда приложение не запоминает последнюю активную форму и активирует не ту, которая ожидается пользователем.

Описание проблемы

Пользователи столкнулись с ситуацией, когда при последовательном открытии форм в FireMonkey, приложение не сохраняет информацию о последней активной форме. После закрытия формы активируется не та форма, которая была открыта до неё, а основная форма (MainForm). Это приводит к неудобствам в использовании и потере логической последовательности переключения форм.

Пример воспроизведения проблемы

Создаём три формы: основную (MainForm) и две дочерние формы (ChildForm1 и ChildForm2), где вторая форма является родительской для третьей. Открываем первую дочернюю форму из основной формы. В первой дочерней форме есть кнопка, которая открывает вторую дочернюю форму. При закрытии второй формы активируется основная форма, а не первая дочерняя, как ожидается. При повторном закрытии второй формы активируется первая, но при следующих действиях порядок активации форм продолжает изменяться некорректно.

Код для открытия форм

var
  tmpForm2: TForm2;
begin
  tmpForm2 := TForm2.Create(Self);
  tmpForm2.Show;
end;

var
  form3: TForm3;
begin
  form3 := TForm3.Create(nil);
  form3.Show;
end;

Подтверждённый ответ

В версии Delphi XE7 и XE7 Update 1 была обнаружена ошибка в функции TScreen.NextActiveForm. В версии XE8 эта функция работает корректно, и после закрытия формы активируется предыдущая.

Для решения проблемы в версии XE7 можно скопировать функцию NextActiveForm из XE8 и использовать её перед закрытием формы. Вот пример кода, который можно вставить в вашу форму:

unit ufmForm3;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls;

type
  TfmForm3 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    function NextActiveForm(const OldActiveForm: TCommonCustomForm): TCommonCustomForm;
  public
  end;

var
  fmForm3: TfmForm3;

implementation

{$R *.fmx}

procedure TfmForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  NextActiveForm(Self);
end;

function TfmForm3.NextActiveForm(const OldActiveForm: TCommonCustomForm): TCommonCustomForm;
var
  I, CurrIndex: integer;
begin
  Result := nil;
  CurrIndex := Screen.IndexFormOfObject(OldActiveForm);
  if CurrIndex >= 0 then
  begin
    I := CurrIndex - 1;
    while (I >= 0) and (Screen.Forms[I].Released or not Screen.Forms[I].Visible) do
      Dec(I);
    if I < 0 then
    begin
      I := Screen.FormCount - 1;
      while (I >= 0) and (I <> CurrIndex) and (Screen.Forms[I].Released or not Screen.Forms[I].Visible) do
        Dec(I);
    end;
    if (I >= 0) and (I <> CurrIndex) then
    begin
      Result := Screen.Forms[I];
      Screen.ActiveForm := Result;
    end;
  end;
end;

end.

Альтернативное решение

В случае использования Delphi FMX Berlin, если у вас есть SDI-приложение с скрытой "реальной" главной формой и одной или несколькими рабочими формами, и при этом при закрытии модального диалога фокус переключается на другую форму, решение может быть следующим:

  1. Создайте диалог с владельцем Self:
MyDlg := TMyDlg.Create(Self);
MyDlg.ShowModal;
  1. Используйте следующий код в обработчике закрытия модального диалога:
procedure TMyDlg.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
  Screen.ActiveForm:=TMySDIAppForm(Self.Owner);
end;

Эти решения помогут устранить проблему с неправильным восстановлением активной формы после её закрытия в приложениях, созданных с использованием FireMonkey.

Создано по материалам из источника по ссылке.

Проблема заключается в том, что в приложении на FireMonkey после закрытия формы не активируется предыдущая форма, а восстанавливается основная форма, что нарушает логику переключения форм.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:19:27/0.0033318996429443/0