Ein Dokument-Template assoziiert eine Doc/View-Dokumentklasse mit einer View-Klasse und erzeugt eine neue Klasse, die dann über ein View mit einem festgelegten Doc/View-Dokument verbunden wird. Eine solche Dokument-Template-Klasse wird mit dem Makro DEFINE_DOC_TEMPLATE_CLASS (definiert in doctpl.h) erzeugt, welches drei Argumente erwartet:
- Name der Dokumentklasse
- Name der Viewklasse
- Name der zu erzeugenden Templateklasse
DEFINE_DOC_TEMPLATE_CLASS( TFileDocument, TEditView, CEditTemplate);
Mit diesem Beispiel wird die Doc/View-Dokumentklasse TFileDocument mit der Viewklasse TEditView verbunden und eine neue Klasse mit dem Namen CEditTemplate erzeugt. Die Klassen TFileDocument und TEditView sind von der OWL bereits vorgegebene Klassen.
TDocTemplate
Die Klasse TDocTemplate ist eine abstrakte Basisklasse, die die Funktionalität für Dokument-Templates bereitstellt. Jeder Dokumenttyp benötigt sein eigenes Dokument-Template.
Template Instanzen
Nachdem wir eine Doc/View-Dokumentklasse definiert haben, können wir eine beliebige Anzahl von Instanzen dieser neuen Klasse erzeugen. Die Verwaltung der Klassen übernimmt dann der Dokument-Manager der Anwendung.
Es existieren zwei verschiedene Konstruktoren zur Erzeugung von Template-Klassen. Der erste Konstruktor hat folgendes Aussehen:
TemplateName name(const char* description, const char* filter, const char* directory, const char* extension, long flags)
Parameter | Bedeutung |
TemplateName | Name der Dokument-Templateklasse, die bei dessen Definition angegeben wurde. |
name | beliebiger Name für die zu erzeugende Instanz |
description | Textbeschreibung für das Dokument-Template. Diese wird in den Auswahllisten des Dokument-Managers angezeigt, vorausgesetzt das Modus-Flag dtHidden wird nicht verwendet. Übliche Textbeschreibungen sind beispielsweise „Alle Dateien“ oder „Textdateien“ usw. |
filter | enthält eine Dateimaske zur Filterung von Dateinamen. Ein Beispiel für eine solche Maske ist beispielsweise „*.txt“. |
directory | bezeichnet das zu verwendende Standardverzeichnis für die Doc/View-Dokumente dieser Klasse. Bei der Übergabe von 0, wird das aktuelle Verzeichnis verwendet. |
extension | enthält die Standard-Dateinamenserweiterung, die automatisch verwendet werden soll, wenn vom Benutzter ein Dateiname ohne Dateinamenserweiterung eingegeben wird. Wird hier 0 angegeben, wird die automatische Dateinamenserweiterung für diese Klasse deaktiviert. |
flags | bestimmt den Modus und verschiedene Eigenschaften der Template-Instanz. Nachfolgend finden Sie die wichtigsten Konstanten die Sie verwenden und in sinnvoller Weise miteinander kombinieren können. |
Wichtige dtXXXX-Konstanten
Konstante | Funktionsbeschreibung |
dtAutoDelete | Das Doc/View-Dokumentobjekt wird automatisch gelöscht, wenn das letzte View gelöscht wird. |
dtNoAutoView | Es erfolgt keine automatische Erzeugung einer Standard-View. |
dtSingleView | Es kann je Doc/View-Dokument nur ein View verwendet werden. |
dtAutoOpen | Das Doc/View-Dokument wird bei der Erzeugung automatisch geöffnet. |
dtConfirm | Es besteht für den Benutzer die Möglichkeit, den Pfad zu bestätigen. |
dtHidden | Das Template erscheint nicht in den Auswahllisten des Dokument-Managers, wird also vor dem Benutzer verborgen. |
dtNewDoc | Erzeugt ein neues Doc/View-Dokument. |
dtUpdateDir | Bewirkt, daß das Standardverzeichnis jedesmal neu gesetzt wird, wenn durch eine Dateiauswahl mit dem Dokument-Manager ein neues Verzeichnis gewählt wird. |
Erzeugung einer Template-Instanz
Sehen wir uns nun ein Beispiel an, wie man Template-Instanzen erzeugt:
DEFINE_DOC_TEMPLATE_CLASS( TFileDocument, TEditView, CEditTemplate);
…
CEditTemplate TextTemplate( „Textdateien“, „*.TXT“, „C:\\TEXTE“, „TXT“, dtAutoDelete);
CEditTemplate AsmSources( „Assemblerdateien“, „*.asm;*.ash;*.inc“, 0, „ASM“, dtAutoDelete);
CEditTemplate CSources( „C/C++ Quelltexte“, „*.cpp;*.c;*.hpp;*.h“, 0, „CPP“, dtAutoDelete);
CEditTemplate AllFiles( „Alle Dateien“, „*.*“, 0, 0, dtAutoDelete | dtNoAutoView);
Mit diesem Beispiel werden vier Template-Instanzen erzeugt:
- Die erste Instanz bekommt die Beschreibung „Textdateien“ für Dateien die als Erweiterung TXT haben und sich im Verzeichnis C:\TEXTE befinden. Beim Speichern wird die Erweiterung TXT automatisch benutzt, wenn der Anwender keine Erweiterung angibt. Außerdem ist das automatische Löschen des Dokuments, wenn das letzte View geschlossen wird, zugelassen.
- Die zweite Instanz bekommt die Beschreibung „Assemblerdateien“ für Dateien die als Erweiterung entweder ASM, ASH oder INC haben. Wie wir sehen können, können mehrere Erweiterungen mit ein Semikolon getrennt angegeben werden. Als Verzeichnis wird das aktuelle Verzeichnis verwendet und für die automatische Erweiterung ASM verwendet. Das automatische Löschen des Dokuments ist hier ebenfalls zugelassen.
- Die dritte Instanz ist im Prinzip identisch mit der zweiten, mit dem Unterschied, daß die Beschreibung „C/C++ Quelltexte“ ist, die für Dateien mit der Erweiterung CPP, C, HPP und H verwendet wird und das als automatische Erweiterung CPP verwendet wird.
- Die vierte und letzte Instanz bekommt die Beschreibung „Alle Dateien“ und erhält als Maske „*.*“. Weiterhin wird das aktuelle Verzeichnis und keine automatische Erweiterung verwendet. Das automatische Löschen des Dokuments, wenn das letzte View geschlossen wird, ist zugelassen aber es erfolgt keine automatische Erzeugung einer Standard-View (dtNoAutoView).
Den zweiten Konstruktor zur Erzeugung einer Template-Klasse sollte man vorziehen, da der erste Konstruktor eigentlich nur noch aus Gründen der Abwärtskompatibilität mit älteren OWL Versionen vorhanden ist. |
TemplateName name(TRegList& regTable);
Parameter | Bedeutung |
TemplateName | Name der Dokument-Templateklasse, die bei dessen Definition angegeben wurde. |
name | beliebiger Name für die zu erzeugende Instanz |
regTable | Name der Registriertabelle, die mit den Makros BEGIN_REGISTRATION und END_REGISTRATION erzeugt wird |
Der Code für die bereits oben beschriebenen Instanzen könnte dann ungefähr wie folgt aussehen:
BEGIN_REGISTRATION(TextReg)
REGDATA(description,“Textdateien“,
REGDATA(docfilter,“*.TXT“,
REGDATA(extension,“TXT“,
REGDATA(directory, „C:\\TEXTE“, REGDOCFLAGS(dtAutoDelete)
END_REGISTRATION
BEGIN_REGISTRATION(AsmSourcesReg)
REGDATA(description,“Assemblerdateien“,
REGDATA(docfilter,“*.ASM;*.ASH;*.INC“,
REGDATA(extension,“ASM“,
REGDOCFLAGS(dtAutoDelete)
END_REGISTRATION
BEGIN_REGISTRATION(CSourcesReg)
REGDATA(description,“C/C++ Quelltexte“,
REGDATA(docfilter,“ *.CPP;*.C;*.HPP;*.H „,
REGDATA(extension,“CPP“,
REGDOCFLAGS(dtAutoDelete)
END_REGISTRATION
BEGIN_REGISTRATION(AllReg)
REGDATA(description,“Alle Dateien“,
REGDATA(docfilter,“ *.* „,
REGDOCFLAGS(dtAutoDelete | dtNoAutoView)
END_REGISTRATION
CEditTemplate TextTemplate(TextReg);
CEditTemplate AsmSources(AsmSourcesReg);
CEditTemplate CSources(CSourcesReg);
CEditTemplate AllFiles(AllReg);