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?
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 ")
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?!
'======================================================
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&)
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?!
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 ;(
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.
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:
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.
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” Achte auf die Parameter!!!
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…