Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Druckervorschau (https://www.delphipraxis.net/38518-druckervorschau.html)

Fourcorner 20. Jan 2005 12:59


Druckervorschau
 
Hallo,
ich habe eine DruckProcedure geschrieben, die dem Drucker über printer.canvas "Daten" übermittelt.
Bevor der Druck jedoch beginnt hätte ich noch gern ein Fenster mit dem Seiteninhalt, der anschließend gedruckt wird, angezeigt. Kann ich dafür irgendwie die Daten vom printer.canvas verwenden, oder muss ich das ganze noch mal für eine andere Komponente schreiben?

Meine erste Idee war, die Daten von printer.canvas in eine PaintBox zu laden doch bei

Delphi-Quellcode:
paint.Canvas. := printer.canvas;
kommt der Fehler:

Zitat:

Einer Nur-Lesen Eigenschaft kann kein Wert zugewiesen werden
gibt es da noch einen anderen Weg, die Canvas zu überladen?.

Binärbaum 20. Jan 2005 13:09

Re: Druckervorschau
 
Soweit ich mich erinnere hat ein Canvas auch noch die Eigenschaft "Pixels[x,y]", mit der man jeden Pixel einzeln ansprechen kann. Eventuell könnte man damit eine Vorschau erzeugen, dass man x und y in einer (For-)Schleife durchlaufenlässt und die pixel einzeln kopiert.
(Ich weiß, dass das relativ langsam sein wird, aber es ist erstmal ein Ansatz.)

MfG
Binärbaum

Steve 20. Jan 2005 13:30

Re: Druckervorschau
 
Hi,

keine Ahnung, ob's funktioniert, aber TCanvas besitzt die Methode Delphi-Referenz durchsuchenAssign


edit: Schau Dir mal Delphi-Referenz durchsuchenStretchDraw an.

Gruß
Stephan :dance:

Thunderman 20. Jan 2005 18:53

Re: Druckervorschau
 
Oder über das Handle der Canvas-Objekte direkt mit den Funktionen der WinAPI mit BitBlt oder StretchBlt. Siehe dazu dann sonst im MSDN nach.

Fourcorner 21. Jan 2005 15:45

Re: Druckervorschau
 
Hallo,

Zitat:

Soweit ich mich erinnere hat ein Canvas auch noch die Eigenschaft "Pixels[x,y]", mit der man jeden Pixel einzeln ansprechen kann. Eventuell könnte man damit eine Vorschau erzeugen, dass man x und y in einer (For-)Schleife durchlaufenlässt und die pixel einzeln kopiert.
(Ich weiß, dass das relativ langsam sein wird, aber es ist erstmal ein Ansatz.)
Wenn ich das mache, bekomme ich eine schwarze Canvas. (:wall:)

Zitat:

keine Ahnung, ob's funktioniert, aber TCanvas besitzt die Methode Schau in die Delphi-HilfeAssign
Gute Idee, Fehlermeldung beim Ausführen: TPrinterCanvas ist nicht mit TControlCanvas kompatible (:wall: )

Zitat:

Oder über das Handle der Canvas-Objekte direkt mit den Funktionen der WinAPI mit BitBlt oder StretchBlt. Siehe dazu dann sonst im MSDN nach.
Ich habe in der MSDN nachgesehen aber nichts gefunden...Kann das überhaupt gehen, da nach der oberen Fehlermeldung es sich hierbei um zwei verschiedene Canvas handelt?

Thunderman 22. Jan 2005 10:32

Re: Druckervorschau
 
Wenn man auch lesend auf das Canvas des TPrinter Objektes zugreifen kann, wovon ich mal ausgehe, sollte das schon gehen. Theoretisch sollte das in etwa so aussehen, wenn du z.Bsp. auf das TForm-Objekt Form1 zeichnen willst:
Delphi-Quellcode:
BitBlt(Form1.Canvas.Handle, 0, 0, breite, hoehe, printer.Canvas.Handle, 0, 0, SRCCOPY);
Sofern dein Canvas Objekt natürlich die notwendige Breite und Höhe besitzt sollte das meines Erachtens gehen.

Fourcorner 22. Jan 2005 17:54

Re: Druckervorschau
 
hallo,
der Code funktioniert aber nicht:
Es kommt eine Fehlermeldung, dass die beiden Canvas nicht zueinander kompatiebel sind :wall:

Hat da jemand noch eine Idee?

Binärbaum 22. Jan 2005 19:31

Re: Druckervorschau
 
Nur mal so eine Idee: man könnte statt der Paintbox auch ein extra Formular erstellen, auf dessen Canvas dann die Vorschau angezeigt wird.

MfG
Binärbaum

Thunderman 23. Jan 2005 10:55

Re: Druckervorschau
 
Hallo!

Das mit auf einer Form zeichnen ändert in diesem Falle nichts, da das Canvas des TPrinter Objekts ein anderes Format hat. Wennn es überhaupt geht, muss man wahrscheinlich das ganze in etwa so lösen:
Delphi-Quellcode:
var
  h_DC, hdc_mem, temp : HDC;
begin
  h_DC := GetDC(Form1.Handle);
  hdc_mem := CreateCompatibleDC(h_DC);
  temp := SelectObject(hdc_mem, Printer.Canvas.Handle);
  BitBlt(h_DC, 0, 0, Breite, Hoehe, hdc_mem, 0, 0, SRCCOPY);
  SelectObject(hdc_mem, temp);
  DeleteDC(hdc_mem);
  ReleaseDC(Form1.Handle, h_DC);
Sicher bin ich mir dabei jetzt aber nicht, da ich das ganze gerade nicht in Delphi testen kann. Aber vielleicht guckt ja hier noch jemand rein, der etwas vesierter mit den GDI Funktionen ist. Ansonsten würde ich eine Druckfunktion erstellen, die ein TCanvas als Parameter übernimmt und dann auf diesem alles ausgibt. Dann ruft man diese zuerst mit dem Canvas der Druckvorschau auf und anschließend wenn der Nutzer OK drückt eben mit dem Printer-Canvas. Da sollte man aber natürlich nicht vergessen dann BeginDoc und EndDoc aufzurufen.

mschaefer 23. Jan 2005 13:30

Re: Druckervorschau
 
Moin, Teetimemoin,

also ich denke, dass es aufgrund der doch sehr unterschiedlichen Auflösungen von Bildschirm zu Drucker ziemlich sinnlos ist, den Druckercanvas fürdie Bildschirmanzeige herunterzurechnen. Denke Du solltest den Druck auf zwei Canvas mit unterschiedlicherAuflösung drucken. Einen für den Bildschirm,einen für den Ausdruck. Das Verfahren gibt es praktisch bei AlReport angewendet.

Etwas Einarbeitungszeit braucht man dafür aber auch..

Grüße // Martin


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