![]() |
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; |
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.
|
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:
durch
Canvas := TCanvas.Create;
Canvas.Handle := Backpuffer.Canvas.Handle; canvas.pen.color := cllime; Canvas.Rectangle(10,10,50,random(60)+10); canvas.Free;
Delphi-Quellcode:
ersetzte habe ich keine Fehler mehrBackpuffer.canvas.pen.color := cllime; Backpuffer.Canvas.Rectangle(10,10,50,random(60)+10); Aufruf und zeichen eines Textes ist übrigens so (in einem Timer):
Delphi-Quellcode:
Object.draw(FBackpuffer)
FBackpuffer.Canvas.textout(5,5,'jkgkj'); |
Re: Grafikfehlern und TCanvas
Delphi-Quellcode:
Sollte vor Free nicht Canvas.Handle:=0 sein? :gruebel:
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; Zumindest mach ich das immer so. |
Re: Grafikfehlern und TCanvas
das habe ich auch schon getestet hilft leider nicht.
|
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 18:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz