Zeichnen in Canvas funktioniert nicht in FormCreate

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Zeichnen in Canvas funktioniert nicht in FormCreate

Beitrag von Linkat »

Hallo,
habe in Form1 eine PaintBox- und eine Panel-Komponente abgelegt.
in der procedure FormCreate möchte ich in die Canvas der Form1, der PaintBox1 und Panel1 ein Rechteck bzw. Kreis zeichnen. Was leider nicht funktioniert. In der Button1Click-Procedure gelingt das.

Gibts hierfür eine Erklärung?

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Canvas.Rectangle(1,1,20,20);
  Panel1.Canvas.Rectangle(30,30,60,60);
  PaintBox1.Canvas.Ellipse(30,30,60,60);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Canvas.Rectangle(1,1,20,20);
  Panel1.Canvas.Rectangle(10,10,90,90);
  PaintBox1.Canvas.Ellipse(10,10,90,90);
end;
 


Gibts hier für eine Erklärung?

Gruß, Linkat

Win 7 64bit; Lazarus 1.0.14; FPC 2.6.2
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Zeichnen in Canvas funktioniert nicht in FormCreate

Beitrag von Scotty »

Linkat hat geschrieben:Gibts hier für eine Erklärung?

Nach dem Erstellen wird die Paintbox neu gezeichnet. Du kannst das gleiche bekommen, indem du ein Fenster nach der OnClick-Methode über den Canvas der Paintbox schiebst. Benutze einfach das OnPaint() Ereignis der Paintbox oder ein TImage.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Zeichnen in Canvas funktioniert nicht in FormCreate

Beitrag von theo »

Linkat hat geschrieben:Gibts hier für eine Erklärung?


Erstens: OnCreate ist noch gar nichts sichtbar. Wenn schon, wäre OnShow das passendere Event.
Zweitens: Eine Paintbox hat keinen Puffer. In eine Paintbox soll man auschliesslich in deren OnPaint Ereignis zeichnen.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Zeichnen in Canvas funktioniert nicht in FormCreate

Beitrag von Michl »

Schiebe mal noch ein "Repaint" beim Buttonklick hinterher (oder veränder mal die Größe des Formulars nach dem Buttonklick)

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Canvas.Rectangle(1,1,20,20);
  Panel1.Canvas.Rectangle(10,10,90,90);
  PaintBox1.Canvas.Ellipse(10,10,90,90);
  RePaint;
end;
Die Ursache ist, dass (fast) alle Canvas von sichtbaren Controls bei jedem "RePaint", "ReFresh" oder "Invalidate" neu aufgebaut werden und damit flüchtig sind.

Anders herum, ist es sogar möglich ins Canvas eines Images zu schreiben, ohne dass diese Zeichenoperation erhalten bleibt, wenn man dies bei "OnPaint" des Images macht, siehe http://wiki.freepascal.org/Developing_with_Graphics/de#Im_fl.C3.BCchtigen_sichtbaren_Bereich_einer_TImage_zeichnen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten