Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Canvas als PDF speichern oder ausdrucken (https://www.delphipraxis.net/185892-canvas-als-pdf-speichern-oder-ausdrucken.html)

Tazidus 16. Jul 2015 01:28

Canvas als PDF speichern oder ausdrucken
 
Hallo,

ich suche ein Möglichkeit dem Benutzer die Wahl zu bieten, einen Canvas (Text/Tabelle) wahlweise als PDF zu speichern oder auszudrucken.

PDF's erstellen funktioniert über synpdf (Synopse). Das drucken funktioniert auch über Printers.

Nun habe ich das Problem, dass der "Canvas" gleich sein soll. Also der Text, den ich ausgeben will, nur einmal erstellen möchte.

Meine Idee war, eine Radiobutton oder eine Combobox zu nehmen und dann während des eigentlichen Druck-Erstellungs-Vorgang eine Unterscheidung vorzunehmen.
Die Erstellung von PDF und Druck-Canvas sind etwas unterschiedlich aber soweit kein Problem.
Das eigentliche Erstellen will ich aber nicht doppelt anlegen.

Meine Idee daher eine Fallunterscheidung zu realisieren.
Beispiel:

PDF: lPdf.Canvas.TextOut( 300, 700, 'Dies ist ein Test-Text');
Drucker: Printer.Canvas.TextOut( 300, 700, 'Dies ist ein Test-Text');

Ich habe schon etwas rum experimentiert, weiß aber nicht mehr weiter.

Daher meine Frage: Kann mir einer helfen, wie ich die Fallunterscheidung hin bekomme und den Canvas nur einmal erstellen muss?

Danke
Gruß
Daniel

Sir Rufo 16. Jul 2015 01:36

AW: Canvas als PDF speichern oder ausdrucken
 
Vielleicht so?
Delphi-Quellcode:
procedure PrintOnCanvas(ACanvas: TCanvas);
begin
  ACanvas.TextOut( 300, 700, 'Dies ist ein Test-Text');
end;

procedure PrintPdf;
begin
  PrintOnCanvas( lPdf.Canvas );
end;

procedure PrintOnPrinter;
begin
  PrintOnCanvas( Printer.Canvas );
end;

Tazidus 16. Jul 2015 15:23

AW: Canvas als PDF speichern oder ausdrucken
 
Hallo,

vielen Dank für die schnelle Antwort.
Der Lösungsansatz sieht recht gut aus.
Werde ich sofort mal ausprobieren.

Gruß
Daniel

Tazidus 16. Jul 2015 16:53

AW: Canvas als PDF speichern oder ausdrucken
 
Hallo,

die Lösung sah gut aus, leider kommt eine Fehlermeldung

E2010 Inkompatible Typen: 'TCanvas' und 'TPdfCanvas'

So wie es aussieht, muss ich dann doch alles doppelt machen.
Schade.

Oder hat noch einer eine Lösung?

Gruß
Daniel

TiGü 16. Jul 2015 17:04

AW: Canvas als PDF speichern oder ausdrucken
 
Von welchen Klassen ist denn TPdfCanvas abeleitet?
Suche den gemeinsamen Vorfahren zu TCanvas!

Mavarik 16. Jul 2015 19:21

AW: Canvas als PDF speichern oder ausdrucken
 
Zitat:

Zitat von Tazidus (Beitrag 1308931)
So wie es aussieht, muss ich dann doch alles doppelt machen.
Schade.

Natürlich nicht... Wir machen das seit Jahren so..

Sir Rufo 16. Jul 2015 22:57

AW: Canvas als PDF speichern oder ausdrucken
 
Da fällt es mir gerade wie Schuppen aus den Haaren,
Delphi-Quellcode:
TPdfCanvas
wird direkt von
Delphi-Quellcode:
TObject
abgeleitet (oder was auch immer), auf jeden Fall nicht von
Delphi-Quellcode:
TCanvas
...

Also muss eine abstrakte Klasse her und je eine konkrete Ableitung für
Delphi-Quellcode:
TCanvas
und eine für
Delphi-Quellcode:
TPdfCanvas
. Dann schreibt man alles nur einmal ;)

Luckie 17. Jul 2015 00:00

AW: Canvas als PDF speichern oder ausdrucken
 
Klingt nach einem Fall für Vererbung.

Sir Rufo 17. Jul 2015 01:35

AW: Canvas als PDF speichern oder ausdrucken
 
Klingt nach dem Adapter-Pattern: Adapter mit Delegation (Objektadapter)
Delphi-Quellcode:
unit Unit1;

interface

uses
  System.Classes,
  Vcl.Graphics,
  SynPdf;

type
  ICanvas = interface
    ['{F4E825EF-5ADF-42AB-B5E1-8CF82BA5DCDB}']
    procedure TextOut( X: Integer; Y: Integer; const Text: string );
  end;

  TVclCanvas = class( TInterfacedObject, ICanvas )
  private
    FCanvas: TCanvas;
  public
    constructor Create( ACanvas: TCanvas );
    procedure TextOut( X: Integer; Y: Integer; const Text: string );
  end;

  TSynPdfCanvas = class( TInterfacedObject, ICanvas )
  private
    FCanvas: TPdfCanvas;
  public
    constructor Create( ACanvas: TPdfCanvas );
    procedure TextOut( X: Integer; Y: Integer; const Text: string ); override;
  end;

implementation

{ TVclCanvas }

constructor TVclCanvas.Create( ACanvas: TCanvas );
begin
  inherited Create;
  FCanvas := ACanvas;
end;

procedure TVclCanvas.TextOut( X, Y: Integer; const Text: string );
begin
  FCanvas.TextOut( X, Y, Text );
end;

{ TSynPdfCanvas }

constructor TSynPdfCanvas.Create( ACanvas: TPdfCanvas );
begin
  inherited Create;
  FCanvas := ACanvas;
end;

procedure TSynPdfCanvas.TextOut( X, Y: Integer; const Text: string );
begin
  FCanvas.TextOut( X, Y, Text );
end;

end.
und in der Anwendung selber:
Delphi-Quellcode:
procedure PrintOnCanvas(ACanvas: ICanvas);
begin
  ACanvas.TextOut( 300, 700, 'Dies ist ein Test-Text');
end;

procedure PrintPdf;
var
  LCanvas: ICanvas;
begin
  LCanvas := TSynPdfCanvas.Create( lPdf.Canvas );
  PrintOnCanvas( LCanvas );
end;

procedure PrintOnPrinter;
var
  LCanvas: ICanvas;
begin
  LCanvas := TVclCanvas.Create( lPdf.Canvas );
  PrintOnCanvas( LCanvas );
end;
Das immer nach dem Motto
Zitat:

Was nicht passt, wird passend gemacht!

Tazidus 17. Jul 2015 14:44

AW: Canvas als PDF speichern oder ausdrucken
 
Hallo,

vielen Dank für die vielen Anregungen.


Die Lösung - Teil 1: TPdfDocumentGDI.VCLCanvas

Wenn ich nun lPdf:TPdfDocumentGDI setze/definiere,
und lPdf mit TPdfDocumentGDI.Create erzeuge,
gibt es mit lPDF.VCLCanvas ein Konstrukt, welches TCanvas ist.

Somit kann ich nun die gleichen Sachen machen mit lPDF.VCLCanvas und Printer.Canvas.

So kann man dann in etwas anderer Form
Code:
procedure PrintOnCanvas(ACanvas: TCanvas);
begin
  ACanvas.TextOut( 300, 700, 'Dies ist ein Test-Text');
end;

procedure PrintPdf;
begin
  PrintOnCanvas( lPdf.VCLCanvas );
end;

procedure PrintOnPrinter;
begin
  PrintOnCanvas( Printer.Canvas );
end;
benutzen.

Nun stehe ich aber vor dem nächsten Problem.

PageBreak / NewPage oder wie es auch heißt ist nicht Methode von einem Canvas.

Lösung hier: derzeit noch offen.

Gruß
Daniel


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