Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Grafikfehlern und TCanvas (https://www.delphipraxis.net/81303-grafikfehlern-und-tcanvas.html)

Gandalfus 24. Nov 2006 13:43


Grafikfehlern und TCanvas
 
Folgender Code führt zu Grafikfehlern. Farben und Schriftgrösse ändern sich, wenn man mit der Maus das Fformular verlässt. (und nach dem Aufruf der Methode nach auf das Bild zeichnet).
Der Code ist gekürtzt. Ich möchte eigendlich an eine dll nur den Canvas Handle weitergeben.
Delphi-Quellcode:
procedure TKlasse.draw(var Backpuffer: TBitmap
var
  Canvas: TCanvas;
begin

  Canvas := TCanvas.Create;
  Canvas.Handle := Backpuffer.Canvas.Handle;//!!!
  canvas.pen.color := cllime;
  Canvas.Rectangle(10,10,50,random(60)+10);
  canvas.Free;

end;

SirThornberry 24. Nov 2006 14:07

Re: Grafikfehlern und TCanvas
 
Also Backbuffer muss nicht als "var" übergeben werden da TBitmap ein Object ist und somit nur ein Pointer (Objectinstanz-Pointer) auf das Object übergeben wird. An dem Code kann ich soweit nichts erkennen was nicht stimmen sollte. Entweder du hast hier den entscheidenten Teil weg gelassen oder der Fehler liegt in der anderen Funktion. Wenn du mit DLL's arbeitest ohne SharedMem solltest du nur das Handle übergeben (wie du ja bereits planst) und nicht das ganze Object.

Gandalfus 24. Nov 2006 15:02

Re: Grafikfehlern und TCanvas
 
Der Fehler liegt an der Stelle. Also die Schriftgrösse ändert sich von 8 auf 12 ohne das ich das irgendwo eingestellt habe. (Das habe ich durch suchen überpruft in meinem gesamten code wird nicht einmal die Schriftgrösse verändert).
Ich gehe davon auss, dass wenn ich das verändern der Schriftgrösse verhindere ich auch das Farben Problem löse.

Wenn ich den Code
Delphi-Quellcode:
Canvas := TCanvas.Create;
Canvas.Handle := Backpuffer.Canvas.Handle;
canvas.pen.color := cllime;
Canvas.Rectangle(10,10,50,random(60)+10);
canvas.Free;
durch
Delphi-Quellcode:
 
Backpuffer.canvas.pen.color := cllime;
Backpuffer.Canvas.Rectangle(10,10,50,random(60)+10);
ersetzte habe ich keine Fehler mehr

Aufruf und zeichen eines Textes ist übrigens so (in einem Timer):
Delphi-Quellcode:
Object.draw(FBackpuffer)
FBackpuffer.Canvas.textout(5,5,'jkgkj');

Sunlight7 24. Nov 2006 15:10

Re: Grafikfehlern und TCanvas
 
Delphi-Quellcode:
procedure TKlasse.draw(var Backpuffer: TBitmap
var
  Canvas: TCanvas;
begin

  Canvas := TCanvas.Create;
  Canvas.Handle := Backpuffer.Canvas.Handle;//!!!
  canvas.pen.color := cllime;
  Canvas.Rectangle(10,10,50,random(60)+10);
  canvas.Free; // Damit löscht Du das Canvas Handle vom Bitmap

end;
Sollte vor Free nicht Canvas.Handle:=0 sein? :gruebel:
Zumindest mach ich das immer so.

Gandalfus 24. Nov 2006 17:45

Re: Grafikfehlern und TCanvas
 
das habe ich auch schon getestet hilft leider nicht.

Muetze1 24. Nov 2006 20:15

Re: Grafikfehlern und TCanvas
 
1. Du musst das Handle vorher auf 0 setzen, sonst wird wirklich das DC Handle des Bitmaps freigegeben mit der TCanvas Instanz.
2. Wenn du nur ein DC Handle übergibst, dann ermittelt sich das TCanvas sofort bei der Zuweisung alle Einstellungen des DC's und setzt seine Eigenschaften um. Von daher wird bei der nächsten Operation eher die Eigenschaft des TCanvas genutzt. Wenn also ein TCanvas einen default Font-Höhe von 12 hat, dann wird diese Höhe genommen beim TextOut und nicht die von dem DC Handle was du übergeben hast.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 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