2017-01-01 2 views
3

Если я создаю простое приложение с красящим полем и полосой прокрутки, нарисуйте в прямоугольнике прямоугольники и сделайте изменение полосы прокрутки, обновите окно с краской, я получу мерцающий дисплей, когда я перетащите полосу прокрутки (с DoubleBuffer устанавливается на форме):Delphi Flicker Free с появлением

procedure TMainForm.OnHorzChange(Sender: TObject); 
begin 
    PaintBox.Refresh; 
end; 

procedure TMainForm.OnPaint(Sender: TObject); 
var 
    x, y: integer; 

begin 
    with PaintBox.Canvas do 
    begin 
     Pen.Color := clBlack; 
     Brush.Color := clGray; 
     for y := 0 to 9 do 
      for x := 0 to 9 do 
       Rectangle(x * 32, y * 32, x * 32 + 24, y * 32 + 24); 
    end; 
end; 

Если я после этого изменить внешний вид к углероду, фликкер возвращается:

program test; 

uses 
    Vcl.Forms, 
    main in 'main.pas' {MainForm}, 
    Vcl.Themes, 
    Vcl.Styles; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    TStyleManager.TrySetStyle('Carbon'); 
    Application.CreateForm(TMainForm, MainForm); 
    Application.Run; 
end. 

Так как я могу использовать внешний вид и не получить мерцает? Установка двойного буфера в главном окне не останавливает мерцание.

+0

Возможно, вы не должны использовать двойную буферизацию. Вы должны использовать Invalidate, а не Refresh. И стили VCL мерцают. Прекратите использование стилей VCL, и все будет хорошо. –

+0

Решение похоже на использование FMX, так как у него есть графика без мерцания – imekon

+3

Из сковороды и в огонь –

ответ

5

Поместите свой PaintBox на TPanel и установите Panel.ParentBackground в значение False. В этом случае он не мерцает для меня.

+0

Это сработало и для меня! – imekon