In dem Artikel Druck Objekte Teil I bin ich auf das PrintDocRecord-Objekt eingegangen. Ein Objekt, welches sich für die schnelle Erstellung von Drucklisten und Reports eignet.
Der heutige Artikel befasst sich mit dem PrintDoc-Objekt. Das PrintDoc wurde speziell für das Erstellen von Druckvorlagen, wie zum Beispiel Formulare, Briefvorlagen, Etiketten etc., konzipiert.
Aufbau
Der Aufbau des PrintDoc-Objekts erfolgt hierarchisch. Die Basis bildet das PrintDoc-Objekt selbst. Über dieses Objekt wird neben verschiedenen Farb- und Formatierungseinstellungen das Papierformat der Druckvorlage bestimmt. Über die Eigenschaft ppPageFormat
stellt CONZEPT 16 bereits eine Reihe von vordefinierten Papierformaten nach der Deutsche Industrie Norm sowie US-Amerikanische Formate zur Verfügung. Benutzerdefinierte Formate können über die Eigenschaften ppPageHeight
und ppPageWidth
erstellt werden.
Das Basis-Objekt kann keine Objekte aufnehmen, die den Seiteninhalt bestimmen. Dazu ist dem PrintDoc-Objekt ein sogenanntes Seiten- bzw. PrtPage-Objekt hinzuzufügen. Neben den Objekten aus der Objekt-Palette “Druck” können dem PrtPage-Objekt zwei spezielle Objekte für das Erzeugen eines Kopf- und Fußbereichs hinzugefügt werden.
Das PrintDoc-Objekt kann bis zu zehn unterschiedliche Seiten-Objekte aufnehmen. Während der Druckaufbereitung können die einzelnen Seiten-Objekte angesprochen werden. Auf diese Weise lässt sich ein Seitenobjekt mit unterschiedlichen Inhalten beliebig oft ausgeben.
Ein typischer Anwendungsfall ist eine Briefvorlage. Für die Vorlage werden zwei Seitenobjekte definiert. Ein Objekt beinhaltet die erste Seite mit Briefkopf und Anschrift, das zweite Objekt gibt die Folgeseite(n) aus.
// Druckjob öffnen
tJob # PrtJobOpen('Briefvorlage','',_PrtJobOpenWrite |
_PrtJobOpenTemp);
// PrtDoc-Objekt ermitteln
tDoc # tJob->PrtInfo(_PrtDoc);
// Erste Seite drucken
tJob->PrtJobWrite(tDoc->PrtSearch('Seite1'));
// Seite 2 ermitteln
tPage # tDoc->PrtSearch('Seite2')
// Seite 2 drucken, solange Text vorhanden
while (CheckText())
{
// Seite drucken
tJob->PrtJobWrite(tPage);
}
//Druckjob an den Drucker senden
tJob->PrtJobClose(_PrtJobPrint);
4 Antworten
@Th.Eichele
Ja, dies ist möglich. Mit Hilfe des Befehls PrtInfo(). Wird dort der Parameter _PrtInfoPaperID angegeben, kann die intere ID des Papierformats ermittelt werden. Dabei gibt tCnt den Index des Papierformats innerhalb des Druckers an.
Das ausgewählte Papierformat kann über die Eigenschaft ppPageFormat des PrtDoc-Objekts ermittelt werden.
Beispiel:
tSelectedPaper # aPrtDoc->ppPageFormat;
tPaperCnt # aPrtDevice->PrtInfo(_PrtInfoPaperCount);
for tIndexCnt # 1;
loop inc(tIndexCnt);
while (tIndexCnt<= tPaperCnt )
{
if (aPrtDevice->PrtInfo(_PrtInfoPaperID, tIndexCnt) = tSelectedPaper)
return(true);
}
@Kilian
Wir nehmen Ihren Vorschlag gerne auf.
Läßt sich vor dem Druck prüfen, ob das das hinterlegte Papierformat vom ausgewählten Drucker unterstützt wird ?
Vorschlag: Es sollte in den komplexeren Druckobjekten (Druckdokumente, Druckformulare usw.) die Möglichkeit geben einfache graphische Tabellen einzufügen (ähnlich wie in Word). Viele Kunden wollen Druckvorlagen realisiert haben, die zum einen zu komplex für die DocRecord-Möglichkeit sind, zum andern aber etliche Tabellen enthalten, die man dann unglaublich mühsam Linie für Linie zusammenstellen muss um sie exakt dem Kundenwunsch gemäss darstellen zu können.