Weitere Frage zum Druckerschacht

Hallo,

ich arbeiter mit LL17 Standard Edition unter Visual Basic. Bei der Erstellung eines
Projektes lege ich im Dseigner den Drucker und Papierschacht für die die erste Seite
und die Folgeseiten fest. Die Namen des Papierfaches (z.B. Kassette 1, Kassette 3)
sind dabei auf den Treiber des zugeteilten Druckers bezogen.

Jetzt ist es aber so, dass der Anwender aus verschiedenen Gründen den Druck ab und
zu auf einem anderen Drucker ausgeben will. Den Drucker kann er dabei im Options-
dialog wählen. Jetzt stimmen aber die im Designer hinterlegten Angaben zum Papier-
fach nicht mehr. Wie kann man das in den Griff bekommen?

Vielen Dank für ein Feedback.
Rainer

Wenn Du alle “möglichen” Drucker kennst, kannst Du die P-Dateien für diese Drucker erzeugen und irgendwo speichern. Dann sollte jeder Benutzer ein eigenes Drucker-Config-Verzeichnis bekommen (LlSetPrinterDefaultsDir), und Du frast in Deinem Code den gewünschen Drucker ab und kopierst das entsprechende P-File in dieses Verzeichnis vor dem Druckstart.

Ansonsten müssen die halt die Einstellungen für den Schacht im Config-Dialog machen.

(Per DOM ist dann auch möglich, siehe Thread "Drucker und Druckerschacht für Ausdruck festlegen ")

Paulchen

Hallo Paulchen,

vielen Dank für Deine Antwort. Ich habe nun versucht, die Druckersteuerung mittels
DEVMODE gemäss nachstehendm Beispiel zu realisieren. Das funktioniert soweit auch
ganz gut. Ich kann den gewählten Papierschacht über DEFAULTSOURCE, welchen ich von
meinem Programm mitgebe, ansprechen.

Nun ist es aber so, dass die Folgeseiten au einem anderen Schacht kommen sollen. Hier
stehe ich an. Kann ich überhaupt einen 2. Papierschacht so mitgeben? Wenn nicht, wie
kann ich feststellen, ob ein Seitenwechsel stattgefunden hat und kann ich dann DEVMODE
nochmals modifizieren? Vielleicht hast Du eine Antwort auf diese Fragen?!

Aufruf im Programm

' -------------------------------------------- DevMode-Struktur erzeugen
ReadDevMode SelDrucker, MyDevMode
' -------------------------------------------- DevMode-Struktur manipulieren
ChangeDevMode MyDevMode
' -------------------------------------------- DevMode-Struktur in P-Datei schreiben
ret% = LlSetPrinterInPrinterFile(ListLabel1.hJob, LL_PROJECT_LIST, Dateiname, 0, SelDrucker, MyDevMode)

Abhandlung im Modul


'======================================================
Public Sub ChangeDevMode(ByRef xdev As DEVMODEA)
'======================================================

'D:   Gegebene DevMode-Struktur ändern
With Screen.ActiveForm
    xdev.dmPaperSize = SelPapersize
    xdev.dmPaperWidth = SelWidth
    xdev.dmPaperLength = SelHeight
    xdev.dmPrintQuality = SelQuality
    xdev.dmCopies = SelKopien
    xdev.dmDefaultSource = SelPapierfach
    xdev.dmFields = xdev.dmFields Or DM_PAPERSIZE Or DM_PAPERWIDTH Or DM_PAPERLENGTH Or DM_PRINTQUALITY Or DM_COPIES Or DM_DEFAULTSOURCE
End With

Dim myhDC&
myhDC = CreateDC(0, xdev.dmDeviceName, 0, xdev)
Debug.Print myhDC&
Debug.Print GetDeviceCaps(myhDC&, HORZSIZE)
Debug.Print GetDeviceCaps(myhDC&, VERTSIZE)
Debug.Print DeleteDC(myhDC&)

End Sub

Vielen Dank
Rainer

SelDrucker = 0 -> Erstseitendrucker
SelDrucker = 1 -> Folgeseitendrucker

Da kannst Du also für beide Bereiche den Schacht vorgeben, indem Du die API zwei Mal aufrufst mit verschiedenen DEVMODEs.

Paulchen

Hallo Paulchen,

danke für Deine schnelle Antwort. Wenn ich Dich richtig verstehe, kann ich die API
mehrmals vor dem Druck aufrufen und jeweils die Definitionen für die erste
und dann für die Folgeseiten übergeben.

Ich muss also nicht einen Seitenumbruch abfangen und erst dann den 2. Aufruf der
API absetzen?!

Danke
Rainer

Genau - vor dem Druck die API zwei mal aufrufen.

Kannst Du m.W. auch direkt nach LlPrintStart() rsp LlPrintWithBoxStart() machen (wichtig: vor dem ersten LlPrint()!), dann ist’s etwas schneller, weil es nur das Projekt modifiziert, nicht aber die P-Dateien. Aber da bin ich mir nicht 100% sicher, ist schon eine Weile her ;(

Paulchen

Vielen Dank Paulchen für deine wertvollen Hinweise. Ich werde nun mal beide Varianten antesten; die Zeit ist aber hier sekundär - Hauptsache die Schachtsteuerung funktioniert
korrekt.

Liebe Grüsse
Rainer

Hallo Paulchen,

ich habe nun mit LlSetPrinterInFile getestet. Ganz wie gewünscht funktioniert das nicht.
Ich setze die folgenden Commands ab:

SelDrucker = 1
ret% = LlSetPrinterInFile(ListLabel1.hJob, LL_PROJECT_LIST, Dateiname, 0, SelDrucker, MyDevMode)

SelDrucker = 4
ret% = LlSetPrinterInFile(ListLabel1.hJob, LL_PROJECT_LIST, Dateiname, 0, SelDrucker, MyDevMode)


Bei den anschliessenden Tests musste ich feststellen, dass der Druck immer aus der
oberen Kassette kommt. Ein Schachtwechsel bei Seite 2 findet nicht statt.

In der generierten lsp-Datei vermisse ich auch Einträge, die auf die einzelnen Schächte zeigen. In einer durch LL erzeugten Datei (z.B. Angebot.lsp) habe ich folgende Einträge:

Condition=Page() = 1
Condition=Page() > 1
Condition=True

Kannst Du mir vielleicht noch sagen, wie ich diese Bedingungen durch LlSetPrinterinFile erzeugen kann? Leider finde ich da keinen Hinweis/Beispiel in der Dokumentation. Evtl.
liegt haber heir das Problem.

Vielen Dank und Gruss
Rainer

Also Vorsicht:

Druckerindex -1 -> gleicher Drucker für beide Bereiche
Druckerindex 0 -> Erstseitendrucker
Druckerindex 1 -> Folgeseitendrucker

Du willst Drucker 1 und 4 ändern -> letztere ist nicht definiert.

Durch Setzen der Drucker 0 und 1 erzeugst Du implizit zwei Regionen mit den Bereichen “Page()==1” und “Page()>1”. Wenn Du nur einen Bereich willst, definierst Du nur Drucker -1.

Dein Code beingt aber was durcheinander - sorry, aber “Basic halt” :wink: Achte auf die Parameter!!!

ret% = LlSetPrinterInFile(ListLabel1.hJob, LL_PROJECT_LIST, Dateiname, 0, “HP4000”, MyDevModeErstseitendrucker)
ret% = LlSetPrinterInFile(ListLabel1.hJob, LL_PROJECT_LIST, Dateiname, 1, “Canon”, MyDevModeFolgeseitendrucker)

Natürlich müssen die DEVMODEs zu dem jeweiligen Drucker passen!

Du hast zwei mal Drucker 0 gesetzt, einmal auf den Drucker “1” und einmal auf den Drucker “4”.

Dir Schachtinfo findest Du in der P-Datei - aber nicht-trivial sichtbar, denn die ist in der DEVMODE-Struktur, die hier hex-codiert ist.

Paulchen

Hinweis: Ein Blick aufs Log-File hätte Dir das glaube ich verdeutlicht ;))!!! Wenn was nicht so läuft, wie Du willst, schau erst mal ins Log, ob LL auch wirklich glücklich ist… :wink:

Hallo Paulchen,

danke für Deine Hilfestellung. Die Schachsteuerung funktioniert inzwischen. Ich habe
bei meinen Bemühungen 2 grundsätzlich Fehler gemacht:

  1. SelDrucker = 1 & SelDrucker = 4 => Hier wollte ich eigentlich Das Papierfach und
    nicht den Drucker vorgeben; also SelSchacht = 1 …

  2. Bei den DEMODE-Parametern hatte ich 2x den Druckerindex 0, anstatt 1x 0 und 1x 1
    übergeben.

Dank Deinem Feedback konnte ich die Punkte korrigieren. Ab Du hast recht, ohne Basics
und Sorgfalt läuft nichts …

Nachmals herzlichen Dank und ein schönes Wochenende

Gruss, Rainer