OptionValueManager

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

Re: OptionValueManager

Beitragvon Andreas Vogt » Di 26. Mai 2015, 09:36

Gar nicht.
Ablauf in aktueller Version ist folgender:
Initialisierung: nix passiert
Property OptionTable wird gesetzt: catchOptionValues wird ausgeführt.

Andreas
Andreas Vogt
Entwickler
 
Beiträge: 151
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: OptionValueManager

Beitragvon Andreas Vogt » Di 26. Mai 2015, 10:21

Hallo Josef,
denke habs soweit gecheckt.
Anstatt eine Klassenvariable zu verwenden die eine begrenzte Lebensdauer hat verwenden wir direkt den Klassennamen.
Mit dem Tabellennamen als Konstante kann ich mich immer mehr anfreunden.
D.H. wir erstellen im HelperModul neben dem Enum auch noch die Konstante, und in dem Setup-Modul bringen wir eine MsgBox mit ToDos, dass der Anwender weis dass wenn er die Tabelle umbenennt dass er die Konstante ändern muss.

Die Sache mit der Instancing Eigenschaft "PublicNotCreatable" haben wir doch bereits durch die Anweisungen Attribute VB_PredeclaredId = True im Klassenmodul gesetzt?!

Eine Sache noch, der Aufruf catchOptionValues würde ich abändern und ausschließlich dann aufrufen wenn man es braucht, in der Property Settings.

Andreas
Andreas Vogt
Entwickler
 
Beiträge: 151
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: OptionValueManager

Beitragvon Josef Pötzl » Di 26. Mai 2015, 11:18

Ich hab den Code einmal ein wenig umgebaut.

Eine Sache noch, der Aufruf catchOptionValues würde ich abändern und ausschließlich dann aufrufen wenn man es braucht, in der Property Settings.

Das wird jetzt abgerufen, wenn das Array noch nicht initialisiert ist.
Eine Methode zum Neueinlesen der Werte wird auch praktisch sein.

Noch ein Gedanke zum Einsatz der Enum-Werte:
Da sich die Zahlen nach der Reihenfolge des PK richten, darf man niemals die Long-Zahl im Code oder sonstwo verwenden, da nicht sichergestellt ist, dass diese Werte nach dem Neuerstellen der Enum-Definition gleich sind.
Josef Pötzl
Moderator
 
Beiträge: 754
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

Re: OptionValueManager

Beitragvon Andreas Vogt » Di 26. Mai 2015, 11:38

Hallo,
Da sich die Zahlen nach der Reihenfolge des PK richten, darf man niemals die Long-Zahl im Code oder sonstwo verwenden, da nicht sichergestellt ist, dass diese Werte nach dem Neuerstellen der Enum-Definition gleich sind.

Und wie behebt man das?

Andreas
Andreas Vogt
Entwickler
 
Beiträge: 151
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: OptionValueManager

Beitragvon Josef Pötzl » Di 26. Mai 2015, 12:00

Entweder man speichert den Enum-Wert in der Tabelle mit, was ich irgendwie unpraktisch finde, oder man versucht, die bestehenden Werte aus dem Enum-Code herauszulesen und fügt die neuen Werte aus der Tabelle dahinter an.

.. oder: man weiß, dass man nur die Enum-Definition im Code verwenden darf und nutzt für Abfrage, direkte Steuerelementinhalte u. ä. eine Methode, die direkt über den Key den passenden Wert liefert.
(Da man von Abfragen usw. sowieso eine Hilfsprozedur benötigt, da ein Klassenzugriff nicht möglich ist, kann man sich da schon ein wenig helfen.)

Ein Zugriff wie OptionManager.ValueByKey("xyz") wird generell nützlich sein.


Bitte den Beitrag bezüglich Benennung nicht übersehen: viewtopic.php?f=14&t=400&start=30#p1198

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

Re: OptionValueManager

Beitragvon Andreas Vogt » Di 26. Mai 2015, 12:36

