Domino 9 und frühere Versionen > Entwicklung
Wie kann ich eine Klasse sinnvoll aufbauen ?
animate:
kommt drauf an, wo du es deklarierst.
wenn du es im Sub Postopen deklarierst, ist es danach tot.
wenn du es in den Declaration der Maske deklarierst und im Postopen erzeugst, dann hast du es bis zum Terminate-Event der Maske
TMC:
--- Zitat von: TMC am 20.06.04 - 19:07:33 ---Wann ist denn mein Objekt tot?
--- Ende Zitat ---
Ich kenne das auch aus anderem Kontext. Manchmal ist sowas hilfreich:
Set uidoc = Nothing
Da ansonsten u.U. ein anderes UI-Document im Fokus ist unter bestimmten (nicht immer nachvollziehbaren) Umständen - und somit das Objekt nicht 'tot' ist.....
TMC:
--- Zitat von: Thomas Völk am 20.06.04 - 19:15:21 ---kommt drauf an, wo du es deklarierst.
wenn du es im Sub Postopen deklarierst, ist es danach tot.
wenn du es in den Declaration der Maske deklarierst und im Postopen erzeugst, dann hast du es bis zum Terminate-Event der Maske
--- Ende Zitat ---
Jetzt geht mir langsam ein Licht auf :D
Ich muss verdammt nochmal meine Denkweise umstellen ;)
TMC:
cool, Visio bietet da schon sehr viel, hier ein Update meines Modells (vieles fehlt noch, ist erstes Experiment):
Was mir viel Spaß macht ist die logische Vorgehensweise. Kein Durcheinander. Alles strukturiert und logisch.
animate:
ich hab mal ein Gerüst zusammengezimmert, das wir zur Diskussion verwenden können.
hier kommts:
Maske
'Options
Use "Document"
Option Declare
'Declarations
Dim myDoc as Document
Sub Postopen(Source As Notesuidocument)
Set myDoc = New Document(source)
End Sub
Klasse Document
Option Declare
Use "History"
Public Class Document
Private m_uidoc As NotesUIDocument
Private m_doc As NotesDocument
Private m_History As History
Public Sub new (uidoc As NotesUIDocument)
'initialisieren
Set m_uidoc = uidoc
Set m_doc = uidoc.Document
Set m_History = New History(m_doc)
On Event PostSave From m_uidoc Call ProcessPostSave
End Sub
Private Sub ProcessPostSave(Source As NotesUIDocument)
'nach dem Speichern des Dokuments muss die History geschrieben werden
Call m_History.save()
End Sub
End Class
Klasse History
Option Declare
Use "HistoryEntry"
Use "TextHistoryEntry"
Public Class History
Private m_doc As NotesDocument
Private m_vaHistoryFields As Variant
Private m_InitialFieldValues As Variant
Private m_SavedFieldValues As Variant
Private m_HistoryEntry As HistoryEntry
Public Sub new(doc As NotesDocument)
Set m_doc = doc
'Ermitteln, welche Felder beobachtet werden sollen und die Werte der Felder einlesen
Call getHistoryFields()
Call readInitialValues()
'Ermitteln, welche HistoryEntry-Art erzeugt werden muss
'...Ich tu so, als ob ich ermittelt hätte, dass ich normalen Text schreiben muss
Set m_HistoryEntry = New TextHistoryEntry
'...
End Sub
Public Sub save()
'die einzige Funktion, die nach aussen sichtbar ist
Call readSavedValues()
Call writeHistory()
End Sub
Private Sub getHistoryFields()
'die zu prüfenden Felder ermitteln
'zur Einfachheit mache ich hier feste Werte
'denkbar wäre, die Feldnamen in einem Konfigurationsdokument zu halten und hier auszulesen
Redim m_vaHistoryFields(0)
m_vaHistoryFields(0) = "Subject"
End Sub
Private Sub readInitialValues()
'die Anfangswerte lesen
Dim i As Integer
Redim m_InitialFieldValues(Ubound(m_vaHistoryFields))
For i = 0 To Ubound(m_vaHistoryFields)
m_InitialFieldValues(i) = m_doc.GetItemValue(m_vaHistoryFields(0))
Next
End Sub
Private Sub readSavedValues()
'die gespeicherten Werte lesen
Dim i As Integer
Redim m_SavedFieldValues(Ubound(m_vaHistoryFields))
For i = 0 To Ubound(m_vaHistoryFields)
m_SavedFieldValues(i) = m_doc.GetItemValue(m_vaHistoryFields(0))
Next
End Sub
Private Sub writeHistory()
'Werte vergleichen und Ergebnisse an den HistoryEntry geben
'ich lasse zur Einfachheit die Logik fürs Vergleichen weg und nehme feste Einträge
m_HistoryEntry.myDate = "20.06.2004"
m_HistoryEntry.myName = "TV"
m_HistoryEntry.myAction = "saved"
'Eintrag ins Dokument schreiben
Call m_HistoryEntry.save(m_doc)
End Sub
End Class
Klasse HistoryEntry
Option Declare
Public Class HistoryEntry
'ein Eintrag besteht immer aus drei Daten
Private m_sDate As String
Private m_sName As String
Private m_sAction As String
'Get/Set-Methoden
Public Property Set myDate As String
m_sDate = myDate
End Property
Public Property Set myName As String
m_sName = myName
End Property
Public Property Set myAction As String
m_sAction = myAction
End Property
Public Sub new()
End Sub
Public Sub save(doc As NotesDocument)
'ich werde von den speziellen Klassen implementiert
'sie wissen genau, wie das speichern aussieht.
End Sub
End Class
Klasse TextHistoryEntry
Option Declare
Use "HistoryEntry"
Const FIELD_NAME = "Name"
Const FIELD_DATE = "Date"
Const FIELD_ACTION = "Action"
Public Class TextHistoryEntry As HistoryEntry
Public Sub new()
End Sub
Public Sub save(doc As NotesDocument)
'neuen Eintrag schreiben
'zur Einfachheit überschreibe ich hier die aktuellen Werte
'normalerweise müssen sie angehängt werden
Call doc.ReplaceItemValue(FIELD_NAME, m_sName)
Call doc.ReplaceItemValue(FIELD_DATE, m_sDate)
Call doc.ReplaceItemValue(FIELD_ACTION, m_sAction)
Call doc.Save(True, True)
End Sub
End Class
was fehlt ist die Klasse für die RTF-History, aber es müsste klar sein, wie die zu machen ist.
bin gespannt, was ihr davon haltet. wie gesagt, das ist nur ein Diskussionsstartpunkt, ich behaupte nicht, dass das gut oder schlecht ist.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln