|
[ 1 ] [ 2 ] Spezielle Features dieser Unterklasse für die BerichtsverwaltungGeschwindigkeit ist wichtig. Sie sollten immer nach der schnellstmöglichen Methode für die Kommunikation mit Word suchen. Im Code von GroupHeader1Entry, den sie in Listing A sehen, habe ich eine Tabelle erstellt, die die Daten der aktuellen Gruppe enthält. Ich habe den Code für die Erstellung der Tabelle bewußt in mehrere Zeilen aufgeteilt, so daß Sie in der Lage sein sollten, zu erkennen, wie die Tabelle aussieht. Beachten sie besonders, daß ich die Spaltenbreite durch einen String festlege und dabei die Maßeinheit mit angebe (THIS.oWordRef. TableColumnWith(‘2“‘)). Sie können und sollten die Einheit immer mit angeben, da Sie nicht wissen, welches Maßsystem in WinWord voreingestellt ist. Auf jeden Fall vermindern OLE-Anweisungen immer die Geschwindigkeit. Wenn ich Code schreibe, der anschließend in der Praxis eingesetzt werden soll, könnte ich eine spezielle Formatvorlage erstellen, die ein Beispiel dieser Tabelle als Autotext enthält. Dann brauche ich die sie nur noch an die richtige Position einzufügen, wenn ich mit einer Gruppe beginne. Auch mit solchen Verbesserungen bleibt die Kommunikation zwischen Komponenten recht behäbig. Sie könnten nun dem Anwender mitteilen, daß nichts schiefgegangen ist und die Verarbeitung läuft. Ich habe der Klassenhierarchie meiner Klasse FRXClass die Methode UpdateMessage() hinzugefügt, die dem Anwender in ähnlicher Form wie die Fortschrittsanzeige von WinWord mitteilt, daß seine Aktion bearbeitet wird. Sie sehen sie in Abbildung 3. In der Klasse Juggler1 habe ich UpdateMessage() nur im Detailbereich aufgerufen, da die Tabelle nur wenige Datensätze enthält; aber in größeren Tabellen kann es sinnvoll sein, sie für jede Gruppe aufzurufen.
Abbildung 3 Die Methode UpdateMessage() teilt dem Anwender mit, daß das Dokument erstellt wird. Da Juggler1 einen Standardbriefkopf der Organisation verwendet, habe ich das Ereignis TitleEntry() benutzt, um diesem Bericht einige Formatanweisungen für diesen Bericht mitzugeben. Dieser Abschnitt kann nahezu endlos erweitert werden oder Sie speichern berichtsspezifische Informationen in einer berichtsspezifischen Formatvorlage. Sie werden bald feststellen, daß Sie die WordBasic-Anweisungen sehr schnell schreiben können, daher ist es nicht notwendig, sie noch länger zu behandeln. Der Code, den ich in das Ereignis SummaryExit() geschrieben habe, erfordert aber doch noch einige Aufmerksamkeit. In diesem Ereignis kann ich alle Arten von globalen Formatierungen unterbringen, die ich nicht in jedem Detailbereich erneut plazieren will. Zum Beispiel formatiert der Code von SummaryExit() negative Zahlen entweder rot oder fett (je nach den Fähigkeiten des Druckers). Dafür werden Makros verwendet, die ich in FRX2DOC.DOT gespeichert habe. Als Erstes stellt SummaryExit() Word auf den Standarddrucker ein. Sie können dem Anwender auch mit Visual FoxPros Funktion APRINTERS() eine Liste aller verfügbaren Drucker anzeigen lassen und ihn wählen lassen. Als nächstes stellen Sie mit VFPs Funktion PRTINFO() fest, ob der Drucker Farbe drucken kann, soweit VFP und Windows das feststellen können. Haben Sie APRINTERS() eingesetzt und WinWord benutzt nicht den Standarddrucker, müssen Sie PRTINFO() den optionalen zweiten Parameter mit der Druckerinformation übergeben. Anschließend können Sie entscheiden, welches Makro eingesetzt werden soll und übergeben dessen Namen WordBasics Funktion ToolsMacro(). Ich habe eines der zwei Makros, die sich im Übrigen nicht stark unterscheiden, in Listing B dargestellt.
Jenseits von WordSie haben nun gesehen, wie die Klasse Juggler1 auf ihrer Elternklasse, Frx2Doc, aufbaut. Frx2Doc ist eine abstrakte Klasse, die für FRXCLASS.FRX die Dokumentenstellung verwaltet. Vielleicht glauben Sie nun, das einzige komplexe wäre der Code für die generelle Behandlung von WinWord, den ich in Frx2Doc geschrieben habe. Wenn Sie eine Klassenhierarchie entwerfen und erstellen, werden Sie häufig feststellen, daß Sie das eine oder andere erneut entwerfen, bis Sie die meisten Funktionalitäten der Basisklasse in höheren Stufen der Klassenhierarchie separiert haben, die dann die unterschiedlichen Aufgaben in zusätzlichen abgeleiteten Klassen ausführen. Auch Frx2Doc war da keine Ausnahme. In der jetzigen Fassung basiert Frx2Doc auf FrxClass, einer Custom-Klasse, die FRXCLASS.FRX steuert, ohne selber eine eigene Ausgabe zu besitzen.
Listing D - Auszug aus FRXCLASS.PRG Die Listings C und D zeigen Ihnen Aufzüge der Definitionen von Frx2Doc und FrxClass. Die Klasse Frx2Doc erhält mehrere Parameter, die ersten vier werden von der Superklasse FrxClass vorgeschrieben, die fünfte ist WinWord- und Frx2Doc-spezifisch. Die Parameter enthalten folgende Angaben:
Das Programm, das eine von Frx2Doc abgeleitete Klasse instantiiert, sollte wie dieses aussehen:
Beachten Sie, daß oFRX ein unbedingt erforderlicher Variablenname ist, da diese Referenz für alle Ereignisaufrufe in der FRX benötigt wird. Das Objekt oFRX räumt auf und gibt in seiner Methode Run() selbst frei. Ihre Methode Run() könnte, bevor sie etwas anderes macht, versuchen, Word mit dem Dokument in der Seitenansicht zu öffnen. Sie könnte auch QUICKVIEW, den Dateibetrachter, der mit Win95 ausgeliefert wird, starten, um dem Anwender die Möglichkeit zu geben, sich das Dokument anzusehen. Wie ich bereits früher beschrieben habe, könnte Run() es dem Anwender auch ermöglichen, das Dokument in einem beliebigen Dateityp zu speichern. Sie können diese Vorschläge noch beliebig erweitern Sie finden genauere Erläuterungen zu diesem Vorgehen, dem Gebrauch und Entwurf der Klassen Frx2Doc und FrxClass in den vollständigen Source, die die Klassendefinitionen enthalten (Listing C und D: FRX2DOC.PRG). Wenn Sie sich die generische Natur von FrxClass ansehen, werden Sie leicht verstehen, wie das entsprechende Berichtsformular andere Ausgabeformate steuern kann. Stellen Sie sich zum Beispiel vor, es wird eine Präsentation von PowerPoint mit zwei Tabellen in einer 1:n-Beziehung gesteuert, von denen die Mastertabelle Überschriften oder Titel enthält und die Detailtabelle einzelne Punkte oder die Darstellungen selber enthält. Sie starten die OLE-Sitzung mit dem bekannten CREATEOBJECT() und benutzen dann das Objektmodell von PowerPoint, fügen der Sammlung der Präsentationen ein Mitglied hinzu und dem neuen Präsentationsobjekt Folien hinzu. Der Code in der Gruppe könnte zum Beispiel so aussehen:
Der Code für den Detailbereich geht weiter mit dem füllen der Objektreferenz oBody mit zusammengesetzten Zeichenketten, die die Punkte, die Sie auf der Folie darstellen wollen, benennen. Sie werden durch Zeilenumbrüche voneinander getrennt. Aufbauend auf den Layoutinformationen, die Sie ausgewählt haben, werden diese Punkte automatisch formatiert. Die Formatanweisungen können sie aber ändern und Grafiken, eigene Hintergründe usw. „während des laufenden Betriebs“, ganz wie es Ihre Daten erfordern hinzufügen. Jenseits von OLENachdem Sie nun einmal gesehen haben, wie OLE Automation arbeitet, ist der Code, den Sie für den jeweiligen Server schreiben, einfach und vorhersehbar. Je offener das Objektmodell des Server, desto einfacher und vorhersehbarer ist der Code. Daher werde ich auch keinen extra Artikel schreiben, in dem ich Ihnen zeige, wie Sie den Code einer Klasse für PowerPoint schreiben, die Sie von FrxClass ableiten. Außerdem steht Ihnen mit Frx2Doc eine gut entwickelte von FrxClass abgeleitete Klasse zur Verfügung. Diese Beispiele sollten Ihnen auch helfen, mit jedem anderen OLE Automation Server zu arbeiten. Allerdings definiert OLE Automation noch nicht die Grenzen von Nicht-VFP-Ausgabemöglichkeiten oder die Möglichkeiten von FrxClass. In der nächsten Folge dieses Serie, werden wir mit FrxClass HTML-formatierten Text generieren, mit dem Sie WWW-Dokumente erstellen können. Sie werden sehen, daß die gleiche „Technologie des leeren Berichts“, mit der wir hier ein WinWord-Dokument erstellt haben, auch in ein vollständig anderes Ziel ausgeben kann. [ 1 ] [ 2 ] |