Domino 9 und frühere Versionen > Entwicklung

Wie kann ich eine Klasse sinnvoll aufbauen ?

<< < (6/41) > >>

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