Guten Tag, liebe Leserin und lieber Leser! Kaum eine Systemerweiterung hat in der letzten Zeit für so viele Diskussionen gesorgt wie WDIALOG von Behne & Behne. Moderne Software setzt WDIALOG zunehmend voraus, doch leider gab es noch das eine oder andere Problem mit älteren TOS-Versionen oder N.AES. Bei letzterem zeichnet sich nun eine grundsätzliche Lösung ab, und mit der aktuellen WDIALOG-Version 2.04 sollte sowohl Single-TOS als auch N.AES im wesentlichen zurechtkommen. Unter MagiC gab es diese Probleme nie, und seit MagiC 6 wird WDIALOG in Form einer Shared Library ("PDLG.SLB") mitgeliefert.
Ältere TOS-Systeme haben Erweiterungen wie Fensterdialoge, Listboxen, eine Zeichensatzauswahl und einen Druckdialog nicht eingebaut, was viele Applikationen daher durch eigene Routinen nachbilden (müssen). Alternativ gibt es zahlreiche AUTO-Ordner-Programme, die beispielsweise eine systemweite Zeichensatzauswahl nachrüsten. Alle diese Erweiterungen sind in WDIALOG zusammengefaßt, und selbst MagiC, das die meisten der oben genannten Erweiterungen bereits mitbringt, kommt so auch in den Genuß des einheitlichen Druckdialogs.
int out1,out2,out3,out4;
int has_print_dialog = 0;
if (appl_xgetinfo(7,&out1,&out2,&out3,&out4) (
has_print_dialog = (out1 & 0x0010);
}
if (has_print_dialog)
{
/* WDIALOG-Druckdialog vorhanden */
}
Wir werden uns heute nur einen Teil von WDIALOG ansehen, den Druckdialog (siehe Bild l). Man beachte den Namen "WDIALOG-Druckdialog" (und nicht etwa "NVDl-Druckdialog"), denn dieser kann ebenso gut mit SpeedoGDOS verwendet werden - auch wenn sich der Einsatz des De-facto-Standards NVDI dringend empfiehlt.
Der Druckdialog nimmt dem Programmierer die mühselige Arbeit ab, sich mit den Fähigkeiten und Eigenschaften der diversen Ausgabegeräte genauer beschäftigen zu müssen. Man kann mit einer einheitlichen und kompakten Schnittstelle die unterschiedlichsten Treiber auf allen möglichen TOS-kompatiblen Systemen ansteuern, und WDIALOG kümmert sich darum, daß der Anwender immer die optimalen Einstellungsmöglichkeiten präsentiert bekommt. Wenn man beispielsweise mit NVDI unter MagiCMac direkt auf den QuickDraw-Drucker des Mac OS druckt, erscheint konsequenterweise auch der Original-Druckdialog des Mac OS (siehe Bild 2).
Zunächst müssen wir testen, ob WDIALOG installiert ist und wir den Druckdialog nutzen können. Dazu verwenden wir Unterfunktion 7 von appl_getinfo [1] bzw. appl_xgetinfo [2] (siehe Info 1).
Der Druckdialog kann unmodal in einem Fenster oder als gewöhnlicher modaler Dialog verwendet werden. Die Aufrufschemata sehen sehr ähnlich aus (siehe Tabellen 1 und 2).
Tabelle 1:
Aufrufschema des Fenster-Druckdialogs
Tabelle 2:
Aufrufschema des modalen Druckdialogs
Durch Aufruf der Funktion pdlg_create reserviert WDIALOG Speicher für den Druckdialog. Als Rückgabe erhalten wir einen Zeiger auf eine interne Verwaltungsstruktur. Diesen Zeiger verwenden wir bei den weiteren Aufrufen als Kennung für unseren soeben erzeugten Druckdialog. Bei Programmende geben wir den Speicher mit pdlg_delete wieder frei.
WDIALOG trennt die Verwaltung der Dialoge von deren Darstellung auf dem Bildschirm. Erst nachdem nämlich ein Druckdialog mit pdlg_create erzeugt wurde, müssen wir uns entscheiden, ob wir den Dialog modal mit pdlg_do oder unmodal in einem Fenster mit pdlg_open, pdlg_event und pdlg_closc anzeigen lassen wollen.
Egal für welche Variante wir uns entscheiden, sowohl pdlg_do als auch pdlg_open wollen beim Aufruf nicht nur den Zeiger auf die Verwaltungsstruktur übergeben bekommen, sondern auch einen Zeiger auf den Speicherbereich, in dem die Einstellungen des Benutzers abgelegt werden. Diese Einstellungen sollten in jedem Dokument gespeichert werden, wodurch jedes Dokument eine komplett andere Druckereinstellung besitzen kann!
Wenn ein Dokument noch keine Druckereinstellungen besitzt, müssen wir diese neu anlegen. Dazu gibt es zwei Möglichkeiten:
Die Verwaltung der Einstellungen wird WDIALOG überlassen. Dann können wir uns von pdlg_new_settings passend Speicher anfordern und geeignet initialisieren lassen. Diesen Speicher, der dem System gehört, müssen wir zum Schluß mit pdlg_free_settings wieder freigeben.
Mit pdlg_get_setsize kann die Länge der Einstellungen-Struktur erfragt werden. Mit Malloc wird mit dieser Länge dann ein passender Speicherblock angefordert. Anschließend läßt man pdlg_dflt_settings diesen Block mit geeigneten Werten initialisieren.
Es spricht nichts dagegen, Methode 1 zu verwenden.
Wenn das Dokument seine Druckereinstellungen schon mitbringt, geht man zunächst auch nach Methode 1 vor. Wenn man von pdlg_new_settings den Zeiger auf den Einstellungen-Speicher erhalten hat, lädt man nun die binären Daten aus dem Dokument direkt in diesen Bereich. Um Unstimmigkeiten zu beseitigen (das Dokument könnte auf einem anderen Rechner geöffnet worden sein), sollte man nun noch pdlg_validate_settings aufrufen, damit eventuell fehlerhafte Einträge korrigiert werden.
Die Versuchung mag groß sein, aus der Einstellungen-Struktur irgendwelche Werte direkt auszulesen. Wie wir weiter unten noch sehen, ist das in den meisten Fällen aber unnötig - das Verwenden der Einstellungen ist viel einfacher, als man denkt. Wer doch meint, direkt auf eine Einstellung zugreifen zu müssen, findet in der WDIALOG-Doku eine Übersicht, auf welche Felder man überhaupt zugreifen darf.
Eine wichtige Entscheidung haben wir noch zu lallen. Der Dialog kann nämlich in zwei Gestalten erscheinen, als Einstelldialog oder als eigentlicher Druckdialog. Der Einstelldialog - Mac-Benutzern besser als "Papierformat" bekannt - besitzt einen "OK"-Button. Man kann es dem Benutzer hiermit also ermöglichen, die Einstellungen zu ändern, ohne das Dokument zu drucken. Der Druckdialog dagegen besitzt einen "Drucken"-Button für eben diesen Zweck.
Programmstart
pdlg_create
Aufruf des Druckdialogs: pdlg_open
Event-Loop: pdlg event
Schließen des Druckdialogs: pdlg_close
pdlg delete
Programmend:
Wenn der Benutzer alle Einstellungen vorgenommen und den "Drucken"-Button angeklickt hat (was man übrigens von pdlg_do bzw. pdlg_event gemeldet bekommt), bleibt die Frage, wie die neuen Einstellungen beim Ausdrucken angewendet werden. Dazu wird das Binding von v_opnwk etwas erweitert, damit zusätzlich zu den üblichen Parametern noch die Einstellungen-Struktur übergeben werden kann. Dem "NVDI5 Programmer's Guide" liegt ein entsprechendes Binding - v_opnpm - bereits bei. Dort finden sich auch einige Beispielprogramme, die die Verwendung von v_opnpm demonstrieren.
Wer sich das Binding selbst schreiben möchte (oder muß), geht dazu vom Original-Binding aus. Vor dem VDI-Aufruf schreibt man einfach in in-tint[ 14]/intin[ 15] den Zeiger auf die Einstellungen-Struktur. Aus Kompatibilitätsgründen kopiert man in intin[11] noch das Feld size id aus der Einstellungen-Struktur und schreibt in intin[12]/intin[13] einen Zeiger auf das Feld device (ebenfalls aus der Einstellungen-Struktur). Nun muß nur noch controI[3] wegen der zusätzlichen Parameter auf 16 gesetzt werden, und der VDI-Aufruf kann erfolgen. An Auswertung der Rückgabe ändert sich nichts. Wenn der Aufruf geklappt hat, kann man seine Ausgaben wie gewohnt auf die so erhaltene Drucker-Workstation machen.
Programmstart
pdlg_create
Aufruf des Druckdialogs: pdlg_do
pdlg_delete
Programmende
Man kann den Druckdialog um eigene Unterdialoge erweitern, um so programmspezifische Druckeinstellungen anzubieten. Bild 3 zeigt, wie eine solche Erweiterung aussehen könnte.
Die zugehörigen Funktionen pdlg_add_sub_dialogs und pdlg_remove_sub_dialogs sind in der WDIALOG-Dokumentation beschrieben.
Moderne Druckertreiber nutzen gegebenenfalls die Fähigkeiten einiger Drucker, mehrere Kopien einer Seite auszugeben, ohne daß sie mehrfach an den Drucker geschickt werden muß. Applikationen können diese Eigenschaft abfragen und wissen somit, wann sie Kopien nicht selbst erzeugen dürfen. Dazu ruft man nach dem Öffnen der Drucker-Workstation v_copies (handle,-1) auf. Wenn die Funktion einen Wert größer als 1 zurückliefert, kümmert sich der Druckertreiber automatisch um das Erzeugen der gewünschten Anzahl von Kopien! Wichtig: Unter Umständen ist v_copies überhaupt nicht implementiert. Nur wenn contrl[4] nach dem VDI-Aufruf gleich 1 ist, darf die Anzahl der Kopien ausgewertet werden, ansonsten fehlt die Funktion und die Applikation muß die Seite mehrfach zum Drucker schicken. Man sollte sein v_copies-Binding also überprüfen und bei Bedarf korrigieren.
Zahlreiche weitere Features, beispielsweise das Hinzufügen eigener Drucker und Rasterverfahren zur Laufzeit, können in der WDIALOG-Dokumentation nachgelesen werden, sind aber zur Unterstützung des Druckdialogs in eigenen Programmen nicht notwendig.
Kontakt
Links zur Dokumentation und zu den besprochenen Programmen finden sich wie immer im World Wide Web unter der Adresse: http://www.snailshell.de/insider.html.
[1] Diese Unterfunktion haben wir bereits in Ausgabe 9/98 verwendet, um das Vorhandensein der erweiterten Dateiauswahl festzustellen.
[2] appl_xgetinfo wurde in Ausgabe 12/98 vorgestellt.