2014-02-08 2 views
-1

Хороший день ... Я использую OnPaint Delphi, чтобы создать несколько строк ... пока все будет в порядке ... Моя проблема начинается, когда я пытаюсь обновить эти строки ...Как обновить чертеж в OnPaint Delphi

я обнаружил, что для очистки экрана, я могу использовать:

Invalidate() 

например:

Then if True 
Begin 
      Canvas.Ellipse (0,0,100,50); 
End Else Begin 
     Invalidate(); 
end; 

Этот способ работает очень хорошо ... Но проблема заключается в том, что потребление памяти Invalidate() ; использует ....

Нормальный Он потребляет меньше 0,3% .... Теперь Invalidate(); потребляет 30% ... большая разница ...

Есть ли какие-либо другие функции, которые могут использовать для очистки экрана без использования OnPaint как процессора, так и способа сделать OnPaint одним проходом, чтобы дать Invalidate(); ... Потому что он постоянно обновляется, поэтому потребляет много процессора .... Мне нужно очистить этот экран в то время, но другим нужно обновить изображение OnPaint ...

+1

сделал вы помещаете 'Invalidate'' внутри' OnPaint'-Method? –

+0

BTW 'Invalidate' сделал ** не ** очистить экран, это просто, чтобы проинформировать элемент управления, чтобы перекрасить как можно скорее. http://docwiki.embarcadero.com/Libraries/en/Vcl.Controls.TControl.Invalidate –

+0

@SirRufo Это не то, что делает Invalidate. Перерисовать или обновить. Invalidate помещает элемент управления как грязный, вызывая InvalidateRect. Только когда очередь сообщений пуста, будет инициирован цикл рисования. –

ответ

0

Спасибо ... Я думаю, вы поняли, что я не хватает ... Я сделал это так, и по-видимому, работает правильно:

procedure paintestOnclick(blabla); 
Begin 
    if word= 'Open' then Begin 
     onpaintTela := True; 
     repaint(); 
     End; 

     if word= 'close' Then Begin 
     invalidate(); 
     onpaintTela := False; 
     End; 
End; 

процедуру OnPaint:

if onpaintTela then begin 
    //Comand paint 
End; 
+1

Это не отвечает на вопрос, который вы задали. Вам все еще нужен ответ? –

+0

@ Давид Хеффернан Да .. Это сработало ... это то, что я искал .... – user3185448

+0

Вы действительно не поощряете нас, чтобы помочь вам –

4

Вопрос: не хватает деталей. Код неполный. Однако, похоже, вы звоните Invalidate с того же места, которое вы рисуете. Это явная ошибка.

Покрасочные работы путем маркировки областей окон как недействительных. Если область окна недействительна, система инициирует цикл рисования, когда очередь сообщений становится пустой. В этот момент нам нужна работа над созданием программы. Когда программа должна изменить свой внешний вид, она отменяет измененную область, а затем обрабатывает следующий цикл рисования.

Похоже, вы съели вызов Invalidate из вашего метода рисования. Это приводит к бесконечно повторяющейся последовательности:

  • Вы рисуете.
  • Вы недействительны.
  • Очередь сообщений опущена, и окно недействительно.
  • Система поднимает цикл краски.
  • Вы рисуете.
  • Вы недействительны.
  • И так далее и так далее.

Эта бесконечная последовательность событий приведет к сжиганию циклов процессора.

Решение состоит в том, чтобы остановить недействительность в методе краски. Я не знаю, почему вы недействительны там, но что бы вы ни пытались сделать, аннулирование вашего окна не является ответом.

Смежные вопросы