Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TPrinter: Portrait auf Landscape umzuschalten (https://www.delphipraxis.net/201179-tprinter-portrait-auf-landscape-umzuschalten.html)

tomkupitz 29. Jun 2019 22:02

TPrinter: Portrait auf Landscape umzuschalten
 
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

p80286 29. Jun 2019 22:25

AW: TPrinter: Portrait auf Landscape umzuschalten
 
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

einbeliebigername 30. Jun 2019 12:17

AW: TPrinter: Portrait auf Landscape umzuschalten
 
Hallo,

Zitat:

Zitat von p80286 (Beitrag 1435631)
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
Delphi-Quellcode:
EndPage(DC);
und
Delphi-Quellcode:
StartPage(DC);
stattfinden. Meine Lösung war damals, den Sourcecode von TPrinter kopieren und das NewPage in EndPage und StartPage zerlegen.

einbeliebigername.

peterbelow 30. Jun 2019 12:27

AW: TPrinter: Portrait auf Landscape umzuschalten
 
Zitat:

Zitat von tomkupitz (Beitrag 1435629)
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;

tomkupitz 30. Jun 2019 17:23

AW: TPrinter: Portrait auf Landscape umzuschalten
 
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.

zeras 30. Jun 2019 17:46

AW: TPrinter: Portrait auf Landscape umzuschalten
 
Zitat:

Zitat von tomkupitz (Beitrag 1435687)
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.

tomkupitz 30. Jun 2019 18:04

AW: TPrinter: Portrait auf Landscape umzuschalten
 
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.

zeras 30. Jun 2019 18:13

AW: TPrinter: Portrait auf Landscape umzuschalten
 
Zitat:

Zitat von tomkupitz (Beitrag 1435690)
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.

Zitat:

Zitat von tomkupitz (Beitrag 1435690)
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.

tomkupitz 30. Jun 2019 18:45

AW: TPrinter: Portrait auf Landscape umzuschalten
 
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.

zeras 30. Jun 2019 19:10

AW: TPrinter: Portrait auf Landscape umzuschalten
 
Wie ist DC deklariert?
Delphi-Quellcode:
EndPage(DC);


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 Uhr.
Seite 1 von 3  1 23      

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