Вниз
Скачать: CL | DM;

Отрисова формы по ходу обработки данных   Найти похожие ветки 

← →
SergeyV   (2004-02-13 14:30) [0]

Уважаемые Гуру, ну просветите пожалуйста "молодого" как это вы пишите хорошие программы :))

В программе идет длительная обработка данных (обрабтка больших массивов в математике или выполнение хранимых процедур в базе данных). Обработка разбита на несколько этапов.
На главной форме есть Memo в который выводятся комментарии по ходу решения. проблема в том что если пользователь запустив расчет, свернул окно, то развернув его прочитать комментарии уже не удасться.
Форма просто не успевает отрисовываться.

Пробовал разместить на форме Label и Timer чтобы писать время по ходу решения. В начале делаю
StartTime := Time;
а на обработчик таймера вешаю
StopTime := Time;
label.Caption:=TimeToStr(StartTime-StopTime)
и опять форма (а точнее Label на ней) не отрисовывается.


← →
Семен Сорокин ©   (2004-02-13 14:32) [1]

В программе идет длительная обработка данных (обрабтка больших массивов в математике или выполнение хранимых процедур в базе данных). Обработка разбита на несколько этапов.
вытаскивай обработку в поток (TThread) а по окончании этапа отрисовывай через Synhronize.


← →
olookin ©   (2004-02-13 14:32) [2]

Добавьте после всего этого Application.ProcessMessages


← →
Семен Сорокин ©   (2004-02-13 14:32) [3]

если без потоков тогда Application.ProcessMessages надо добавить.


← →
Тимохов ©   (2004-02-13 14:33) [4]

Используй Application.ProcessMessages - вызывай по ходу дела все будет отрисовываться. Или у окна c сообщением вызывай refresh.


← →
VLAD-MAL   (2004-02-13 14:33) [5]

Application.ProcessMessages;
в каждой итерации цикла пробовал вызывать?


← →
Тимохов ©   (2004-02-13 14:34) [6]


> VLAD-MAL (13.02.04 14:33) [5]

Если попробует в каждой итерации, то следующий его вопрос будет - почему дельфи такая медленная.

Автору. Не вызывай application.processmessages слишком часто - если у тебя большой цикл, то вызывай на каждые 100 итераций, 1000 или еще как - установи экспериментом.


← →
YurikGl   (2004-02-13 15:44) [7]

Я делал Form.Repaint после каждого изменения содержания формы и все работало.


← →
Тимохов ©   (2004-02-13 15:45) [8]


> Repaint

Логично - это тот же refresh


← →
YurikGl   (2004-02-13 15:46) [9]

Кстати, а различие у них есть?


← →
Alexey_85   (2004-02-13 15:47) [10]

To: YrikGI
ProcessMessages её вызовет...
RePaint толку не даст если я захочу перетащить форму во время выполнения трудоемкого кода?


← →
YurikGl   (2004-02-13 15:48) [11]

Действительно, не перетаскивается. :(


← →
Тимохов ©   (2004-02-13 15:49) [12]


>
> Alexey_85 (13.02.04 15:47) [10]

Точно не даст.
Repaint просто принудительно все перерисовывает. Но никаких сообщений при этом не обрабатывается.


← →
KSergey ©   (2004-02-14 10:52) [13]

Автору: почитайте еще обсуждение здесь

http://delphimaster.net/view/1-1076405195/

А вообще вопрос освещен во всех факах по дельфи.


← →
Anatoly Podgoretsky ©   (2004-02-14 11:05) [14]

ProcessMessages не вызывает заметного замедления, замедление вызывает обработка сообщений, если такие есть, но он то для того и предназначен, чтобы было можно обработать накопленные сообщения, например перерисовки, перемещения, нажатия клавиш и т.д.



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

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.019 c
14-80161
F-man
2004-02-01 15:26
2004.02.25
Создание Wizard-a


1-79941
Layner
2004-02-09 12:57
2004.02.25
Подскажите плз, как на форме fsMDIForm отображать дочерние


1-79718
Aligator
2004-02-12 17:12
2004.02.25
Организация запуска программы по рассписанию (напр. раз в месяц)


9-79535
Omar2002
2003-08-14 23:39
2004.02.25
DXGEdit


3-79663
lic_
2004-01-30 14:12
2004.02.25
Кодировка




   Наверх