AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Print ToFile

Ein Thema von Mario · begonnen am 2. Nov 2006 · letzter Beitrag vom 31. Mär 2010
Antwort Antwort
Mario

Registriert seit: 7. Apr 2003
567 Beiträge
 
Delphi 2006 Enterprise
 
#1

Print ToFile

  Alt 2. Nov 2006, 09:06
Hallo,

ich schreibe direkt mit Printer.BeginDoc;... auf das Canvas vom Drucker. Das tut auch. Nur wenn der Drucker auf die File-Schnittstelle geht, möchte ich gern den Dateinamen im Programm spezifizieren bzw. ich möchte gleich direkt in die Datei drucken, egal welcher Anschluss eingestellt ist. Im Moment kommt halt von Windows die Abfrage nach dem Dateinamen...

Hat jemand eine Idee, wie man das umsetzen kann?
Schöne Grüße,
Mario Noack
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Print ToFile

  Alt 3. Nov 2006, 01:14
Hallo Mario,

es geht zum Beispiel so...

Eine neue Unit anlegen MyPrinters.pas mit folgendem Inhalt...
Delphi-Quellcode:
unit MyPrinters;

interface

var FPrintToFile:string;

implementation

initialization
  FPrintToFile:='';
end.
Die Printers.pas in dein Programmverzeichnis kopieren und eine kleiner Änderung machen...
Delphi-Quellcode:
procedure TPrinter.BeginDoc;
:
begin
  :
  with DocInfo do
  begin
    :
    if FPrintToFile<>'then
      lpszOutput:=PChar(FPrintToFile);
  end;
  :
end;
In die Unit, in der du druckst muss dann MyPrinter.pas und Printers.pas eingebunden werden. Dann kannst du über FPrintFile den Dateinamen angeben und dann normal drucken.

Gruss
Thorsten
  Mit Zitat antworten Zitat
Mario

Registriert seit: 7. Apr 2003
567 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Print ToFile

  Alt 3. Nov 2006, 08:07
Danke für die Antwort. Sieht nach einer praktikablen Lösung aus!

Der Vollständigkeit halber hier noch eine andere Variante, die ich gestern abend noch gefunden habe:
Delphi-Quellcode:
uses JclPrint;
...
var printSet:TJclPrintSet;
...
  printSet := TJclPrintSet.Create;
  try
    printSet.PrinterPort := 'c:\test.ps';

    // Hier Ausdruck
  finally
    printSet.Free;
  end;
...
Intern wird einfach SetPrinter mit dem neuen Port aufgerufen.
Schöne Grüße,
Mario Noack
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Print ToFile

  Alt 3. Nov 2006, 09:26
Hallo.

Bei mir funktioniert das hier:

Delphi-Quellcode:
uses
  Printers;

procedure PrintToFile(fn: TFileName);
var
  PrtDevice: array [Byte] of Char;
  PrtDriver: array [Byte] of Char;
  PrtPort: array [Byte] of Char; // keep filenames small
  PrtDeviceMode: Cardinal;
begin
  with Printer do
  begin
    GetPrinter(PrtDevice, PrtDriver, PrtPort, PrtDeviceMode);
    if fn = ''
      then PrtPort[0] := #0
      else Move(fn[1], PrtPort, Succ(Length(fn)));
    SetPrinter(PrtDevice, PrtDriver, PrtPort, PrtDeviceMode);
  end;
end;
Um die Ausgabe in die Datei zu beenden muss einfach ein leerer String als Dateiname übergeben werden.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Print ToFile

  Alt 3. Nov 2006, 10:05
Ich hab' da auch mal eine Lösung für geschrieben: PrintToFile
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#6

Re: Print ToFile

  Alt 29. Mär 2010, 17:58
Hallo Omata,

habe Deine Lösung aufgegriffen und gleich ein paar Fragen an Dich.

1.
Heisst Deine Unit MyPrinter oder MyPrinters ?
In Deinem Text sind verschiedene Schreibweisen.

2.
In Deiner Unit MyPrinters hast Du Var FPrintToFile erklärt.
Nun entspricht die Schreibweise der Deklaration einer privaten Feldvariablen einer Klasse. Ich finde keine offenlegenden procedures und properties. Ist der UnitCode komplett so?

3.
Die veränderte Unit Printers.pas im lokalen Programmverzeichnis wird bei den eingefügten Zeilen bei FPrintToFile vom Compiler angemeckert. Unbekannter Bezeichner.
Muß ich da MyPrinters ebenfalls in die Usus Clausel schreiben ?

4.
Wie und wo wird nun der FileName im Delphiprogramm eingetragen?

Danke

EB.
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Print ToFile

  Alt 29. Mär 2010, 23:23
Zitat von EccoBravo:
1. Heisst Deine Unit MyPrinter oder MyPrinters ?
Name ist MyPrinters.pas.

Zitat von EccoBravo:
2. In Deiner Unit MyPrinters hast Du Var FPrintToFile erklärt.
Nun entspricht die Schreibweise der Deklaration einer privaten Feldvariablen einer Klasse. Ich finde keine offenlegenden procedures und properties. Ist der UnitCode komplett so?
Da die Deklaration im Interface-Teil der Unit erfolgt, ist diese Variable nach außen sichtbar (also global sichbar)

Zitat von EccoBravo:
3. Die veränderte Unit Printers.pas im lokalen Programmverzeichnis wird bei den eingefügten Zeilen bei FPrintToFile vom Compiler angemeckert. Unbekannter Bezeichner.
Muß ich da MyPrinters ebenfalls in die Usus Clausel schreiben ?
Oh ja, sorry. Die MyPrinters.pas muss natürlich mit in die Uses-Klausel der Printers.pas.

Zitat von EccoBravo:
4. Wie und wo wird nun der FileName im Delphiprogramm eingetragen?
Der Name, der an den Druckertreiber übergeben werden soll, kann nun über FPrintToFile gesetzt werden. Das was in dieser Variablen als Text hinterlegt wird, wird, wenn man irgendetwas über ein TPrinter-Objekt druckt an den Druckertreiber übergeben.

Hoffe, dass hilft dir weiter...
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#8

Re: Print ToFile

  Alt 31. Mär 2010, 13:25
Danke Omata,


habe das so programmiert und es läuft, zwar nicht ganz wie es sollte aber és liess sich erstellen.

Mein Problem, was blieb, war folgendes:
Es werden zwei pdf-Files angelegt!

Einerseits
übergebe ich in FPrintToFile den vollständigen Pfadnamen und den DatewiNamen (*\*.pdf)
Andererseits
benutze ich eine TDirectoryListBox (in dem nur der Pfad steht), um ein Verzeichnis zu wählen, aus dem ich mit SysUtils.FindFirst, ..FindNext Files einlese.
Im QuickReport habe ich Acrobat PDFWriter als StandardDrucker angegeben.

Nun legt das Programm je ein PDF-File im Wunschverzeichnis von FPrintToFile ohne Inhalt (0 kByte) und
ein PDF-File im falschen Verzeichnis von TDirectoryListBox mit Inhalt (9300 kByte) an.

Irgendwie gibt es eine Wechselwirkung von TDirectoryListbox und PDF Writer ?!?

Ist doch komisch!
Habe zwar durch eigenen WirrCode die richtige Funktion hergestellt, bin aber nicht zufrieden.

Vielen Dank für weitere Hilfe.

EB
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Print ToFile

  Alt 31. Mär 2010, 13:53
Das ist ja wirklich sehr mysteriöse.

Was passiert, wenn du FPrintToFile leer läßt? Geht dann ein Fenster auf, der dich nach dem Dateinamen fragt? Wenn du da jetzt den richtigen Pfad mal von Hand einsetzt, funktioniert dann alles oder hast du das selbe Verhalten?
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#10

Re: Print ToFile

  Alt 31. Mär 2010, 14:20
Ja, so dachte ich auch, war richtig verwundert,
Hatte dann mal mit verschiedener Verzeichniswahl in TDirectoryListBox versucht, tatsächlich schreibt er das 9300 kByte pdf immer dhin wie ich es der TDirectoryListBox sage. Querverbindungen von Pfadnamen habe ich im Programm nicht gefunden. Habe auch die Variablennamen für die Pfadbezeichnung umbenannt, hat aber alles nicht geholfen.
Wundersam vorallem ist, über Dein FPrintToFile gebe ich ihm PfadNamen + Dateinamen, über TDirectoryListBox bekommt er nur PfadNamen1 und das richtige 9300 kByte PDF schreibt er in PfadNamen1 + Dateinamen.
(in PfadNamen + Dateinamen steht nur die 0 kByte Variante. )
Probiere ich heute abend Deine '' Variante aus, muss leider gerade etwas anderes tun.

Danke und Grüße

EB.
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:50 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