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 1 von 3  1 23      
tomkupitz

Registriert seit: 26. Jan 2011
323 Beiträge
 
Delphi 11 Alexandria
 
#1

TPrinter: Portrait auf Landscape umzuschalten

  Alt 29. Jun 2019, 22:02
Hallo,

gibt es eine Möglichkeit innerhalb eines Druckauftrages von Portrait auf Landscape umzuschalten?

Folgendes funktioniert nicht:

Delphi-Quellcode:
  Printer.Orientation:=poPortrait; //gilt für den gesamten Druckauftrag

  Printer.BeginDoc;

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

  Printer.NewPage;

  Printer.Orientation:=poLandscape; //erwarteter Fehler

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

  Printer.EndDoc;
Danke und beste Grüße
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 29. Jun 2019, 22:25
Nö das geht nicht:
Zitat:
Determines if the print job prints vertically or horizontally on a page.

Use Orientation to determine if a print job prints in landscape or portrait.
Du mußt für jede Orientation einen eigenen Printjob definieren, oder aber Du schickst die Druckersteuerdaten und die zu druckenden Daten direkt an den Drucker (falls das überhaupt noch geht?)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
einbeliebigername

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

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 30. Jun 2019, 12:17
Hallo,

Nö das geht nicht:
Falsch. Es geht doch, ist bloß nicht so einfach.

Die Orientation bei einem Druckjob kann nur außerhalb einer Seite umgestellt werden.

Das Problem ist das NewPage:
Delphi-Quellcode:
procedure TPrinter.NewPage;
begin
  CheckPrinting(True);
  EndPage(DC);
  StartPage(DC);
  Inc(FPageNumber);
  Canvas.Refresh;
end;
Das Umschalten müsste zwischen EndPage(DC); und StartPage(DC); stattfinden. Meine Lösung war damals, den Sourcecode von TPrinter kopieren und das NewPage in EndPage und StartPage zerlegen.

einbeliebigername.
Mit freundlichen Grüßen, einbeliebigername.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 30. Jun 2019, 12:27
Hallo,

gibt es eine Möglichkeit innerhalb eines Druckauftrages von Portrait auf Landscape umzuschalten?

Danke und beste Grüße
Ich habe folgendes in meiner alten Codesammlung gefunden:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Device : array[0..255] of char;
  Driver : array[0..255] of char;
  Port : array[0..255] of char;
  hDeviceMode: THandle;
  pDevMode: PDeviceMode;
begin
  With Printer Do Begin
    BeginDoc;
    try
      Canvas.font.size := 20;
      Canvas.font.name := 'Arial';
      Canvas.TextOut( 50, 50, 'This is portait');
      GetPrinter(Device, Driver, Port, hDeviceMode);
      pDevMode := GlobalLock( hDevicemode );
      With pDevMode^ Do Begin
        dmFields := dmFields or DM_ORIENTATION;
        dmOrientation := DMORIENT_LANDSCAPE;
      End;
      { Cannot use NewPage here since the ResetDc will
        only work between EndPage and StartPage. As a consequence
        the Printer.PageCount is not updated. }

      Windows.EndPage( Printer.Handle );
      If ResetDC( canvas.Handle, pDevMode^ ) = 0 Then
        ShowMessage( 'ResetDC failed, '+SysErrorMessage(GetLastError));
      GlobalUnlock( hDeviceMode );
      Windows.StartPage( Printer.Handle );
      Printer.Canvas.Refresh;
      Canvas.font.size := 20;
      Canvas.font.name := 'Arial';
      Canvas.TextOut( 50, 50, 'This is landscape');
    finally
      EndDoc;
    end;
  End;
end;
Peter Below
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
323 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 30. Jun 2019, 17:23
Ich habe mal Folgendes in Printers.pas eingebaut:

Delphi-Quellcode:
    procedure NewPage;
    procedure BeginNewPage;
    procedure EndNewPage;

...

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.NewPage;
begin
  CheckPrinting(True);
  EndPage(DC);
  StartPage(DC);
  Inc(FPageNumber);
  Canvas.Refresh;
end;

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.BeginNewPage;
begin
  StartPage(DC);
  Inc(FPageNumber);
  Canvas.Refresh;
end;

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.EndNewPage;
begin
  CheckPrinting(True);
  EndPage(DC);
end;
Leider erhalte dabei die Fehlermeldung:

[dcc32 Fataler Fehler] Vcl.Printers.pas(1550): F2613 Unit 'Vcl.Dialogs' nicht gefunden.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#6

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 30. Jun 2019, 17:46
Leider erhalte dabei die Fehlermeldung:

[dcc32 Fataler Fehler] Vcl.Printers.pas(1550): F2613 Unit 'Vcl.Dialogs' nicht gefunden.
Dann binde doch die VCL.Dialogs unter uses mit ein.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
323 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 30. Jun 2019, 18:04
Zitat:
Dann binde doch die VCL.Dialogs unter uses mit ein.
1. Warum, bei diesen Änderungen?
2. Ich erhalte dann den Fehler: Zu wenig Arbeitsspeicher.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#8

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 30. Jun 2019, 18:13
1. Warum, bei diesen Änderungen?
Hast du vielleicht einen Öffnen/Speichern Dialog noch mit eingebaut?
Klicke doch auf die Fehlermeldung. Dann wirst du sehen, in welcher Zeile da etwas fehlt.

2. Ich erhalte dann den Fehler: Zu wenig Arbeitsspeicher.
Dafür habe ich keine Erklärung, aber vielleicht reicht es, Delphi oder den Rechner neu zu starten.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
323 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 30. Jun 2019, 18:45
Zitat:
Hast du vielleicht einen Öffnen/Speichern Dialog noch mit eingebaut?
Nein, nur gezeigten Code.

Zitat:
Klicke doch auf die Fehlermeldung. Dann wirst du sehen, in welcher Zeile da etwas fehlt.
Fehlerzeile ist letzte Printers.pas Zeile -> end.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#10

AW: TPrinter: Portrait auf Landscape umzuschalten

  Alt 30. Jun 2019, 19:10
Wie ist DC deklariert?
EndPage(DC);
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 11:48 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