AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TPrinter: Portrait auf Landscape umzuschalten
Thema durchsuchen
Ansicht
Themen-Optionen

TPrinter: Portrait auf Landscape umzuschalten

Ein Thema von tomkupitz · begonnen am 29. Jun 2019 · letzter Beitrag vom 14. Nov 2021
Antwort Antwort
Seite 2 von 3     12 3      
Schokohase
(Gast)

n/a Beiträge
 
#11

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 30. Jun 2019, 20:49
Das Problem ist ganz woanders ...

In der Vcl.Dialogs wird die Unit Vcl.Printers verwendet. Da aber jetzt das Interface der Unit Vcl.Printers verändert wurde (neue Methoden) kommt der Kompiler/Linker damit nicht mehr klar (weil die vorkompilierte Vcl.Dialogs verwendet wird) und produziert diesen seltsamen Fehler.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
702 Beiträge
 
Delphi 12 Athens
 
#12

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 1. Jul 2019, 11:04
Ich habe mal Folgendes in Printers.pas eingebaut:
Mach das nicht, es ist nie eine gute Idee, eine der Delphi source files direkt zu verändern. Das führt zu Problemen mit anderen RTL/VCL units, die dann eventuell auch neu kompiliert werden müssen, was dann nur geht, wenn Du die Verzeichnisse mit den Sourcefiles in den search path mit aufnimmst, was dann eine ganze Lawine von anderen Versionkonflikten nach sich ziehen kann.

Mach eine Kopie der vcl.printer.pas Datei und benenne die Unit um. Modifiziere diese Datei und verwende sie dann anstelle von vcl.printers in deinem Projekt.
Peter Below
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
339 Beiträge
 
Delphi 12 Athens
 
#13

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 1. Jul 2019, 11:25
vcl.printer.pas ist natürlich eine Kopie im lokalen Projektverzeichnis. Originale Units ändere ich nie.

Aber die Probleme mit der vcl.printer.pas-Kopie sind so einfach nicht lösbar.

Peter: Ich werde mir mal dein Beispiel ansehen.

Danke an alle und beste Grüße
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#14

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 1. Jul 2019, 14:14
Hallo,

Ich habe es geschafft noch mal in meine alten Sourcen zu schauen. Tatsächlich habe ich damals nicht nur die kopierte (Vcl.)Printer.pas anders benannt, sonder auch die Klassen, Typen und Konstanten umbenannt. Eigentlich sieht mir das jetzt mehr wie nachprogrammiert (was ich heute nicht mehr machen würde) aus.
Wenn man auf das TPrinter. PageNumber verzichten kann, ist Peter’s Variante mitunter einfacher. Es kommt auf die Umgebung an.
Ich bin jetzt noch auf eine Idee gekommen um das Problem mit abhängigen Units zu umgehen.

Delphi-Quellcode:
unit Vcl.Printers.Help;

interface

uses
  System.Classes;

var
  OnPrinterBetweenPage: TNotifyEvent;

implementation

end.
Delphi-Quellcode:
unit Vcl.Printers;
...
implementation

uses
...
  Vcl.Consts,
  Vcl.Printers.Help;
...
procedure TPrinter.NewPage;
begin
  CheckPrinting(True);
  EndPage(DC);
  if Assigned(OnPrinterBetweenPage) then
    OnPrinterBetweenPage(self);
  StartPage(DC);
  Inc(FPageNumber);
  Canvas.Refresh;
end;
Damit bleibt der Interface-Abschnitt von Vcl.Printers unverändert. Man würde dann vor dem Drucken dem OnPrinterBetweenPage eine Methode zuweisen und in dieser wenn nötig das Umschalten der Ausrichtung erledigen.

einbeliebigername.
Mit freundlichen Grüßen, einbeliebigername.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#15

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 1. Jul 2019, 15:18
Moin...
Zitat:
gibt es eine Möglichkeit innerhalb eines Druckauftrages von Portrait auf Landscape umzuschalten?
In den heutigen Zeiten von FastReport (in Delphi dabei und hat mit der Problemstellung keine Probleme ) und Co. auf TPrinter zurückzugreifen ist imho "OldSchool" Wäre ein Reportgenenerator eine Alternative?
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
339 Beiträge
 
Delphi 12 Athens
 
#16

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 2. Jul 2019, 11:14
Eine Lösung ist folgende Helper Klasse, die in die Vcl.Printers.pas eingebaut werden muss:

Delphi-Quellcode:
  ...

  TPrinterHelper = class Helper for TPrinter
  public
    procedure NewPageEx(Orientation: Integer);
  end;
  ...

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinterHelper.NewPageEx(Orientation: Integer);
begin
  CheckPrinting(True);
  EndPage(DC);

  FDevMode^.dmOrientation:=Orientation; //DMORIENT_PORTRAIT DMORIENT_LANDSCAPE

  if ResetDC(Canvas.Handle, FDevMode^)=0 then
    Exit;

  StartPage(DC);
  Inc(FPageNumber);
  Canvas.Refresh;
end;
Aufruf dann:

Delphi-Quellcode:
procedure TForm1.FormClick(Sender: TObject);
begin
  Printer.Orientation:=poPortrait;

  Printer.BeginDoc;

  Printer.Canvas.TextOut(100, 100, 'Seite 1');

  Printer.NewPageEx(DMORIENT_LANDSCAPE);

  Printer.Canvas.TextOut(100, 100, 'Seite 2');

  Printer.EndDoc;
end;
Beste Grüße
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#17

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 2. Jul 2019, 21:55
oder aber Du schickst die Druckersteuerdaten und die zu druckenden Daten direkt an den Drucker (falls das überhaupt noch geht?)
Ja das geht noch. Eine private Anwendung von mir steuert auf dem Weg ESC/P fähige Kassendrucker an, da diese Sonderfunktionen
haben die man mit normalem GDI Druck so m.W. nicht ansteuern kann: Bon Cut zum Beispiel.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#18

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 2. Jul 2019, 21:58
Vielleicht mag auch mal jemand in QP einen "feature request" für das Ursprüngliche Problem
des gewünschten Änderns der Seitenorientierung innerhalb eines Druckauftrages erstellen?

Damit in irgend einer Zukunft nichts mehr an printers.pas geändert werden muss...
  Mit Zitat antworten Zitat
Detlev

Registriert seit: 16. Nov 2014
Ort: Hamburg
46 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#19

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 13. Nov 2021, 21:22
Ich habe die von Tomkupitz in #16 vorgeschlagene Lösung verwendet und es funktioniert! Erst mal vorab: Vielen Dank. Elegante Lösung!

Ich habe dazu natürlich eine lokale Kopie der Vcl.printers.pas in meinem Projektordner gespeichert. Delphi verwendet auch automatisch diese lokale Kopie.

Ich habe aber doch noch zwei Fragen, einfach um was dazu zu lernen:

(1)

Delphi Tokyo 10.2 gibt zahlreiche Warnmeldungen des Typs "[dcc32 Warnung] Vcl.Printers.pas(943): W1025 Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut'" auf den Zeilen mit Attribut aus.

Kann ich die Warnungen einfach ignorieren? Was bedeuten sie überhaupt? Wieso werden die Attribute nicht unterstützt, wenn sie doch exakt so in der VCL.Printers stehen?

(2)

Ich habe eine analoge Lösung ausprobiert, bei der ich die Prozedur statt als Helper-Klasse direkt in TPrinter implementiere. Ansonsten exakt gleich. Geht aber nicht: Fataler Fehler beim Compilieren ohne Angabe einer Zeile.

Warum muss es ausgerechnet eine Helper-Klasse sein? Warum kann man nicht eine eigene Prozedur in TPrinter einfügen?! Ich möchte es nur gerne verstehen.

Code:
...
 public
    constructor Create;
    destructor Destroy; override;
    procedure Abort;
    procedure BeginDoc;
    procedure EndDoc;
    procedure NewPage;
    procedure NewPageWithOrientation(AOrientation: Integer); // added!
    procedure Refresh;
...
// original
[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.NewPage;
begin
  CheckPrinting(True);
  EndPage(DC);
  StartPage(DC);
  Inc(FPageNumber);
  Canvas.Refresh;
end;

// added
[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.NewPageWithOrientation(AOrientation: Integer);
begin
  CheckPrinting(True);
  EndPage(DC);

  FDevMode^.dmOrientation := AOrientation;

  StartPage(DC);
  Inc(FPageNumber);
  Canvas.Refresh;
end;
Detlev
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#20

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 14. Nov 2021, 14:56
Keine Ahnung auf die Schnelle: aber existiert schon ein QP Report für die Problemstellung?
Kann, falls nicht, jemand den erstellen? Dann müssen wir in Zukunft evtl. keine eigenen
Bugfixes mehr anbringen...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 05:34 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