Speichern einer Form
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.
-
-
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... -
-
Versuch mal damit Einstellungen in ein INI Datei speichern oder so:
-Menüleiste -> Projekt -> Eigenschaften -> Einstellunen -> Name z.B Textbox1save
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
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
Ich beschäftige mich non stop damit aber der Funke will einfach nicht überspringen~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.
~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
- Imports System.ComponentModel
- Imports System.Drawing
- Imports System.IO
- Imports System.Text.RegularExpressions
- Imports System.Windows.Forms
- Public Class Rout
- Private LBLText As String = "Routine"
- Private RoutAkt As Boolean = False
- Private RTtime As String = "HH:MM:SS"
- Private RoutAut As Boolean = False
- Private MSel As Boolean = False
- Private Routpath As String = ""
- Property RoutName() As String
- Get
- Return LBLText
- End Get
- Set(ByVal value As String)
- LBLText = value
- LBLNewRout.Text = LBLText
- End Set
- End Property
- Property Aktiv() As Boolean
- Get
- Return RoutAkt
- End Get
- Set(ByVal value As Boolean)
- RoutAkt = value
- CBAkt.Checked = RoutAkt
- End Set
- End Property
- Property Automatik() As Boolean
- Get
- Return RoutAut
- End Get
- Set(ByVal value As Boolean)
- RoutAut = value
- CBAut.Checked = RoutAut
- End Set
- End Property
- Property RoutPfad() As String
- Get
- Return Routpath
- End Get
- Set(value As String)
- Routpath = value
- End Set
- End Property
- Property RoutTime() As String
- Get
- Return RTtime
- End Get
- Set(value As String)
- Dim Muster As String
- Dim Rgx As Regex
- Dim Ergebnis As Boolean
- Muster = "^[0-2]{1}[0-9]{1}:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$"
- Rgx = New Regex(Muster)
- Ergebnis = Rgx.IsMatch(value)
- If Ergebnis = True Then
- RTtime = value
- Else
- RTtime = "Bitte an das Format halten!"
- End If
- value = RTtime
- End Set
- End Property
- Private Sub CBAkt_CheckedChanged(sender As Object, e As EventArgs) Handles CBAkt.CheckedChanged
- If CBAkt.Checked = True Then
- Label1.BackColor = Color.LightGreen
- Me.Aktiv = True
- Else
- Label1.BackColor = Color.Transparent
- Me.Aktiv = False
- End If
- End Sub
- Private Sub CBAut_CheckedChanged(sender As Object, e As EventArgs) Handles CBAut.CheckedChanged
- If CBAut.Checked = True Then
- Label2.BackColor = Color.LightGreen
- Me.Automatik = True
- Else
- Label2.BackColor = Color.Transparent
- Me.Automatik = False
- End If
- End Sub
- Dim i As Integer
- Dim x As Rout
- Dim app, cur As New Point(0, 0)
- Private Sub sync()
- app = Me.Location
- cur = Cursor.Position
- End Sub
- Private Sub Move_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
- Timer1.Enabled = True
- Timer1.Start()
- sync()
- End Sub
- Private Sub Move_Mouseup(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
- Timer1.Stop()
- sync()
- End Sub
- Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
- Me.Location = app - cur + Cursor.Position
- End Sub
- Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
- If e.KeyCode = Keys.Enter Then
- Dim Muster As String
- Dim Rgx As Regex
- Dim Ergebnis As Boolean
- Muster = "^[0-2]{1}[0-9]{1}:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$"
- Rgx = New Regex(Muster)
- Ergebnis = Rgx.IsMatch(TextBox1.Text)
- If Ergebnis = True Then
- RTtime = TextBox1.Text
- Else
- TextBox1.Text = "Format korrigieren"
- End If
- End If
- End Sub
- Private Sub LBLNewRout_KeyDown(sender As Object, e As KeyEventArgs) Handles LBLNewRout.KeyDown
- If e.KeyCode = Keys.Enter Then
- Me.Name = LBLNewRout.Text
- End If
- End Sub
- Private Sub BTNDatei_Click(sender As Object, e As EventArgs) Handles BTNDatei.Click
- Dim opfdia As New OpenFileDialog()
- OpenFileDialog1.ShowDialog()
- Routpath = OpenFileDialog1.FileName
- MsgBox(Routpath)
- End Sub
- Private Sub Routine_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- End Sub
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Me.Dispose()
- End Sub
- End Class
~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
- Imports System.ComponentModel
- Public Class Routine
- Implements INotifyPropertyChanged
- Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
- Private _ausführungszeit As DateTime
- Public Property Ausführungszeit As DateTime
- Get
- Return _ausführungszeit
- End Get
- Set(value As DateTime)
- If value <> _ausführungszeit Then
- _ausführungszeit = value
- OnPropertyChanged(NameOf(Ausführungszeit))
- End If
- End Set
- End Property
- Protected Sub OnPropertyChanged(e As PropertyChangedEventArgs)
- RaiseEvent PropertyChanged(Me, e)
- End Sub
- Protected Sub OnPropertyChanged(propertyName As String)
- OnPropertyChanged(New PropertyChangedEventArgs(propertyName))
- End Sub
- 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~
-
Ähnliche Themen
-
Daten von einer Webanwendung in einer form anzeigen lassen
DerAnfänger2014 - - Sonstige Problemstellungen
-
5 Benutzer haben hier geschrieben
- Gast (6)
- razzzer530i (5)
- ~blaze~ (4)
- mox (2)
- IbBlue (1)