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


Автор: klyaksa 12.11.2010, 19:25
Есть StatusBar, в нем выводится разная информация, в том числе сколько времени прошло и осталось... (по таймеру 1 сек)
Две панели рисую сам (цветом чтобы выделить когда время мало), остальные text.
Так вот иногда вылазит ошибка canvas does not allow drawing. Раньше грешил на Инди (tcpclient и антифриз), но обратил внимания что всегда на статус баре что-то не прорисовано...
В чем может быть дело? Куда копать?

на всякий:

Код

procedure TStudentMainForm.StatusBar1DrawPanel(StatusBar: TStatusBar;
  Panel: TStatusPanel; const Rect: TRect);
var
  R:TRect;
  w, l: Integer;
  t, hh, nn, ss: word; //'hh:nn:ss'
begin

  if (Panel = StatusBar.Panels[4]) or (Panel = StatusBar.Panels[5]) then
  begin

      with StatusBar.Canvas do
      begin
        FillRect(Rect);
        if Panel.Text <> '' then
        begin
          if Length(Panel.Text) = 8 then begin  //'hh:nn:ss'
            hh := StrToIntDef(Copy(Panel.Text, 1, 2), 0);
            nn := StrToIntDef(Copy(Panel.Text, 4, 2), 0);
            ss := StrToIntDef(Copy(Panel.Text, 7, 2), 0);
            t := hh * 3600 + nn * 60 + ss;
          end
          else t := 0;

          if t<=60 then Font.Color := clRed;

          w := TextWidth(Panel.Text); 
          l := ((Rect.Right - Rect.Left) - w) div 2;

          TextOut(Rect.Left + l, Rect.Top, Panel.Text);

        end;
      end;
  end
end;

Автор: Saboten 12.11.2010, 22:12
Скорее всего проблема из-за таймера (2 потока пытаются одновременно что-то нарисовать в канвасе).
Как вариант перед рисованием сделать canvas.Lock а после рисования -  canvas.Unlock, тогда только один поток сможет рисовать.


Автор: ZBugz 15.11.2010, 08:40
Цитата(klyaksa @ 12.11.2010,  19:25)
В чем может быть дело? Куда копать?

Эта ошибка обычно возникает когда ты пытаешься сделать activecontol чему либо, что недоступно. Не обязательно сам activecontrol, имееться ввиду какой нибуть focus на что то либо что не существует, тот же form1.enable:=false и попытка что то сделать на ней...

Автор: klyaksa 25.11.2010, 19:17
В программе для 2 панелей на статус баре ставлю psOwnerDraw - в StatusBar1DrawPanel  все закомментировал -- ошибка выскакивает. psText - все работает без ошибок.

Да и еще если задвинуть окно вниз за экран, то получить ошибку вероятность больше...

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