0 / 0 / 0
Регистрация: 30.01.2012
Сообщений: 20
1

Показывать форму пользователю с информацией о выполнении длительной задачи

19.03.2012, 12:20. Показов 2734. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В проекте есть процедуры которые очень долго выполняются, и что бы пользователь не паниковал когда это происходит (Программа не отвечает), необходимо сделать форму "Думаю", на которой к примеру будет картинка с часами или что-то такое. Есть идеи как это сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2012, 12:20
Ответы с готовыми решениями:

При первом запуске программы показывать первую форму, а при остальных вторую форму
при первом запуске программы показывать первую форму а при остальных вторую форму

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

Показывать форму заданное количество секунд
Всем привет. Как организовать задержку формы. Допустим на секунд 5. То есть пользователь запускает...

При запуске приложения не показывать форму
Имею приложение WindowsForms. Цель такая: - при запуске винды запускать программу (это сделал,...

16
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
19.03.2012, 14:51 2
...можно просто менять курсор в программе на время размышлений ...какой нить подходящий *.ani.
0
0 / 0 / 0
Регистрация: 30.01.2012
Сообщений: 20
19.03.2012, 14:58  [ТС] 3
хотелось бы все таки форму с большой надписью "Погоди я думаю!!!", а то программой будут пользоваться люди, которые недавно научились пользоваться ПК))
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
19.03.2012, 15:14 4
перед процедурой открываешь форму, после процедуры закрываешь, и все.
Правда от зависонаэто не спасет, но зато будет видно что приложение работает, а насчет зависона можешь попробовать вставить в процедуру Application.ProcessMessages или выполнять ее в отдельном потоке.
1
0 / 0 / 0
Регистрация: 30.01.2012
Сообщений: 20
19.03.2012, 15:25  [ТС] 5
Думал про потоки, но с ними ни разу не связывался, не знаю как том что делается, на счет формы тоже думал, ее нужно открывать с помощью ShowModal, иначе при нажатии на другую форму она за нее переместится.
Delphi
1
2
3
form.ShowModal;
// процедура
form.Close;//не выполняется
Добавлено через 6 минут
Ну походу придется разбираться с потоками, иначе, я думаю, нормально этого не сделать
0
498 / 251 / 56
Регистрация: 16.06.2011
Сообщений: 904
19.03.2012, 18:58 6
Однозначно потоки.
0
0 / 0 / 0
Регистрация: 30.01.2012
Сообщений: 20
19.03.2012, 19:01  [ТС] 7
тогда тут другая проблема, если форма будет открываться с помощью ShowModal то на главной форме будет не доступна кнопка закрыть или свернуть, а это тоже не желательно
0
0 / 0 / 0
Регистрация: 30.01.2012
Сообщений: 20
26.03.2012, 15:12  [ТС] 8
Если кому-нибудь еще интересно, то есть такой выход:

Нужно открывать форму "Думаю" поверх остальных форм, но не в модальном режиме (.ShowModal) т.к. после открытия формы процедура перестанет выполнятся пока форма не закроется.

На форме "Думаю)" ставим таймер с интервалом 1 (наверно нужен, без него не пробовал)
и в него пишем:

Delphi
1
SetWindowPos(formMain.Handle,Handle,Left,Top,Width,Height,SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOSIZE);
formMain - это главная форма моей программы.

Код вызова процедуры:
Delphi
1
2
3
4
5
6
formLoading.Show;
formLoading.Timer1.Enabled:=True;
Application.ProcessMessages;
//Тут процедура которая очень долго выполняется
formThink.Timer1.Enabled:=False;
formThink.Hide;
Вроде так
0
498 / 251 / 56
Регистрация: 16.06.2011
Сообщений: 904
27.03.2012, 06:51 9
Лучше использовать потоки, и показывать ход выполнения программы любым индикатором (TPRogressBar, например). Работа с потоками:
1) File - New - Other - Delphi Files - Thread Object; // (Delphi 2010)
2) подключить потоковый модуль в главной форме (ALT + F11)
3) пишешь необходимые (долговременно работающие ) процедуры в теле потока
и самое главное: если процедуры потока работают с визуальными компонентами твоей Form1, процедуры необходимо запускать в режиме синхронизации (тогда не будет наблюдаться эффекта "подвисания" программы):
Delphi
1
2
3
4
procedure TestThread.Execute;
begin
  Synchronize(MyProcedure);
end;
4) процедура:
Delphi
1
2
3
4
procedure TestThread.Execute;
begin
  { Place thread code here }
end;
- запускает необходимый код в потоке.
5) запуск самого потока, например, как в твоем случае, из Form1 будет выглядеть так:
Delphi
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject);
var
  Thread: TestThread;
begin
  Thread:=TestThread.Create(True); // создается поток, но не запускается, если тут указать False - поток запустится на выполнение, тогда следующий метод можно не вызывать:
  Thread.Resume;              // запускаем поток
end;
Ну и естественно не забудь высвободить от него память, если это необходимо.
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
27.03.2012, 07:42 10
А чего просто не вставить в форму большую панель поверх остальных элементов с надписью "Думаю". Во время DesignTime установить свойство Visible:=FALSE. Когда нужно Visible:=TRUE пока ведутся расчёты. И все дела.
Можно панель разрисовать под фориу с кнопками и т.п.
0
0 / 0 / 0
Регистрация: 30.01.2012
Сообщений: 20
27.03.2012, 09:50  [ТС] 11
Можно но не в моем проекте. там в главном окне открываются дочерние формы и вот это как раз происходит долго, а панель будет под ними. ну и когда буду интерфейс менять или еще что-то такое, панель будет мешать. Кстати по тестировал программу, SetWindowPos(formMain.Handle,Handle,Left,Top,Width,Height,SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOSIZE); это вроде не надо, так как программа когда думает виснет и форма не исчезнет за другую)

Добавлено через 1 минуту
А на счет потоков. Пробовал с прогресс баром как то так:
1. Создание и Запуск потока который двигает прогресс бар
2. Выполнение процедуры
...

Почему то прогресс бар начинал двигаться после того как процедура выполнится, хотя код брал с какого-то форума и там у всех все работало
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
27.03.2012, 12:09 12
Я в своём проекте использовал окно выдачи сообщений об ошибках. Создавал ещё одну форму на этапе проектирования, ставил Visible в False. И показывал её когда нужно. При этом свободно работал в другой форме. Другая форма - это другой поток. Можешь на ней ставить хоть таймер, рисовать часы. Установить, чтобы она всегада была на переднем плане. К её событиям из основной формы обращался через Form2. У меня сейчас под рукой нет исходников - вечером, если никто до этого не подскажет, пропишу какого типа была эта форма и как её вывести на передний план.
0
714 / 402 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
27.03.2012, 12:39 13
Цитата Сообщение от Одиночка Посмотреть сообщение
Создавал ещё одну форму на этапе проектирования, ставил Visible в False. И показывал её когда нужно. При этом свободно работал в другой форме. Другая форма - это другой поток. Можешь на ней ставить хоть таймер, рисовать часы. Установить, чтобы она всегада была на переднем плане.
Поглядите работу программы Picasa при самодобавлении файлов.
Отдельный поток - самый лучшый выход.
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
27.03.2012, 12:45 14
Поглядите работу программы Picasa при самодобавлении файлов.
Уточните. Такой программы не знаю. А отдельный поток, это моё мнение, нужен если нужно выполнять одновременно несколько задач. А показывать часы на форме - это не задача, а тьфу.
0
714 / 402 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
27.03.2012, 13:22 15
Другой вариант - на модальной форме отследить свёртывание и сворачивать и основную форму.
Программа Picasa
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
27.03.2012, 17:57 16
Выкладываю, как и обещал описание для формы "Окно ошибок" с которой я работал:
На этапе разработки:
Delphi
1
2
3
FormStyle = fsNormal
WindowState =  wsNormal
    Visible = False
Во время выполнения:
Delphi
1
2
3
4
5
6
7
8
9
10
11
PROCEDURE TForm2.FormActivate(Sender: TObject);
BEGIN
  WITH Form2 DO
 SetWindowPos(Handle,hWnd_TopMost,Left,Top,Width,Height,swp_noActivate+swp_noMove);
END;
PROCEDURE TForm2.FormClose(Sender:TObject;VAR Action:TCloseAction);
VAR
  I : BYTE;
BEGIN
  Action:=CaHide;
END;
Использовать или нет - дело ваше.
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
31.03.2012, 20:11 17
Вот пример кода архив. Там в основной форме после нажатия кнопки выдаётся окно и зацикливается. После нажатия кнопки во втором окне - цикл в первом окне прерывается.
0
31.03.2012, 20:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2012, 20:11
Помогаю со студенческими работами здесь

Как создать форму с прокручиваемой информацией на сайте?
Здравствуйте. Имеется таблица на 15 страниц прокрутки. Необходимо запихнуть её в небольшую форму с...

При нажатии на Ctrl+Space показывать форму
Здравствуйте. У меня на форме есть Cheack, который при установке Form1.Cheack.Checked=True делает...

Показывать кнопки только авторизованному пользователю
1) На форме расположенны две кнопки "добавить", "удалить". Их значение visible = false. Когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru