Пожалуйста помогите разобраться с модальными окнами

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Пожалуйста помогите разобраться с модальными окнами

Сообщение nic1982 » 09.11.2020 14:58:18

Описание:
Представьте, что есть адресная книга (название и адрес).

Есть три формы:
1) FormMain - главная форма с кнопками добавить/редактировать/удалить и таблицей (название, адрес)
2) FormFind - форма поиска по названию и/или адресу
3) FormView - форма просмотра одной пары название-адрес

Формы FormFind и FormView модальные (вызываются ShowModal).

На форме просмотра FormView есть CheckBox,
который отвечает за открытие формы поиска FormFind при закрытии формы просмотра FormView.

Нужно добиться чтобы при закрытии формы просмотра открывалась форма поиска и так по кругу.
При этом любую из форм просмотра и поиска можно было бы закрыть в любой момент.

test4.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
nic1982
новенький
 
Сообщения: 47
Зарегистрирован: 17.05.2011 16:34:05

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение Alex2013 » 09.11.2020 19:19:37

1 "Идея с пылу жару ": Повесить таймер и проверять в нем флаги "активации диалогов ". :wink: (Мда это я "не вник"... )
2 Что мешает просто последовательно вызвать ShowModal из FormView и FormFind в FormMain по очереди ? :roll:

Код: Выделить всё
procedure TFormMain.B_OpenFormViewClick(Sender: TObject);
begin
  FormView:= TFormView.Create(nil);
    FormView.ShowModal;
   FormView.Free;

   FormFind:= TFormFind.Create(nil);
    FormFind.ShowModal;
   FormFind.free;
end;

Последний раз редактировалось Alex2013 09.11.2020 21:09:43, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 1909
Зарегистрирован: 03.04.2013 11:59:44

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение mig-31 » 09.11.2020 20:29:33

Я бы добавил try finally
Код: Выделить всё
procedure TFormMain.B_OpenFormViewClick(Sender: TObject);
begin
  FormView:= TFormView.Create(nil);
  try
    FormView.ShowModal;
  finally 
   FormView.Free;
end;

   FormFind:= TFormFind.Create(nil);
   try
    FormFind.ShowModal;
   finally
    FormFind.free;
   end;
end;
mig-31
постоялец
 
Сообщения: 223
Зарегистрирован: 14.07.2011 13:46:48

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение Alex2013 » 09.11.2020 20:46:12

Вообщем по идее как-то так....
Код: Выделить всё
unit UFormMain;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
  UFormView, UFormFind;

type

{ TFormMain }

  TFormMain = class(TForm)
    B_OpenFormView: TButton;
    B_OpenFormFind: TButton;
    procedure B_OpenFormViewClick(Sender: TObject);
    procedure B_OpenFormFindClick(Sender: TObject);
  private

  public

  end;

var
  FormMain : TFormMain;
  FormView : TFormView;
  FormFind : TFormFind;

implementation

{$R *.lfm}

{ TFormMain }

procedure TFormMain.B_OpenFormViewClick(Sender: TObject);
begin
Application.CreateForm(TFormView, FormView);
  FormView.ShowModal;
   FormView.Free;

//ИМХО  Нормально без этого куска  ! Но вдруг .... 
{ Application.CreateForm(TFormFind, FormFind);
    FormFind.ShowModal;
   FormFind.free;
}

end;

procedure TFormMain.B_OpenFormFindClick(Sender: TObject);
begin
Application.CreateForm(TFormFind, FormFind);
    FormFind.ShowModal;
   FormFind.free;
end;

end.

....
Код: Выделить всё
unit UFormView;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TFormView }

  TFormView = class(TForm)
    Button1: TButton;//  Кнопка "Закрыть окно " 
    B_OpenFormFind: TButton;
    procedure B_OpenFormFindClick(Sender: TObject);
  private

  public

  end;

implementation

{$R *.lfm}

uses UFormMain, UFormFind;

{ TFormView }

procedure TFormView.B_OpenFormFindClick(Sender: TObject);
var FormFind0:TForm;
begin
Application.CreateForm(TFormFind, FormFind0);
   FormFind0.ShowModal;
  FormFind0.Free;
end;

end.


А в FormFind ничего кроме ""пустой кнопки "
Код: Выделить всё
Button1: TButton;//  Кнопка "Закрыть окно "
не нужно.
(Разумеется нужно ей выставить правильный ModalResult )
Зы
Все это "отчасти верно" ТОЛЬКО в рамках предложенного макета реальное приложение разумеется будет сложнее, но как "стартовая идея" думаю пригодится и эта кривуля :idea:
Alex2013
долгожитель
 
Сообщения: 1909
Зарегистрирован: 03.04.2013 11:59:44

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение iskander » 09.11.2020 21:36:47

По-быстрому что-то ничего умнее этого не получилось.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
iskander
постоялец
 
Сообщения: 382
Зарегистрирован: 08.01.2012 18:43:34

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение DedFrend » 09.11.2020 23:25:37

То что лежит в test4 не соответствует постановке задачи. Там CheckBox вообще нет.
А по постановке предложил бы так
Код: Выделить всё
  next := true;
  while next do
  begin
     FormFind := TFormFind.Create(self);
     try
        FormFind.ShowModal;
     finally
        FreeAndNil(FormFind);
     end;
     FormView := TFormView.Create(self);
     try
        FormView.ShowModal;
        next := FormView.CheckBox.Checked;
     finally
       FreeAndNil(FormView);
     end;
  end;
DedFrend
новенький
 
Сообщения: 88
Зарегистрирован: 25.11.2018 12:21:50

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение Seenkao » 10.11.2020 00:50:16

nic1982 писал(а):Нужно добиться чтобы при закрытии формы просмотра открывалась форма поиска и так по кругу.
При этом любую из форм просмотра и поиска можно было бы закрыть в любой момент.
конкретнее. Как я понял, что при закрытии формы открывается другая и при закрытии второй - открывалась первая.

Вопрос! А как вы вообще тогда хотите выходить из этого цикла событий?
P.S. программу не смотрел.
Seenkao
постоялец
 
Сообщения: 162
Зарегистрирован: 01.04.2020 03:37:12

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение zub » 10.11.2020 01:28:08

Модальные окна - зло
zub
долгожитель
 
Сообщения: 2652
Зарегистрирован: 14.11.2005 23:51:26

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение Снег Север » 10.11.2020 09:22:42

zub писал(а):Модальные окна - зло

...в неграмотно спроектированных программах
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2674
Зарегистрирован: 27.11.2007 16:14:47

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение alexs » 10.11.2020 09:45:35

В представленном условии вообще не нужно 2 формы. Логично объединить функционал поиска и просмотра данных в одном месте.

Снег Север писал(а):...в неграмотно спроектированных программах

В гранит!
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3957
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение nic1982 » 10.11.2020 16:30:32

Всем спасибо, вот то что получилось у меня.
test_of_two_modal_forms.zip


Посмотрите пожалуйста если есть вопросы готов ответить,
а если есть идеи по лутше готов посмотреть.

Добавлено спустя 9 минут 25 секунд:
zub писал(а):Модальные окна - зло

Это вызов, который дал мне понять что о том что происходит под капотом я не чего не знаю.

Снег Север писал(а):в неграмотно спроектированных программах

Покажите правильно спроектированные программы.

alexs писал(а):В представленном условии вообще не нужно 2 формы.

Это требование работодателя.

alexs писал(а):Логично объединить функционал поиска и просмотра данных в одном месте.

Это интересная идея. Над этим мне нужно подумать/попробовать.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
nic1982
новенький
 
Сообщения: 47
Зарегистрирован: 17.05.2011 16:34:05

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение Снег Север » 10.11.2020 18:40:58

nic1982 писал(а):Покажите правильно спроектированные программы.

Это такая программа, в которой модальные окна не зло, а полезный инструмент.
Ваш Кэп.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2674
Зарегистрирован: 27.11.2007 16:14:47

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение iskander » 10.11.2020 18:50:09

nic1982, мне кажется ваше техзадание я выполнил. :)
В сети есть куча материалов по модальным формам в Delphi.
iskander
постоялец
 
Сообщения: 382
Зарегистрирован: 08.01.2012 18:43:34

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение olegy123 » 12.11.2020 22:44:44

Вставлю свой подход:
Код: Выделить всё
TMyModalForm = class (TForm)
public
  class function Open():Boolean;
end;

function TMyModalForm.Open():Boolean;
begin
   Result:=false;
   with Create(nil) do
   try
     ShowModal;
     if ModalResult=mrOk then 
          Result:=true;
   finally
     Free;
   end;
end;


И где то в программе
   if TMyModalForm.Open Then
olegy123
долгожитель
 
Сообщения: 1597
Зарегистрирован: 25.02.2016 12:10:20

Re: Пожалуйста помогите разобраться с модальными окнами

Сообщение serbod » 13.11.2020 12:49:22

Снег Север писал(а):
zub писал(а):Модальные окна - зло

...в неграмотно спроектированных программах


  1. Модальное окно содержит свой главный цикл обработки событий, что противоречит самой концепции главного цикла.
  2. Модальное окно может "потеряться" под другими окнами, причем на уровне операционной системы.
  3. Модальное окно может породить другое модальное окно.
  4. Модальное окно может выскочить одновременно в разных приложениях.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 8

Рейтинг@Mail.ru