Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi nach dem Drucken alles spiegelverkehrt ???? (https://www.delphipraxis.net/99673-nach-dem-drucken-alles-spiegelverkehrt.html)

guitar1 15. Sep 2007 23:37


nach dem Drucken alles spiegelverkehrt ????
 
hi,

ich drucke mit folgendem Code, ein TImage, welches ich auch als Druckvorschau verwende
Delphi-Quellcode:
  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;
es klappt auch alles soweit das es ausgedruckt wird, jedoch ist alles spiegelverkehrt!!
Was mach ich denn falsch?? in der Druckansicht ist alles perfekt richtig.

grüße
guitar1

Muetze1 16. Sep 2007 12:18

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...

SirThornberry 16. Sep 2007 12:21

Re: nach dem Drucken alles spiegelverkehrt ????
 
es ist ganz normal das es spiegelverkehrt ist schließlich setzt du mit MM_LOMETRIC MapMode entsprechend.

guitar1 16. Sep 2007 12:56

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

DeddyH 16. Sep 2007 13:05

Re: nach dem Drucken alles spiegelverkehrt ????
 
Schau mal hier

guitar1 16. Sep 2007 13:37

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 ^^

bitsetter 16. Sep 2007 19:38

Re: nach dem Drucken alles spiegelverkehrt ????
 
Zitat:

Zitat von guitar1
Wie das mit der Freigabe des Images geht würde ich aber trozdem ganz gern noch wissen ^^

Hi,
da deine Funktion ein Objekt zurückliefert wird wahrscheinlich ein Speicherleck erzeugt werden.

Dazu gab es schon mal eine Diskussion. Funktionsrückgabe freigeben

guitar1 17. Sep 2007 13:51

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;

Muetze1 17. Sep 2007 16:24

Re: nach dem Drucken alles spiegelverkehrt ????
 
Zitat:

Zitat von guitar1
..., aber der Speicher wird nicht freigegeben?!?!

Woher hast du diese Erkenntnis? Bzw. wodrauf stützt sie sich?

guitar1 17. Sep 2007 19:05

Re: nach dem Drucken alles spiegelverkehrt ????
 
@Muetze1:
Das kann man eindeutig im taskmanager erkennen.


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