Метод рисования Delphi Paintbox не обновляет холст изображения [FMX]

Я работаю над кроссплатформенным проектом vnc. Сторона Windows в порядке с VCL. Но когда я использую платформу FMX с тем же кодом, у меня возникают проблемы.

procedure TFrmScreenView.pbViewPaint(Sender: TObject);
begin
  Client.DrawBitmap(pbView.Canvas);
end;

Этот код обновляется до Paintbox Canvas для каждого нового пакета изображения с удаленного компьютера. Это работает на VCL без проблем. Но когда я выполняю этот проект на FMX, перерисовка изображений не работает. Он просто получает первое изображение и не обновляется.

procedure TFrmScreenView.pbViewPaint(Sender: TObject; Canvas: TCanvas);
begin
  Client.DrawBitmap(pbView.Canvas);
end; 

Код клиента:

procedure TClient.DrawBitmap(Canvas: TCanvas);
  begin
  if assigned(Bitmap) then // Bitmap is global variable
    begin
    Canvas.DrawBitmap(Bitmap,RectF(0,0,Bitmap.Width, Bitmap.Height),
                             RectF(0,0,Bitmap.Width, Bitmap.Height),1,True);
    end;
  end;

Если я использую таймер, Paintbox обновляется для каждого пакета изображений

procedure TScreenViewFrm.Timer1Timer(Sender: TObject);
begin
  pbScreenView.Repaint;
end;

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

*** Примечание. Когда я изменяю размер ScreenView, окно Paint обновляется. Зачем?

Есть ли у вас какие-либо идеи?

Пример захвата

https://gyazo.com/f880c2f172b0106122ea711389bf1659

2 ответа

После Client (Я предполагаю, что это получатель пакетов) получил новое изображение, и оно хранится в глобальном Bitmap, сделайте то, что вы сейчас делаете в таймере: pbScreenView.Repaint; (и снимаем таймер)

При рисовании чего-либо на холсте в FMX вы должны использовать TCanvas.BeginScene и закончить TCanvas.EndScene, иначе ничего не будет нарисовано.

procedure TClient.DrawBitmap(Canvas: TCanvas);
  begin
    if assigned(Bitmap) then // Bitmap is global variable
    begin
      if Canvas.BeginScene then begin
        try
          Canvas.DrawBitmap(Bitmap,Bitmap.Bounds,Bitmap.Bounds,1,True);
        finally
          Canvas.EndScene;
        end;
      end;
    end;
  end;
Другие вопросы по тегам