Domino 9 und frühere Versionen > Entwicklung

Wie kann ich eine Klasse sinnvoll aufbauen ?

<< < (38/41) > >>

animate:
die Objekte musst du selber noch in das Array packen.
In einer Schleife (die, die du schon vorher benutzt hast, um die Objekte zu erzeugen)
In der History-Klasse.
Wenn du den Code der History-Klasse postest, kann ich dir zeigen wo.

TMC:

--- Zitat von: Thomas Völk am 10.07.04 - 20:52:35 ---Wenn du den Code der History-Klasse postest, kann ich dir zeigen wo.
--- Ende Zitat ---

Prima, ich mach erstmal die Klassen alle fertig und poste dann den Code bzw. die nsf ....

TMC:
OK, habe den aktuellen Stand angehängt.
Aufgrund des R5-Debug-Problems entwickle ich das jetzt in ND6 (versuche aber R5-kompatibel zu bleiben).

Hier noch die HistoryMain-Klasse als Code:

--- Code: ---'HistoryMainClass:

Option Declare
'--------------------------------------------------------------------
Use "HistoryAuxiliaryRoutines"
Use "HistoryFieldClass"
Use "HistoryEntryClass"
'--------------------------------------------------------------------
'Konstanten
Const MAX_SIZE# = 5000 'Maximale Größe in Bytes des History-Feldes
Const FIELDNAME_HISTORY$ = "History"  'Feldname des History-Feldes
'--------------------------------------------------------------------
Public Class HistoryMain

   Private m_doc As NotesDocument
   Private m_strHistoryFieldNames As String
   Private m_vaHistoryFieldNames As Variant
   Private m_strHistoryFieldTitles As String
   Private m_vaHistoryFieldTitles As Variant
   Private m_iHistoryFieldAmount As Integer 'Anzahl zu überwachender Felder
   Private m_iMaxEntryAmount As Integer
   Private m_strTextNew As String
   Private m_HistoryFields() As HistoryField
   Private m_strDifferences() As String
   Private m_strHistoryFieldname As String
   '--> Klasse 'HistoryEntry'
   Private m_HistoryEntry As HistoryEntry 'Neuer Eintrag
   Private m_HistoryEntries() As HistoryEntry 'Array aller History-Einträge
   Private m_EntryCount As Integer 'Anzahl der Einträge des HistoryFeldes
   '<---

   '-------------------------------------------------------------------------------------------------------------------------
   Public Sub new(doc As NotesDocument, strHistoryFieldNames As String, strHistoryFieldTitles As String, iMaxEntryAmount As Integer, strTextNew As String)
      Dim iLB As Integer
      Dim iUB As Integer

      '---> Setze Membervariablen
      Set m_doc = doc
      m_strHistoryFieldNames = strHistoryFieldNames
      m_strHistoryFieldTitles = strHistoryFieldTitles
      m_iMaxEntryAmount = iMaxEntryAmount
      m_strTextNew = strTextNew
      '<---

      '---> Die zu prüfenden Felder ermitteln
      m_vaHistoryFieldNames = AuxExplode(m_strHistoryFieldNames, "##")
      m_vaHistoryFieldTitles = AuxExplode(m_strHistoryFieldTitles, "##")
      'Prüfen ob beide Arrays die gleiche Anzahl an Einträgen haben; falls nicht werden als Titel die Feldnamen übernommen.
      iLB = Lbound(m_vaHistoryFieldNames) - Lbound(m_vaHistoryFieldTitles)
      iUB = Ubound(m_vaHistoryFieldNames) - Ubound(m_vaHistoryFieldTitles)
      If (iLB <> 0) Or (iUB <> 0) Then
         m_vaHistoryFieldTitles = m_vaHistoryFieldNames
      End If
      'Ermitteln der Anzahl zu überwachender Felder
      m_iHistoryFieldAmount = Ubound(m_vaHistoryFieldNames) - Lbound(m_vaHistoryFieldNames) + 1
      'So, nun haben wir:
      '                      m_vaHistoryFieldNames = die zu überwachenden Item-Namen in Array
      '                      m_vaHistoryFieldTitles = die Titel der Felder
      '                      m_iHistoryFieldAmount = die Anzahl der Felder
      '<---

      'Erstellen der HistoryField - Objekte in einem Array
      Call initHistoryFields()
      'Nun erzeugen wir noch die HistoryEntry-Objekte. Pro bisherigen Eintrag im History-Feld erzeugen wir 1 HistoryEntryObjekt
      Call initHistoryEntries()
   End Sub
   '-------------------------------------------------------------------------------------------------------------------------
   Private Sub initHistoryFields()
      'Erstellen der HistoryField - Objekte in einem Array
      Dim itmField As NotesItem
      Dim i As Integer
      For i = 0 To m_iHistoryFieldAmount - 1
         Set itmField = m_doc.GetFirstItem(m_vaHistoryFieldNames(i))
         Redim Preserve m_HistoryFields(i)
         Set m_HistoryFields(i) = New HistoryField(itmField, m_vaHistoryFieldTitles(i))
      Next
   End Sub
   '-------------------------------------------------------------------------------------------------------------------------
   Private Sub initHistoryEntries()
      'Erstellt HistoryEntry - Objekte. Pro History-Eintrag wird ein HistoryEntry-Objekt erzeugt
      'Ergebnis steht im Array  'm_HistoryEntries'
      Dim Entry As HistoryEntry
      Dim iContinue As Integer
      m_EntryCount = 0

      iContinue = True
      Do
         Set Entry = New HistoryEntry
         Call Entry.readFromDoc(m_doc, m_EntryCount)
         If Entry.size > 0 Then
            Redim Preserve m_HistoryEntries(m_EntryCount)
            Set m_HistoryEntries(m_EntryCount) = Entry
            m_EntryCount = m_EntryCount + 1
         Else
            iContinue = False
         End If
      Loop While (iContinue = True)
   End Sub
   '-------------------------------------------------------------------------------------------------------------------------
   Public Sub save()
      'Wir schreiben hier die Änderungen in das History-Feld
      '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      'Änderungen in das Array 'm_strDifferences'
      Call getHistoryDifferences()

      'History schreiben
      If Not (m_strDifferences(0) = "NOCHANGES") Then  'History nur schreiben wenn Änderungen stattgefunden haben
         Call writeHistory()
         Call m_doc.Save(True, True)
      End If

      'Aufräumen und neu initiieren
      Call CleanupAndInitiate()

   End Sub
   '-------------------------------------------------------------------------------------------------------------------------
   Private Sub getHistoryDifferences()
      Dim i As Integer
      Dim iCount As Integer
      Dim strDifference As String

      If m_doc.IsNewNote Then 'Falls es sich um ein neues Doc handelt
         Redim m_strDifferences(0)
         m_strDifferences(0) = m_strTextNew
         Exit Sub
      End If

      'Wir bekommen die Unterschiede in das Array "m_strDifferences"
      iCount = -1
      For i = 0 To m_iHistoryFieldAmount - 1
         strDifference = m_HistoryFields(i).difference
         If Not strDifference = "" Then
            iCount = iCount + 1
            Redim Preserve m_strDifferences(iCount)
            m_strDifferences(iCount) = strDifference
         End If
      Next
      If iCount = -1 Then 'Es gab keine Unterschiede
         Redim m_strDifferences(0)
         m_strDifferences(0) = "NOCHANGES" 'Es gab keine Änderung !
      End If

      'Nun stehen die Änderungen in "m_strDifferences"
   End Sub
   '-------------------------------------------------------------------------------------------------------------------------
   Private Sub writeHistory()

      'Klasse für Historyeintrag
      Set m_HistoryEntry = New HistoryEntry
      Redim Preserve m_HistoryEntries(m_EntryCount)
      Set m_HistoryEntries(m_EntryCount) = m_HistoryEntry
      m_EntryCount = m_EntryCount + 1


     'Werte vergleichen und Ergebnisse an den HistoryEntry geben
      m_HistoryEntry.Action = m_strDifferences

      Dim nHowManyEntries As Integer
      Dim nStart As Integer
      Dim i As Integer

      Call clear()

      nHowManyEntries = getMaxEntries()

      nStart = (Ubound(m_HistoryEntries)+1) - nHowManyEntries
      For i = nStart To Ubound(m_HistoryEntries)
            'History-Eintrag ins Dokument schreiben
         Set m_HistoryEntry = m_HistoryEntries(i)
         Call m_HistoryEntry.write(m_doc)
      Next

   End Sub
   '-------------------------------------------------------------------------------------------------------------------------
   Private Sub clear()
      Call m_doc.ReplaceItemValue(FIELDNAME_HISTORY, "")
   End Sub
   '-------------------------------------------------------------------------------------------------------------------------
   Private Function getMaxEntries() As Integer
      Dim i As Integer
      Dim entry As HistoryEntry
      Dim iTotalSize As Integer
      getMaxEntries = 0

      For i = Ubound(m_HistoryEntries) To Lbound(m_HistoryEntries) Step -1
         Set entry = m_HistoryEntries(i)
         iTotalSize = iTotalSize + entry.size
         If iTotalSize > MAX_SIZE Then
            Msgbox "Maximal erlaubte Größe in Bytes (" & Cstr(MAX_SIZE) & ") wurde überschritten"
            Exit For 'Exit Function
         End If
         getMaxEntries = getMaxEntries + 1
      Next
      'Nun prüfen wir ob die Anzahl erlaubter Einträge dadurch nicht überschritten wird
      If   getMaxEntries > m_iMaxEntryAmount Then
         Print "Max. Anzahl Einträge (" & Cstr(m_iMaxEntryAmount) & ") wurde überschritten"
         getMaxEntries = m_iMaxEntryAmount
      End If
   End Function
   '-------------------------------------------------------------------------------------------------------------------------
   Private Sub CleanupAndInitiate()
   'Neue Werte in als InitialValue schreiben, für den Fall dass erneut gespeichert wird
      Dim i As Integer
      For i = 0 To m_iHistoryFieldAmount - 1
         Call m_HistoryFields(i).setInitialValue
      Next

   'HistoryEntries neu initiieren
      Erase m_HistoryEntries
      Call initHistoryEntries()

   End Sub
   '-------------------------------------------------------------------------------------------------------------------------
End Class
--- Ende Code ---

TMC:
Hier noch das aktuelle UML-Diagramm (-> ist-Stand):


Und so - oder so ähnlich - glaub ich sollte das dann mal ausschauen (rechts sind die methods und properties noch nicht gefüllt):

TMC:

--- Zitat von: Thomas Völk am 06.07.04 - 21:49:37 ---in dem Link, den du im Tipps Bereich gepostet hast
(http://www.lotusgeek.com/SapphireOak/LotusGeekBlog.nsf/plinks/ROLR-5UV6YM)
da ist ein Posting von mir, dass zeigt, wie du das machen kannst.
Da sind zwei Klassen (AbstractImportFactory und ExcelFactory).
In der AbstractImportFactory ist die Methode init(), allerdings nur die Signatur.
In der Excel Factory gibts die Methode auch, hier ist die wirkliche Funktionalität implementiert.
--- Ende Zitat ---

Ich hab den Code von Dir mal in eine ND6 - DB kopiert zur besseren Übersicht.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln