AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Bild in TImage auf dem Drucker ausdrucken

Ein Thema von x86DOS · begonnen am 28. Jul 2021 · letzter Beitrag vom 1. Aug 2021
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von x86DOS
x86DOS

Registriert seit: 19. Jan 2019
7 Beiträge
 
Delphi 10.4 Sydney
 
#1

Bild in TImage auf dem Drucker ausdrucken

  Alt 28. Jul 2021, 21:27
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
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
1.699 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Bild in TImage auf dem Drucker ausdrucken

  Alt 29. Jul 2021, 22:39
Woher kommt TImage24? WIe ist das definiert?
Ich kenne nur TImage...
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
590 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Bild in TImage auf dem Drucker ausdrucken

  Alt 29. Jul 2021, 22:43
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();
  Mit Zitat antworten Zitat
Benutzerbild von x86DOS
x86DOS

Registriert seit: 19. Jan 2019
7 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Bild in TImage auf dem Drucker ausdrucken

  Alt 31. Jul 2021, 09:39
Woher kommt TImage24? WIe ist das definiert?
Ich kenne nur TImage...
Image24 ist das 24te Image Control auf der Form.


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'
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
590 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Bild in TImage auf dem Drucker ausdrucken

  Alt 31. Jul 2021, 10:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von x86DOS
x86DOS

Registriert seit: 19. Jan 2019
7 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Bild in TImage auf dem Drucker ausdrucken

  Alt 31. Jul 2021, 10:53
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.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.075 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Bild in TImage auf dem Drucker ausdrucken

  Alt 31. Jul 2021, 11:47
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:

ms-pdf-drucker-1.jpg
PDF-Drucker wählen

druck-speichern-unter.jpg
PDF-Drucker: Datei als Druckziel wählen

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

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (31. Jul 2021 um 11:52 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.075 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Bild in TImage auf dem Drucker ausdrucken

  Alt 31. Jul 2021, 12:10
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von x86DOS
x86DOS

Registriert seit: 19. Jan 2019
7 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Bild in TImage auf dem Drucker ausdrucken

  Alt 31. Jul 2021, 12:20
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.

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.
  Mit Zitat antworten Zitat
mmw

Registriert seit: 10. Sep 2019
Ort: OWL
192 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Bild in TImage auf dem Drucker ausdrucken

  Alt 31. Jul 2021, 15:28
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ß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf