Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   canvas wird überschrieben (https://www.delphipraxis.net/174339-canvas-wird-ueberschrieben.html)

me57 18. Apr 2013 00:48

canvas wird überschrieben
 
Hallo, bin hier ganz neu, nicht so ganz neu mit delphi..
also ich zeichne auf ein Formular mit z.B. canvas.lineto ... usw ..Fadenkreuz etc und andere Dinge ..
wenn ich nun ein zweites Formular(fenster) in der Anwendung aufrufe werden die gezeichneten Linien mit dem Fenster wegradiert ...
nicht so schön ... wie kann ich das unterbinden mit Lock und unlock oder sowas?? hab da noch keine Lösung ...

Union 18. Apr 2013 02:06

AW: canvas wird überschrieben
 
Du solltest das in einer Paintbox Zeichnen und den OnPaint Event entsprechend nutzen.

Perlsau 18. Apr 2013 02:06

AW: canvas wird überschrieben
 
Zitat:

Zitat von me57 (Beitrag 1211846)
Wenn ich nun ein zweites Formular(fenster) in der Anwendung aufrufe werden die gezeichneten Linien mit dem Fenster wegradiert ...
nicht so schön ... wie kann ich das unterbinden mit Lock und unlock oder sowas?? hab da noch keine Lösung ...

Spendiere deiner Zeichenmethode eine eigene private Procedure:
Delphi-Quellcode:
procedure TForm1.Zeichnen;
begin
     Form1.Canvas.MoveTo(10,500);
     Form1.Canvas.LineTo(300,500);
end;
Rufe in OnPaint deines Formulars diese Methode auf:
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
begin
     Zeichnen;
end;
Begründung: Der ursprünglichen OnPaint-Methode deiner Formular-Instanz ist die Methode Zeichnen nicht bekannt, weshalb beim Repaint deines Formulars auch nur das wiederhergestellt wird, was eigentlich zum Formular gehört. Mit dem zusätzlichen Code in OnPaint erweiterst du praktisch die On-Paint-Methode deines Formulars, so daß bei einem Neuzeichnen des Formulars auch deine Linien wieder gezeichnet werden.

DeddyH 18. Apr 2013 07:12

AW: canvas wird überschrieben
 
Zitat:

Zitat von Perlsau (Beitrag 1211848)
Spendiere deiner Zeichenmethode eine eigene private Procedure:
Delphi-Quellcode:
procedure TForm1.Zeichnen;
begin
     Form1.Canvas.MoveTo(10,500);
     Form1.Canvas.LineTo(300,500);
end;

Kleiner Einwand: sicherheitshalber sollte man nicht auf die benannte Instanz zugreifen. Falls man eine weitere Instanz anlegt, greift man im "Glücksfall" nur auf die falsche, im blödesten Fall auf eine nicht existente Instanz zu.
Delphi-Quellcode:
procedure TForm1.Zeichnen;
begin
     {self.}Canvas.MoveTo(10,500);
     {self.}Canvas.LineTo(300,500);
end;
So sollte es immer stimmen. Das "self" ist optional, da, wenn man es weglässt, automatisch auf self zugegriffen wird.

Perlsau 18. Apr 2013 07:14

AW: canvas wird überschrieben
 
Zitat:

Zitat von DeddyH (Beitrag 1211854)
So sollte es immer stimmen. Das "self" ist optional, da, wenn man es weglässt, automatisch auf self zugegriffen wird.

Da hast du auch wieder recht :lol:

me57 18. Apr 2013 09:43

AW: canvas wird überschrieben
 
Danke an alle edlen Wissensspender - werd ich gleich umsetzen ...

sx2008 18. Apr 2013 10:47

AW: canvas wird überschrieben
 
Also mit folgender Vorgehensweise hält man sich alle Möglichkeiten offen:
Delphi-Quellcode:
procedure TForm1.Zeichnen(ACanvas:TCanvas);
begin
  ACanvas.MoveTo(10,500);
  ACanvas.LineTo(300,500);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  Zeichnen(self.Canvas);
end;
So sollte man eigentlich immer vorgehen, ganz gleichgültig ob man auf dem Canvas des Formulars, einer Paintbox oder auf ein Image zeichnen möchte.
Damit ist es auch kein Problem die gezeichneten Daten z.B. auf dem Printer.Canvas auszugeben.
Empfehlenswert ist auch der Zeichenmethode zusätzlich die Anfangkoordinaten mitzugeben:
Delphi-Quellcode:
procedure TForm1.Zeichnen(ACanvas:TCanvas; x,y:Integer);
begin
  ACanvas.MoveTo(10+x,500+y);

me57 18. Apr 2013 10:54

AW: canvas wird überschrieben
 
Hallo, habs mal versucht ... aber irgendwie mach ich irgendwas falsch ... ok...es geht wahrscheinlich auch nicht ohne ein Bitmap im Image-Objekt das funzt.
Hab ja vorher einfach auf das leere Formular mit Teflonbeschichtung gemalt ... hm
also ohne dieses Bitmap-Image kann ein drüberliegendes Fenster als Radierer verwendet werden ...so war es bei mir ..
Danke trotzdem

me57 18. Apr 2013 11:17

AW: canvas wird überschrieben
 
.... ist aber wohl auch nicht die Lösung ... hm da ich da nicht die Auflösung habe ... max 1024x768 pix ...

me57 18. Apr 2013 11:20

AW: canvas wird überschrieben
 
also doch Form1.OnPaint FormPaint ist der Weg DANK hm muss ich also alles umbauen ...oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz