Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2010, 01:16   #1
vldnik
Новичок
Джуниор
 
Регистрация: 27.03.2010
Сообщений: 4
По умолчанию Delphi7 - Почему Edit1.Text не выводит в цикле ?

Подскажите начинающему. Вот фрагмент:

for I:=1 to 9999 do
begin
Edit1.Text := IntToStr(I);
end


Почему я не вижу мелькающих циферок (от 1 до 9999) в окне формы,
а вижу только конечное число 9999, когда цикл закончился ?
Такая же картина и с компонентами Label, Memo, StaticText ...
Читаю Фленова, Архангельского, но видимо что-то глобальное упустил
в самом начале. Подскажите.
vldnik вне форума Ответить с цитированием
Старый 28.03.2010, 01:21   #2
Xatr
Форумчанин
 
Аватар для Xatr
 
Регистрация: 17.09.2008
Сообщений: 349
По умолчанию

В самом цикле попробуйте написать:
Код:
Application.ProcessMessages;
если чем помог, поставьте отзыв на весы

Последний раз редактировалось Xatr; 28.03.2010 в 03:31.
Xatr вне форума Ответить с цитированием
Старый 28.03.2010, 01:23   #3
Chudo4258
Форумчанин
 
Аватар для Chudo4258
 
Регистрация: 19.02.2009
Сообщений: 622
По умолчанию

потому что цикл проходит очень быстро.
попробуй вот так
Код:
for I:=1 to 9999 do
begin
Edit1.Text := IntToStr(I);
sleep(1000);
end
Жми на весы!!!
Chudo4258 вне форума Ответить с цитированием
Старый 28.03.2010, 01:29   #4
Xatr
Форумчанин
 
Аватар для Xatr
 
Регистрация: 17.09.2008
Сообщений: 349
По умолчанию

Это только затормозит цикл. Каждое число будет выводиться через 1 секунду после предыдущего. И выводить результат в Edit-е вряд-ли будет.
При выполнении цикла "вешается" вся программа, потому-что всё выполняется последовательно. И чтобы программа обновляла окно, требуется каждый раз выполнять функцию в посте 2.
если чем помог, поставьте отзыв на весы

Последний раз редактировалось Xatr; 28.03.2010 в 03:19.
Xatr вне форума Ответить с цитированием
Старый 28.03.2010, 03:05   #5
vldnik
Новичок
Джуниор
 
Регистрация: 27.03.2010
Сообщений: 4
По умолчанию

Благодарю за помощь.
Рекомендация (пост 2) - решение проблемы.
Рекомендация (пост 3) - не работает. Происходит точно, что
описал Xatr (пост 4).

Хотелось бы глубже разобраться в проблеме-почему так происходит.
Приведенный в посте 1 фрагмент - это лишь иллюстрация проблемы.
Понимаю, что форум - это не интерактивный курс обучения, поэтому
подскажите где и что почитать. У Фленова и Архангельского не нашел,
м.б. плохо искал ?
vldnik вне форума Ответить с цитированием
Старый 28.03.2010, 03:15   #6
Xatr
Форумчанин
 
Аватар для Xatr
 
Регистрация: 17.09.2008
Сообщений: 349
По умолчанию

Цитата:
почему так происходит
что именно так?
почему "виснет" прога при выполнении цикла?
Потому, что, как я писал выше, все команды программы выполняются последовательно одна за другой. Нну есть ветвление и повторение, но это тоже какая-то последовательность кода программы и при окончании кода, программа завершает свою работу и закрывается. В оконных программах нужно чтобы окно было постоянно видно, для этого непрерывно выполняются в цикле функции обновления окна. Пример WinAPI:
Код:
var a:TMsg;
while GetMessage(a,0,0,0) do begin
translatemessage(a);
dispatchmessage(a);
end;
Поэтому наше окно не закрывается просто так. Так как программа выполняет эти функции в циикле, то при поступлении сообщения "нажатие кнопки", эти функции не выполняются, а выполняется код, закреплённый за кнопкой. Поэтому кажется, что наше окно "зависло". на самом деле программа выполняет другой код. Для того, чтобы наше окно не "зависало" и служит такая функция, написанная в посте 2. Она обновляет окно и заодно переписывает все изменения, в частности в Edit.
Цитата:
форум - это не интерактивный курс обучения
может и нет, у каждого своё мнение, но помочь сможем
если чем помог, поставьте отзыв на весы

Последний раз редактировалось Xatr; 28.03.2010 в 03:30.
Xatr вне форума Ответить с цитированием
Старый 28.03.2010, 04:23   #7
vldnik
Новичок
Джуниор
 
Регистрация: 27.03.2010
Сообщений: 4
По умолчанию

Цитата:
что именно так?
почему "виснет" прога при выполнении цикла?
Нет. Я имел в виду проблему - пост 1.
Цитата:
как я писал выше, все команды программы выполняются последовательно одна за другой.
Вот и я так полагал, а получается, что это не так. Ведь оператор
Edit1.Text := IntToStr(I);
находится в теле цикла, но не выполняется на каждом шаге, а для того, чтобы он выполнялся его надо предварить командой:
Application.ProcessMessages;
Ну, а цикл, в свою очередь является телом процедуры обработки нажатия на Button в окне главной формы.

Вот и хотелось бы разобраться:
Когда программа выполняется строго (гарантированно) последовательно,
а когда для этого надо предпринимать специальные меры (как в случае с функцией
Application.ProcessMessages; для вывода в форму на каждом шаге цикла.
vldnik вне форума Ответить с цитированием
Старый 28.03.2010, 04:35   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
находится в теле цикла, но не выполняется на каждом шаге
Вы не поняли объяснения, данного Вам выше...

ваш цикл прекрасно выполняется и без всякого ProcessMessages!!! Это оператор нужен для совсем другого! Поймите, что Вы видите на форме не то, что находится в Edit1.Text, а то, что на форме отображается! Edit1 прекрасно изменяется (доказать легко. например, в цикле пишите значения в файл. потом посмотрите, что там записалось!)

А вот как раз, чтобы ОТОБРАЗИТЬ изменения и нужно обработать оконные сообщения (любой контрол (управляемый объект) в Windows управляется как раз получаемыми сообщениями), а ProcessMessages позволяет обработать очередь сообщений (таким образом, форма "оживает")!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.03.2010, 05:02   #9
vldnik
Новичок
Джуниор
 
Регистрация: 27.03.2010
Сообщений: 4
По умолчанию

А-а-а-а ... Начинаю понимать.

Спасибо Xatr.
Спасибо Serge_Bliznykov.

А если ещё ткнёте носом, где об этом стройно и подробно изложено,
будет вообще здорово.
vldnik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AnsiUpperCase(Edit1.Text); Шура Помощь студентам 3 01.12.2008 20:04
y=Edit1->Text ??? m.a.x.i.m Помощь студентам 8 31.03.2008 11:29
if edit1.text:='123'then ben95 Помощь студентам 5 28.01.2008 16:29
из edit1.text в stringgrid. fluer Общие вопросы Delphi 8 25.04.2007 11:23
Поиск символа в Edit1.text Alar Компоненты Delphi 0 29.10.2006 19:02