Session D-GRAF

Grafische Präsentation und
Druckausgabe mit VFP

Michael Lackner             /            Sebastian Flucke
ProLib Software GmbH  /  ASCI-Consulting GmbH


Einleitung

Visual FoxPro besitzt für die grafische Präsentation von Daten nur sehr beschränkte Möglichkeiten. Wer solche Funktionen benötigt, muß auf diverse Zusatztools zurückgreifen. Die Session beschreibt die Möglichkeiten und Grenzen von Tools zur Daten-Visualisierung sowie deren Einsatz mit Visual Foxpro. Beginnend mit MS-Graph, das mit Visual Foxpro geliefert wird, werden praktische Beispiele und Vorgehensweisen der Grafikprogrammierung mit FLIPPER, der Virtual Print Engine und dem Graphics Server gezeigt. Außerdem werden einige allgemeine Aspekte der grafischen Präsentation von Daten diskutiert.

Beschränkungen bei Ausgabe/Druck

Obwohl Visual Foxpro eine äußerst leistungsfähige Programmiersprache ist, so sind allerdings die Ausgabemöglichkeiten relativ eingeschränkt. Eigentlich kennt VFP nur Berichte und Etiketten, um Daten an den Druck auszugeben. Beim Arbeiten mit dem Berichtsgenerator hat man allerdings mit einigen Mankos zu kämpfen.

Aus diesem Grund muß man bei diesen Anforderungen meist auf Zusatztools zurückgreifen.

MSGRAPH

MS-Graph wird mit VFP geliefert. Dabei handelt es sich um ein Add-In, daß die grafische Darstellung von Daten unterstützt. Die Dokumentation zu MS-Graph finden Sie normalerweise im Verzeichnis \Programme\GemeinsameDateien\MicorsoftShared\MSGraph5\VBA_GRP.HLP.

MS-Graph kann auf zwei verschiedene Arten verwendet werden:

  1. ActiveX-Ansteuerung
    Auf das MS-Graph-OCX kann von VFP aus zugegriffen werden. Plazieren Sie das OLE-Control auf einer Form und starten Sie die Form.
  2. General-Field-Variante

Folgende Probleme können beim Einsatz von MS-Graph auftreten:

FLIPPER

Bei Flipper handelt es sich um ein OCX zur grafischen Präsentation. Unterstützt werden alle gängigen Diagrammtypen, wie z.B. Liniendiagramm, Balkendiagramm, Tortengrafik, Säulendiagramm, Flächendiagramm, usw.... Die meisten dieser Diagrammarten lassen sich beliebig in einer Grafik kombinieren. Sie können alle Diagramme mit 3D-Effekten versehen, den Blickwinkel abändern, das Diagramm drehen, Linienarten und Farben ändern, ...

Der Leistungsumfang von Flipper erfüllt normalerweise die meisten gängigen Anforderungen an Grafiken. Grenzen liegen u.a. in der unterschiedlichen Beschriftung und Farbgebung in Richtung Z­Achse.

VPE Virtual Print Engine

Bei der Virtual Print Engine handelt es sich um ein programmatisches Seitenbeschreibungs-Tool für Reports und Charts, daß wahlweise als OCX oder DLL eingesetzt werden kann. Im wesentlichen unterstützt die Virtual Print Engine die wichtigsten Zeichenoperationen wie Linien, Polygone, Kreise, Ellipsen und Rechtecke. Zum Einsatz kommt die VPE immer dann, wenn Anforderungen an Reports und Grafiken gestellt werden, die mit dem Reportgenerator von VFP oder mit anderen Grafiktools nicht erschlagen werden können.

Folgende Features zeichnen die VPE aus:

Einsatz als Report-Tool

Wann immer man an die Leistungsgrenzen des Reportgenerators von Foxpro stößt, kann man auftretende Probleme meist mit der VPE lösen:

Durch die Möglichkeit der absoluten Positionierung lassen sich mehrere Detailbereiche nebeneinander realisieren. Außerdem kann man Fließtext neben einem Detailbereich realisieren. Auch Memofelder über den Seitenumbruch hinaus werden unterstützt.

Einsatz als Chart-Tool:

Als Charttool wird die VPE immer dann eigesetzt, wenn benutzerdefinierte Chart-Typen verlangt werden, die normalerweise von keinem gängigen Tool unterstützt werden. Schwierig wird die Darstellung von 3D-Effekten, da alle Grafiken "von Hand" programmiert werden müssen.

Graphics Server

Der Graphics-Server ist als HighEnd-Tool für Chartprogrammierung zu bezeichnen. Auch der Graphics Server wird als OCX und als DLL ausgeliefert.

Prolib Navigator/GN

