Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Bild in TImage auf dem Drucker ausdrucken (https://www.delphipraxis.net/208437-bild-timage-auf-dem-drucker-ausdrucken.html)

x86DOS 28. Jul 2021 20:27

Bild in TImage auf dem Drucker ausdrucken
 
Moin,

ich stehe vor einem Problem, zu dem es zwar viele beiträge gibt, aber die bei mir interessanterweise nicht fruchten wollen, oder ich habe einen zu großen Denkfehler.

Wenn ich nach Delphi TImage Drucken google, erhalte ich viele ergebnisse, auch aus dem Forum, mit jeder menge Code beispiele, aber all diese wollen bei mir nicht zum gewünschten Ergebnis führen.

Ich habe im TImage24 über die Eigenschaft Picture ein Bild Geladen, also nicht zur Laufzeit aus einer Datei und dieses möchte ich nun gerne auf meinem Drucker, zum Testen nutze ich einen PDF Printer, ausgeben.

leider bleibt das Blatt immer weiß.

Mein Code:
Code:
procedure TForm4.Button1Click(Sender: TObject);
var
  ScaleX, ScaleY: Integer;
  RR: TRect;
begin
  if PrintDialog1.Execute then
  begin
    //Printer.Title := 'Bild Drucken Delphi';
    Printer.Orientation := poPortrait;
    Printer.BeginDoc;
    Printer.Canvas.TextOut (0, 0, ' ');
    SetMapMode (Printer.Canvas.Handle, MM_LOMETRIC);
    Printer.Canvas.Font.Name := 'Arial';
    SetTextAlign (Handle, TA_LEFT + TA_TOP);
    Printer.Canvas.Font.Size := 8;
    Printer.Canvas.TextOut(200, -50, 'Test');
    try
      ScaleX := GetDeviceCaps(Printer.Handle, logPixelsX) div PixelsPerInch;
      ScaleY := GetDeviceCaps(Printer.Handle, logPixelsY) div PixelsPerInch;
      RR := Rect(0, 0, Image24.picture.Width * scaleX, Image24.Picture.Height * ScaleY);
      Printer.Canvas.StretchDraw(RR, Image24.Picture.Graphic);
    finally
    Printer.EndDoc;
    end;
  end
end;
Eventuell kann mir hier ja jemand bei meinem Problem helfen, bzw. Sieht wo mein Fehler liegt.

Nutze Embarcadero® Delphi 10.4 Version 27.0.40680.4203 als Community Edition

Mit freundlichem Gruß
x86DOS :)

TurboMagic 29. Jul 2021 21:39

AW: Bild in TImage auf dem Drucker ausdrucken
 
Woher kommt TImage24? WIe ist das definiert?
Ich kenne nur TImage...

philipp.hofmann 29. Jul 2021 21:43

AW: Bild in TImage auf dem Drucker ausdrucken
 
Folgender Code funktioniert bei mir tadellos (FMX-App unter Windows):

Delphi-Quellcode:
var
  image:TImage;
  txt:String;
  printDialog:TPrintDialog;
  ...
  image:=...;
  txt:='...';

  printDialog:=TPrintDialog.Create(nil);
  printDialog.FromPage:=1;
  printDialog.ToPage:=1;
  printDialog.MinPage:=1;
  printDialog.MaxPage:=1;
  printDialog.PrintRange := TPrintRange.prAllPages;
  if printDialog.Execute() Then
  begin
    Printer.Title:=txt;
    Printer.ActivePrinter;
    Printer.ActivePrinter.SelectDPI(600,600);
    Printer.Canvas.Fill.Color := TAlphaColors.Black;
    Printer.Canvas.Fill.Kind := TBrushKind.Solid;
    Printer.BeginDoc;
    Printer.Canvas.Font.Size:=120;
    Printer.Canvas.FillText(RectF(0,0,Printer.PageWidth,Printer.PageWidth/20),txt,True,1,[],TTextAlign.Leading,TTextAlign.Leading);
    Printer.Canvas.DrawBitmap(Image.bitmap,
                              RectF(0,0,Image.bitmap.Width,Image.bitmap.Height),
                              RectF(0,Printer.PageWidth/20,Printer.PageWidth/3,Printer.PageWidth/10+Printer.PageWidth/3),1,false);
    Printer.EndDoc;
  end;
  printDialog.Free();

x86DOS 31. Jul 2021 08:39

AW: Bild in TImage auf dem Drucker ausdrucken
 
Zitat:

Zitat von TurboMagic (Beitrag 1492981)
Woher kommt TImage24? WIe ist das definiert?
Ich kenne nur TImage...

Image24 ist das 24te Image Control auf der Form.


Zitat:

Zitat von philipp.hofmann (Beitrag 1492982)
Folgender Code funktioniert bei mir tadellos (FMX-App unter Windows):

Delphi-Quellcode:
var
  image:TImage;

    Printer.Canvas.DrawBitmap(Image.bitmap,
                              RectF(0,0,Image.bitmap.Width,Image.bitmap.Height),
                              RectF(0,Printer.PageWidth/20,Printer.PageWidth/3,Printer.PageWidth/10+Printer.PageWidth/3),1,false);

bei diesem Code schmeist mein Compiler die fehler, benötige ich dafür spezielle units? Hatte im Netz die Unit FMX.Graphics dazzu gefuden, aber wenn ich versuche die einzubinden, dann hab ich statt der 7 über 40 Fehler, die mir angezeigt werden.

Zitat:

[dcc32 Fehler] E2003 Undeklarierter Bezeichner: 'DrawBitmap'
[dcc32 Fehler] E2003 Undeklarierter Bezeichner: 'bitmap'
[dcc32 Fehler] E2003 Undeklarierter Bezeichner: 'RectF'

philipp.hofmann 31. Jul 2021 09:26

AW: Bild in TImage auf dem Drucker ausdrucken
 
Nein, du brauchst keine speziellen Units. Aber welcher Datentype ist denn dein Image. Bei mir ist es TImage aus FMX.Objects. Wenn es bei dir VCL-Image ist, dann passt dies natürlich nicht zusammen.

x86DOS 31. Jul 2021 09:53

AW: Bild in TImage auf dem Drucker ausdrucken
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1493032)
Nein, du brauchst keine speziellen Units. Aber welcher Datentype ist denn dein Image. Bei mir ist es TImage aus FMX.Objects. Wenn es bei dir VCL-Image ist, dann passt dies natürlich nicht zusammen.

Ah ok, ja VCL dürfte das bei mir sein. Das Image habe ich sowohl als png, als auch als jpg als auch als bmp geladen. brachte alles keinen Erfolg.

Zitat:

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ExpSoft,ShlObj, Vcl.Imaging.jpeg,
Vcl.ExtCtrls, Vcl.Imaging.pngimage, Vcl.StdCtrls, Printers;
Diese Units habe ich alle eingebunden.

Delbor 31. Jul 2021 10:47

AW: Bild in TImage auf dem Drucker ausdrucken
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi x86DOS

Zitat:

zum Testen nutze ich einen PDF Printer,
Welchen PDF-Printer? Ich kenne nur denjenigen von Windows, und der druckt erstmal in eine Datei.
Wenn du irgendwas in PDF speichern möchtest, kannst du dazu diesen Drucker verwenden. Aber Achtung: der ist Software, keine Hardware.
Wenn du diesen als "Druckermedium" auswählst und dann das Dokument mit deinem physischen Drucker ausgibst, hat dieser Drucker nichts zu drucken und gibt demnach ein leeres Blatt aus (Es sei denn, du hast die Canvas-Positionen(X,Y) nicht gespiegelt angegeben).
Der PDF-Printer aber macht getreulich seine Arbeit - nur, da er keine Angabe erhält, in welche (Pdf-)Datei er drucken soll, macht er wahrscheinlich das, was Windows in so einem Fall immer macht: er druckt ins Arbitsverzeichnis - und das kann irgendwo sein. Zum Abschluss noch zwei jpegs:

Anhang 54220
PDF-Drucker wählen

Anhang 54221
PDF-Drucker: Datei als Druckziel wählen

Der PDF-Drucker erstellt nun hier eine PDF-Datei.

Gruss
Delbor

Delbor 31. Jul 2021 11:10

AW: Bild in TImage auf dem Drucker ausdrucken
 
