Пожалуйста помогите разобраться с модальными окнами
Модератор: Модераторы
Пожалуйста помогите разобраться с модальными окнами
Описание:
Представьте, что есть адресная книга (название и адрес).
Есть три формы:
1) FormMain - главная форма с кнопками добавить/редактировать/удалить и таблицей (название, адрес)
2) FormFind - форма поиска по названию и/или адресу
3) FormView - форма просмотра одной пары название-адрес
Формы FormFind и FormView модальные (вызываются ShowModal).
На форме просмотра FormView есть CheckBox,
который отвечает за открытие формы поиска FormFind при закрытии формы просмотра FormView.
Нужно добиться чтобы при закрытии формы просмотра открывалась форма поиска и так по кругу.
При этом любую из форм просмотра и поиска можно было бы закрыть в любой момент.
Представьте, что есть адресная книга (название и адрес).
Есть три формы:
1) FormMain - главная форма с кнопками добавить/редактировать/удалить и таблицей (название, адрес)
2) FormFind - форма поиска по названию и/или адресу
3) FormView - форма просмотра одной пары название-адрес
Формы FormFind и FormView модальные (вызываются ShowModal).
На форме просмотра FormView есть CheckBox,
который отвечает за открытие формы поиска FormFind при закрытии формы просмотра FormView.
Нужно добиться чтобы при закрытии формы просмотра открывалась форма поиска и так по кругу.
При этом любую из форм просмотра и поиска можно было бы закрыть в любой момент.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
1 "Идея с пылу жару ": Повесить таймер и проверять в нем флаги "активации диалогов ".
(Мда это я "не вник"... )
2 Что мешает просто последовательно вызвать ShowModal из FormView и FormFind в FormMain по очереди ?
2 Что мешает просто последовательно вызвать ShowModal из FormView и FormFind в FormMain по очереди ?
Код: Выделить всё
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 раз.
Я бы добавил 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;
Вообщем по идее как-то так....
....
А в FormFind ничего кроме ""пустой кнопки " не нужно.
(Разумеется нужно ей выставить правильный ModalResult )
Зы
Все это "отчасти верно" ТОЛЬКО в рамках предложенного макета реальное приложение разумеется будет сложнее, но как "стартовая идея" думаю пригодится и эта кривуля
Код: Выделить всё
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 )
Зы
Все это "отчасти верно" ТОЛЬКО в рамках предложенного макета реальное приложение разумеется будет сложнее, но как "стартовая идея" думаю пригодится и эта кривуля
По-быстрому что-то ничего умнее этого не получилось.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
То что лежит в 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;
конкретнее. Как я понял, что при закрытии формы открывается другая и при закрытии второй - открывалась первая.nic1982 писал(а):Нужно добиться чтобы при закрытии формы просмотра открывалась форма поиска и так по кругу.
При этом любую из форм просмотра и поиска можно было бы закрыть в любой момент.
Вопрос! А как вы вообще тогда хотите выходить из этого цикла событий?
P.S. программу не смотрел.
Модальные окна - зло
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
zub писал(а):Модальные окна - зло
...в неграмотно спроектированных программах
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
В представленном условии вообще не нужно 2 формы. Логично объединить функционал поиска и просмотра данных в одном месте.
В гранит!
Снег Север писал(а):...в неграмотно спроектированных программах
В гранит!
Всем спасибо, вот то что получилось у меня.
Посмотрите пожалуйста если есть вопросы готов ответить,
а если есть идеи по лутше готов посмотреть.
Добавлено спустя 9 минут 25 секунд:
Это вызов, который дал мне понять что о том что происходит под капотом я не чего не знаю.
Покажите правильно спроектированные программы.
Это требование работодателя.
Это интересная идея. Над этим мне нужно подумать/попробовать.
Посмотрите пожалуйста если есть вопросы готов ответить,
а если есть идеи по лутше готов посмотреть.
Добавлено спустя 9 минут 25 секунд:
zub писал(а):Модальные окна - зло
Это вызов, который дал мне понять что о том что происходит под капотом я не чего не знаю.
Снег Север писал(а):в неграмотно спроектированных программах
Покажите правильно спроектированные программы.
alexs писал(а):В представленном условии вообще не нужно 2 формы.
Это требование работодателя.
alexs писал(а):Логично объединить функционал поиска и просмотра данных в одном месте.
Это интересная идея. Над этим мне нужно подумать/попробовать.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
nic1982 писал(а):Покажите правильно спроектированные программы.
Это такая программа, в которой модальные окна не зло, а полезный инструмент.
Ваш Кэп.
nic1982, мне кажется ваше техзадание я выполнил.
В сети есть куча материалов по модальным формам в Delphi.
В сети есть куча материалов по модальным формам в Delphi.
Вставлю свой подход:
Код: Выделить всё
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
- Откуда: Минск
- Контактная информация:
Снег Север писал(а):zub писал(а):Модальные окна - зло
...в неграмотно спроектированных программах
- Модальное окно содержит свой главный цикл обработки событий, что противоречит самой концепции главного цикла.
- Модальное окно может "потеряться" под другими окнами, причем на уровне операционной системы.
- Модальное окно может породить другое модальное окно.
- Модальное окно может выскочить одновременно в разных приложениях.
