Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bereich aus Form in PDF drucken (https://www.delphipraxis.net/206202-bereich-aus-form-pdf-drucken.html)

Kegasetu 30. Nov 2020 07:07

Bereich aus Form in PDF drucken
 
Hallo Zusammen.
Es gibt zu diesem Thema eine Vielzahl von Beiträgen, jedoch bin ich auch nur stundenlangen probieren nicht weitergekommen. Um einen Bereich zu drucken, verwende ich im Moment diesen Code:

Delphi-Quellcode:
Procedure BildAusSchnitt(hWND: HWND; iLeft, iTop, iWidth, iHeight: integer);
var
c: TCanvas;
begin
BringWindowToTop(hWND);
c:= TCanvas.Create;
c.Handle:= GetWindowDC(hWND);
try
Printer.Orientation := poLandscape;
printer.begindoc;
printer.Canvas.CopyRect(Rect(0, 0, iWidth* 10, iHeight* 10), c, Rect(iLeft, iTop, iLeft+ iWidth, iTop+ iHeight));
printer.enddoc;
finally
ReleaseDC(hWND, c.handle);
c.Free;
end;
end;

procedure TForm1.druckenClick(Sender: TObject);
begin
BildAusSchnitt(Form1.Handle, 60, 82, 3600, 4000);
end;
Der ist fast 1:1 aus diesem Forum "geklaut". Mein Problem ist, egal wie hoch ich die Parameter 3600 und 4000 stelle, es verändert sich nichts am Bild. Bis ca. 2600 und 3000 hat es noch funktioniert, aber ab einer gewissen Größe bleibt das Bild gleich groß.
Um eine PDF draus zu machen, habe ich einfach einen PDF-Drucker als Standard eingestellt. Ist nicht die schönste Lösung, aber es funktioniert.

Hat jemand vielleicht eine Idee, oder eine ganz andere Methode um dieses Problem zu lösen? Ich bin für alle Vorschläge offen.
Vielen Dank für Unterstützung!

Klaus01 30. Nov 2020 07:11

AW: Bereich aus Form in PDF drucken
 
.. wieviele Bildpunkte hat denn Dein Monitor Vertikal/Horizontal?
Spielt die Scalierung vielleicht mit?

Grüße
Klaus

Kegasetu 30. Nov 2020 08:02

AW: Bereich aus Form in PDF drucken
 
Zitat:

Zitat von Klaus01 (Beitrag 1478171)
.. wieviele Bildpunkte hat denn Dein Monitor Vertikal/Horizontal?
Spielt die Scalierung vielleicht mit?

Grüße
Klaus

1920 x 1080

Ich habe schon an der Form gespielt, leider ohne Erfolg.

Moombas 30. Nov 2020 08:35

AW: Bereich aus Form in PDF drucken
 
Wie willst du bei "nur vorhandenen 1920 * 1080 Pixel, 3600 * 4000 Pixel erstellen?

Kegasetu 30. Nov 2020 08:41

AW: Bereich aus Form in PDF drucken
 
Zitat:

Zitat von Moombas (Beitrag 1478176)
Wie willst du bei "nur vorhandenen 1920 * 1080 Pixel, 3600 * 4000 Pixel erstellen?

Ich weiß nicht wonach das geht, aber ich bekomme bei 1920 * 1080 einen viel zu kleinen Auschnitt der Form. Wenn ich die Werte erhöhe, wird es größer, aber nur bis zu einer bestimmten Größe.

TiGü 30. Nov 2020 08:58

AW: Bereich aus Form in PDF drucken
 
Delphi-Quellcode:
procedure TForm1.FormClick(Sender: TObject);
var
  FormImage: TBitmap;
  PrinterDpiHeight, PrinterDpiWidth: Integer;
  FormDpiHeight, FormDpiWidth: Integer;
  Source: TRect;
begin
  FormImage := Self.GetFormImage;
  try
    Printer.Orientation := poLandscape;
    Printer.BeginDoc;
    try
      Source := Self.ClientRect;
      PrinterDpiWidth := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX);
      FormDpiWidth := GetDeviceCaps(Self.Canvas.Handle, LOGPIXELSX);
      Source.Width := Round(Source.Width * (PrinterDpiWidth / FormDpiWidth));
      PrinterDpiHeight := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY);
      FormDpiHeight := GetDeviceCaps(Self.Canvas.Handle, LOGPIXELSY);
      Source.Height := Round(Source.Height * (PrinterDpiHeight / FormDpiHeight));
      Printer.Canvas.StretchDraw(Source, FormImage);
    finally
      Printer.EndDoc;
    end;
  finally
    FormImage.Free;
  end;
end;
Damit bekommst du die gesamte Form mit der 1:1 Größe wie das richtige Formular ins PDF.
Willst du das seitenfüllend haben, müsstest du noch ein bisschen an Width und Height spielen.

Kegasetu 30. Nov 2020 09:46

AW: Bereich aus Form in PDF drucken
 
Zitat:

Zitat von TiGü (Beitrag 1478180)
Delphi-Quellcode:
procedure TForm1.FormClick(Sender: TObject);
var
  FormImage: TBitmap;
  PrinterDpiHeight, PrinterDpiWidth: Integer;
  FormDpiHeight, FormDpiWidth: Integer;
  Source: TRect;
begin
  FormImage := Self.GetFormImage;
  try
    Printer.Orientation := poLandscape;
    Printer.BeginDoc;
    try
      Source := Self.ClientRect;
      PrinterDpiWidth := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX);
      FormDpiWidth := GetDeviceCaps(Self.Canvas.Handle, LOGPIXELSX);
      Source.Width := Round(Source.Width * (PrinterDpiWidth / FormDpiWidth));
      PrinterDpiHeight := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY);
      FormDpiHeight := GetDeviceCaps(Self.Canvas.Handle, LOGPIXELSY);
      Source.Height := Round(Source.Height * (PrinterDpiHeight / FormDpiHeight));
      Printer.Canvas.StretchDraw(Source, FormImage);
    finally
      Printer.EndDoc;
    end;
  finally
    FormImage.Free;
  end;
end;
Damit bekommst du die gesamte Form mit der 1:1 Größe wie das richtige Formular ins PDF.
Willst du das seitenfüllend haben, müsstest du noch ein bisschen an Width und Height spielen.


Ich habe auf der Form etwas gezeichnet, dass ist leider nicht drauf zu erkennen. Gezeigt werden nur die Bedienelemente

TiGü 30. Nov 2020 10:17

AW: Bereich aus Form in PDF drucken
 
Bitte benutze eine Paintbox zum Zeichnen. Direkt auf das Formular zu malen ist nicht zu empfehlen, wie du gerade merkst.

Kegasetu 30. Nov 2020 10:58

AW: Bereich aus Form in PDF drucken
 
Zitat:

Zitat von TiGü (Beitrag 1478194)
Bitte benutze eine Paintbox zum Zeichnen. Direkt auf das Formular zu malen ist nicht zu empfehlen, wie du gerade merkst.

Ja, damit geht es ganz einfach. Danke


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