Dlaczego Canvas się rysują dopiero za drugim wywołaniem?

0
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  PaintBox1.Width := 50;
  PaintBox1.Height := 50;
  PaintBox1.Canvas.Rectangle(0, 0, PaintBox1.Height, PaintBox1.Width);
end;

end.

Dlaczego kwadracik pojawia się na ekranie dopiero po drugim naciśnięciu Button1?
Dlaczego problem znika po zakomentowaniu wierszy PaintBox1.Width := 50; PaintBox1.Height := 50;?

4

PaintBox zmienia swój rozmiar a ty nie dajesz mu czasu na "zatrybienie" zmiany rozmiaru a po zmianie rozmiaru sam się odświeża trzeba to zrobić tak (przynajmniej w Delphi działa):

  PaintBox1.Width := 50;
  PaintBox1.Height := 50;
  Application.ProcessMessages; //aplikacja przetworzy kolejkę komunikatów a wiec zmiana rozmiaru PaintBoxa
  PaintBox1.Canvas.Rectangle(0, 0, PaintBox1.Height, PaintBox1.Width); //teraz można rysować

Najlepiej rysować w OnPaint wtedy to co narysujesz nie będzie znikało po odświeżeniu bo będzie przerysowywane gdy zajdzie taka potrzeba.

3

Ewentualnie można spróbować

PaintBox1.Canvas.Refresh

albo

PaintBox1.Canvas.Invalidate
PaintBox1.Width := 50;
PaintBox1.Height := 50;
PaintBox1.Canvas.Rectangle(0, 0, PaintBox1.Height, PaintBox1.Width);
PaintBox1.Canvas.Refresh; // PaintBox1.Canvas.Invalidate
0

Działa, dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1