PrintToFile, Version 1.3c (alt)

Hinweis: dies ist nicht die neueste Version!

Zurück zur Übersicht

Datei: README.de.txt

PrintToFile.pas

Delphi Unit zum direkten Ausdrucken in eine Datei, selbst wenn die benutzte
Komponente dies nicht unterstützt. Unterdrückt auch die Frage nach dem
Dateinamen.

Version 1.3c - die aktuelle Version gibt's immer unter
http://flocke.vssd.de/prog/code/pascal/prt2file/

Copyright (C) 2005, 2006 Volker Siebert <flocke@vssd.de>
Alle Rechte vorbehalten.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

---------------------------------------------------------------------------

Delphi-Versionen: 5, 6, 7, 2005 und 2006.

Der Grund für das Schreiben der Unit war der Wunsch nach der Möglichkeit,
beim Ausdruck in eine Datei den Dateinamen direkt angeben zu können. Auf
API-Ebene kann man den Dateinamen beim Aufruf der Funktion "StartDoc"
angeben, aber dies ist nicht möglich über Delphis TPrinter-Objekt, da die
entsprechende Methode "BeginDoc" nicht überschrieben werden kann (keine
virtuelle Methode).

Weiterhin gibt es viele Delphi-Komponenten, die etwas Ausdrucken aber
entweder selbst das TPrinter-Objekt benutzten oder aber keinen Einfluss
darauf geben, ob in eine Datei gedruckt werden soll.

Und genau da kommt diese Unit "PrintToFile" in's Spiel.

Sie klinkt sich in den Aufruf der "StartDoc" API-Funktion und modifiziert
die TDocInfo-Struktur so, dass der Dateiname nach Wunsch gesetzt wird.

BENUTZUNG:

Nach der Initialisierung (mehr dazu später) muss man einfach nur den
gewünschten Dateinamen an die globale Variable "PrintToThisFile" zuweisen.
Beim nächsten Ausdruck wird dieser Dateiname dann für die Ausgabedatei
benutzt.

Hier ist ein Beispiel, dass nach Anklicken von "Button1" den Inhalt des
RichEdit-Controls "RichEdit1" ausdruckt:
+-------------------------------------------------------------------------
| uses
|   PrintToFile;
|
| ...
|
| procedure Button1Click(Sender: TObject);
| begin
|   PrintToThisFile := 'C:\PrinterOutput.prn';
|   RichEdit1.Print('My Document');
| end;
+-------------------------------------------------------------------------

Wenn man "PrintToThisFile" einen Leerstring zuweist, dann wird nichts an
der TDocInfo-Struktur geändert und der Aufruf wird unverändert an StartDoc
weitergegeben.

Nach jedem Ausdruck wird "PrintToThisFile" wieder auf einen Leerstring
gesetzt.

INITIALISIERUNG:

Die Unit bietet drei unterschiedliche Level für den Patch, daher gibt es
auch drei unterschiedliche Funktionen dafür.

- Patch_TPrinter_BeginDoc

  Diese Funktion durchsucht den Code von TPrinter.BeginDoc nach dem Aufruf
  von "StartDoc" und ersetzt es durch einen Aufruf unserer Funktion.

  -> Alle Komponenten der Anwendung, die das TPrinter-Objekt von Delphi
     benutzen, können in Dateien drucken.
  
- Patch_StartDoc_ImportTable

  Diese Funktion ersetzt den Eintrag für "StartDoc" im Importverzeichnis
  der Anwendung durch einen Verweis auf unsere Funktion.

  -> Alle Komponenten, die direkt mit der Anwendung gelinkt werden und die
     Windows.StartDoc benutzten, können in Dateien drucken.
  
- Patch_StartDoc_DLL_Entry

  Diese Funktion patched die ersten Codebytes der wirklichen "StartDoc"
  API Funktion in der geladenen "gdi32.dll".
  
  Achtung: dies funktioniert nicht unter Windows 95/98/Me - dort muss man
           auf eine der obigen Funktionen zurückgreifen.

  -> Alle Komponenten, entweder direkt mit der Anwendung gelinkt oder als
     DLL benutzt, können in Dateien drucken - selbst wenn sie die Adresse
     von "StartDoc" mit GetProcAddress holen.

Jeder der Funktionen liefert TRUE zurück wenn der Patch erfolgreich
geklappt hat und FALSE, falls der Patch aus irgendeinem Grund nicht
erfolgreich war.

Nachdem einmal erfolgreich gepatched wurde, kann man den Patchlevel nicht
mehr ändern. Jeder weitere Aufruf irgendeiner der drei Funktionen liefert
dann sofort TRUE zurück. Es ist also kein Problem die Funktionen beliebig
oft aufzurufen.

Hier ein Beispiel mit Initialisierung:
+-------------------------------------------------------------------------
| uses
|   PrintToFile;
|
| ...
|
| procedure Button1Click(Sender: TObject);
| begin
|   if not Patch_StartDoc_ImportTable then
|     raise Exception.Create('Ausdruck in Datei nicht möglich!');
|   PrintToThisFile := 'C:\PrinterOutput.prn';
|   RichEdit1.Print('My Document');
| end;
+-------------------------------------------------------------------------

Schaut euch auch die Beispielanwendung an!

AUSGABE:

Für die Ausgabe der so abgefangenen Druckaufträge gibt es die Funktion
"SendFileToPrinter", mit dem man eine Druckerdatei dann zum wirklichen
Ausdruck an den Drucker senden kann.

Hier ein Beispiel mit dem Dateinamen von oben:
+-------------------------------------------------------------------------
| SendFileToPrinter('C:\PrinterOutput.prn');
+-------------------------------------------------------------------------
Flocke's Garage
Valid HTML 4.01 Transitional Valid CSS!
(C) 2005-2018 Volker Siebert.
Creative Commons-LizenzvertragDer gesamte Inhalt dieser Webseite steht unter einer Creative Commons-Lizenz (sofern nicht anders angegeben).