Cavas.Clear

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Cavas.Clear

Beitrag von Mathias »

Ich habe nacktes Fenster mit einem Button.

Klicke ich einmal auf den Button, bleibt das Fenster unverändert grau, so wie erwartet.
Klickt man zwei oder mehr mal wir das Fenster weiss.
Vergrössert ich es anschliessend, wird es wieder grau.

Ändere ich Color, z.B. auf rot, egal ob über FormCreate oder im Objectinspector, dann bleibt das Fenster immer rot, egal wie viel ich klicke.

Ist dies ein Bug ?

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Canvas.Clear;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
//  color:=$ff;
end;     
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Cavas.Clear

Beitrag von theo »

Auf den Canvas sollte man nur im OnPaint Ereignis zugreifen.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Cavas.Clear

Beitrag von Mathias »

Im OnPaint bleibt das Fenster weiss.

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Clear;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Cavas.Clear

Beitrag von theo »

Ich kapier nicht, was du erreichen willst.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Cavas.Clear

Beitrag von Mathias »

Ich wollte etwas probieren und dann bin ich auf diesen Effekt gestossen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Cavas.Clear

Beitrag von theo »

Mathias hat geschrieben:Ich wollte etwas probieren und dann bin ich auf diesen Effekt gestossen.


Welcher Effekt?
Kannst du nicht sagen, was du erwartest und warum und was dann effektiv passiert, was nicht deiner Erwartung entspricht?

Ich verstehe dich nicht. Du sagst: "Im OnPaint bleibt das Fenster weiss."
Ja, und jetzt? Was soll es denn dMn werden?

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Cavas.Clear

Beitrag von Mathias »

Ja, und jetzt? Was soll es denn dMn werden?

Grau bleiben, so wie es im Formular-Designer ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Cavas.Clear

Beitrag von m.fuchs »

Dann solltest du kein Canvas.Clear aufrufen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Cavas.Clear

Beitrag von Socke »

Mathias hat geschrieben:
Ja, und jetzt? Was soll es denn dMn werden?

Grau bleiben, so wie es im Formular-Designer ist.

In der Regel sollte man keine Annahmen über den bisherigen Status des Canvas (inklusive Brush und Pen) machen.
Daher: Farbe setzen.

Code: Alles auswählen

  Canvas.Brush.Color := Self.Color;
  Canvas.Clear;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Cavas.Clear

Beitrag von m.fuchs »

Die Frage nach der Sinnhaftigkeit stellt sich allerdings. Warum sollte man das überhaupt tun?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: Cavas.Clear

Beitrag von theo »

m.fuchs hat geschrieben:Die Frage nach der Sinnhaftigkeit stellt sich allerdings. Warum sollte man das überhaupt tun?


Wieso nicht?
Bevor man neu zeichnet (OnPaint) kann man doch den Canvas löschen.
Ich hatte Canvas.Clear zwar nicht auf dem Radar. Ich mache immer Canvas.FillRect(...), kommt aber auf das selbe raus.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Cavas.Clear

Beitrag von m.fuchs »

Ist das notwendig? Wenn ein OnPaint ausgelöst wird, sollte doch alles wieder gelöscht sein.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: Cavas.Clear

Beitrag von theo »

m.fuchs hat geschrieben:Ist das notwendig? Wenn ein OnPaint ausgelöst wird, sollte doch alles wieder gelöscht sein.


Ja, kann sein. Ich weiss auch nicht mehr, in welchem Szenario ich das gemacht habe. Vllt fällt es mir morgen ein. :wink:

Warfley
Beiträge: 12
Registriert: So 8. Mai 2011, 09:21

Re: Cavas.Clear

Beitrag von Warfley »

Canvas.Clear überschreibt alles mit der Brush Color, daher weiß. Bei Resize wird die Form/Control neu gezeichnet, was dazu führt dass deine zeichnung wieder überschrieben wird, daher sollte man im OnPaint ereignis zeichnen, um auf den ReDraw Call der Anwendung "abzufangen".

Warum es 2 versuche Braucht zum Clearen weiß ich auch nicht, ich habs mit einem Bitmap getestet, hat auch 2 Clear aufrufe benötigt keine Ahnung warum

PS: Beispiel Bitmaps zeichnen, die werden sonst nicht gelöscht ;)

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

Re: Cavas.Clear

Beitrag von theo »

theo hat geschrieben:
m.fuchs hat geschrieben:Ist das notwendig? Wenn ein OnPaint ausgelöst wird, sollte doch alles wieder gelöscht sein.


Ja, kann sein. Ich weiss auch nicht mehr, in welchem Szenario ich das gemacht habe. Vllt fällt es mir morgen ein. :wink:


Jetzt weiß ich wieder, wie ich drauf komme. :)
Ich zeichne normalerweise erst auf ein Buffer Bitmap und dieses muss man natürlich überpinseln.
Beim direkt auf einen Control Canvas zeichnen ist das afaik nicht nötig.

Antworten