Перейти к содержанию
Fire Monkey от А до Я
  • 0

3 формы в приложении


haword

Вопрос

столкнулся с такой проблемой. есть главная форма. она вызывает дочернюю форму. из дочерней формы вызывается третья форма. так как в андроиде нельзя использовать ShowModal делаю Show с обработкой вернувшегося результата. так вот, когда закрываешь 3 форму активной становится первая, а вторая дочерняя прячется под ней. что только не делал и BringToFront и Activate и даже Форм2.Show в обработке вернувшегося результата, все равно первый раз практически всегда показывается основная форма а потом на второй раз при вызове 3 формы покажется 2 а не 1. 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

А вы уверены, что вам нужны именно формы? В некоторых ситуациях предпочтительней работать, например, с TRectangle. Их и скрывать/показывать удобно, и пошустрее работает, на мой взгляд.

Ссылка на комментарий
  • 0

если программа состоит из пару окон то да всякими панельками можно обойтись. но у меня в программе их не менее 15 этих форм и держать 15 различных панелек в скрытых или активных видах очень затрудняет разработку. и когда все это скрывается и прячется на одной форме, начальная загрузка формы идет очень медленно. у меня на моем телефоне после пропадания картинки заставки, черный экран висит 5 секунд. поэтому и решил все раскидать по формам и сделать их динамически создаваемыми. что бы и памяти не жрать и грузилось быстрее. грузится стало все за секунду. под андроидом все нормально, формы закрываются в порядке их показа. под виндою в первый раз после закрытия 3 формы активируется основная форма. после того как мышкой выберешь вторую и через нее откроешь опять третью, то после ее закрытия показывается как и положено вторая. глюк короче какой то не приятный. 

Изменено пользователем haword
Ссылка на комментарий
  • 0

так в xe8 глюк исправили. перенс решение в xe7 работает собака :)

 

при закрытии формы код в файле FMX.Forms должен быть такой

procedure TCommonCustomForm.Close;
var
  CloseAction: TCloseAction;
  NeedActiveChange: boolean;
  procedure CloseAllViews;
  var
    View: IMenuView;
    LParent: TFmxObject;
    procedure FindView(Obj: TFmxObject);
    var
      I: Integer;
    begin
      I := 0;
      while (I < Obj.ChildrenCount) and not Obj.Children[I].GetInterface(IMenuView, View) do
        Inc(I);
      I := 0;
      while (I < Obj.ChildrenCount) and (View = nil) do
      begin
        FindView(Obj.Children[I]);
        Inc(I);
      end;
    end;
  begin
    View := nil;
    LParent := Self;
    if LParent.Parent <> nil then
      LParent := LParent.Parent;
    FindView(LParent);
    if (View <> nil) and View.Loop then
      repeat
        View.Loop := False;
        View := View.ChildView;
      until View = nil;
  end;

  procedure ActivateLastActiveForm(const OldActiveForm: TCommonCustomForm);
  var
    I: Integer;
  begin
    if OldActiveForm <> nil then
      for I := Screen.FormCount - 1 downto 0 do
        if (Screen.Forms[I].Visible) and not Screen.Forms[I].Released and (Screen.Forms[I] <> OldActiveForm) then
        begin
          Screen.ActiveForm := Screen.Forms[I];
          Exit;
        end;
  end;

begin
  if not (TFmxFormState.Closing in FFormState) then
  begin
    FFormState := FFormState + [TFmxFormState.Closing];
    try
      NeedActiveChange := not (TFmxFormState.Modal in FFormState) and Active;
      if TFmxFormState.Modal in FFormState then
        ModalResult := mrCancel
      else if CloseQuery then
      begin
        CloseAction := TCloseAction.caHide;
        DoClose(CloseAction);
        if CloseAction <> TCloseAction.caNone then
        begin
          if NeedActiveChange then
//            if (Screen.FormCount = 1) and (Screen.Forms[0] = Self) then
//              Screen.ActiveForm := nil
//            else
//              Screen.NextActiveForm(Self);
            ActivateLastActiveForm(Self);

          if Application.MainForm = Self then
            Application.Terminate
          else
          begin
            CloseAllViews;
            case CloseAction of
              TCloseAction.caHide:
                Hide;
              TCloseAction.caFree:
                Release;
              TCloseAction.caMinimize:
                WindowState := TWindowState.wsMinimized;
            end;
          end;
        end;
      end;
    finally
      FFormState := FFormState - [TFmxFormState.Closing];
    end;
  end;
end;

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...