
In der Artikelreihe des GanttGraphen habe ich erläutert, wie ein GanttGraph aufgebaut und zu verwenden ist. Oft gibt es den Wunsch einen fertig aufbereiteten GanttGraphen zu drucken. Um dies zu ermöglichen gibt es in CONZEPT 16 das PrtGanttGraph-Objekt. Die anzuzeigenden Daten müssen dabei nicht erneut aus der Datenquelle ausgelesen werden. Stattdessen können die Daten direkt aus dem GanttGraph übernommen werden.
GanttGraph vs. PrtGanttGraph
Der PrtGanttGraph verhält sich weitgehend so, wie der eigentliche GanttGraph. Jedoch wird der PrtGanttGraph ausschließlich zum Drucken eines GanttGraphen verwendet. Intervalle, Linien und Boxen werden mit den gewohnten Befehlen hinzugefügt oder entfernt. Eigenschaften die beim GanttGraph-Objekt in Pixeln angegeben wurden, werden beim PrtGanttGraph-Objekt in logischen Einheiten definiert. Beispielsweise wird bei der Eigenschaft ppCellSizeHorz
, die Breite einer Zelle in Pixeln (im GanttGraph-Objekt), bzw. in logischen Einheiten (im PrtGanttGraph-Objekt) definiert. Außerdem besitzt das PrtGanttGraph-Objekt vier spezielle Eigenschaften zur Anpassung der Darstellung des Objektes:
ppAreaHeightCells
undppAreaWidthCells
In diesen Eigenschaften können die Höhe und die Breite des PrtGanttGraph-Objektes als Vielfaches der Zellenhöhe bzw. -breite angegeben werden.
Das Setzen einer der Eigenschaften ändert die EigenschaftwpAreaBottom
bzw.wpAreaRight
.ppCellSizeMode
In dieser Eigenschaft wird bestimmt, wie die für die Zellen zur Verfügung stehende Fläche aufgeteilt wird. Folgende Werte können gesetzt werden:_PrtCellSizeModeNone
Ist dieser Wert gesetzt, definiertppAreaWidthCells
undppAreaHeightCells
die Anzahl der Zellen in horizontaler bzw. vertikaler Richtung, die der Ausgabebereich des PrtGanttGraph-Objektes umfassen soll. Die Größe des PrtGanttGraph-Objektes wird entsprechend angepasst.
Das Setzen der EigenschaftenppCellSizeHorz
bzw.ppCellSizeVert
in diesem Modus führt zu einer Veränderung der Werte inppAreaWidthCells
bzw.ppAreaHeightCells
._PrtCellSizeModeStretch
Bei diesem Wert wird die Zellgröße (ppCellSizeHorz
undppCellSizeVert
) so angepasst, dass die inppAreaWidthCells
undppAreaHeightCells
angegebene Anzahl von Zellen im PrtGanttGraph dargestellt werden. Das Verändern der Größe des PrtGanttGraph-Objektes führt somit auch zu einer Anpassung der Zellgröße.
Ist diese Ausprägung gesetzt sind die EigenschaftenppCellSizeHorz
undppCellSizeVert
nur lesbar.
ppHeightIvl
Die Höhe des Intervalls in einem PrtGanttGraph-Objekt wird durch die Höhe der Zeile bestimmt. In dieser Eigenschaft kann die Höhe des Intervalls in Relation zur Höhe der Zeile angegeben werden. Die Höhe kann zwischen 25% und 100% der Höhe der Zeile betragen. Das Intervall wird zentriert in der Zeile gezeichnet.
Aus GanttGraph werde PrtGanttGraph
Damit ein GanttGraph-Objekt gedruckt werden kann, müssen dessen Daten in ein PrtGanttGraph-Objekt übertragen werden.
Angefangen wird dabei beim Öffnen des Druckjobs:
sub PrintGantt
(
aWinGantt : handle; // Zu druckender GanttGraph
)
local
{
tPrtJob : handle;
tPrtForm : handle;
tPrtPage : handle;
tPrtGantt : handle;
}
{
// Temporären Druckjob öffnen (PrintDocument DIN A4, leer)
tPrtJob # PrtJobOpen(_PrtDocDINA4,'',_PrtJobOpenWrite);
if (tPrtJob > 0)
{
// PrintForm mit dem PrtGanttGraph-Objekt laden
tPrtForm # PrtFormOpen(_PrtTypePrintForm,'PrtGanttGraph');
if (tPrtForm > 0)
{
// Seite ankündigen
tPrtPage # tPrtJob->PrtJobWrite(_PrtJobPageStart);
if (tPrtPage > 0)
{
// PrtGantt-Objekt suchen
tPrtGantt # tPrtForm->PrtSearch('PrtGantt');
// PrtGanttGraph aufbereiten
if (tPrtGantt != 0)
tPrtGantt->PrtGanttSetup(aWinGantt);
// Inhalt der Printform zu Seite hinzufügen.
tPrtPage->PrtAdd(tPrtForm);
// Seite geschrieben
tPrtJob->PrtJobWrite(_PrtJobPageEnd);
}
// PrintForm schließen
tPrtForm->PrtFormClose();
}
// Druckjob schließen und Preview anzeigen
tPrtJob->PrtJobClose(_PrtJobPreview);
}
}
In der Funktion PrtGanttSetup()
wird der PrtGanttGraph entsprechend des originalen GanttGraphen erstellt. Dabei ist es empfehlenswert mit dem Einstellen der Achsen zu beginnen:
Werden die Achsen des GanttGraph-Objektes zur Laufzeit mittels einer Funktion konfiguriert, kann dieser Funktion auch der Deskriptor des PrtGanttGraphen übergeben werden.
Sind die Achsen des GanttGraph-Objektes im Designer definiert, kann das Objekt in der Entwicklungsumgebung kopiert und in eine PrtForm eingefügt werden. Dabei werden das GanttGraph-Objekt und dessen untergeordnete Elemente automatisch in ihre entsprechenden Druck-Objekte umgewandelt.
sub PrtGanttSetup
(
aPrtGantt : handle;
aWinGantt : handle;
)
local
{
tWinGanttView : handle;
}
{
// Achsen des PrtGantt setzen.
aPrtGantt->AxisSetup();
// Ermitteln des GanttView-Objektes
tWinGanttView # aWinGantt->WinInfo(_WinObject, 1, _WinTypeGanttView);
if (tWinGanttView > 0)
{
// Ursprung des Ausschnitts vom View übernehmen.
aPrtGantt->ppCellOfsHorz # tWinGanttView->wpCellOfsHorz;
aPrtGantt->ppCellOfsVert # tWinGanttView->wpCellOfsVert;
// Breite und Höhe der Zellen an Größe des GanttGraphen anpassen.
aPrtGantt->ppAreaWidthCells # tWinGanttView->wpAreaWidthCells;
aPrtGantt->ppAreaHeightCells # tWinGanttView->wpAreaHeightCells;
// Intervalle hinzufügen.
aPrtGantt->IntervalAdd(aWinGantt);
}
}
In diesem Beispiel-Code soll der sichtbare Bereich gedruckt werden. Die Werte der Eigenschaften wpCellOfsHorz
und wpCellOfsVert
des View-Objektes geben die Größe des aktuell sichtbaren Bereich an.
Das Hinzufügen der Intervalle geschieht in der Funktion IntervallAdd()
. Diese kann beispielsweise wie folgt aussehen:
sub IntervalAdd
(
aPrtGantt : handle;
aWinGantt : handle;
)
local
{
tObj : handle;
}
{
// Intervalle hinzufügen
for tObj # aWinGantt->WinInfo(_WinFirst, 0, _WinTypeInterval);
loop tObj # tObj->WinInfo(_WinNext, 0, _WinTypeInterval);
while (tObj > 0)
{
aPrtGantt->WinGanttIvlAdd(tObj->wpArea:left, tObj->wpArea:top,
tObj->wpArea:right - tObj->wpArea:left + 1,
tObj->wpName, tObj->wpCaption);
}
// Boxen hinzufügen
for tObj # aWinGantt->WinInfo(_WinFirst, 0, _WinTypeIvlBox);
loop tObj # tObj->WinInfo(_WinNext, 0, _WinTypeIvlBox);
while (tObj > 0)
{
aPrtGantt->WinGanttBoxAdd(tObj->wpArea, tObj->wpColBkg,
tObj->wpName, tObj->wpCaption);
}
// Linien hinzufügen
for tObj # aWinGantt->WinInfo(_WinFirst, 0, _WinTypeIvlLine);
loop tObj # tObj->WinInfo(_WinNext, 0, _WinTypeIvlLine);
while (tObj > 0)
{
aPrtGantt->WinGanttLineAdd(
Max(tObj->wpArea:left, tObj->wpArea:top),
tObj->wpColBkg, tObj->wpArea:left = 0);
}
}
Sofern alles erfolgreich war, sollte nun der sichtbare Bereich des GanttGraph-Objektes, innerhalb der Druckvorschau im PrtGanttGraph dargestellt werden.
Zusätzlich gibt es in der CodeLibrary das Beispiel „GanttGraph“, das unter anderem auch das Drucken des GanttGraphen zeigt.
6 Antworten
Danke für den Tipp,
wenn aus einem GanttGraph Steuerlement (nicht PrtGanttGraph) mittels eine Speicherfunktion direkt als Picture umgewandelt werden könnte, wäre dies als Grafik einfach drucken.
@R. Krichbaum
Dies ist auch bereits bei der Druckaufbereitung möglich. Mit der Option _PrtJobTif bei PrtJobClose() kann ein TIFF-Image erzeugt werden.
Mittels ChartSave kann ein Bild erzeugt werden, wäre eine solche Option beim Gantt denkbar?
@R. Krichbaum
Welche Druckvariante meinen Sie genau?
Wäre es möglich eine weitere zusätzliche Druckvariante anzubieten wie beim Chart?
Soll der ganze Gantt-Graph gedruckt werden, so sollte man die PrintForm zuerst laden und füllen, so daß man Pro Seite nur noch jeweils den Druckbereich setzen muß.