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

Вниз

Блокируется вывод в Edit в цикле   Найти похожие ветки 

 
EsKor   (2002-04-12 09:00) [0]

На досуге проверял категоричное утверждение одного автора одной книги, что переменная (счетчик) цикла после его завершения неопределена, наткнулся на может быть мелкие, но грабли в следующем коде:

procedure TForm1.Button1Click(Sender: TObject);
var i: Cardinal;
begin
Edit2.Text := "Ждите!"; //что-бы не волноваться если цикл будет долгим
for i := 1 to StrToInt(Edit1.Text) do; //просто пустой цикл
Edit2.Text := IntTostr(i); //отобразить значение счетчика цикла
end;

Здесь было наивное предположение, что в Edit2 сначала появится слово "Ждите!", а затем начнет выполняться цикл. Но не тут-то было - ничего нового в Edit2 не появляется пока не закончится цикл. Я вобщем-то нашел решение, вставив перед циклом инструкцию Application.ProcessMessages. Правда появляется аналогичная проблема если инструкцию Edit2.Text := IntTostr(i); поместить в тело цикла, т.е. пытаться отображать значение счетчика при каждом его проходе - опять же надо туда помещать и Application.ProcessMessages, что заметно увеличивает время выполнения цикла. Как-то не уютно от мысли, что здесь что-то не так: если это особенность Windows вообще, то получается, что похожие ситуации нужно "пасти" и вставлять, как мне думается, лишний код (может есть другие решения?), или это какой-то глюк в имеющеся у меня версии Delphi?


 
Alx2   (2002-04-12 09:05) [1]

Edit1 должен перерисоваться. Для этого надо обработать сообщение. Эту возможность дает ProcessMessages


 
Игорь Шевченко   (2002-04-12 09:25) [2]

День добрый,

Или ProcessMessages, или после присвоения значения Edit1.Text надо вызывать Edit1.Update;

С уважением,


 
KSergey   (2002-04-12 09:37) [3]

Да это не глюк, вам верно ответили
Как вариант - можно еще вызвать метод Repaint и ему подобные (вроде там еще какой-то есть) для немедленной отрисовки элемента.
Я бы посоветовал вам почитать как Windows вообще-то работает.


 
EsKor   (2002-04-12 10:02) [4]

Спасибо за ответы!
Кое что о работе Windows я знаю, конечно далеко не все. Просто я не ожидал, что, в частности циклы, так круто "подвешивают" систему.


 
kull   (2002-04-12 10:26) [5]

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

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

Так что система не виснет, просто это такой концепт.

Есть еще одно решение и на мой взгляд - правильное, особенно если циклы долгие - это отдельный поток TThread.


 
REA   (2002-04-12 10:46) [6]

Никто не заставляет перерисовывать каждый раз. Можно и раз в секунду.


 
EsKor   (2002-04-12 10:51) [7]

> kull
Т.е. дело не совсем в цикле и на самом деле информация, в этом случае, в Edit (без принуждения) обновится только после завершения обработки щелчка на кнопке? Да, до сих пор я как то на это не обращал внимания и не задумывался, видимо случая не было.



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

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

Наверх




Память: 0.48 MB
Время: 0.015 c
1-80977
ilysha
2002-04-11 10:46
2002.04.25
Как отследить окончание созданного процесса


3-80753
nic406
2002-04-04 06:35
2002.04.25
Выборка с VIEW и JOIN(SQL2000) - Помогите новичку!!!


4-81117
BVS
2002-02-06 17:15
2002.04.25
Как создать динамический масив?


3-80832
Tolstomordik
2002-04-05 17:12
2002.04.25
Получить значение выбранной ячейки в DBGrid


3-80824
VAleksey
2002-04-05 14:29
2002.04.25
Refresh для Oracl