Der ProLib-Navigator/GN ist eine in Visual FoxPro programmierte Wrapper-Klasse für Chart-Zusatztools. Diese Klasse kapselt das Handling des jeweiligen Chart-Tools (im Moment verfügbar für das GraphicsServer-OCX) und bietet dem FoxPro-Programmierer eine Schnittstelle zur grafischen Präsentation von numerischen Werten aus einer beliebigen DBF-Dateien (z.B. kann auch FoxFire-Output kann verarbeitet werden).

Der ProLib-Navigator/GN bietet folgende Features:

Klippen und Tricks bei der Chart-Programmierung

Probleme bei der Datenbereitstellung

Je nach verwendetem Chart-Typ können mehr oder weniger störende Probleme durch die darzustellenden Daten auftreten:

  1. bei Struktur-Darstellungen (Kreis- und Stapelbalken-Diagramm sowie verwandte Chart-Typen), wenn ausschließlich negative oder gemischt negative und positive Werte auftreten
  2. bei Verlaufs-Darstellungen (Linien-Diagramm sowie verwandte Chart-Typen), wenn Werte fehlen
  3. wenn Daten seitens FoxPro echt nicht vorhanden sind (.NULL.)

zu (1):

Die diversen Chart-Engines reagieren unterschiedlich auf diese Daten-Konstellation.

Für den Fall gemischt positive und negative Daten muß die Anzeige eines Struktur-Diagramms eigentlich abgelehnt werden, was aber keines der Tools tut (in den meisten Fällen werden negative Werte einfach ignoriert, was natürlich die Strukturaussage verfälscht!). Hier kann man Abhilfe schaffen durch vorheriges Prüfen der Datenkonstellation und durch Verhindern der Anzeige dieses Charts.

Liegen dagegen ausschließlich negative Werte vor und das Chart-Tool verweigert die Darstellung, so kann man vorher programmatisch die Datenreihe ins Positive konvertieren, muß dann allerdings für korrekte Beschriftung sorgen. Zu diesem Zweck muß man in den meisten Fällen die Beschriftungsautomatismen abschalten und die Beschriftungstexte (d.h. die Originalwerte mit negativem Vorzeichen) explizit zuweisen.

Ein spezielles Problem können Strukturdarstellungen (insbesondere Kreisdiagramme) sein, wenn der komplette Datenvektor auf Grund der konkreten Programmkonstellation nur aus "0"-Werten besteht. Auch diesen Fall muß man oft abfangen, da sich manche Chart-Engine hier nur mit einem GPF zu wehren weiß!

zu (2)

Fehlen bei Verlaufsdarstellungen in einem Datenvektor einzelne Werte (weil z.B. für einen Teilzeitraum noch nicht gemeldet wurde), so sollte die Darstellung wie folgt aussehen:

Viele Chart-Engines präsentieren aber leider folgendes Bild:

Nachfolgende Darstellung ist mit extrem erhöhtem Programmieraufwand zu erreichen:

Hier wurde als Stützwert am Punkt 4 eine 20 in das Datenarray gemogelt und außerdem die Farbgestaltung der Linie dahingehend manipuliert, daß der Bereich von 3-5 andersfarbig dargestellt wird (was hier in dem Ausdruck eventuell nicht sichtbar ist), um die vorgenommene Approximation optisch zu veranschaulichen. Bietet die konkrete Chart-Engine nicht diese Einfärbungsmöglichkeit, kann man notfalls mehrere Linien überlagern, um diesen Effekt zu erreichen (was dann aber umfangreiche Manipulationen bei der Datenbereitstellung erfordert).

zu (3)

In den meisten Fällen vertragen die Chart-Engines keine .NULL.-Werte in ihren Datenarrays, so daß dann bloß eine Konvertierung in eine numerische "0" bleibt. Dies kann aber seinerseits wieder Probleme entsprechend Punkt (2) nachsichziehen!

Skalierung von Charts

Als "Skalierung" wird im folgenden die Einstellung der Achsen-Grenzen auf einen bestimmten Wertebereich betrachtet.

Alle Chart-Engines bieten einen AutoScale-Mode, der die Skalierung automatisch an das vorhandene Datenarray anpaßt und normalerweise auch überwacht, daß sinnvolle Skaleneinteilungen entstehen.

Nimmt man allerdings die Skalierung selbst in die Hand, hat man sich schlagartig mit einer ganzen Menge an Problemen auseinanderzusetzen:

Legenden-Darstellung

Die Legende ist bei den meisten Chart-Engines eine Schwachstelle. Einerseits bietet das einzelne Legenden-Element oft keine genügende Anzahl von Zeichen, zum anderen ist die Anzahl der Legenden-Elemente meist begrenzt oder es kann nicht gescrollt werden. Stellt man also z.B. die Struktur des Jahresumsatzes nach 100 Geschäftstellen eines Unternehmens für die 12 Monate eines Jahres dar, ergibt sich eine Legende mit 100 Einträgen. Eine solche Legende kann keines der bekannten Chart-Tools sinnvoll bereitstellen (entweder sieht man nur die ersten x Einträge, oder die Legende wird zur Unkenntnis verkleinert).

Hat man die Chart-Engine in Visual FoxPro eingebunden, kann man auf die Legendenanzeige durch das Chart-Tool komplett verzichten und sich statt dessen eine DBF-Datei aufbauen, die in einem Grid oder BROWSE angezeigt wird.

Allerdings muß man in diesem Fall auf die automatische Farbvergabe durch die jeweilige Chart-Engine verzichten und die Farbzuordnung selbst programmatisch vornehmen, damit die Legende mit dem Chart entsprechend korrespondiert.

Zusätzlich hat dieses Verfahren den Vorteil, daß man die Legenden-DBF-Datei gleichzeitig für das Ausdrucken mitbenutzen kann.

Drucken

Außer der VPE und dem Graphics-Server kennen die vorgestellten Tools keine eigene Druckunterstützung. Eine der einfachsten und schnellsten Möglichkeiten zur Druckausgabe ist in den meisten Fällen folgende Vorgehensweise:

Bei dieser Verfahrensweise ist zu beachten, daß die BMP bei den meisten Tools in genau der Größe erzeugt wird, die der Größe des aktuellen Diagramms auf dem Bildschirm entspricht. Wird eine solche Bitmap dann beim Ausdrucken auf Papier-Größe gezoomt, entstehen die altbekannten Treppenstufen. Dies kann man dadurch umgehen, daß man empirisch die Diagrammgröße auf dem Bildschirm ermittelt, die 1:1 in den Bericht übernommen werden kann. Bei der Druckvorbereitung erzeugt man nun ein unsichtbares Diagramm der erforderlichen Größe und stellt daraus die BMP her!

Interaktive Charts

Interaktivität von Charts ist unter verschiedenen Aspekten zu betrachten

  1. Beeinflussung des Grafik-Verlaufs durch interaktive Korrektur per Maus

Durch diese Art von Manipulation des Charts können z.B. Planverläufe direkt im Grafik-Modus angepaßt werden. Die Veränderungen des Charts wirken sich automatisch auf das zugrunde liegende Werte-Array aus, welches dann in der Applikation weiterverarbeitet werden kann.

  1. Anklicken von Chart-Elementen (z.B. einzelnen Segmenten eines Kreis-Diagramms)

Viele Chart-Tools stellen Events bereit, in denen man auf das Anklicken von bestimmten Chart-Elementen reagieren kann. In den meisten Fällen bekommen diese Events als Parameter die Koordinaten des betreffenden Elements bezogen auf das Datenarray übergeben, so daß man an diese Events vielfältige weitergehende Aktivitäten anbinden kann.

  1. Anpassung der optischen Eigenschaften

Die meisten Chart-Tools bieten programmatische Methoden zum Verändern der optischen Eigenschaften der Charts.

Verbindet man diese Methoden mit entsprechenden FoxPro-Controls (z.B. in einer Toolbar), so kann man dem Benutzer eine sehr gut angepaßte Oberfläche bereitstellen, mit der er die Charts konfigurieren kann (2D-/3D-Umschaltung, Wechseln von Charttypen usw.).

'ActiveX-Control' versus 'DLL/FLL' versus 'ActiveX-Automation'

Generell lassen sich Zusatztools zu Visual FoxPro auf drei verschiedenen Wegen anbinden:

  1. Einbindung von ActiveX-Controls

Die Einbindung von ActiveX-Controls hat den Vorteil einer einfachen Programmierbarkeit, wenn man die prinzipiellen Hürden beim Einsatz von ActiveX-Controls in Visual FoxPro einmal überwunden hat (die dabei auftretenden Probleme hängen nicht mit VFP, sondern mit den oft etwas unsauber programmierten ActiveX-Controls zusammen, siehe auch Session E-OCX).

Nachteile beim Einsatz von ActiveX-Controls erwachsen aus der Tatsache, daß diese Controls normalerweise ins Windows-Systemverzeichnis installiert werden und dort mit anderen Controls oder mit anderen Versionen des gleichen Controls kollidieren können.

Außerdem bieten die ActiveX-Controls meist einen geringeren Leistungsumfang als die oft ebenfalls erhältliche DLL-/FLL-Schnittstelle.

  1. Aufruf von DLL- oder FLL-Funktionen

Der Aufruf von DLL- oder FLL-Funktionen ermöglicht meist eine detailliertere Einflußnahme auf den Aufbau und die Gestaltung der Charts.

Allerdings bezahlt man diesen Vorteil mit einem wesentlich höheren Programmieraufwand auf der FoxPro-Seite. Außerdem gibt es oft Probleme mit der Integration von DLL-gesteuerten Fenstern in die foxpro-eigene Event-Loop, was sich besonders bei interaktiven Grafiken negativ auswirken kann.

  1. ActiveX-Automation

Begleitdiskette:

Flipper-Demo
VPE-Demo
GS-Slides