Autor Beitrag
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 22.01.03 17:46 
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 folgendes, recht vielversprechendes, Beispiel gefunden:
ausblenden 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 // ADDJOB_INFO_1
      Path: PChar;
      JobID: DWORD;
    end;
    PathBuffer: array[0..255of Char;
  end;
  SizeNeeded: DWORD;
  Handle: THandle;
  PrtName: string;
  ok: Boolean;
begin
  // Flush job to printer
  PrtName := PrinterName;
  if PrtName = '' then
    PrtName := Printer.Printers[Printer.PrinterIndex]; // Default printer name
  ok := False;
  if OpenPrinter(PChar(PrtName), Handle, nilthen
    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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Mi 22.01.03 18:47 
Hallo,

ausblenden Delphi-Quelltext
1:
2:
3:
4:
var dateiname:String;
...
dateiname:='C:\Eigene Dateien\WinWord\Dokument1.doc';
ShellExecute(Application.Handle, 'print', PChar(dateiname), nilnil0);


Word muss installiert sein. Schein bei Dir ja der Fall zu sein.

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
Printer.PrinterIndex:=Printer.Printers.IndexOf('Minolta PagePro');					


Mit
ausblenden 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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 32


D5 Pers, D7 Ent
BeitragVerfasst: Do 27.10.05 11:33 
user profile iconsmiegel hat folgendes geschrieben:

Eine andere Möglichkeit den Drucker zu setzen wäre vor Aufruf von ShellExecute:
ausblenden Quelltext
1:
Printer.PrinterIndex:=Printer.Printers.IndexOf('Minolta PagePro');					


Mit
ausblenden 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
ausblenden 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!
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Do 27.10.05 13:36 

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)