Erweiterungen für Klasse "ApplicationHandler"

Diskussionen über den Quellcode (Module, Klassenstruktur, Schnittstellen u.s.w.) der Access Code Library

Erweiterungen für Klasse "ApplicationHandler"

Beitragvon Josef Pötzl » Fr 11. Dez 2009, 21:24

Hallo!

Wie könnte man am besten eine dynamische Erweiterung von eine Klasse mit "Erweiterungsklassen" aufbauen?

Beispiel:
Haupt-Klasse: ApplicationHandler ... Klasse für die Steuerung der Anwendung, die mit Access erstellt wird. Diese Klasse wird so ziemlich in jeder Access-Anwendung genutzt werden.
Erweiterungsklasse: ApplicationHandler_AppFile ... Klasse die als Aufgabe das Speichern von Dateien (Icon, Dll,...) in ein Tabelle übernimmt

Die AppFile-Klasse wird sicher nicht in jeder Access-Anwendung benötigt. somit darf in der Klasse ApplicationHandler nicht darauf referenziert werden.

Mein aktueller Lösungsweg:
Erst im Configurationsmodul werden die beiden Klassen verknüpft. Dabei wird der Erweiterungsklasse die Referenz zur ApplicationHandler-Instanz übergeben.
Die Hauptklasse löst an den Stellen, wo diese Erweiterungsklasse benötigt wird, ein Ereignis aus, auf das die Erweiterungsklasse reagiert.

Die Variante in der Hauptklasse für jede mögliche Erweiterung eine Objektvariable abzulegen, wäre zwar noch einfacher, da man dann nur prüfen müsste, ob die Objektvariable auf nothing steht.
Allerdings müsste man dann immer die Hauptklasse ändern, wenn eine Erweiterung dazu kommt.
Beim Konzept mit den Ereignissen würde es ausreichen, wenn man vorab an den interessanten Stellen entsprechende Ereignisse einbaut. Außerdem können sich an die Ereignisse mehrere Erweiterungen hängen, was bei der Variante mit der Objektvariable nicht möglich ist.

Beispiel:
1. Initialisierung im Konfigurationsmodul base/_config_Application_sample.bas
Code: Alles auswählen
Public Sub InitConfig(Optional oCurrentAppHandler As ApplicationHandler = Nothing)
...
   modApplication.AddApplicationHandlerExtension New ApplicationHandler_AppFile
...
End Sub

2. Bedarf in base/ApplicationHandler.cls
Code: Alles auswählen
Public Sub SetAppIcon(ByVal AppIconFile As String, Optional ByVal UseAppIconForFrmRpt As Boolean = True)
   [...]
   Else ' Datei nicht vorhanden => versuchen aus AppFile-Tabelle zu erzeugen:
     '1. Prüfen ob AppFile-Erweiterung vorhanden ist
     RaiseEvent CheckExtension(EXTENSION_KEY_AppFile, bolCheck)
      If bolCheck Then
         bolCheck = CreateAppFile("AppIcon", AppIconFile)
      End If
  [...]
End Sub

Public Function CreateAppFile(ByVal sFileID As String, ByVal sFileName As String) As Boolean
   [...]
   eventResumeMode = 0
   RaiseEvent AppFileBeforeCreateFile(sFileID, sFileName, eventResumeMode, eventResumeMessage)
   If eventResumeMode <> 0 Then
      CreateAppFile = (eventResumeMode = ApplicationHandlerResumeModes.AppResumeMode_Completed)
   Else
      Err.Raise ApplicationHandlerErrors.AppErr_EventInterfaceMissing, _
                "CreateAppFile", "Auf das AppFileBeforeCreateFile-Ereignis wurde nicht reagiert"
   End If
 
   
End Function
 


3. Ereignisbehandlung in der Erweiterung base/ApplicationHandler_AppFile.cls
Code: Alles auswählen
Private Sub m_ApplicationHandler_CheckExtension(ByVal sExtensionKey As String, exists As Boolean)
   If sExtensionKey = m_EXTENSION_KEY Then exists = True
End Sub

Private Sub m_ApplicationHandler_AppFileBeforeSaveFile(ByVal sFileID As String, ByVal sFileName As String, ByVal saveVersion As Boolean, ByRef ResumeMode As ApplicationHandlerResumeModes, ByRef ResumeMessage As String)

   If SaveAppFile(sFileID, sFileName, saveVersion) Then
      ResumeMode = ApplicationHandlerResumeModes.AppResumeMode_Completed
   Else 'Fehler rückmelden
     ResumeMode = ApplicationHandlerResumeModes.AppResumeMode_Error
   End If

End Sub
Josef Pötzl
Moderator
 
Beiträge: 731
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

Re: Erweiterungen für Klasse "ApplicationHandler"

Beitragvon Josef Pötzl » Mo 14. Dez 2009, 12:25

Anm.: der erste Versuch mit diesem Konzept klappte gar nicht mal so schlecht.

Die Konfigurationsdatei, die die einzelnen Elemente miteinander verbindet sieht so aus:
Code: Alles auswählen
Public Sub InitConfig(Optional oCurrentAppHandler As ApplicationHandler = Nothing)

'----------------------------------------------------------------------------
' Fehlerbehandlung
'
  modErrorHandler.DefaultErrorHandlerMode = m_DefaultErrorHandlerMode

'----------------------------------------------------------------------------
' Anwendungsinstanz einstellen
'
  If oCurrentAppHandler Is Nothing Then
      Set oCurrentAppHandler = CurrentApplication
   End If

   With oCurrentAppHandler
   
      'Zur Sicherheit AccDb einstellen
     Set .AppDb = CodeDb 'muss auf CodeDb zeigen,
                         'da diese Anwendung als Add-In verwendet wird
 
      'Anwendungsname
     .ApplicationName = m_ApplicationName
      .ApplicationFullName = m_ApplicationFullName
     
      .Version = m_ApplicationVersion
   
   End With
   
