Speichern einer Form

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Speichern einer Form

    Hallo



    Kann auf einfache Art eine Form mit Steuerelementen z.B.Buttons,PictureBoxen,TextBoxen...

    gespeichert werden.

    Die Steuerelemente können verschoben und verändert werden.

    Nach neuen Aufruf müssen die Veränderungen aktuell sein.



    MfG
    Ist das Programm zum installieren oder nicht?
    Falls schon, kannst du My.Settings gebrauchen, ist ziemlich einfach, damit kannst du sicher auch Position speichern,
    Falls das Prog nicht zum installieren ist, ist My.Setting nicht zu empfehlen, weil alle Einstellungen verloren gehen, wenn das Prog verschoben wird,
    aber ich glaube es gibt .ini-Dateien oder so...

    Einstellungen in ein INI Datei speichern

    Versuch mal damit Einstellungen in ein INI Datei speichern oder so:

    -Menüleiste -> Projekt -> Eigenschaften -> Einstellunen -> Name z.B Textbox1save

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. TextBox1.Text = My.Settings.Textbox1save 'In (Form)_Load eingeben
    3. end sub


    VB.NET-Quellcode

    1. Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    2. My.Settings.Textbox1save = TextBox1.Text 'In (Form)_Close eingeben
    3. My.Settings.Save()
    4. end sub


    Das wäre jetzt zum Beispiel für die Textbox (Textbox1.Text).
    Für Checkbox z.B (My.Settings.Check1save = Checkbox1.Checked 'Das kommt wiederum in Form_Close)

    Hoffe konnte dir helfen ;)
    Hallo

    Danke für die Antworten.

    Settings und Inis sind mir mehr oder weniger bekannt und nutze Sie.

    Ich habe z.B. 50-100 Steuerelemente auf der Form.

    Diese werden neu Angeordnet und verändert (vom Anwender).

    Bedienerführung angepasst damit es Übersichtlicher wird.

    Jedes Steuerelement hat nun mal einen Sack voll Parameter.

    Diese wollte ich alle mit einen Ruck speichern und nicht einzeln wie bisher.

    Gruß
    @mox
    Bin schon ewig am suchen und machen und bin tatsächlich gerade darauf gestoßen und probiere aus wie ein irrer. Dabei sind mir einige Fehler an meinem Control aufgefallen, die das Speichern und Laden der Parameter schwer machen, wenn diese gar nicht richtig übergeben werden :D

    Speichern der Parameter klappt jetzt, nur die Controls mit dem entsprechenden Settings einzeln zu laden verwirrt mich einfach total.
    Es funktioniert einfach nicht.

    Ich muss ja eigentlich (Nehme jetzt mal einen BTN start Load) unter BTN_Load.click

    VB.NET-Quellcode

    1. 'Zähle wieviel Controls gespeichert wurden
    2. controls.add("Mein Control so oft wie gezählt dabei Name anpassen")
    3. For each x in Me.Controls.oftyle(of "Mein Steuerelement")
    4. x.name= 'Ladde daten aus Control Nr x
    5. next


    Ich beschäftige mich non stop damit aber der Funke will einfach nicht überspringen :D
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    ~blaze~ schrieb:

    Hi
    serialisiere nicht die Steuerelemente, sondern die Daten.


    Hi, ich weiß leider überhaupt nicht was du meist und wie ich das umsetzen könnte.
    Kannst du mir das vielleicht etwas besser beschreiben?

    //EDIT

    Habe es so hinbekommen, dass es mit allen anderen Steuerelementen funktioniert, die bereits in der Form enthalten sind. Es liegt also an der Focused Property von meinem Steuerelement. Finde allerdings nirgendwo diese Property um sie nachzubauen.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

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

    Speichere einfach die Einstellungen in einer Klasse und serialisiere dann die Instanz davon. Sämtliche Datenverarbeitung findet dort statt. Schau' dir am besten auch Datenbindung und das MVC-Pattern an.
    Du hast sonst eigentlich nur Nachteile. Du hast alle Daten gemischt mit ihrem anzeigenden Steuerelement und dessen vollständigen Eigenschaften. Das ist einfach total unpraktisch so. Außerdem wird eine riesige Datei erstellt, die Eigenschaften enthält, die eh nicht benötigt werden.

    Viele Grüße
    ~blaze~
    Also, ich habe mein Steuerelement ja als eigene Klasse erzeugt.

    Ich habe das Steuerelement mal hochgeladen.

    Es funktioniert so wie ich es haben möchte, allerdings lässt sich schlecht damit arbeiten.
    Versucht mal das element mehrmals während der Laufzeit in ein Panel zu laden und es mit Focused oder ActiveControl anzeigen zu lassen.

    Vielleicht könnt ihr mir so auch ohne Code einfach spezifischere Tipps geben und mir einen echten Gefallen tun.
    Ich weiß eben nur nicht wo mein Fehler liegt.
    Andere controls wie ein Button oder sowas, da funktioniert das...

    Klar das ist sicherlich alles etwas bescheuert aber was solls. Schließlich will ich ja wissen wie man es besser macht.
    Dateien
    • AddRoutine.rar

      (194,84 kB, 98 mal heruntergeladen, zuletzt: )
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

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

    Ich weiß nicht, wieviele Vorkenntnisse du bereits hast und ich habe auch nicht genügend Informationen über das Problem.
    Geht es dir darum, Controls mit einer spezifischen Konfiguration auf eine Form zu platzieren?

    Viele Grüße
    ~blaze~

    PS: Ich bin niemand, der gerne Projekte oder dergleichen herunterlädt. Erkläre das Problem lieber.
    Also, ich habe ein Steuerelement entworfen.
    Habe Properties gesetzt, die selbsterklärend sind.

    Jetzt habe ich eine WindosForm.

    Ich möchte auf dieser Form in einem Panel dem User ermöglichen, per Button bis zu 10(erstmal klein anfangen) Steuerelemente hinzuzufügen.
    Diese kann er bewegen und löschen.

    Jetzt möchte ich erreichen. dass mir der Name des Steuerelements, welches ich angeklickt habe angezeigt wird. Normal geht das ja mit me.activecontrol.name
    In diesem Fall und da es sich in einem Panel befindet, geht das nicht.

    Dieses Problem möchte ich lösen.
    Ich möchte wenn das Programm fertig ist folgende Optionen bieten:

    - User kann Steuerelemente hinzufügen und löschem
    - Die Einstellungen des Programms sollen gespeichert werden

    Für mein Steuerelement wird benötigt:

    2x Checkbox
    2x Panel
    3x Label
    2x Textbox
    2x Button
    1x Timer
    1x Openfiledialog

    Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Drawing
    3. Imports System.IO
    4. Imports System.Text.RegularExpressions
    5. Imports System.Windows.Forms
    6. Public Class Rout
    7. Private LBLText As String = "Routine"
    8. Private RoutAkt As Boolean = False
    9. Private RTtime As String = "HH:MM:SS"
    10. Private RoutAut As Boolean = False
    11. Private MSel As Boolean = False
    12. Private Routpath As String = ""
    13. Property RoutName() As String
    14. Get
    15. Return LBLText
    16. End Get
    17. Set(ByVal value As String)
    18. LBLText = value
    19. LBLNewRout.Text = LBLText
    20. End Set
    21. End Property
    22. Property Aktiv() As Boolean
    23. Get
    24. Return RoutAkt
    25. End Get
    26. Set(ByVal value As Boolean)
    27. RoutAkt = value
    28. CBAkt.Checked = RoutAkt
    29. End Set
    30. End Property
    31. Property Automatik() As Boolean
    32. Get
    33. Return RoutAut
    34. End Get
    35. Set(ByVal value As Boolean)
    36. RoutAut = value
    37. CBAut.Checked = RoutAut
    38. End Set
    39. End Property
    40. Property RoutPfad() As String
    41. Get
    42. Return Routpath
    43. End Get
    44. Set(value As String)
    45. Routpath = value
    46. End Set
    47. End Property
    48. Property RoutTime() As String
    49. Get
    50. Return RTtime
    51. End Get
    52. Set(value As String)
    53. Dim Muster As String
    54. Dim Rgx As Regex
    55. Dim Ergebnis As Boolean
    56. Muster = "^[0-2]{1}[0-9]{1}:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$"
    57. Rgx = New Regex(Muster)
    58. Ergebnis = Rgx.IsMatch(value)
    59. If Ergebnis = True Then
    60. RTtime = value
    61. Else
    62. RTtime = "Bitte an das Format halten!"
    63. End If
    64. value = RTtime
    65. End Set
    66. End Property
    67. Private Sub CBAkt_CheckedChanged(sender As Object, e As EventArgs) Handles CBAkt.CheckedChanged
    68. If CBAkt.Checked = True Then
    69. Label1.BackColor = Color.LightGreen
    70. Me.Aktiv = True
    71. Else
    72. Label1.BackColor = Color.Transparent
    73. Me.Aktiv = False
    74. End If
    75. End Sub
    76. Private Sub CBAut_CheckedChanged(sender As Object, e As EventArgs) Handles CBAut.CheckedChanged
    77. If CBAut.Checked = True Then
    78. Label2.BackColor = Color.LightGreen
    79. Me.Automatik = True
    80. Else
    81. Label2.BackColor = Color.Transparent
    82. Me.Automatik = False
    83. End If
    84. End Sub
    85. Dim i As Integer
    86. Dim x As Rout
    87. Dim app, cur As New Point(0, 0)
    88. Private Sub sync()
    89. app = Me.Location
    90. cur = Cursor.Position
    91. End Sub
    92. Private Sub Move_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    93. Timer1.Enabled = True
    94. Timer1.Start()
    95. sync()
    96. End Sub
    97. Private Sub Move_Mouseup(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
    98. Timer1.Stop()
    99. sync()
    100. End Sub
    101. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    102. Me.Location = app - cur + Cursor.Position
    103. End Sub
    104. Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
    105. If e.KeyCode = Keys.Enter Then
    106. Dim Muster As String
    107. Dim Rgx As Regex
    108. Dim Ergebnis As Boolean
    109. Muster = "^[0-2]{1}[0-9]{1}:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$"
    110. Rgx = New Regex(Muster)
    111. Ergebnis = Rgx.IsMatch(TextBox1.Text)
    112. If Ergebnis = True Then
    113. RTtime = TextBox1.Text
    114. Else
    115. TextBox1.Text = "Format korrigieren"
    116. End If
    117. End If
    118. End Sub
    119. Private Sub LBLNewRout_KeyDown(sender As Object, e As KeyEventArgs) Handles LBLNewRout.KeyDown
    120. If e.KeyCode = Keys.Enter Then
    121. Me.Name = LBLNewRout.Text
    122. End If
    123. End Sub
    124. Private Sub BTNDatei_Click(sender As Object, e As EventArgs) Handles BTNDatei.Click
    125. Dim opfdia As New OpenFileDialog()
    126. OpenFileDialog1.ShowDialog()
    127. Routpath = OpenFileDialog1.FileName
    128. MsgBox(Routpath)
    129. End Sub
    130. Private Sub Routine_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    131. End Sub
    132. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    133. Me.Dispose()
    134. End Sub
    135. End Class
    Bilder
    • steuerelement.png

      3,69 kB, 282×184, 89 mal angesehen
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Rout ist dann wohl eine partielle Klasse, die dein Fenster enthält, oder?

    Meine Herangehensweise wäre folgende: Falls jeder Eintrag mehrere Steuerelemente benötigt, diese in einem Behälter, d.h. UserControl oder Fenster, zu gruppieren und anschließend Instanzen dieses UserControls zu erstellen und an die Instanz einer Klasse Routine zu binden. Innerhalb des UserControls werden also alle Events abonniert, die für die Verwaltung nötig sind.
    Die Routine-Klasse könnte bspw. so aussehen:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class Routine
    3. Implements INotifyPropertyChanged
    4. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    5. Private _ausführungszeit As DateTime
    6. Public Property Ausführungszeit As DateTime
    7. Get
    8. Return _ausführungszeit
    9. End Get
    10. Set(value As DateTime)
    11. If value <> _ausführungszeit Then
    12. _ausführungszeit = value
    13. OnPropertyChanged(NameOf(Ausführungszeit))
    14. End If
    15. End Set
    16. End Property
    17. Protected Sub OnPropertyChanged(e As PropertyChangedEventArgs)
    18. RaiseEvent PropertyChanged(Me, e)
    19. End Sub
    20. Protected Sub OnPropertyChanged(propertyName As String)
    21. OnPropertyChanged(New PropertyChangedEventArgs(propertyName))
    22. End Sub
    23. End Class


    Durch das Interface INotifyPropertyChanged kann halbwegs elegant an Eigenschaften gebunden werden. Man gibt den Namen der Eigenschaft an, die ihren Wert geändert hat. Das machst du dann über alle Eigenschaften, die es zu speichern gilt.
    Manche würden, anstatt es selbst zu implementieren, übrigens auch auf DataSet zurückgreifen, denke ich. Das ist mir aber bei dem geringen Kompexitätsgrad zu hoch gegriffen.

    Die Datenbindung kann bspw. durch die Binding-Klasse erfolgen.
    Es wäre eine gute Wahl, dem Behälter eine Eigenschaft hinzuzufügen, die die Datenbindung durchführt. D.h. du fügst dem Setter eine Routine hinzu, die die alten Eventabonnements (Bindungen sind i.a. gekapselte Event-Abonnements) entfernt und die neuen registriert. Diese Eigenschaft setzt du dann auf dem UserControl, sobald du die Einstellungen deserialisierst. D.h. du fügst den Einstellungen alle Instanzen der Routine-Klasse hinzu, die angezeigt werden.

    Übrigens ist die Datenbindung in WPF wesentlich eleganter, als in Windows.Forms. Du musst wesentlich weniger implementieren, auch wenn sie dafür komplizierter ist, als in Windows Forms.

    Viele Grüße
    ~blaze~