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

Вниз

Обновление метки в цикле.   Найти похожие ветки 

 
Viktoria   (2003-06-15 18:35) [0]

Добрый вечер.

У меня следующий вопрос.

Я использую цикл, в котором со временем должна обновляться метка:

Пример кода:

for i:=0 to 20000000 do
begin
//...
if (i mod 100)=0 then
begin
Label1.Caption:="Write specail text";

end;

Обновление метки не происходит.
Я долго изучала проблему, решение в лоб, это подписать ниже

Label1.Repaint;

И все работает.

Но изучив исходники VCL, меня все-таки смутила одна вещь.

При выполнении присваивания Label1.Caption происходит

procedure TControl.SetText(const Value: TCaption);
begin
if GetText <> Value then SetTextBuf(PChar(Value));
end;

Что в свою очередь использует

procedure TControl.SetTextBuf(Buffer: PChar);
begin
Perform(WM_SETTEXT, 0, Longint(Buffer));
Perform(CM_TEXTCHANGED, 0, 0);
end;

Кто-нибудь сможет мне объяснить почему посылка данных сообщений
не заставляет перерисовываться Label1?

TCustomLabel = class(TGraphicControl)
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;

procedure TCustomLabel.CMTextChanged(var Message: TMessage);
begin
Invalidate;
AdjustBounds;
end;

Заранее благодарна.


 
Palladin   (2003-06-15 18:39) [1]

потому что обработать эти сообщения программа не может ибо занята циклом...
для обработки сообщений есть метод объкта Application.ProcessMessages

его вызов в теле цикла будет наиболее правильным решением,
можно не вызывать слишком часто, скажем после прохода нескольких итераций... 50 или 100, зависит от времени исполнения каждой итерации


 
Viktoria   (2003-06-15 19:00) [2]

Т.е. я так поняла, что программа все сообщения ставит в очередь, поскольку цикл много ресурсов отнимает. Почему когда цикл заканчивается, обновление тоже не происходит?
Ведь сообщения в очереди.

Application.ProcessMessages затормозит процесс, если пользователь будет, что-то делать с окном...

Как при ProcessMessages запретить выполнять всякие манипуляции с окном, например его перемещение и т.д., что полностью останавливает выполнение цикла?


 
Palladin   (2003-06-15 19:08) [3]

когда цикл заканчивается обновление обязано происходить, иначе нужно смотреть код...

если хочешь оставить пользователя без контроля над окном, то используй repaint, тогда уж перерисовывай все, потомучто если другое приложение расоположить над твоим окном, а после убрать, будет полная лажа на экране с обновляемым Label


 
Palladin   (2003-06-15 19:16) [4]

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


 
Viktoria   (2003-06-15 19:32) [5]


> Palladin © (15.06.03 19:08)
> когда цикл заканчивается обновление обязано происходить,
> иначе нужно смотреть код...
>
> если хочешь оставить пользователя без контроля над окном,
> то используй repaint, тогда уж перерисовывай все, потомучто
> если другое приложение расоположить над твоим окном, а после
> убрать, будет полная лажа на экране с обновляемым Label


Если я правильно поняла, то Repaint всего окна?

Я думаю, что приблизительно так происходит обновление при старте Delphi 7. Там если на Splash screen навести окно, а потом убрать, оно только через какое-то время перерисовывается...

Все остально вроде ясно, спасибо.
Буду Repaint на все окно делать.

На счет потока я подумаю...




 
Real   (2003-06-16 09:38) [6]

label1.update;



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

Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.06 c
3-84015
anton_cor
2003-05-30 22:28
2003.06.26
Сделать из массива DataSource


3-83995
Sevish
2003-05-30 14:00
2003.06.26
Ошибка конвертации между кодировками!


14-84584
Yanis
2003-06-08 12:51
2003.06.26
Скучно


14-84569
Andrew.
2003-06-07 17:30
2003.06.26
SMTP и отправка писем из програмы.


1-84148
Comp
2003-06-11 12:40
2003.06.26
Как прокручивать часть формы её собственными полосами прокрутки?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский