Delphi-PRAXiS

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

Bjoerk 18. Apr 2013 12:14

AW: canvas wird überschrieben
 
Schau nochmal #2 :wink:

me57 19. Apr 2013 10:31

AW: canvas wird überschrieben
 
grübeldübel grübeldübel ...

ich will natürlich mit externen Daten und den Mauskoordinaten arbeiten ... wie sollen die denn in Formpaint kommen ?? global will ich nich .. zu ville ...hm

Union 19. Apr 2013 10:37

AW: canvas wird überschrieben
 
Wie wär es denn mit einem Objekt für die Daten? Die Zeichenroutine arbeitet dann das von außen gefüllte Objekt ab. Oder das Objekt malt sich selber in einen Bitmap-Canvas und die Paintroutine mach dann nur noch ein Draw des Bitmaps.

Luckie 20. Apr 2013 20:52

AW: canvas wird überschrieben
 
Guck mal hier: http://michael-puff.de/Programmierun...enBitmap.shtml
Es ist performanter, wenn man auf ein Bitmap im Speicher zeichnet.

me57 21. Apr 2013 17:14

AW: canvas wird überschrieben
 
Ja danke auch hier ... mir ist auch eingefallen daß ich vor 8 Jahren mal sowas wie ein Kreativ-Programm in Delphi als Remake meines immer noch schönen Pascal - Programms
gestartet hatte ... damals funzte das ganz gut ... weil eben das Bitmap auf das ich malte nicht größer war als erlaubt wegen der damaligen Grafikkarte. Wenn ich heute das Programm starte und das Image auf meine gewünschte Größe setze funzt gar nix mehr ...

ich muß hier aber beifügen ...:ich arbeite noch antiquarisch mit Delphi Prof. 4 vielleicht ist das heute nicht mehr der Fall heutige Version 10?

Medium 21. Apr 2013 20:01

AW: canvas wird überschrieben
 
Über welche Größe reden wir hier denn? IMHO sind Windows Bitmaps auf 65536x65536 begrenzt, egal welche Delphi Version, und mindestens ab WinXP. Was heisst zudem "garnichts mehr"? Darstellungsfehler? Zugriffsfehler? Hangs? Mit derart schwammigen Aussagen wie du sie machst kann man leider nichts anfangen.

me57 22. Apr 2013 01:16

AW: canvas wird überschrieben
 
Ok - alles geht jetzt so wie ich mir das vorstelle. Habe in einem neuen Formular ein leeres Image. Auf dessen Canvas wird gezeichnet. Überlagernde Fenster haben keinen
Einfluß mehr ...Auch mit großem Image (1900x1600) kein Problem ... da war wohl noch was anderes falsch gelaufen ...
Vielen Dank nochmal für den Schubs ..


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 Uhr.

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