Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2022, 17:57   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Show vs ShowModal

Ну какие я нашел сам отличия
При ShowModal ставится на паузу теперешняя процедура и можно совершить действия после закрытия окна, при ShowModal нельзя делать действия с прошлой формой, с ShowModal можно вернуть какой-то результат.

Какие-то еще отличия есть?


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

И обычно делается все так:
Код:
Form2.Show;
Form1.Visible:=false;
И реакция на закрытие Form2:
Код:
Form1.Visible:=true;
Kronos913 вне форума Ответить с цитированием
Старый 11.09.2022, 18:00   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Из ShowModal активная форма возвращает результат ModalResult
macomics вне форума Ответить с цитированием
Старый 11.09.2022, 18:16   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Просто для выше описанной цели лучше Show, или ShowModal?
Kronos913 вне форума Ответить с цитированием
Старый 11.09.2022, 19:44   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

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

Последний раз редактировалось macomics; 11.09.2022 в 19:59.
macomics вне форума Ответить с цитированием
Старый 12.09.2022, 00:51   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

ShowModal следует использовать когда дальнейшая работа пользователя с программой не возможна до тех пор, пока пользователь не ответит на некий вопрос или не представит некие данные для продолжения работы. Во всех прочих случаях использование этого метода ничем не оправдано.
northener вне форума Ответить с цитированием
Старый 12.09.2022, 10:56   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

У ТС более хитрая система (собственно, у него в каждой теме обсуждаются лишь костыли, которые он пихает везде где только можно). У него же после открытия новой формы, текущая форма скрывается. То есть пользователь на нее вернуться не может.

В такой постановке вопроса лучше использовать Show.
Arigato вне форума Ответить с цитированием
Старый 12.09.2022, 11:44   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Давайте лучше обсудим вот что. Лучше использовать
Код:
Form1.Visible := False
или
Код:
Form1.Hide;
macomics вне форума Ответить с цитированием
Старый 12.09.2022, 12:21   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Ну это надо смотреть на код в ассемблере, сколько там операций выполняется, и какие регистры задействованы. Есть подозрения, что первый вариант лучше, так как в случае Hide будет вызов подпрограммы, где уже выполняется присвоение Visible := False, то есть лишнее действие, на слабых компах будет очень серьезно тормозить, да и памяти на десяток байт больше израсходуется, может не хватить места в оперативке или на диске.

Но это неточно. Без ассемблера тут не разобраться
Arigato вне форума Ответить с цитированием
Старый 12.09.2022, 12:24   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А вот у меня в Lazarus - Hide помечен как inline
Hide еще и печатать - быстрее.

Последний раз редактировалось macomics; 12.09.2022 в 12:37.
macomics вне форума Ответить с цитированием
Старый 12.09.2022, 12:46   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Hide;
Код:
C:\Users\User-PC\AppData\Local\Temp\unit1.pas:34  Hide;
000000010002F371 488B4DF0                 mov rcx,[rbp-$10]
000000010002F375 E85642FFFF               call -$0000BDAA
Visible := False;
Код:
C:\Users\User-PC\AppData\Local\Temp\unit1.pas:34  Visible := False;
000000010002F371 488B45F0                 mov rax,[rbp-$10]
000000010002F375 30D2                     xor dl,dl
000000010002F377 488B4DF0                 mov rcx,[rbp-$10]
000000010002F37B 4C8B01                   mov r8,[rcx]
000000010002F37E 4889C1                   mov rcx,rax
000000010002F381 41FF90D8010000           call dword ptr [r8+$000001D8]
Это в Лазарусе. Неожиданно...

Можно вот такую альтернативу предложить:
Код:
  Left := -Width * 2;
  Enabled := False;

Последний раз редактировалось Arigato; 12.09.2022 в 12:51.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Showmodal Mr_skiner Общие вопросы Delphi 4 05.04.2011 17:40
Формы ShowModal SoftKoc Общие вопросы Delphi 6 18.09.2010 16:37
ShowModal, close!!!! Ital1cs Помощь студентам 3 02.04.2010 19:50
вызов из dll не ShowModal. Roof Общие вопросы Delphi 7 25.07.2008 15:22
AlphaBlend + ShowModal Cardagant Общие вопросы Delphi 2 11.06.2008 15:42