2009-08-05 7 views
0

ich den folgenden Automatisierungscode haben:Einstellung richtigen Drucker in MS Word durch Automatisierung

lPrintSetup := fWordObject.Application.Dialogs.Item(wdDialogFilePrintSetup); 
lPrintSetup.Printer := 'MyPrinter'; 
lPrintSetup.DoNotSetAsSysDefault := True; 
lPrintSetup.Execute; 
lPrintSetup := Null; 

Die Printer Eigenschaft wird mir einige Probleme geben, manchmal Execute stürzt mit einem EOleException (0x800A1460 (Fehlercode 5216): Es wird ein Druckerfehler) wegen eines falschen Druckernamens.

Ich habe Druckerinformationen aller Drucker in einem _PRINTER_INFO_2 Datensatz, den ich von einem EnumPrinters API-Aufruf erhalten habe. Wie kann ich den richtigen Druckernamen für Word anhand der Informationen in einem _PRINTER_INFO_2 Datensatz erstellen? Es funktioniert mit mindestens Windows 2000, Word 2000 und Citrix.

Einige Informationen Hintergrund:

Unsere Anwendung gefüllt zuerst die printer mit einem selbst konstruierten printer. Dies führte zu Problemen mit den Citrix Clients, so dass wir für Citrix Clients die _PRINTER_INFO_2.pPortName und den Client: #: part löschten. Dies funktioniert für die Mehrheit unserer Kunden, aber manchmal zeigt sich immer noch der Druckerfehler.

Was ich bisher versucht (unter Windows XP SP3, Word 2007):

  • Nehmen Sie einfach die _PRINTER_INFO_2.pPrinterName. Problem ist, dass wenn Sie printernames absichtlich ändern (Umbenennen von "PDFCreator" zu "HP DESKJET 520 auf MYPC"), stürzt es auf letzterem ab (während der Auswahl dieses Druckers in Word funktioniert).
  • Erstellen eines Druckernamens wie folgt: lPrintSetup.Printer := PRINTER_INFO_2.pPrinterName + ' on ' + PRINTER_INFO_2.pPortname. Scheint immer zu funktionieren! Aber Googlen hat gezeigt, dass 'on' lokalisiert ist, also bin ich mir nicht sicher, ob das auf nicht-englischen Windows-Versionen funktionieren wird. Edit: nicht immer funktioniert :(

Eine andere Lösung, die ich im Web gefunden:

Wenn die Drucker aus Word liest es hat die Form von „printer auf NE01:“, wo NE01 reichte wird von Ne00: bis Ne99: Die Lösung schlug vor, den Druckernamen zu nehmen und einfach zu versuchen, ihn von Ne00 auf Ne99 zu setzen: Wenn .Execute nicht abstürzt, hast du den richtigen von dieser "Spur und Fehler" -Methode.

Antwort

0

Ich habe es herausgefunden. Word hat den Druckernamen in Form von "Printername on NE01:". Ne01: ist der Druckerport wie in devices section of win.ini angegeben.Jetzt komponiere ich den Druckernamen als _PRINTER_INFO_2.pPrinterName + ' on ' + <PrinterPort from win.ini> und setze diesen Namen für die Druckereigenschaft des FilePrintSetup Dialogs.

Das ist viel besser, als auf die in meiner Frage erwähnte Trail-and-Error-Methode zurückzugreifen.

+0

Hast du nicht gesagt, dass du das wegen des lokalisierten "An" nicht machen willst? –

+0

Ich habe dies auf einer niederländischen Windows Vista Business Edition getestet und "on" wurde nicht lokalisiert, also habe ich meine Chancen genutzt. Ich habe den neuen Code in einem Versuch verpackt, außer wenn es fehlschlägt, wende ich mich wieder unserer alten Methode zu, einen Drucker zuzuweisen. –

0

Ich bin mir nicht sicher, ob Sie dies versucht haben, oder ob es von irgendwelchen Gebrauch, aber Sie können eine Liste aller Drucker auf dem System von der Pr bekommen inter.Printers-Objekt stellen Sie sicher, dass Sie Drucker zur Uses-Klausel Ihrer Einheit hinzufügen.

Dies sollte dann die tatsächlichen Namen auf dem System auflisten und Sie können möglicherweise diese Informationen verwenden, um zu tun, was Sie wollen.

0

Wie angegeben, können Sie eine Liste der Druckernamen mit dem Printer.Printers erhalten, der eine TStringList mit dem Namen des Druckers für jedes Element ist.

Dieser Code gibt den Standarddruckernamen

Printer.Printers[Printer.PrinterIndex] 
0

Einige Minuten vor habe ich gelernt, dass word2k nicht nur Printernames wie will „printer auf NE01:“ Es ist nur der Port (nenn) Groß „Printer auf NE01 will : "

+0

Ich testete auf Word 2000, es akzeptiert auch "Ne00:". –

Verwandte Themen