Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Обновление TLabel на родительской MDI форме


Автор: ShadeSt 21.12.2006, 14:27
Добавил на родительскую MDI форму метку (TLabel), добавил таймер, который тикает с интервалом 1000 мс. и сделал так:
Код

procedure TMainForm.TimerOnTime(Sender: TObject);
begin
  Label1.Caption := 'До нового года осталось: ' + #13#10 + FormatDateTime('D дней HH часов MM минут SS секунд', T);
  Label1.Refresh; // наличие и отсутствие данной строки не на что не влияет.
end;


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

спсб.

Автор: Rodman 21.12.2006, 14:30
попробуй
Код

procedure TMainForm.TimerOnTime(Sender: TObject);
begin
  Application.Progress;
  Label1.Caption := 'До нового года осталось: ' + #13#10 + FormatDateTime('D дней HH часов MM минут SS секунд', T);
  Label1.Refresh; // наличие и отсутствие данной строки не на что не влияет.
  Application.Progress;//если я правильно помню... 
end;

Автор: ShadeSt 21.12.2006, 14:35
Rodman, такого метода нет.

есть ProcessMessages; но не в нем дело. приложение сообщения отрабатывает.
дело видимо в том, что метка находится на форме, у которой:
Код

  FormStyle := fsMDIForm



Автор: Snowy 21.12.2006, 15:46
А таймер точно работает?
А T точно меняется?

Автор: ShadeSt 21.12.2006, 15:58
Цитата(Snowy @  21.12.2006,  15:46 Найти цитируемый пост)
А таймер точно работает?А T точно меняется?

Да, точно. 
Пробовал даже делать новый проект, в котором вообще ничего нет, кроме таймера и метки на форме.
из кода только это:
Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  label1.Caption := timetostr(now);
end;


если у формы ставлю FormStyle := fsNormal - то все работает, если ставлю fsMDIForm то не работает.
Самое интересное то, что на форме метка прибывает с 
caption = 'asdf'
после запуска проходит секунда, и метка обновляется на текущее время, а вот после этого глухо как в танке. для того, что бы текст метки обновился надо либо 
Код

  label1.visible := false;
  label1.visible := true;

либо
Код

  sendmessage(self.handle, wm_resize, 0, 0)

вобщем кривые решения smile((

еще для проверки делал так:
Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  label1.Caption := timetostr(now);
  Caption := label1.Caption;
end;

в итоге в заголовке формы время тикает, а метка не перерисовывается.

Автор: ShadeSt 24.12.2006, 20:06
Как вариант решения данной проблемы - поместить Label в TPanel.

Автор: valentos 24.12.2006, 21:38
Цитата

Label1.Caption := 'До нового года осталось: ' + #13#10 + FormatDateTime('D дней HH часов MM минут SS секунд', T);    
  Label1.Refresh; // наличие и отсутствие данной строки не на что не влияет.


Блин, я с токой проблемой также столкнулся, тока у меня в Label1 должна была отображаться инфа о ходе загрузки программы и также ничего не отображалось.
 Выход следующий:
Код

procedure TMainForm.TimerOnTime(Sender: TObject);    
begin    
  Label1.Caption := 'До нового года осталось: ' + #13#10 + FormatDateTime('D дней HH часов MM минут SS секунд', T);    
 // Label1.Refresh; // Это нах... не надо 
 Label1.Update;// Так будет обновляться
    
end;


Автор: ShadeSt 26.12.2006, 09:53
Код

  Label1.Update;

неа, не помогло.

хотя, вобщем-то необходимость в том, что бы иметь метку на MDI форме отпала, но все же интересно почему такая проблема существует.

Автор: Winprogrammer 13.1.2007, 17:17
Цитата(Rodman @ 21.12.2006,  14:30)
Код

  Application.Progress;//если я правильно помню... 

Не progress, а 
Код

 Application.ProcessMessages.

Или попробуй
Код

 Label1.Invalidate;

Автор: ShadeSt 15.1.2007, 10:17
ни 
Код

  Label1.Invalidate;

ни
Код

  InvalidateRect()

не помогают smile

Автор: CatATonik 15.1.2007, 10:24
Код

InvalidateRect(MainForm.ClientHandle, nil, False);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)