Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];

Вниз

Блокируется вывод в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
1-80874
Alexander K.
2002-04-14 00:05
2002.04.25
Как быстрее всего переделать цветное bmp(24) в монохром(24) ?


14-81058
Somebody_
2002-03-20 11:31
2002.04.25
новый трейд ПРО ЭТО.....


7-81097
Sender
2002-01-27 11:09
2002.04.25
Адрес ввода-вывода PS/2 порта


1-80894
f0rm
2002-04-14 15:19
2002.04.25
Нужна процедура загрузка и сохранения item ов в listview e


3-80744
Lego
2002-04-02 02:35
2002.04.25
Наверное глупый вопрос... но все-же... какие файлы нужны клиенту?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский