Форум: "Основная";
Текущий архив: 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.029 c