'----------------------------------------------------------------------------
' Globale Variablen einstellen
'
  ' Formular, das am Ende von StartApplication aufgerufen wird
  ApplicationStartFormName = m_ApplicationStartFormName
   
'----------------------------------------------------------------------------
' Erweiterung: AppFile
'
#If USE_CLASS_ApplicationHandler_File = 1 Then
   modApplication.AddApplicationHandlerExtension New ApplicationHandler_AppFile
#End If

'----------------------------------------------------------------------------
' Konfiguration nach Erweiterungen
'
  'AppIcon
  'oCurrentAppHandler.SetAppIcon CodeProject.Path & "\" & m_ApplicationIconFile, True

'----------------------------------------------------------------------------
' Erweiterungen für Add-In laden
'
  'Konfiguration/Add-In-Einstellungen
  modApplication.AddApplicationHandlerExtension New ACLibConfiguration
   
   'Import/Export von Dateien bzw. Access-Objekten
  modApplication.AddApplicationHandlerExtension New ACLibFileManager
   
End Sub

(Das ist die Konfigurations-Datei für den Import-Assistenten, mit dem Dateien aus der lokalen Codelib-Verzeichnisstruktur in eine Anwendung importiert werden können.)
Josef Pötzl
Moderator
 
Beiträge: 731
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

Re: Erweiterungen für Klasse "ApplicationHandler"

Beitragvon Josef Pötzl » So 20. Dez 2009, 12:05

Zwei weitere Beispiele von Erweiterungen, die etwas überschaubarer als das Access-Add-In sind.
  • DirTextbox ... In Textbox im Dateisystem navigieren (Unterstützung von {Tab}-Taste)
  • AppLogin_Win .. Anwendungsstart mit Windows-Login abfangen

DirTextbox
Repository-Pfad für Import-Assistenten: _codelib/samples/_config_Application_DirTextbox.bas
Klasse: ApplicationHandler_DirTextbox
Test: Formular TEST_DirTextbox

AppLogin_Win
Repository-Pfad für Import-Assistenten: _codelib/samples/_config_Application_Login_Windows.bas
Klasse: ApplicationHandler_AppLogin_Win
Test: Aufruf von CurrentApplication.Start() z. B. über das Formular frmAppWatcher

Ist bei diesen Beispielen das Konzept hinter der Erweiterungstechnik verständlich?
Josef Pötzl
Moderator
 
Beiträge: 731
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

Re: Erweiterungen für Klasse "ApplicationHandler"

Beitragvon Dmitry » Di 3. Jun 2014, 15:28

Hallo,
integriere gerade den Framework bei mir hier..

wollte auch eigene "Application" Funktionalitäten hinzufügen, und zwar über eine Erweiterung.

Gleich erste Frage:
warum gibt es in der Vorlage keinen Code für m_ApplicationHandler_ExtensionProcedureCall ?
für m_ApplicationHandler_ExtensionPropertyLookup ist der code schon da...
Dmitry
 
Beiträge: 14
Registriert: Fr 9. Mai 2014, 11:15
Wohnort: Nürnberg
Accessversion: 2007, 2010
Access-Erfahrung: Experte

Re: Erweiterungen für Klasse "ApplicationHandler"

Beitragvon Josef Pötzl » Di 3. Jun 2014, 15:57

Hallo!

m_ApplicationHandler_ExtensionPropertyLookup ist nichts anders als eine Ereignisbehandlung für ApplicationHandler.ExtensionPropertyLookup.
Das gleiche kann auch für das Ereignis ExtensionProcedureCall gemacht werden.
Was soll so ein Code in einer Vorlage zeigen? Die Schnittstelle ist durch das Ereignis definiert.

In den gezeigten Beispielen nutzte ich diese Aufrufvariante nicht, da ich direkt über das Objekt und deren Methode ging. Daher gibt es auch keine Prozedur, die auf dieses Ereignis reagiert.

mfg
Josef
Josef Pötzl
Moderator
 
Beiträge: 731
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

Re: Erweiterungen für Klasse "ApplicationHandler"

Beitragvon Dmitry » Di 3. Jun 2014, 16:08

hm.. also wenns selten benutzt wird, dann ja, lohnt sich wahrscheinlich nicht die Vorlage damit zu spammen ;)

sonst hätte ich sowas erwartet:


Code: Alles auswählen

Private Sub m_ApplicationHandler_ExtensionProcedureCall(ByVal sExtensionKey As String, ByVal ProcedureName As String, _
            ByRef ResumeMode As ApplicationHandlerResumeModes, ByRef ResumeMessage As Variant, _
            ByRef params() As Variant)
    On Error GoTo HandleErr

    If sExtensionKey = m_EXTENSION_KEY Then
       ExtensionProcedureCall ProcedureName, ResumeMode, ResumeMessage, params
    End If
   
    .......
   
End Sub

 


'und dann
Code: Alles auswählen

Private Sub ExtensionProcedureCall( .... )
    ResumeMode = AppResumeMode_Completed
   
    Select Case ProcedureName
      'case ...
         
      Case Else 'Procedure wurde nicht erkannt
        ResumeMode = ApplicationHandlerResumeModes.AppResumeMode_Error
                 
    End Select
    ........
End Sub
 
Dmitry
 
Beiträge: 14
Registriert: Fr 9. Mai 2014, 11:15
Wohnort: Nürnberg
Accessversion: 2007, 2010
Access-Erfahrung: Experte


Zurück zu Quellcode

cron