Hi x86DOS
Delphi-Quellcode:
var
  image:TImage;
  txt:String;
  printDialog:TPrintDialog;
  ...
  image:=...;
  txt:='...';

  printDialog:=TPrintDialog.Create(nil);
  printDialog.FromPage:=1;
  printDialog.ToPage:=1;
  printDialog.MinPage:=1;
  printDialog.MaxPage:=1;
  printDialog.PrintRange := TPrintRange.prAllPages;
  if printDialog.Execute() Then
  begin
    Printer.Title:=txt;
    Printer.ActivePrinter;
    Printer.ActivePrinter.SelectDPI(600,600);
    Printer.Canvas.Fill.Color := TAlphaColors.Black;
    Printer.Canvas.Fill.Kind := TBrushKind.Solid;
    Printer.BeginDoc;
    Printer.Canvas.Font.Size:=120;
    Printer.Canvas.FillText(RectF(0,0,Printer.PageWidth,Printer.PageWidth/20),txt,True,1,[],TTextAlign.Leading,TTextAlign.Leading);
    Printer.Canvas.DrawBitmap(Image.bitmap,
                              RectF(0,0,Image.bitmap.Width,Image.bitmap.Height),
                              RectF(0,Printer.PageWidth/20,Printer.PageWidth/3,Printer.PageWidth/10+Printer.PageWidth/3),1,false);
    Printer.EndDoc;
  end;
  printDialog.Free();
Und wo bestimmst du hier, welcher Drucker verwendet werden soll? Mit Printer.ActivePrinter jedenfalls nicht - in diesem Property ist der Drucker gespeichert, der zuletzt verwendet wurde, und das kann irgendeiner sein - oder eben der, den du verwendest, wenn du irgendwas ausdruckst. Falls seit dem letzten Windowsstart nichts gedruckt wurde, ist das der oberste Item in der Windows Druckerliste.
Es sei denn, du weist dem Property einen Drucker zu.

Gruss
Delbor

x86DOS 31. Jul 2021 11:20

AW: Bild in TImage auf dem Drucker ausdrucken
 
Zitat:

Zitat von Delbor (Beitrag 1493035)
Hi x86DOS

Zitat:

zum Testen nutze ich einen PDF Printer,
Welchen PDF-Printer?

Microsoft PDF Writer. der Simuliert einen Drucker und gibt die Ausgabe in einer PDF aus.

Zitat:

Zitat von Delbor (Beitrag 1493036)
Hi x86DOS
Und wo bestimmst du hier, welcher Drucker verwendet werden soll? Mit Printer.ActivePrinter jedenfalls nicht - in diesem Property ist der Drucker gespeichert, der zuletzt verwendet wurde, und das kann irgendeiner sein - oder eben der, den du verwendest, wenn du irgendwas ausdruckst. Falls seit dem letzten Windowsstart nichts gedruckt wurde, ist das der oberste Item in der Windows Druckerliste.
Es sei denn, du weist dem Property einen Drucker zu.

Gruss
Delbor

Code:
 if printDialog.Execute() Then
Hiermit bekomme ich das normale Drucker Layout von Windows angezeigt, bei dem ich auch auswählen kann, wo gedruckt werden soll.

mmw 31. Jul 2021 14:28

AW: Bild in TImage auf dem Drucker ausdrucken
 
hallo,

wenn die Graphic zuerst gedruckt wird, funkionierts.

Delphi-Quellcode:
var
  ScaleX, ScaleY: Integer;
  RR: TRect;
  map_mode: Integer;
begin
  if PrintDialog1.Execute then
  begin
    //Printer.Title := 'Bild Drucken Delphi';
    Printer.Orientation := poPortrait;
    Printer.BeginDoc;


    map_mode := GetMapMode(Printer.Canvas.Handle);

    Printer.Canvas.Font.Name := 'Arial';
    SetTextAlign(Handle, TA_LEFT + TA_TOP);
    Printer.Canvas.Font.Size := 8;
    Printer.Canvas.TextOut(200, -50, 'Test');

    try

    //SetMapMode(Printer.Canvas.Handle, map_mode);
      ScaleX := GetDeviceCaps(Printer.Handle, LOGPIXELSX) div PixelsPerInch;
      ScaleY := GetDeviceCaps(Printer.Handle, LOGPIXELSY) div PixelsPerInch;
      RR := Rect(0, 0, Image1.picture.Width * ScaleX, Image1.Picture.Height * ScaleY);
      Printer.Canvas.StretchDraw(RR, Image1.Picture.Graphic);

      Printer.Canvas.TextOut(0, 0, '');
      SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);
      Printer.Canvas.Font.Name := 'Arial';
      SetTextAlign(Handle, TA_LEFT + TA_TOP);
      Printer.Canvas.Font.Size := 8;
      Printer.Canvas.TextOut(200, -50, 'Test');

      Printer.EndDoc;

    except
      Printer.Abort
    end;
  end;

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 Uhr.
Seite 1 von 2  1 2      

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