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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2015, 17:18   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Открытие модальной формы с продолжением выполнения кода первой формы

Подскажите пожалуйста
Есть код:
Код:
begin
...
  FRepeat := TFRepeat.Create(self);
  FRepeat.ShowModal;
  showmessage('Next');
…
end;
мне нужно, чтоб форма «FRepeat», открылась модально (чтоб пользователь находился только в «FRepeat»), но код (в первой форме) после «FRepeat.ShowModal;» (первой формы), сразу (после открытия второй формы) дошел бы до конца.

Спасибо.
P.S.
Дело в том что, «FRepeat.ShowModal;» может вызываться и с других нескольких мест, но с ОБЯЗАТЕЛЬНОЙ отработкой кода (см. выше).
Нельзя же открытую немодальную форму сделать модальной

Последний раз редактировалось KBO; 18.08.2015 в 17:28.
KBO вне форума Ответить с цитированием
Старый 18.08.2015, 17:43   #2
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от KBO Посмотреть сообщение
Дело в том что, «FRepeat.ShowModal;» может вызываться и с других нескольких мест
То есть может быть открыта более чем одна форма «FRepeat»?

Для этого нужно будет создавать новый поток, и с него уже открывать форму, т.к. после ShowModal поток ожидает, пока форма не будет закрыта. Но проще будет использовать Show, т.к. и в одном, и в другом случае нужно самому блокировать основную форму.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 18.08.2015 в 18:04.
Krasiosoft вне форума Ответить с цитированием
Старый 18.08.2015, 17:43   #3
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

А что, если сначала дать отработать необходимому участку кода (если такое можно), а потом открыть модальную форму?

Либо второй вариант - работа с несколькими потоками: http://www.delphi-manual.ru/threads.php

Подробнее о потоках не скажу - не работал с ними.

Krasiosoft опередил меня насчёт потоков.
Вадим Мошев вне форума Ответить с цитированием
Старый 18.08.2015, 18:12   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

а можно нужный код выполнять в отдельном потоке, стартовать который непосредственно перед ShowModal()?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 18.08.2015, 20:22   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Можно конечно так
Код:
FRepeat.Show;
showmessage('Next');
Frepeat.hide;
Frepeat.ShowModal;
Но почему нельзя просто поменять код местами (выполнить тот же код ДО показа формы в модальном режиме?
Цитата:
сразу (после открытия второй формы) дошел бы до конца.
P.S. показывать не модально и блокировать работу пользователя с другой формой
Код:
Repeat:=TReprat.Create(self);
repeat.Show;
Код:
procedure TRepeat.onShow(sender: TObject);
begin
  (self.owner as TForm).enabled:=false;
end;

procedure TRepeat.OnClose(sender: TObject; var action: TActionClose);
begin
  (self.owner as Tform).Enabled:=true;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.08.2015 в 20:24.
evg_m вне форума Ответить с цитированием
Старый 18.08.2015, 21:28   #6
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
а можно нужный код выполнять в отдельном потоке, стартовать который непосредственно перед ShowModal()?
Про поток я как-то подзабыл. Это вариант. Но честно говоря, приложение не стоит лишнего потока, это если совсем деваться не куда будет.

Подумаю всетаки о перестановке (старый код не хотел менять - работал ведь). Перенесу вызов процедуры в конец, сделаю какую-нибудь private переменную - ключ. и вынесу showmodal в отделюную процедуру. Не хотелось конечно, столько процедур развелось... :-)

Цитата:
Сообщение от evg_m Посмотреть сообщение
Можно конечно так
Код:
FRepeat.Show;
showmessage('Next');
Frepeat.hide;
Frepeat.ShowModal;
Но почему нельзя просто поменять код местами (выполнить тот же код ДО показа формы в модальном режиме?
Интересный вариант

Спасибо

Последний раз редактировалось KBO; 18.08.2015 в 21:46.
KBO вне форума Ответить с цитированием
Старый 18.08.2015, 22:30   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Но честно говоря, приложение не стоит лишнего потока, это если совсем деваться не куда будет.
всё от постановки задачи зависит. перетащить кусок кода из основного потока в побочный много времени не займёт, зато как красиво!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание модальной формы на чистом API SalasAndriy Общие вопросы Delphi 4 06.10.2013 02:16
Закрытие модальной формы в другом потоке m9yt C# (си шарп) 6 19.04.2013 18:37
Уничтожение модальной формы AndreyK Общие вопросы Delphi 3 15.03.2011 01:24
Как вернуть немодальное значение из модальной формы theYozh Общие вопросы Delphi 3 31.01.2011 14:48
Проблема при использовании модальной формы a1ias Помощь студентам 10 14.11.2008 17:29