eigene My.Settings programmieren - Denkanstoß benötigt

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    eigene My.Settings programmieren - Denkanstoß benötigt

    Hallo Leute,

    Programmeinstellungen mit My.Settings zu speichern und abzurufen ist eine angenehme Sache. Funktioniert auch einwandfrei.
    Jedoch ist bei einer Neuinstallation oder Übersiedlung auf einen anderen Rechner die Wiederherstellung der Einstellungen relativ mühsam. Daher habe ich mir überlegt die My.Settings Funktionen mit einer eigenen Funktion zu ersetzen, welche die Daten aus der My.Settings in einer lokalen Datei abspeichert - und wenn die lokale Datei existiert, nur noch aus dieser heraus arbeitet. Somit kann man einfach EXE-Datei und Settingsdatei in einen anderen Ordner übertragen und von dort mit allen Einstellungen starten.

    Ich möche dies mit relativ wenig Programmieraufwand und mit fast keiner Umstellung meiner Programmiergewohnheiten bewerkstelligen.

    Ich habe mir folgendes vorgestellt:

    1. Alle My.Settings.xxxx Aufrufe werden durch eine eigene "Routine" MYSettings.xxxx ersetzt (Suchen-Ersetzen über den kompletten Quellcode).
    2. My.Settings.save wird in MYSettingsSave per Suchen-Ersetzen ersetzt.

    Wenn ich nun das erste Mal eine MYSettings Variable abrufe oder setze, dann wird ermittelt ob die lokale INI-Datei schon existiert. Wenn nicht, dann werden alle Elemente von My.Settings geladen und in diese Datei gespeichert. Ab sofort greifen dann alle MySettings Zugriffe direkt auf die INI-Datei zu.

    Nun zu meiner eigentlichen Aufgabe, wo ich nicht weiß wie ich das machen kann.

    Beispiel:
    bisher: My.Settings.Fensterbreite = 600
    nachher: MYSettings.Fensterbreite = 600

    Wie erstelle ich eine eigene Klasse "MYSettings", die ich dann aber mit der Erweiterung des Wertes "Fensterbreite" ansprechen kann?
    Ich habe bisher ausschließlich mit Modulen gearbeitet und von Klassen keine Ahnung.
    Eine "statische" Variable wie im Beispiel nützt mir nichts, denn diese sollte bei jedem Aufruf geladen oder gesetzt werden.

    VB.NET-Quellcode

    1. Class Settings
    2. Public Shared meineVariable As String = "irgendwas"
    3. End Class
    4. Debug.Print(settings.meineVariable)


    Oder bin ich hier schon eher richtig?:

    VB.NET-Quellcode

    1. Public Class User
    2. Private _username
    3. Public Property Username()
    4. Get
    5. ' Hier den Code
    6. Return _username
    7. End Get
    8. Set(ByVal value)
    9. 'Hier den Code ?
    10. _username = value
    11. End Set
    12. End Property
    13. End Class


    Könnt Ihr mir da weiterhelfen?
    Möglicherweise habe ich meine Frage auch nicht eindeutig ausgedrückt - mal sehen. Vielleicht versteht jemand den Österreicher ;)

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dive26“ ()

    dive26 schrieb:

    Vielleicht versteht jemand den Österreicher

    Ich als auch Österreich sicher 8o

    dive26 schrieb:

    Jedoch ist bei einer Neuinstallation oder Übersiedlung auf einen anderen Rechner die Wiederherstellung der Einstellungen relativ mühsam.

    Ui, da fällt mir was ein was wir die Tage schon mal hatten.
    Ich denke der Provider von @VB1963 ist da sicher die beste wahl für dich da man diesen unkompliziert einbinden kann und ich denke der erfüllt deine erwartungen, und das schöne an dem Ding - was nicht passt kann ganz leicht passend gemacht werden.

    Hier findest du ihn

    Grüße aus Wiener Neustadt
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Vielen Dank, lieber @Nofear23m

    Schaut nach genau dem aus was ich suche ;)
    Werde nächste Woche mal schauen was ich daraus lernen und verwenden kann.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Irgendwie kommen mir immer spät Nachts die Ideen.
    Ich handhabe das noch einfacher.

    Beim Beenden der Anwendung speichere ich die aktuellen My.Settings Infos in ein Configfile.
    Beim Starten der Anwendung wird dieses Configfile ausgelesen (falls vorhanden).
    Der Rest läuft nach wie vor über die My.Settings Funktionen.

    Wird die Software auf einem neuen Rechner oder von einem neuen Pfad gestartet und es liegt das Configfile im Anwendungsordner, dann werden automatisch die dort gespeicherten Informationen verwenden.

    Das Hinzufügen von neuen Settings über die IDE funktioniert auch wie gewohnt.

    Hier der Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System
    3. Imports System.IO
    4. Public Module mdl_Einstellungen
    5. ''' <summary>
    6. ''' Exportiert My.Settings in eine Textdatei und berücksichtigt Boolean, Color, String, Integer und Double Werte
    7. ''' </summary>
    8. ''' <remarks></remarks>
    9. Public Sub ExportSettings()
    10. Dim Filename As String = Path.Combine(My.Application.Info.DirectoryPath, "erp2client.config")
    11. Dim Divider As String = ";"
    12. Using sWriter As New StreamWriter(Filename)
    13. For Each Setting As System.Configuration.SettingsPropertyValue In My.Settings.PropertyValues
    14. If Setting.Property.PropertyType.ToString = "System.Drawing.Color" Then
    15. 'sWriter.WriteLine(Setting.Property.PropertyType.ToString & Divider & Setting.Name & Divider & (Setting.PropertyValue.toargb).ToString)
    16. sWriter.WriteLine(Setting.Property.PropertyType.ToString & Divider & Setting.Name & Divider & CType(Setting.PropertyValue, Color).ToArgb.ToString)
    17. Else
    18. sWriter.WriteLine(Setting.Property.PropertyType.ToString & Divider & Setting.Name & Divider & Setting.SerializedValue.ToString)
    19. End If
    20. Next
    21. End Using
    22. End Sub
    23. ''' <summary>
    24. ''' Importer My.Settings in eine Textdatei und berücksichtigt Boolean, Color, String, Integer und Double Werte
    25. ''' </summary>
    26. ''' <remarks></remarks>
    27. Public Sub ImportSettings()
    28. Dim Filename As String = Path.Combine(My.Application.Info.DirectoryPath, "erp2client.config")
    29. If IO.File.Exists(Filename) = False Then Exit Sub 'nichts laden, wenn die Datei nicht existiert
    30. Dim Divider As String = ";"
    31. Try
    32. Using sReader As New StreamReader(Filename)
    33. While sReader.Peek() > 0
    34. 'Zeile aus Datei einlesen
    35. Dim Input = sReader.ReadLine()
    36. 'Elemente/Werte in Array aufsplitten
    37. Dim DataSplit = Input.Split(CChar(Divider))
    38. Select Case DataSplit(0)
    39. Case "System.Boolean"
    40. My.Settings(DataSplit(1)) = CBool(DataSplit(2))
    41. Case "System.String"
    42. My.Settings(DataSplit(1)) = DataSplit(2)
    43. Case "System.Int32"
    44. My.Settings(DataSplit(1)) = CInt(DataSplit(2))
    45. Case "System.Double"
    46. My.Settings(DataSplit(1)) = CDbl(DataSplit(2))
    47. Case "System.Drawing.Color"
    48. My.Settings(DataSplit(1)) = Color.FromArgb(CInt(DataSplit(2)))
    49. 'Hier kann man weitere Datentypen einbinden
    50. End Select
    51. End While
    52. End Using
    53. My.Settings.Save()
    54. Catch
    55. MessageBox.Show("Fehler beim Importieren der Clienteinstellungen!", "Dateifehler", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    56. End Try
    57. End Sub
    58. End Module
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26 Da gibt es zwei Möglichkeiten.
    Den Provider von @VB1963 :
    UserSettingsProvider (Persistieren von UserSettings)
    oder eine einfache XML-serialisierte Datenklasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private XmlFile As String = "c:\temp\data.xml" ' Pfad zum Speichern / Lesen
    3. Private Data As MyData
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. '' Daten-Instanz erstellen und befüllen
    6. 'Me.Data = New MyData()
    7. 'Me.Data.name = "Test Status"
    8. 'Me.Data.address = "0000"
    9. 'Me.Data.type = 9999
    10. 'Me.Data.timestamp = DateTime.Now
    11. 'Me.Data.flags = 0
    12. 'Me.Data.user = "Tester"
    13. 'Me.Data.SingleValues = New List(Of Integer) From {1, 2, 3, 4, 5}
    14. End Sub
    15. ''' <summary>
    16. ''' Daten auf Festplatte schreiben
    17. ''' </summary>
    18. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    19. Me.Data.WriteData(Me.XmlFile)
    20. End Sub
    21. ''' <summary>
    22. ''' Daten von Festplatte laden
    23. ''' </summary>
    24. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    25. Me.Data = MyData.LoadData(Me.XmlFile)
    26. End Sub
    27. ''' <summary>
    28. ''' aktuelle Daten darstellen
    29. ''' </summary>
    30. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    31. Me.ListBox1.Items.Clear()
    32. ' hier: nur das Integer-Array
    33. For Each value In Me.Data.SingleValues
    34. Me.ListBox1.Items.Add(value)
    35. Next
    36. End Sub
    37. End Class
    38. '#####################################################
    39. '#####################################################
    40. '#####################################################
    41. Imports System.IO
    42. Imports System.Text
    43. Imports System.Xml.Serialization
    44. ''' <summary>
    45. ''' Datenklasse
    46. ''' </summary>
    47. ''' <remarks>mit XML-Serialisierung</remarks>
    48. Public Class MyData
    49. ' alle vorkommenden Daten
    50. Public Property name() As String
    51. Public Property address() As String
    52. Public Property type() As Integer
    53. Public Property timestamp() As DateTime
    54. Public Property flags() As Integer
    55. Public Property user() As String
    56. Public Property SingleValues() As List(Of Integer)
    57. Public Sub New()
    58. ' Hier die Daten mit Defaultwerten befüllen oder nicht
    59. Me.name = "Hase"
    60. Me.SingleValues = New List(Of Integer)
    61. End Sub
    62. ''' <summary>
    63. ''' Daten aus einer Datei lesen
    64. ''' </summary>
    65. ''' <param name="file">Dateiname</param>
    66. ''' <returns>die geladene Instanz</returns>
    67. Public Shared Function LoadData(file As String) As MyData
    68. Dim data As New MyData()
    69. Try
    70. ' Deserialize XML file to a new object.
    71. Using sr As New StreamReader(file, Encoding.Default)
    72. Dim x As New XmlSerializer(data.GetType())
    73. data = DirectCast(x.Deserialize(sr), MyData)
    74. End Using
    75. Return data
    76. Catch
    77. ' nix tun, die Daten-Instanz ist nicht valid,
    78. ' es wird die Instanz übergeben, die bei New() erzeugt wird
    79. End Try
    80. Return data
    81. End Function
    82. ''' <summary>
    83. ''' Daten in eine Datei schreiben
    84. ''' </summary>
    85. ''' <param name="file">Dateiname</param>
    86. Public Sub WriteData(file As String)
    87. ' Serialize object to a XML file.
    88. Using sw As New StreamWriter(file, False, Encoding.Default)
    89. Dim x As New XmlSerializer(Me.GetType())
    90. x.Serialize(sw, Me)
    91. End Using
    92. End Sub
    93. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja, die vom User eingestellten, nicht die Default Werte. Die Default Werte werden nur verwendet, wenn keine Configdatei existiert.

    So wie ich es jetzt mache passt es mir aber optimal. So kann die Software auch direkt von einem USB Stick geladen werden - auf einem beliebigen Rechner - und die Settings sind immer mit dabei.
    Und das Beste: ich muss im Code nichts ändern.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    So kann die Software auch direkt von einem USB Stick geladen werden - auf einem beliebigen Rechner - und die Settings sind immer mit dabei.
    Wenn du einen eigenen Settingsprovider erstellst, wo die Daten im Programmverzeichnis abgelegt werden, sind deine Settings auch immer dabei (du lenkst damit nur die Datenhaltung in eine eigene von dir bestimmte Datei und Speicherort um)...
    Du arbeitest jetzt doppelt: zum einen verwendest du wie bisher deine Settings per user.Config.xml und persistierst deine Settings detto nebenbei im Programmverzeichnis - das ist m.M. inkonsistent bzw. fehleranfällig...