Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.30;
Скачать: CL | DM;

Вниз

Модальная форма   Найти похожие ветки 

 
zz 5 ©   (2005-10-03 12:51) [0]

Всем доброго дня. При выполнении длительных операций в программе, причем в разных режимах выводится форма с прогресс-бар. Как ее вывести, чтобы, пока она не закроется, пользователь не мог с нее уйти и работать с программой, т.е. сделать ее модальной, но при этом не передовать ей управление. Заранее спасибо.


 
TUser ©   (2005-10-03 13:00) [1]

Сделай ее модальной и убери все способы ее закрытия.


 
y-soft ©   (2005-10-03 13:01) [2]

>zz 5 ©   (03.10.05 12:51)  

А вы правильно понимаете, что такое модальность окна?

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


 
zz 5 ©   (2005-10-03 14:48) [3]

>y-soft ©   (03.10.05 13:01) [2]

Когда я вызываю окно с помощью ShowModal управление переходит в модальное окно, как мне потом, допустим, из родительского окна работать с модальным, например, увеличить значение прогресс-бар ?
Надо: 1) При старте длительной операции показать модальное окно 2) При выполнении операции постепенно наращивать значение прогресс-бар


 
y-soft ©   (2005-10-03 15:04) [4]

>zz 5 ©   (03.10.05 14:48) [3]

Вы имеете в виду, что ShowModal не возвращает управление до тех пор, пока модальное окно не закроется?

Ну так в Ваших руках сам код этой модальной формы. Т.е. Вы можете всю необходимую обработку производить там. Но для Windows более естественным способом является вынесение длительной операции в отдельный поток...

Еще один довольно часто используемый вариант - использование не модальной, а псевдомодальной формы. Т.е. вызываете не ShowModal, а Show а затем до конца операции делаете главную форму недоступной (Enabled := False)...


 
y-soft ©   (2005-10-03 15:22) [5]

>>zz 5 ©   (03.10.05 14:48) [3]

Еще немного.

Если Ваша длительная операция атомарная, т.е. не возвращает управления до полного завершения, то, чтобы не "замораживать" программу, выход один - выносить ее в отдельный поток...

Если же операция состоит из большого кол-ва более мелких опраций, то не забывайте после каждой вызывать Application.ProcessMessages, иначе прогресс будет перерисовываться скачками...


 
zz 5 ©   (2005-10-03 17:35) [6]

>>zz 5 ©   (03.10.05 14:48) [5]

Сам склоняюсь в сторону потоков, но пока нужно быстрое решение, потому что переделка всех режимов, а их не мешьше пятидесяти, займет продолжительное время.
Спасибо за ответы, попробую пока MainForm.Enabled := False


 
Плохиш ©   (2005-10-04 00:13) [7]

При показе формы с процессбаром послать себе сообщение, в обработчике этого сообщения выполнить необходимые действия.


 
zz 5 ©   (2005-10-04 10:05) [8]

>> Плохиш ©   (04.10.05 00:13) [7]
Это немного не то, так как придется писать для каждой длительной операции свой обработчик. Сейчас у меня такой порядок
ShowProgressForm // показ модальной формы
try
 for I := 1 to 43 do
 begin
   // операция
   IncProgressFormPos // Увеличение значенея позиции прогресс-бара модальной формы
 end;
finally
 CloseProgressForm
end;



Страницы: 1 вся ветка

Текущий архив: 2005.10.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.054 c
6-1121436507
DSKalugin
2005-07-15 18:08
2005.10.30
Проверить дату обновления файла на WEB Server-е


1-1128669106
snake_r
2005-10-07 11:11
2005.10.30
Двоичные константы


14-1129023072
Андрей Жук
2005-10-11 13:31
2005.10.30
На www.dynamo.kiev.ua раздают бесплатные почтовые ящики (2 Гб)


14-1128889828
Kerk
2005-10-10 00:30
2005.10.30
Ого


2-1128929639
alol
2005-10-10 11:33
2005.10.30
выделение строк в DBGrid