Вторая форма "по типу" модал, но не модал :о)

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

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

Вторая форма "по типу" модал, но не модал :о)

Сообщение sunjob » 25.01.2022 13:24:42

добре день!

что нужно:
- две формы, "основная" и "настройки"
- обе формы "рабочие" (auto-create)
- "основная" использует "настройки" для работы (в режиме "онлайн")
- при показе формы "настройки" нужно поведение "как модальное", но без создания/уничтожения формы настроек
- пока идет "настройка" не нужно трогать "основную" форму, точнее ее "как-бы" незаметно подменяет форма настроек (для пользователя это "как-бы" одна и та-же форма, работа не должна вызывать когнитивного диссонанса)
- сделали настройки, скрываем форму настроек, показываем основную форму

по типу сначало подбираем ботинки, потом одеваем их, и только потом пристегиваем лыжи...
можно опустить процесс подбора, но ботинки как бы должны быть в наличие ... как-то так, не нужно удалять их, после того, как пристегнули лыжи :о)

последовательность работы примерно следующая:
1. запуск приложения, показ основной формы
2. теперь можно работать, но можно и под-дать...(простите, под-настроиться, но не обязательно)
3. работаем или настраиваемся
4. скрыли "основную" форму
5. показали форму "настроек"
6. что-то "подкрутили"
7. скрыли форму "настроек"
8. показали основную "форму"
9. работаем

как в той итории: ... достали сумочку, открыли сумочку, достали кошелку, закрыли сумочку... :о)

выкрутился примерно так (условно-сокращенно):

Код: Выделить всё
procedure TForm1.XXX_Click(Sender: TObject);
begin
...
Form2.Show;
Form2.BringToFront;
self.Hide;
...
procedure TForm2.FormHide(Sender: TObject);
begin
...
Form1.Show;
Form1.BringToFront;
...
end;         


особенность "скрытия" формы настроек:
- можно скрывать "програмно" (основная логика поведения)
- можно скрывать "механически" кнопкой "подчеркивание" на тулбаре окна, тогда "как-бы приложение все" скрывается, т.е. опять нормальное поведение, не выходит за рамки логики
- можно скрывать "механически" кнопкой "крестик" на тулбаре окна, тогда форма настроек "закрывается" (*) и появляется основная форма (основная логика поведения)
(*) - в инете пишут что это "нормальное поведение" 2го окна, т.е. оно не закрывается как 1-е основное окно с закрытием приложения, а просто скрывается, но при этом не удаляется и вызывается обработчик формы OnClose(), в отличие от "обычного сокрытия", во всем остальном это "нормальное" поведение сокрытия/показа неосновной формы (конец цитатов :о)

add условие: главной формы не должно быть видно, пока работаем с формой настройки, печатаем, двигаем, ресайзим её или чего еще :о)

ВОПРОСЫ
1. какие возможны подводные камни при таком подходе?
2. по поводу "нормальности" поведения сокрытия 2го неосновного окна, это действительно так? (в смысле "выкусы" из инета верны?!)
3. т.е. это нормальное поведение "всего комбайна" без подводных камней, утечки памяти итд? или как?

спасибо, всех с новым годом!
Последний раз редактировалось sunjob 25.01.2022 15:28:17, всего редактировалось 4 раз(а).
Аватара пользователя
sunjob
постоялец
 
Сообщения: 174
Зарегистрирован: 12.01.2011 15:19:54

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение Снег Север » 25.01.2022 13:48:46

Вызывать не Form2.Show, а Form2.ShowModal
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3050
Зарегистрирован: 27.11.2007 16:14:47

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение sunjob » 25.01.2022 14:23:33

первым делом именно так и пробовал :mrgreen:
первый раз вызывается и закрывается 2я форма нормально, следующий раз получаем ошибку (с набегу не раскурил)
к тому-же, пока 2я форма активна - 1я форма не сворачивается и болтается на экране, если переместить 2ю форму... (это как условие, точнее, 1й формы не должно быть видно, пока работаем со 2й формой, печатаем, двигаем, ресайзим итд)
Изображение

п.с. по исходным вопросам каки ни-будь комменты?
Последний раз редактировалось sunjob 25.01.2022 14:40:06, всего редактировалось 3 раз(а).
Аватара пользователя
sunjob
постоялец
 
Сообщения: 174
Зарегистрирован: 12.01.2011 15:19:54

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение zub » 25.01.2022 14:25:18

Просто она закрылась наглухо, ее надо либо пересоздать, либо не уничтожать при закрытии
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение sunjob » 25.01.2022 14:27:59

zub писал(а):ее надо либо

нужно поведение "как модальное", но без создания/уничтожения формы настроек


zub писал(а): либо не уничтожать при закрытии

это как это, поподробнее?!

p.s. не жмать "случайно" на кнопку "крестик"? или принудительно скрыть кнопки на тулбаре?! многовато танцев вокруг одной формы для использования модального доступа :mrgreen:

ну и не стыкуется с
add условие
Последний раз редактировалось sunjob 25.01.2022 14:36:35, всего редактировалось 1 раз.
Аватара пользователя
sunjob
постоялец
 
Сообщения: 174
Зарегистрирован: 12.01.2011 15:19:54

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение zub » 25.01.2022 14:36:27

ответ снимается, отвечал неглядя на картинку
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение sunjob » 25.01.2022 14:37:01

спасибо

зы. по исходным вопросам есть комменты?
Аватара пользователя
sunjob
постоялец
 
Сообщения: 174
Зарегистрирован: 12.01.2011 15:19:54

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение zub » 25.01.2022 14:41:42

Есть такое понятие - минимальный воспроизводимый пример ошибки.
Старики говорят можно привести несколько строк кода и получить ответ, чем строчить простыни текста с картинками
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение sunjob » 25.01.2022 14:45:34

другие старики говорят
- это вы к чему?! :mrgreen: :mrgreen: :mrgreen:

минимальный воспроизводимый пример ошибки
ткните где я про ошибки писал или речь вЁл?! :P
если вы про "картинку", то это ответ на предложение Снег Север (тот вариант, кот. отклонен изначально и не рассматривается в топике)

есть топик, есть тема, есть вопросы. если будут предложения, то обязательно это обсудим. 8)
Аватара пользователя
sunjob
постоялец
 
Сообщения: 174
Зарегистрирован: 12.01.2011 15:19:54

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение svk12 » 25.01.2022 17:54:21

Использовать 1(одну) форму с двумя панелями, развёрнутыми на всю форму(alClient). Показывать одну из них, переключая видимость по необходимости.
svk12
постоялец
 
Сообщения: 408
Зарегистрирован: 09.06.2008 18:42:47

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение Vlad04 » 25.01.2022 18:46:09

sunjob писал(а):первым делом именно так и пробовал :mrgreen:
первый раз вызывается и закрывается 2я форма нормально, следующий раз получаем ошибку (с набегу не раскурил)

Модальную форму нужно не прятать Hide, а закрывать Close. А вот первую форму перед вызовом Form2.ShowModal можно спрятать.
Аватара пользователя
Vlad04
новенький
 
Сообщения: 79
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение DedFrend » 25.01.2022 20:37:57

sunjob писал(а):это как это, поподробнее?!

Например так
Код: Выделить всё
procedure TfmMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  CloseAction := caHide;
end;


Добавлено спустя 2 минуты 30 секунд:
Пардон, в вашем случае не TfmMain, а TForm2
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение Alex2013 » 25.01.2022 22:49:01

Наиболее честная "Подмена формы" (или ее части) может делаться например так :
Удаляем котролы c одной формы через RemoveControl
(В примере я удаляю котролы co страницы PageControl и я в курсе что такой-же функционал можно получить используя ТабКонтрол "без танцев с бубном" но для иллюстрации идеи это не важно ) ...
Код: Выделить всё
For I:=0 to PageControl1.PageCount-1 do
If PageControl1.Pages[i].ControlCount>0 then begin
  PageControl1.Pages[i].RemoveControl(Image2);
  PageControl1.Pages[i].RemoveControl(Panel4);
  PageControl1.Pages[i].RemoveControl(StatusBar1);
end;


...и вставляем в другую с помощью InsertControl.
Код: Выделить всё
PageControl1.ActivePage.InsertControl(Image2);
PageControl1.ActivePage.InsertControl(Panel4);
PageControl1.ActivePage.InsertControl(StatusBar1);


Исходная форма может быть невидимой .
И разумеется нужно не забыть удалить с все лишнее с текущей .
ЗЫ
Но само собой самый простой способ "подмены формы" это сделать перекрывающие друг друга панели и просто переключать их видимость.
Единственное чем хорош способ с RemoveControl/InsertControl это тем что можно выдирать нужный функционал из готовых форм не задумываясь о переносе или копировании кода
Alex2013
долгожитель
 
Сообщения: 3117
Зарегистрирован: 03.04.2013 11:59:44

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение sunjob » 26.01.2022 04:05:23

svk12 писал(а):Использовать 1(одну) форму с двумя панелями

хорошая идея!

+

Vlad04 писал(а):Модальную форму нужно не прятать Hide, а закрывать Close

т.е. удалять?! я правильно понял? (поправьте)
->
но без создания/уничтожения формы настроек


+

Vlad04 писал(а):А вот первую форму перед вызовом Form2.ShowModal можно спрятать

именно
Код: Выделить всё
    procedure TForm1.XXX_Click(Sender: TObject);
    begin
    ...
    Form2.Show; -> тут меняли на ShowModal
    Form2.BringToFront;
    self.Hide; -> тут скрывали Form1

ну и не стыкуется с add условие

add условие: главной формы не должно быть видно, пока работаем с формой настройки, печатаем, двигаем, ресайзим её или чего еще :о)

у меня не получилось скрыть первую форму (она так и болталась), т.е.
1. главная форма нормально скрывается при обычном вызове/открытии формы настроек
2. главная форма не скрывается при модальном вызове формы настроек
(допускаю, что что-то недо или перекрутил + про "исключение" я уже говорил, дальше тоже будет скриншот, это исключение касается Модального запуска второй формы)

+

DedFrend писал(а):Например так + Пардон, в вашем случае не TfmMain, а TForm2

имеется в виду закрытие/скрытие модальной формы?! или обычной? если обычной, то она и так нормально скрывается. (пожалуйста, уточните)

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

если у вас нормально работает, то, видимо, я что-то недокрутил.

+

Alex2013 писал(а):RemoveControl/InsertControl

показался рискованно-неоправданна-тяжело-неайсным (как пример, да, хорош)

Alex2013 писал(а):перекрывающие друг друга панели и просто переключать их видимость

svk12 писал(а):Использовать 1(одну) форму с двумя панелями

пожалуй, самый подходящий

+

ИТОГО: на данный момент дополнительно к идеи топика предлогается два варианта
- запуск второй формы модально (ведет к ошибке/исключению)
- использование формы с 2мя панелями (интересный вариант!)
- и... самый главный момент ###!!! Attention !!!### Как насчет вопросов в топике?

!!! всем спасибо !!!
Аватара пользователя
sunjob
постоялец
 
Сообщения: 174
Зарегистрирован: 12.01.2011 15:19:54

Re: Вторая форма "по типу" модал, но не модал :о)

Сообщение WAYFARER » 26.01.2022 11:44:29

sunjob писал(а):- запуск второй формы модально (ведет к ошибке/исключению)


Делай скрытие и показ из основной формы.
Сперва скрываем основную форму, потом вызываем модально вторую.
Пока вторая форма открыта, первая будет ждать ModalResult.
После закрытия второй формы первая будет показана.

Код: Выделить всё
begin
   fForm1.Hide;
   fForm2.ShowModal;
   fForm1.Show;

end; 


Добавлено спустя 16 минут 38 секунд:
Кстати, это не самый лучший способ.
Для этого есть фреймы.
А еще можно использовать вкладки - их точно так же можно скрывать и показывать.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru