Eine "Properties" Klasse zum Verwalten von "Session Persistent Properties"

    • VBA: Sonstige

      Eine "Properties" Klasse zum Verwalten von "Session Persistent Properties"

      In Windows können sogenannte Session Persistent Properties, d.h. Werte zu einem Schlüsselbegriff (Key) sowohl in einer Datei (.ini, .cfg, etc) oder in der Registry verwaltet werden. Der Einsatz eines Klassen-Moduls bietet dafür überzeugende Vorteile. Die Klasse ist in allen VBA Applikationen für die Verwaltung von "Sitzungsübergreifenden Werten" in der Registry oder einer Datei gleichemaßen verwendbar. Durch die Verwendung mehrere Instanzen der Klasse können einige Werte in der Registry und andere in einer Datei liegen. Jeder zu verwaltende Wert kann der Klasse als Property Get/Let Paar hinzugefügt werden wodurch sich die Verwendung auf einfache Zuweisungs-Statements reduziert.
      Wert speichern:

      Visual Basic-Quellcode

      1. cSPP.MeinWert = "xxxx"

      Wert lesen:

      Visual Basic-Quellcode

      1. sMeinWert = cSPP.MeinWert

      Damit bleibt letztendlich sogar der Name, unter dem der Wert in der Registry oder Datei verwaltet wird, vor der Applikation verborgen. Das folgende Code Beisipiel soll das verdeutlichen. Gespeichert und wiederverwendet werden soll die Position einer UserForm, die der Nutzer, bei jedem Aufrauf der Arbeitsmappe gleichermaßen wieder vorfindet - und zwar jeder Nutzer seine von ihm/ihr präferierte Position.
      1. Klasse deklarieren (Code einfügen folgt am Ende, sofern der Ansatz überzeugt)

      Visual Basic-Quellcode

      1. Dim cReg As clsSPP ' Instance to maintain values in the Registry
      2. '~~> Instantierung der Klasse
      3. If cReg Is Nothing Then Set cReg = New clsSPP
      4. With cReg
      5. .Location = spp_Reg
      6. .Subject = ThisWorkbook.Name
      7. End With


      2. Klasse um die folgenden Zeilen erweitern:

      Visual Basic-Quellcode

      1. Public Property Get UserFormLeft() As Single
      2. Dim v As Variant: v = ValueGet("UserFormLeft")
      3. If Len(v) = 0 Then UserFormLeft = CSng(10) Else UserFormLeft = CSng(v)
      4. End Property
      5. Public Property Let UserFormLeft(si As Single)
      6. ValueLet si, "UserFormLeft"
      7. End Property
      8. Public Property Get UserFormTop() As Single
      9. Dim v As Variant: v = ValueGet("UserFormTop")
      10. If Len(v) = 0 Then UserFormTop = CSng(10) Else UserFormTop = CSng(v)
      11. End Property
      12. Public Property Let UserFormTop(si As Single)
      13. ValueLet si, "UserFormTop"
      14. End Property

      Die Methoden ValueLet und ValueGet müssen nur mit dem Namen versorgt werden, unter dem die Werte verwaltet werden. Alles Andere ist bereits entweder mit der Instantierung der Klasse erfolgt (Location, Subject) oder als Default im Konstruktor festgelegt (Hkey=spp_HKEY_CURRENT_USER und Aspect="Common")

      3. Die beiden Properties können nun wie eingangs beschrieben verwendet werden.

      4. Falls das überzeugt,
      • muss das Klassen Modul (wegen seiner Größe) aus der angefügten clsSPP.xls Arbeitsmappe in Dein VBA-Projekt kopiert werden
      • die beiden Referenzen Microsoft Scripting Runtime und Windows Script Host Object Model dem Projekt hinzugefügt werden
      • die Klasse analog Schritt 2 ergänzt werden
      • der folgenden Code in ein Standard Modul kopiert werden

      Visual Basic-Quellcode

      1. ' -------------------------------------------------------
      2. ' Enumerations and declarations required for using clsSPP
      3. ' -------------------------------------------------------
      4. Public Enum enRegDataType
      5. spp_REG_NONE = 0 ' No defined value type.
      6. spp_REG_SZ = 1 ' A null-terminated string. This will be either a Unicode or an ANSI string,
      7. ' depending on whether you use the Unicode or ANSI functions.
      8. spp_REG_EXPAND_SZ = 2 ' A null-terminated string that contains unexpanded references to environment variables
      9. '(for example, "%PATH%"). It will be a Unicode or ANSI string depending on whether
      10. ' you use the Unicode or ANSI functions. To expand the environment variable references,
      11. ' use the ExpandEnvironmentStrings function.
      12. spp_REG_BINARY = 3 ' Binary data in any form.
      13. spp_REG_DWORD = 4 ' A 32-bit number.
      14. spp_REG_DWORD_LITTLE_ENDIAN = 4 ' A 32-bit number in little-endian format.
      15. ' Windows is designed to run on little-endian computer architectures.
      16. ' Therefore, this value is defined as REG_DWORD in the Windows header files.
      17. spp_REG_DWORD_BIG_ENDIAN = 5 ' A 32-bit number in big-endian format. Some UNIX systems support big-endian architectures.
      18. spp_REG_LINK = 6 ' A null-terminated Unicode string that contains the target path of a symbolic link that
      19. ' was created by calling the RegCreateKeyEx function with REG_OPTION_CREATE_LINK.
      20. spp_REG_MULTI_SZ = 7 ' A sequence of null-terminated strings, terminated by an empty string (\0).
      21. ' The following is an example:
      22. ' String1\0String2\0String3\0LastString\0\0
      23. ' The first \0 terminates the first string, the second to the last \0
      24. ' terminates the last string, and the final \0 terminates the sequence.
      25. ' Note that the final terminator must be factored into the length of the string.
      26. spp_REG_RESOURCE_LIST = 8
      27. spp_FullResourceDescriptor = 9 ' Resource list in the hardware description
      28. spp_ResourceRequirementsList = 10
      29. spp_REG_QWORD = 11 ' A 64-bit number.
      30. spp_REG_QWORD_LITTLE_ENDIAN = 11 ' A 64-bit number in little-endian format.
      31. ' Windows is designed to run on little-endian computer architectures.
      32. ' Therefore, this value is defined as REG_QWORD in the Windows header files.
      33. End Enum
      34. Public Enum enLocation ' Enumerated locations saves an error handling by enforcing a valid location
      35. spp_File = 1 ' "Private Profile" file
      36. spp_Registry = 2
      37. End Enum
      38. Public Enum enHkey ' Enumerated Hkey saves an error handling by enforcing a valid HKEYs
      39. spp_HKEY_CLASSES_ROOT = 1
      40. spp_HKEY_CURRENT_CONFIG = 2
      41. spp_HKEY_CURRENT_USER = 3
      42. spp_HKEY_LOCAL_MACHINE = 4
      43. spp_HKEY_USERS = 5
      44. End Enum
      45. Public Const REG_MAX_VALUE_LENGTH As Long = &H100


      Jetz könnt es tatsächlich losgehen mit der Verwaltung von Session Persistent Properties.
      Die Arbeitsmappe ClassSPP.xls (Anhang) enthält auch alle Anwendungsbeispiele in Form einer Test-Prozedur.
      Anregungen, Kritik, etc. sind mir sehr willkommen und führen ggf. im Laufe der Zeit zu Änderungen bzw. Ergänzungen.
      Dateien
      • ClassSPP.xls

        (264,7 kB, 132 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „warbe“ ()