Entwickler-Ecke
Sonstiges (Delphi) - Beliebiges Dokument Drucken
Klabautermann - Mi 22.01.03 17:46
Titel: Beliebiges Dokument Drucken
Hallo,
ich möchte, das mein Programm Dateien nach einer FileMask sucht (Findfirst, Findnext) und dies je nach Maske auf einem bestimmten Drucker ausgiebt.
Also z.B. *.doc Dateien auf dem (s/w) Laser Drucker ausgeben und *.jpg auf dem Farb-Tintenstrahler.
Ich habe bei den
Schweizern [
http://www.swissdelphicenter.ch/de/showcode.php?id=747] folgendes, recht vielversprechendes, Beispiel gefunden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| function SpoolFile(const FileName, PrinterName: string): Integer; var Buffer: record JobInfo: record Path: PChar; JobID: DWORD; end; PathBuffer: array[0..255] of Char; end; SizeNeeded: DWORD; Handle: THandle; PrtName: string; ok: Boolean; begin PrtName := PrinterName; if PrtName = '' then PrtName := Printer.Printers[Printer.PrinterIndex]; ok := False; if OpenPrinter(PChar(PrtName), Handle, nil) then if AddJob(Handle, 1, @Buffer, SizeOf(Buffer), SizeNeeded) then if CopyFile(PChar(FileName), Buffer.JobInfo.Path, True) then if ScheduleJob(Handle, Buffer.JobInfo.JobID) then ok := True; if not ok then Result := GetLastError else Result := 0; end; |
Dieses erzeugt auch einen Job in der Druckerwarteschlage, dieser kann aber nicht verarbeitet werden, weil die Datei in keinem dem Drucker Bekannten Format vorliegt.
Wenn ich z.B. eine Doc Datei auf das Druckerobjekt ziehe wird Word gestartet und druckt die Datei korreckt aus, wie kann ich dieses Verhalten in meinem Programm erreichen?
Gruß
Klabautermann
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt
smiegel - Mi 22.01.03 18:47
Hallo,
Delphi-Quelltext
1: 2: 3: 4:
| var dateiname:String; ... dateiname:='C:\Eigene Dateien\WinWord\Dokument1.doc'; ShellExecute(Application.Handle, 'print', PChar(dateiname), nil, nil, 0); |
Word muss installiert sein. Schein bei Dir ja der Fall zu sein.
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt
Klabautermann - Mi 22.01.03 23:41
Hallo,
danke, aber ist es mit dieser Methode möglich, den Drücker festzulegen über den gedruckt werden soll? Oder funktioniert das nur mit dem Standartdrucker?
Neugierig
Klabautermann
Delete - Mi 22.01.03 23:51
Nein, das funktioniert wohl nur mit dem standard Drucker, da man Shellexecute ja nicht sagen kann welchen Drucker es nehmen soll. Ein Workaround wäre, vorher den standard Drucker umzuschalten und dann natürlich wieder zurück.
smiegel - Do 23.01.03 00:42
Hallo,
im DruckenDialog von Word kann man doch angeben, auf welchem Drucker gedruckt werden soll. Dieser sollte doch dann übernommen werden.
Eine andere Möglichkeit den Drucker zu setzen wäre vor Aufruf von ShellExecute:
Delphi-Quelltext
1:
| Printer.PrinterIndex:=Printer.Printers.IndexOf('Minolta PagePro'); |
Mit
Delphi-Quelltext
1:
| ListBox.Items:=Printer.Printers; |
kannst Du sogar noch eine Auswahl der installierten Drucker anbieten.
Nicht vergessen die Unit Printers in Uses aufzunehmen.
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt
Klabautermann - Do 23.01.03 01:09
Hallo,
da die Dokumente wie erwähnt je nach namen auf unterschiedlichen Druckern ausgegeben werden sollen, ist das mit dem Druckerdialog nicht wirklich Praktikaben.
Das mit dem Standartdrucker setzen scheint mir zwar Praktikabel, aber nicht besonders Elegant.
Gibt es Dateien, welche die Installierten Drucker representieren, kann man diese nicht ausführen und die zu Druckende Datei einfach als Parameter übergeben?
Wenn's jemand weiß bitte hier antworten, ansonsten habe ich nach dem Aufstehen was zum Experimentieren.
Gruß
Klabutermann
Klabautermann - Do 23.01.03 14:26
Hallo,
leider gibt es keine Dateien :(.
Naja, muss ich wohl den Standartdrucker ändern.
Danke für eure hilfe,
Klabautermann
smiegel - Do 23.01.03 14:29
Hallo Klabautermann,
Du änderst mit der von mir geposteten Routine keinen Standarddrucker. Du teilst Deinem Programm lediglich mit, auf was für einem Drucker Du drucken willst.
Ich benutze das beschriebene Verfahren ohne Probleme.
Klabautermann - Do 23.01.03 15:32
Hallo,
smiegel hat folgendes geschrieben: |
Du änderst mit der von mir geposteten Routine keinen Standarddrucker. Du teilst Deinem Programm lediglich mit, auf was für einem Drucker Du drucken willst. |
das Pronlem ist aber, das ich ja nur indireckt drucken kann, es also nicht selber machen.
Also: Der Benutzer kann in meinem Programm einstellen:
Zitat: |
wenn Datein aus Quelle XXX kommen überprüfe die auf Folgendes:
Wenn sie der Maske "*.doc" ensprechen Drucker sie auf Ducker 1.
Wenn sie der Maske "*.sxw" ensprechen Drucker sie auf Ducker 2.
Wenn sie der Maske "rechnung*.xls" ensprechen Drucker sie auf Ducker 1. |
Nun kann ich in meinem Programm nicht das Word, das Open Office Writer und das Exel Format (und jedes beliebige andere) unterstützen. Praktischerweise erlaubt es Windows aber, das sich Programme zum Drucken mit einem Programm verknüpft wird (deshalb funktioniert Shell Execute). Mein Programm sol nun diese Verknüpfung nutzen. Nur möchte ich dem
verknüpften Programm aber zusätzlich mitteilen auf welchem Drucker es die Datei ausgeben soll.
Leider habe ich keine Ahnung wie ich das mache. Das mit dem ShelExecute war ein guter hinweis aber ich muss noch diese eine Information an ein mir nicht bekanntes (denn ich weiß ja nicht was der User installiert hat) Programm übergeben. Daher bingt es leider nichts, wenn ich das lokale Printer-Objekt meines Programms umstelle :(.
Gruß
Klabautermann
Cashels - Do 23.01.03 16:44
Hi,
nur noch so ne Idee im Raume und vielleicht total unsinnig. Aber kannst du vielleicht im Word ein Makro erzeugen, welches ein beliebiges Dokument ausdruckt. Diese Makro müsstest du doch mit Shellexecute starten können, oder? Wir gesagt, probiert habs ich nicht.
Gruss,
Tom
Klabautermann - Do 23.01.03 17:00
Hallo Cashels,
aber auch Word kennt nicht alle Dokumenttypen (schon gar nicht die von der Kostenlosen Komprenz Open Office ;)). Daher wird das leider auch nichts bringen. Das Drucken an sich ist auch nicht das wirkliche Problem (nicht mehr dank des vorschlages von smiegel) sondern das Festlegen des richtigen druckers.
Aber danke für den Vorschlag
Klabautermann
Cashels - Do 23.01.03 20:49
Hallo nochmals,
also mit Word selbst kann ich dir ne Lösung geben, wo ich Word per OLE ansteuere. Ich benutze selbst ganz oft Word als Berichtersteller, statt Quickreport o.ä. Damit ist es möglich, den Drucker, den Druckerschacht und die Anzahl der Kopien im Delphi festzulegen. Klappt einwandfrei, allerdings nur mit Word. Aber vielleicht hilfts dir zumindest da weiter. Ich bin im Moment nicht an meinem Rechner (ja, auch in der Freizeit geht meine ganze Zeit im Delphi Forum drauf ;-) ), aber ich kann mal morgen den Code posten, bei Interesse.
Gruß,
Tom
Klabautermann - Fr 24.01.03 00:27
Hallo Cashels,
das ist lieb von dir, hilft mir aber leider nicht weiter, da es eine Zentrale anforderung ist, dass das Dokumentformat "beliebig" ist. Leider besitzt nicht jede Anwendung eine ensprechende COM-Schnitstelle, und selbst wenn währen diese nicht alle gleich aufgebaut und ich müsste über die Dateiendung das Richtige COM-Objekt identifizieren.
Scheinbar muss ich wohl doch den Standartdrucker entsprechend endern (und dann die Wartschlange überwachen damit ich weis wann ich die änderung wieder Rückgängig machen kann).
Schade eigentlich, aber eine Bessere Lösung sehe ich momentan nicht. (Wenn sie jemand anderes sieht bitte noch melden :))
Gruß
Klabautermann
xck3001 - Do 27.10.05 11:33
smiegel hat folgendes geschrieben: |
Eine andere Möglichkeit den Drucker zu setzen wäre vor Aufruf von ShellExecute:
Quelltext 1:
| Printer.PrinterIndex:=Printer.Printers.IndexOf('Minolta PagePro'); |
Mit
Quelltext 1:
| ListBox.Items:=Printer.Printers; |
kannst Du sogar noch eine Auswahl der installierten Drucker anbieten.
Nicht vergessen die Unit Printers in Uses aufzunehmen. |
Hi, das Thema ist schon etwas älter aber für mich trotzdem noch aktuell :)
Ich drucke aus einem TWebbrowser, und dachte eigentlich ich kann vorher einfach wie folgt dem Drucker festlegen
Quelltext
1: 2:
| Printer.PrinterIndex:=Printer.Printers.IndexOf(ListBox1.Items[ListBox1.ItemIndex]); web.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER); |
In ListBox1 stehen die Druckernamen wie oben von dir beschrieben.
Leider wird weiterhin auf dem Standarddrucker gedruckt.
Statt DONTPROMPTUSER einfach PROMPTUSER zu verwenden geht leider nicht weil ich mehrere Seiten in Folge drucken muss.
Danke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!