^15.5 Erweiterte DateioperationenIn diesem Abschnitt wird beschrieben, wie die Operationen "Kopieren nach", "Verschieben nach", "Umbenennen" und das Ändern der Benutzernotizen implementiert werden. Die entsprechenden Routinen BasicCopyToDoc, BasicMoveToDoc, BasicRenameDoc und BasicChangeUsernotes werden vom DocumentAndToolButtonHandler aufgerufen, wenn der Nutzer den entsprechenden Menüpunkt anklickt.Kopieren nach ...Die Funktion "Kopieren nach" erstellt eine Kopie des aktuellen Standes unseres Dokuments unter einem neuen Namen. Die von BasicCopyToDoc aufgerufenen Routinen haben im Folgenden dargestellten Aufgaben. Sollte ein Fehler oder ein Nutzerabbruch möglich sein, wird dieser jeweils abgefragt und die Routine BasicCopyToDoc wird verlassen.
|
SUB BasicCopyToDoc () DIM ret as DialogReturnStruct DIM err DIM newFile AS FILE DoEnterDocumentPath(FALSE) ret = DTMoveCopyDialog(ConvertObjForSDK(DocumentObj), "", FALSE) IF ret.retInfo = DRI_CANCEL THEN RETURN err = DTConfirmAndDelete(ret.fileName$) IF err THEN RETURN newFile = DTCloneAndOpenFile(ConvertObjForSDK(DocumentObj), ret.fileName$) IF fileError THEN RETURN DoSaveDataToDoc(newFile) DTCloseClone(newFile) END SUB |
Verschieben nach ...Die Funktion "Verschieben nach" verschiebt das aktuelle Dokument an einen neuen Ort. Dazu muss das aktuelle Dokument zunächst kopiert werden. War das erfolgreich wird es geschlossen und gelöscht. Danach wird die Kopie geöffnet. Beachten Sie, dass sich durch dieses Vorgehen das FILE Handle des Dokuments ändert.
|
SUB BasicMoveToDoc ()
DIM ret as DialogReturnStruct
DIM err, oldState
DIM oldFile$ as STRING(230)
DoEnterDocumentPath(FALSE)
ret = DTMoveCopyDialog(ConvertObjForSDK(DocumentObj), "", TRUE)
IF ret.retInfo = DRI_CANCEL THEN RETURN
err = DTConfirmAndDelete(ret.fileName$)
IF err THEN RETURN
DTCloneFile(ConvertObjForSDK(DocumentObj), ret.fileName$)
IF fileError THEN RETURN
oldFile$ = DocumentObj.documentPath$ + "\\" + \
DocumentObj.documentname$
oldState = DocumentObj.documentState AND \
(DOCS_MODIFIED OR DOCS_EDIT_TEMPLATE)
DocumentObj.CloseDocument
DocumentObj.OpenDocument(ret.FileName$)
if ( DocumentObj.documentState ) THEN
DocumentObj.SetDocumentState oldState, 0
FileDelete oldFile$
END IF
DoUpdateDocButtons
END SUB
|
UmbenennenUm eine Datei umbenennen zu können müssen wir sie zunächst schließen. Dann können wir sie umbenennen und mit neuem Namen wieder öffnen.
|
SUB BasicRenameDoc ()
DIM ret as DialogReturnStruct
DIM err, oldState
DIM oldFile$ as STRING(32)
SetCurrentPath(DocumentObj.documentPath$)
ret = DTRenameDialog(ConvertObjForSDK(DocumentObj), "")
IF ret.retInfo = DRI_CANCEL THEN RETURN
err = DTConfirmAndDelete(ret.fileName$)
IF err THEN RETURN
oldFile$ = DocumentObj.documentName$
oldState = DocumentObj.documentState AND (DOCS_MODIFIED OR DOCS_EDIT_TEMPLATE)
DocumentObj.CloseDocument
FileRename oldFile$, ret.fileName$, "m"
IF fileError THEN
DocumentObj.OpenDocument(oldFile$)
ELSE
DocumentObj.OpenDocument(ret.FileName$)
END IF
DocumentObj.SetDocumentState oldState, 0
DoUpdateDocButtons
END SUB
|
Benutzernotizen ändernDas Ändern der Benutzernotizen übernimmt die Routine DTChangeUsernotes aus der DocumentTools Library. Sie erledigt alle notwendigen Schritte, einschließlich der Anzeige der entsprechenden Dialogbox sowie der Prüfung, ob das aktuell geöffnete Dokument überhaupt Benutzernotizen unterstützt. |
SUB BasicChangeUsernotes () DTChangeUsernotes(ConvertObjForSDK(DocumentObj)) END SUB |
^15.6 Letzter StandKlickt der Nutzer im Menü auf den entsprechenden Button so wird im DocumentAndToolButtonHandler die Routine BasicRevertDoc gestartet. Diese Routine prüft zur Sicherheit, ob das Dokument überhaupt geändert wurde und fragt dann den User, ob er sicher ist. Sodann ruft es DoRevertDoc, dass die eigentliche Arbeit erledigt und updatet dann mit DoReadDataFromDoc und DoUpdateDocButtons die UI. Wichtig ist, dass mit DoSetDocModified (FALSE) der "modified" Zustand des Dokuments zurückgesetzt wird. |
SUB BasicRevertDoc ()
DIM ans, docState
docState = DocumentObj.documentState
IF (docState AND DOCS_MODIFIED) = 0 THEN RETURN
ans = QuestionBox ("Sind Sie sicher, dass Sie alle Änderungen
seit dem letzten Speichern verwerfen wollen?")
IF ans <> YES THEN RETURN
DoRevertDoc
DoSetDocModified (FALSE)
DoReadDataFromDoc
DoUpdateDocButtons
END SUB
|
|
Nur VM-Dateien unterstützen ein echtes "Zurück zum letzten gespeicherten Stand". Wenn Sie VM-Dateien als Dokumente benutzen, können Sie beliebig Daten in die Datei schreiben und trotzdem VMRevert benutzen, um den letzten gespeicherten Stand wieder herzustellen. Deshalb werden VM-Dateien von allen großen Applikationen wie GeoWrite und auch R-BASIC selbst als Dokumente benutzt.
Wenn Sie sich, wie in unserem Beispiel, gegen VM-Dateien entscheiden, ist der einfachste Weg, eine "Revert"-Funktion zu unterstützen, alle Änderungen der Dokumentdaten in Instancevariablen oder globalen Variablen zu speichern und nicht in die Datei zu schreiben, bis der Nutzer explizit "Speichern" wählt. In diesem Fall besteht das Wiederherstellen des letzten gespeicherten Standes einfach darin, die (ungeänderten) Daten aus dem Dokument wieder auszulesen. DoRevertDoc hat dann nichts zu tun, weil das Auslesen der Daten von BasicRevertDoc erledigt wird, nachdem es DoRevertDoc aufgerufen hat. Dieses Konzept hat einen großen Nachteil. Im Falle eines Fehlers gehen alle geänderten Daten verloren, weil sie nirgends in einer Datei gespeichert wurden. Auch wenn DoRevertDoc nichts tut, wird es von allen Routinen, die ein Zurücksetzen der Datei auf den letzten gespeicherten Stand erwarten, gerufen. Deshalb, wenn Sie ein Konzept haben, nicht-VM-Dateien auf ihren letzten gespeicherten Stand zurückzusetzen, so können Sie es hier implementieren. Wenn Sie VM-Dateien benutzen braucht DoRevertDoc nur VMRevert aufzurufen. |
SUB DoRevertDoc ()
MsgBox "DoRevertDoc: Datei auf den letzten gespeicherten Stand bringen -
falls es dazu etwas zu tun gibt."
' Im aktuellen Konzept hat DoRevertDoc nichts zu tun
' Sie können die MsgBox einfach entfernen
' Für VM-Dateien: VMRevert(DocumentObj.documentHandle) rufen
END SUB
|
^15.7 Quick BackupKlickt der Nutzer im Menü auf den entsprechenden Button so wird im DocumentAndToolButtonHandler die Routine BasicQuickBackup bzw. BasicRestoreFromBackup gerufen.BasicQuickBackup legt eine Kopie der Datei im Backup-Ordner (SP_BACKUP) an. Dort werden üblicherweise keine Unterordner verwaltet. Zunächst wird ein eventuell vorhandenes älteres Backup gelöscht. DTCloneAndOpenFile legt eine 1:1 Kopie der aktuell offenen Datei an und öffnet diese. Im Fehlerfall gibt es eine Fehlermeldung, ansonsten wird die Backupkopie mit DoSaveDataToDoc auf den neuesten Stand gebracht und danach geschlossen. In jedem Fall rufen wir DoUpdateDocButtons um den "Aus Backup wiederherstellen"-Button zu updaten. |
SUB BasicQuickBackup ()
DIM fileName$ ', docState, ro
DIM docPath$ as string(200)
DIM backupFile as FILE
fileName$ = DocumentObj.documentName$
SetStandardPath SP_BACKUP
FileDelete fileName$
backupFile = DTCloneAndOpenFile(ConvertObjForSDK(DocumentObj), fileName$)
IF fileError THEN
MsgBox "Konnte Backup-Datei nicht anlegen. Fehlercode: "
+ ErrorText$(fileError)
ELSE
DoSaveDataToDoc(backupFile)
DTCloseClone(backupFile)
End IF
DoUpdateDocButtons
END SUB
|
BasicRestoreFromBackup stellt eine Datei aus einer Backupkopie wieder her. Dazu gehen wir folgendermaßen vor:
|
SUB BasicRestoreFromBackup ()
DIM docPath$ as String(200)
DIM fileName$, err
fileName$ = DocumentObj.documentname$
docPath$ = DocumentObj.documentPath$
SetStandardPath SP_BACKUP
err = DTCheckFileType(ConvertObjForSDK(DocumentObj), fileName$, "*")
IF err THEN
MsgBox "Kann Backup nicht wieder herstellen. Fehlercode: " + ErrorText$(err)
RETURN
End IF
DocumentObj.CloseDocument
FileCopy fileName$, docPath$ + "\\" + fileName$
SetCurrentPath docPath$
DocumentObj.OpenDocument fileName$
DoReadDataFromDoc
DoUpdateDocButtons
END SUB
|
^15.8 Verwendung von Muster-DateienMuster-Dateien werden immer in einem Unterordner des Ordners "USERDATA\TEMPLATE" gespeichert. Klickt der Nutzer im Menü auf einen der zugehörigen Buttons so wird im DocumentAndToolButtonHandler eine der Routinen BasicOpenTemplate oder BasicSaveAsTemplate gerufen.Die Routine BasicOpenTemplate öffnet eine Musterdatei indem entweder eine neue Datei angelegt wird oder das Muster zum Bearbeiten geöffnet wird.
|
SUB BasicOpenTemplate ()
DIM fileName$ as string(32)
DIM srcFile$ as String(240)
DIM err
DIM ret as DialogReturnStruct
ret = DTOpenTemplateDialog(ConvertObjForSDK(DocumentObj), "")
IF ret.retInfo = DRI_CANCEL THEN RETURN
srcFile$ = currentPath$ + "\\" + ret.fileName$
err = BasicCloseDoc(TRUE)
IF err THEN RETURN
IF ret.retInfo = DRI_OK THEN ' => zum Bearbeiten
DocumentObj.OpenDocument ret.fileName$
DocumentObj.SetDocumentState DOCS_EDIT_TEMPLATE, 0
ELSE
DoEnterDocumentPath(TRUE)
fileName$ = DTFindNameForNew(ConvertObjForSDK(DocumentObj))
FileCopy srcFile$, fileName$, "m"
IF fileError = 0 THEN
DocumentObj.OpenDocument fileName$
DocumentObj.SetDocumentState DOCS_UNTITLED, 0
End IF
End IF
DoReadDataFromDoc
DoUpdateDocButtons
END SUB
|
|
Nun informieren wir das DocumentGuardian-Objekt dass eine Musterdatei in Bearbeitung ist und wir haben die Möglichkeit "Muster-typische" Änderungen an der Datei vorzunehmen. Ob es da etwas gibt und was das ist hängt wieder vom Ihrem Programm ab. Abschließend geben wir noch eine Erfolgsmeldung an den Nutzer aus. |
SUB BasicSaveAsTemplate ()
DIM err
DIM ret as DialogReturnStruct
ret = DTSaveAsTemplateDialog(ConvertObjForSDK(DocumentObj), "", FALSE)
IF ret.retInfo = DRI_CANCEL THEN RETURN
err = InternalSaveAs(ret)
IF err THEN RETURN
DocumentObj.SetDocumentState DOCS_EDIT_TEMPLATE, 0
MsgBox("BasicSaveAsTemplate: Datei gespeichert. Hier eventuell
Sonderaufgaben für \"Muster\" erledigen")
MsgBox "Die Datei wurde als Muster gespeichert
und zum Bearbeiten geöffnet."
RETURN
END SUB
|
Das GEOS-System hat für "Muster" Dateien ein spezielles Attribut, das dem Dokument-Interface mitteilt, dass es sich nicht um ein normales Dokument handelt. R-BASIC unterstützt dieses Attribut nicht. Wenn Sie möchten, können Sie an dieser Stelle einen bestimmten Wert in Ihrem Muster-Dokument setzen, der das Dokument als "Muster" kennzeichnet. Diesen können Sie beim Öffnen des Dokuments auslesen und entsprechend (analog zu BasicOpenTemplate) reagieren.
^ |