![]() |
nach dem Drucken alles spiegelverkehrt ????
hi,
ich drucke mit folgendem Code, ein TImage, welches ich auch als Druckvorschau verwende
Delphi-Quellcode:
es klappt auch alles soweit das es ausgedruckt wird, jedoch ist alles spiegelverkehrt!!
function DruckCanvas(Width, Height: Integer): TImage;// ist in einer andern unit aber das sollte ja nicht stören
... if PrintDialog1.Execute then begin Printer.Title:= CboxFormularart.Text+' '+LabNr.Caption; Printer.BeginDoc; SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); Printer.Canvas.Draw(0, GetDeviceCaps(Printer.Handle,VERTSIZE)*-10, FormDruckansicht.DruckCanvas(GetDeviceCaps(Printer.Handle, HORZSIZE)*10, GetDeviceCaps(Printer.Handle, VERTSIZE)*10).Picture.Graphic); Printer.EndDoc end; Was mach ich denn falsch?? in der Druckansicht ist alles perfekt richtig. grüße guitar1 |
Re: nach dem Drucken alles spiegelverkehrt ????
1. Deine Funktion erzeugt ein TImage welches du niemals wieder freigibst und somit ein grosses Speicherleck erzeugt.
2. Die BitBlt() Funktion spiegelt das Bild, wenn die Höhen- bzw. Weitenangabe negativ sind. Nun ist die Frage ob das BitBlt() VCL intern irgendwo aufgerufen wird, oder du das irgendwo machst. Daher erstmal die Frage: kann es zu einer negativen Weitenangabe bei deinem Code kommen? /EDIT: SirThornberry hat natürlich Recht. Das habe ich total übersehen. Grundsätzlich bleibt aber immernoch Punkt 1 zu beachten... |
Re: nach dem Drucken alles spiegelverkehrt ????
es ist ganz normal das es spiegelverkehrt ist schließlich setzt du mit MM_LOMETRIC MapMode entsprechend.
|
Re: nach dem Drucken alles spiegelverkehrt ????
das ist ja schön und gut, dass es "richtig" gedruckt wird, aber was kann ich gegen das spiegelverkehrte machen? ich muss ja MM_LOMETRIC nehmen sonst hab ichs ja nur ganz winzig! oder gibts da noch nenn anderen MapMode der angaben im metrischem system versteht und die koordinaten richtig setzt?
@Muetze1: wie gebe ich das image denn wieder frei? also mit .Free ist mir schon klar, aber wo muss ich das setzen? Und kann so ein Speicherleck dazuführen das eine fehlermeldung : "Das System konnte die angegebene Datei nicht finden." auftritt wenn ich auf MM_HIMETRIC umstelle? mfg guitar1 //EDIT: Tippfehler ausgebessert |
Re: nach dem Drucken alles spiegelverkehrt ????
Schau mal
![]() |
Re: nach dem Drucken alles spiegelverkehrt ????
@ DeddyH:
Vielen dank, jetzt ist zumindest alles richtig rum. Wie das mit der Freigabe des Images geht würde ich aber trozdem ganz gern noch wissen ^^ |
Re: nach dem Drucken alles spiegelverkehrt ????
Zitat:
da deine Funktion ein Objekt zurückliefert wird wahrscheinlich ein Speicherleck erzeugt werden. Dazu gab es schon mal eine Diskussion. ![]() |
Re: nach dem Drucken alles spiegelverkehrt ????
hi
@bitsetter: erstmal danke für den Link, ich habe alles so gemacht, wie es dort beschrieben war, also die function zu einer procedure mit const parameter gemacht, ich habe auch das .Free nicht vergessen, und auch die Anzeige funktioniert einwandfrei, aber der Speicher wird nicht freigegeben?!?! Hier mal ein bisschen Code:
Delphi-Quellcode:
//Zum Drucken:
if PrintDialog1.Execute then begin Printer.Title:= CboxFormularart.Text+' '+LabNr.Caption; Printer.BeginDoc; SetMapMode(Printer.Canvas.Handle, MM_ANISOTROPIC); x:= GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH); y:= GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT); SetWindowExtEx(Printer.Canvas.Handle,x,y,Nil); SetViewportExtEx(Printer.Canvas.Handle,x,y,Nil); DrCanvas := TImage.Create(self); FormDruckansicht.DruckCanvas(DrCanvas,x,y); Printer.Canvas.Draw(0-GetDeviceCaps(Printer.Canvas.Handle, PHYSICALOFFSETX), 0-GetDeviceCaps(Printer.Canvas.Handle, PHYSICALOFFSETY), DrCanvas.Picture.Graphic); DrCanvas.Free; Printer.EndDoc; end; //Als Druckvorschau: DrCanvas := TImage.Create(self); try DruckCanvas(DrCanvas ,width, height); Image1.Canvas.Draw(0,0, DrCanvas.Picture.Graphic); finally DrCanvas.Free; end; |
Re: nach dem Drucken alles spiegelverkehrt ????
Zitat:
|
Re: nach dem Drucken alles spiegelverkehrt ????
@Muetze1:
Das kann man eindeutig im taskmanager erkennen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 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