Hallo,
man könnte ja auch aus dem Enum-Wert den Keynamen ermitteln:
Code: Alles auswählen
Private Function getKeyName(ByVal keynum As Long)
    With CurrentDb.OpenRecordset(OptionTable)
        .Move keynum
        getKeyName = .Fields("strKey")
    End With
End Function


Dann könnte man in der Settings-Property den KeyValue direkt über den Keynamen ermitteln?!

Andreas
Andreas Vogt
Entwickler
 
Beiträge: 151
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: OptionValueManager

Beitragvon Josef Pötzl » Di 26. Mai 2015, 12:57

Das wird nicht sicher funktionieren, wenn jemand manuell einen Eintrag in die Tabelle macht.
=> eventuell doch ein Autowertfeld einfügen (nicht unbedingt als PK sondern als Unique Index verwenden). Solange die Tabelle nicht neu erstellt wird, könnte man dann diese Autowert-Zahl als Enum-Wert mitgeben.

Dass gelöschte Autowerte nicht noch einmal vergeben werden, wäre in diesem Fall gar nicht so schlecht, um Code-Leichen (die direkt die Zahl übergeben) aufzustöbern bzw. zumindest beim Zugriff auf den nicht vorhandenen Wert einen Fehler auslösen.

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

Re: OptionValueManager

Beitragvon Andreas Vogt » Sa 30. Mai 2015, 20:51

Hallo,
habe gesehen dass du daran gearbeitet hast.
Es haben sich leider ein paar Fehler eingeschlichen die ich Korrigiert habe.
Außerdem habe ich 2 Properties hinzugefügt:
Code: Alles auswählen
Public Property Get KeyName(ByVal SettingIndex As SettingKeys) As String
    If (0 / 1) + (Not Not m_Values) = 0 Then
        CatchOptionValues
    End If
   
    KeyName = m_Keys(SettingIndex)
End Property

Public Property Get Count() As Long
    If (0 / 1) + (Not Not m_Values) = 0 Then
        CatchOptionValues
    End If
   
    Count = UBound(m_Keys)
End Property


Damit kann man vom Formular aus z.B. alle Optionen ausgeben lassen. Hier mein BeispielCode dazu:
Code: Alles auswählen
Option Compare Database
Option Explicit

Dim myOpt As OptionManager

Private Sub runTest_Click()
    Dim i As Long
    Set myOpt = New OptionManager
    With myOpt
        For i = 1 To .Count
            Debug.Print .KeyName(i) & ": " & .Setting(i)
        Next i
    End With
    Set myOpt = Nothing
End Sub

Private Sub CreateEnum_Click()
    Set myOpt = New OptionManager
    myOpt.UpdateEnum
    Set myOpt = Nothing
End Sub


Habe das Projekt eben geupdatet.
Gruß Andreas
Andreas Vogt
Entwickler
 
Beiträge: 151
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: OptionValueManager

Beitragvon Andreas Vogt » So 31. Mai 2015, 21:49

Hallo,
so, habe noch ein paar Funktionen in die Klasse getan, SettingByName und DeleteByName.
Außerdem hab ich ein Beispiel-Formular erstellt das automatisch importiert wird.

Dateien sind geupdated.
Weiteres siehe Log.

Gruß Andreas
Andreas Vogt
Entwickler
 
Beiträge: 151
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: OptionValueManager

Beitragvon Andreas Vogt » Mo 1. Jun 2015, 09:23

Da ist noch ein Fehler drin.
versuche ich den Enum aufzubauen wenn es keine Tabelleneinträge gibt, kommt das dabei raus:
Code: Alles auswählen
Public Const OptionManagerDefaultDataSource As String = "tabOptions"

    [_undefined] = 0
Public Enum SettingKeys
End Enum


Andreas
Andreas Vogt
Entwickler
 
Beiträge: 151
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

VorherigeNächste

Zurück zu Quellcode

cron