Programmierung

Drucken eines GanttGraphen

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 und ppAreaWidthCells
    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 Eigenschaft wpAreaBottom 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, definiert ppAreaWidthCells und ppAreaHeightCells 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 Eigenschaften ppCellSizeHorz bzw. ppCellSizeVert in diesem Modus führt zu einer Veränderung der Werte in ppAreaWidthCells bzw. ppAreaHeightCells.
    • _PrtCellSizeModeStretch
      Bei diesem Wert wird die Zellgröße (ppCellSizeHorz und ppCellSizeVert) so angepasst, dass die in ppAreaWidthCells und ppAreaHeightCells 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 Eigenschaften ppCellSizeHorz und ppCellSizeVert 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.

Sichtbarer Bereich des GanttGraphen

Zusätzlich gibt es in der CodeLibrary das Beispiel „GanttGraph“, das unter anderem auch das Drucken des GanttGraphen zeigt.

6 Kommentare

6 Kommentare “Drucken eines GanttGraphen”

Kommentar abgeben