Главная страница
    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.042 c
3-83931
st-av
2003-06-03 19:56
2003.06.26
DBGrid и DBLookupComboBox в одной упряжке


1-84214
Ig
2003-06-11 19:47
2003.06.26
Подскажите пожалуйста, как поместить значение из TEdit в Timer.In


6-84479
alt7
2003-04-21 12:26
2003.06.26
TThread и TIdTelnet


1-84104
Zemal
2003-06-10 11:30
2003.06.26
Как определить объём занимаемой приложением памяти?


3-83984
*pavel
2003-05-30 10:47
2003.06.26
Документация на Oracle (от А до Я)





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