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

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

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

nic1982
новенький
Сообщения: 48
Зарегистрирован: 17.05.2011 16:34:05

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

Сообщение nic1982 »

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

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

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

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

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

test4.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

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 20:09:43, всего редактировалось 1 раз.
mig-31
постоялец
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Сообщение mig-31 »

Я бы добавил 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;
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Вообщем по идее как-то так....

Код: Выделить всё

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:
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

По-быстрому что-то ничего умнее этого не получилось.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
DedFrend
постоялец
Сообщения: 157
Зарегистрирован: 25.11.2018 11:21:50

Сообщение DedFrend »

То что лежит в 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;
Seenkao
энтузиаст
Сообщения: 565
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

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

Вопрос! А как вы вообще тогда хотите выходить из этого цикла событий?
P.S. программу не смотрел.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Модальные окна - зло
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

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

...в неграмотно спроектированных программах
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

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

В гранит!
nic1982
новенький
Сообщения: 48
Зарегистрирован: 17.05.2011 16:34:05

Сообщение nic1982 »

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


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

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

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

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

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

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

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

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

Это интересная идея. Над этим мне нужно подумать/попробовать.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

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

Это такая программа, в которой модальные окна не зло, а полезный инструмент.
Ваш Кэп.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

nic1982, мне кажется ваше техзадание я выполнил. :)
В сети есть куча материалов по модальным формам в Delphi.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Вставлю свой подход:

Код: Выделить всё

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
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

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

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


  1. Модальное окно содержит свой главный цикл обработки событий, что противоречит самой концепции главного цикла.
  2. Модальное окно может "потеряться" под другими окнами, причем на уровне операционной системы.
  3. Модальное окно может породить другое модальное окно.
  4. Модальное окно может выскочить одновременно в разных приложениях.
Ответить