Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Drucken auf Plotter mit TPrinter (https://www.delphipraxis.net/143416-drucken-auf-plotter-mit-tprinter.html)

Computerbabalulu 15. Nov 2009 17:17


Drucken auf Plotter mit TPrinter
 
Hallo ihr lieben.


Ich habe ein Problem und komme nicht weiter!

Ich Drucke aus meine Programm heraus auf verschiedenen Plottern (das möchte ich jedenfalls).
Für jeden Plotter gibt es einen eigenen Thread der das Ausdrucken übernimmt.

Bein Starten des Threads wird jeweils ein neues Druckerobjekt erzeugt
Delphi-Quellcode:
Drucker:= TPrinter.create
Dann wird mit
Delphi-Quellcode:
Drucker.PrinterIndex:=xxx
der entsprechende Plotter zugewiesen.

Nun wird ganz normal mir
Delphi-Quellcode:
with Drucker do begin
 BeginDoc;
 ..................
 EndDoc;
end;
der Druck abgewickelt.
Wenn ich das ganze mit dem Standard Printer Objekt Printer mache,
funktioniert es einwandfrei. Wenn ich es mit dem zur Laufzeit erzeugtem
Drucker mache klappt es nicht, da das Objekt Drucker offensichtlich die Druckereinstellungen
(Papiergröß, Papiertype usw.) nicht kennt.

Wieso ist das so, dass mein Standard Printer Objekt die Daten vom Drucker kennt
und das von mir zur Laufzeit angelegte Drucker Objekt nicht?
Und vorallem wie kann ich das ändern? Ich möchte hier keine Daten angeben sondern
die einstellungen so übernehmen wie Sie im Druckersetup des Treibers grade eingestellt sind.

Hier mal der Thread:

Delphi-Quellcode:
unit PEngine1;

interface

uses
   Classes, SysUtils, stdctrls, comctrls,GR32_Image, ExtCtrls,
   Messages, Variants, Graphics, Forms, Dialogs, Printers,
   GR32, JPEG,WinSpool;

type
  Engine1 = class(TThread)
  public
    constructor Create(PRN : Integer; Viewer : TImage32);
  private
    { Private-Deklarationen } 
    PIndex   : Integer;
    IViewer  : TImage32;
    Drucker  : TPrinter;
  protected
    procedure Execute; override;
    procedure PrintImage(Datei: string; O,L,H,B: Integer);
    procedure Preprint(PCanvas: TCanvas; px1: Integer; py1: Integer;
                  px2: Integer; py2: Integer; Datei: string);
    procedure Drucken;
    end;

implementation

uses Main, Controls;

{ Engine1 } 
constructor Engine1.Create(PRN : Integer; Viewer : TImage32);
begin
   PIndex := PRN;
   IViewer := Viewer;
   FreeOnTerminate := True;
  inherited Create(True);
end;


procedure Engine1.Preprint(PCanvas: TCanvas; px1: Integer; py1: Integer;
          px2: Integer; py2: Integer; Datei: string);
var
  gra : Tbitmap32;
begin
   IViewer.Visible:= false;
   IViewer.Bitmap.LoadFromFile(Datei);
   IViewer.Visible:= true;
   gra := Tbitmap32.Create;
   gra.LoadFromFile(Datei);
   //gra.ResamplerClassName := 'TLinearResampler';
   gra.ResamplerClassName := 'TKernelResampler';
   gra.DrawTo(pcanvas.Handle, Rect(px1,py1,px2,py2), gra.BoundsRect);
   gra.Free;
end;
procedure Engine1.PrintImage(Datei: string; O,L,H,B: Integer);
begin
    Drucker:= TPrinter.Create;
    Drucker.PrinterIndex:=PIndex;
    with Drucker do
     begin
      BeginDoc;
      PrePrint(Canvas,O,L,H,B,Datei);
     EndDoc;
    end;
end;

procedure Engine1.Execute;
begin
  Synchronize(Drucken);
end;

procedure Engine1.Drucken;
begin
  PrintImage('I:\Test\Image1p.jpg', 0,0,16064,9686);
end;

end.

Gruß Baba

Computerbabalulu 15. Nov 2009 20:46

Re: Drucken auf Plotter mit TPrinter
 
Hat sich erledigt, ich komme wohl nicht drum rum dem Drucker Objekt die Daten zu übergeben.

Wem es interessiert ...

Einstellungen des aktuellen Standartdruckers auslesen...

Delphi-Quellcode:
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port  : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
begin
  //Default Printer oder hier mit Printer.PrinterIndex:=xxx einen bestimmten Drucker wählen
  Printer.GetPrinter(Device, Driver, Port, hDMode);
  if hDMode <> 0 then begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin
    Memo1.Lines.Add('DmSize : ' + IntToStr(pDMode^.dmSize));
    Memo1.Lines.Add('dmDriverExtra : ' + IntToStr(pDMode^.dmDriverExtra));
    Memo1.Lines.Add('dmFields : ' + IntToStr(pDMode^.dmFields));
    Memo1.Lines.Add('dmOrientation : ' + IntToStr(pDMode^.dmOrientation));
    Memo1.Lines.Add('dmPaperSize : ' + IntToStr(pDMode^.dmPaperSize));
    Memo1.Lines.Add('dmPaperLength : ' + IntToStr(pDMode^.dmPaperLength));
    Memo1.Lines.Add('dmPaperWidth :' + IntToStr(pDMode^.dmPaperWidth));
    Memo1.Lines.Add('dmScale : ' + IntToStr(pDMode^.dmScale));
    Memo1.Lines.Add('dmCopies : ' + IntToStr(pDMode^.dmCopies));
    Memo1.Lines.Add('dmDefaultSource : ' + IntToStr(pDMode^.dmDefaultSource));
    Memo1.Lines.Add('dmPrintQuality : ' + IntToStr(pDMode^.dmPrintQuality));
    Memo1.Lines.Add('dmColor : ' + IntToStr(pDMode^.dmColor));
    Memo1.Lines.Add('dmDuplex : ' + IntToStr(pDMode^.dmDuplex));
    Memo1.Lines.Add('dmYResolution : ' + IntToStr(pDMode^.dmYResolution));
    Memo1.Lines.Add('dmTTOption : ' + IntToStr(pDMode^.dmTTOption));
    Memo1.Lines.Add('dmCollate : ' + IntToStr(pDMode^.dmCollate));
    Memo1.Lines.Add('dmLogPixels : ' + IntToStr(pDMode^.dmLogPixels));
    Memo1.Lines.Add('dmBitsPerPel : ' + IntToStr(pDMode^.dmBitsPerPel));
    Memo1.Lines.Add('dmPelsWidth : ' + IntToStr(pDMode^.dmPelsWidth));
    Memo1.Lines.Add('dmPelsHeight : ' + IntToStr(pDMode^.dmPelsHeight));
    Memo1.Lines.Add('dmDisplayFlags : ' + IntToStr(pDMode^.dmDisplayFlags));
    Memo1.Lines.Add('dmDisplayFrequency : ' + IntToStr(pDMode^.dmDisplayFrequency));
    Memo1.Lines.Add('dmMediaType : ' + IntToStr(pDMode^.dmMediaType));
    Memo1.Lines.Add('dmDitherType : ' + IntToStr(pDMode^.dmDitherType));
    Memo1.Lines.Add('dmICCManufacturer : ' + IntToStr(pDMode^.dmICCManufacturer));
    Memo1.Lines.Add('dmICCModel : ' + IntToStr(pDMode^.dmICCModel));
    Memo1.Lines.Add('dmPanningWidth : ' + IntToStr(pDMode^.dmPanningWidth));
    Memo1.Lines.Add('dmICMIntent : ' + IntToStr(pDMode^.dmPanningHeight));

    GlobalUnlock(hDMode);
   end;
  end;
end;

Einstellungen des aktuellen Standartdruckers schreiben...

Delphi-Quellcode:
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port  : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
begin

   //Default Printer oder hier mit Printer.PrinterIndex:=xxx einen bestimmten Drucker wählen
  Printer.GetPrinter(Device, Driver, Port, hDMode);

  if hDMode <> 0 then
  begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then
    begin
     {Set to custom Settings}
      pDMode^.dmFields := pDMode^.dmFields or
                          DM_PAPERSIZE or
                          DM_SCALE or
                          DM_ORIENTATION or
                          DM_DEFAULTSOURCE or
                          DM_PRINTQUALITY or
                          DM_COLOR or
                          DM_PAPERWIDTH or
                          DM_PAPERLENGTH or
                          DM_MEDIATYPE or
                          DM_DITHERTYPE;

       pDMode^.dmPaperSize := 256;
       pDMode^.dmScale := 100;
       pDMode^.dmOrientation:= 2;
       pDMode^.dmDefaultSource:= 400;
       pDMode^.dmPrintQuality:= 600;
       pDMode^.dmColor:= 2;
       pDMode^.dmPaperWidth := 4320;
       pDMode^.dmPaperLength := 6950;
       pDMode^.dmMediaType:=1;
       pDMode^.dmDitherType:=2;
      GlobalUnlock(hDMode);
    end;
  end;
end;
Gruß Baba


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