Ausgewählten Drucker nach Programmende und Neustart merken?

WOW, Danke für die schnelle Hilfe

Soweit funktioniert es jetzt auch schon... Bekomme aber 2 Warnungen:

1. Die Standarddrucker-Variable wird verwendet, bevor ihr ein Wert zugewiesen wird. Zur Laufzeit kann eine Nullverweisausnahme auftreten.

(Betrifft die Private Sub Form1_Load vom Beitrag davor)

Codeausschnitt vom Ende... - Fehler rot markiert.

Dim Standarddrucker As String
With ComboBox1
For Each s In Printing.PrinterSettings.InstalledPrinters
.Items.Add(s)
If s = PrintDoc.PrinterSettings.PrinterName Then
Standarddrucker = s
End If
Next s
If .Items.Count > 0 Then
'// Standarddrucker markieren
' aber nur wenn vorher kein Drucker von dir selektiert wurde
Dim i As Integer = _
Me.ComboBox1.FindStringExact(clsSettings.GetSetting("ComboBox", "dein_Drucker", "DeineConfigDatei.xml"))
If i = -1 Then
'// Standarddrucker setzen
i = Me.ComboBox1.FindStringExact(Standarddrucker)
Else
'// eigener Drucker wurde gefunden
End If
Me.ComboBox1.SelectedIndex = i
Else
MessageBox.Show("Es ist kein Drucker installiert!", "Abbruch", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Me.Close()
End If


2. Die GetSetting-Funktion gibt nicht für alle Codepfade einen Wert zurück. Wenn das Ergebnis verwendet wird, kann zur Laufzeit eine Nullverweisausnahme auftreten.

(Betrifft das Ende deiner kopierten Funktion: Public Shared Function GetSetting)

Codeausschnitt vom Ende... - Fehler rot markiert.

Catch ex As Exception
'// System.Windows.Forms.MessageBox.Show(ex.ToString)
End Try

End Function#End Region
End Class

Habe jetzt mal eine neue Klasse (clsSettings.vb) bei mir angelegt und deine Inhalte der Public Shared Sub SaveSetting und die Public Shared Function GetSetting Funktion kopiert. Passen hier jetzt noch die Bezeichnungen? ("dein_Drucker" wie oben im Beispiel beschrieben und "Eintrag" wie bei dir in deinem 1. Beispiel mit den 4 Einträgen?
Brauche ich den kompletten Inhalt deiner Public Shared Sub SaveSetting und der Public Shared Function GetSetting Funktion für die Speicherung der Variable, oder kann ich da noch was kürzen oder rauslöschen? (ist nicht böse gemeint)

Oder anders gefragt, sieht der Code für das eben beschriebene Beispiel hier oben drüber noch genauso aus, wie die Public Shared Sub SaveSetting und die Public Shared Function GetSetting Funktion aus deinem 1. Beispiel weiter oben? (Oder kann man das einfacher / kürzer machen, weil ich ja nur die Variable für den Drucker speichern will, du in deinem Projekt aber vielleicht mehr oder anderes gespeichert hast?)

Danke nochmals für deine super Unterstützung
 
Hallo Matze,

ja , ich sage mal die Warnungen könnte man auch ignorieren, hier ist
VB mit Option Strict On etwas sehr pingelig, das führt in dem Fall nicht
wirklich zu einem Fehler.

Aber wenn man es wirlich sauber haben möchte:

1. Dim Standarddrucker As String = "" deklarieren, dann hat die Variable gleich einen
Wert

2. diese Meldung kommt weil das GetSetting im Fehlerfall nichts zurückgibt.
Hier könnte man im Try Catch Block einfach Return "-" einfügen

Catch ex As Exception
'// System.Windows.Forms.MessageBox.Show(ex.ToString)
Return "-"
End Try

Das mit dem Kopieren der beiden Sub/Functions ist ok.
Mehr brauchst du nicht.
Die anderen Functions waren Sachen die ich benötige.
Die Namen der Einträge legst du ja in deinem Code fest (nicht in der Settings Klasse).
Wenn du andere Dinge Speichern möchtest nimmst du beim SaveSetting einfach eine andere Sektion oder einen anderen Eintrag.
Das ganze ist analog aufgebaut zu einer Ini Datei, nur eben moderner in einem
XML File.

Ich würde den Code in der Settings Klasse so lassen, denn:
- er prüft ob die Datei existiert, wenn nicht legt er sie an
- genauso bei den Einträgen
also sehr komfortabel.

Du wirst dich fragen wo die XML Datei landet :-)
Die landet bewusst unter C:\Dokumente und Einstelungen\All Users\Anwendungsdaten\Name deiner Exe\Name der XMLDatei.xml

Warum dort ?
Weil man mit nicht Adminrechten im Programme Ordner keine Schreibrechte
hat und das Programm dann einen Fehler werfen würde.
Das raffen viele Entwickler nicht :-)

Gruß
Jens
 
Super Jens! Habe die 2 Warnungen wie von dir beschrieben geändert, alles bestens...

Den Code der Settingsklasse lasse ich jetzt so... Danke

Die Idee mit dem Speicherort ist natürlich bestens. (soweit mir bekannt, habe ich Zugriff auf den Programmordner, aber man weiß ja nie.)

Gibt es vielleicht die Möglichkeit auch einen anderen Speicherort fest zu legen, z.B. das Programmeigene Programmverzeichnis? (natürlich nur, wenn auch Zugriff und Schreibrechte bestehen...)
 
Zuletzt bearbeitet:
Hallo Matze,

ja den Speicherort für die XML Datei kannst du ändern.
Und zwar in der clsSettings Klasse.

So würde die Klasse aussehen um die XML Datei im Programmpfad
zu speichern:

Code:
Imports System.IO

Public Class clsSettings
#Region " Speichern XML "
    Public Shared Sub SaveSetting(ByVal Sektion As String, ByVal Eintrag As String, ByVal Value As String, Optional ByVal configfile As String = "")

        Try

            Using dssettings As New DataSet("Settings")


                Dim myConfigfile As String = Application.StartupPath & "\Settings.xml"

                If configfile.Length > 1 Then
                    myConfigfile = Application.StartupPath & "\" & configfile
                End If

                '// existiert ein Settings File ?
                '   wenn ja dann einlesen
                If File.Exists(myConfigfile) Then
                    dssettings.ReadXml(myConfigfile)
                End If

                Using t As New DataTable(Sektion)

                    '// gibt es diese Tabelle schon ?
                    If dssettings.Tables.Count = 0 OrElse Not dssettings.Tables.Contains(Sektion) Then
                        dssettings.Tables.Add(t)
                        dssettings.Tables(Sektion).Columns.Add("Eintrag")
                        dssettings.Tables(Sektion).Columns.Add("Value")
                    End If

                    Dim pk(0) As DataColumn
                    pk(0) = dssettings.Tables(Sektion).Columns("Eintrag")
                    dssettings.Tables(Sektion).PrimaryKey = pk

                    '// gibt es den Eintrag schon ?
                    If dssettings.Tables(Sektion).Rows.Find(Eintrag) Is Nothing Then
                        '// nein dann hinzufügen
                        Dim newRow As DataRow = dssettings.Tables(Sektion).NewRow()
                        newRow("Eintrag") = Eintrag
                        newRow("Value") = Value
                        dssettings.Tables(Sektion).Rows.Add(newRow)
                    Else
                        '// ja dann Updaten
                        Dim newRow() As Data.DataRow
                        newRow = dssettings.Tables(Sektion).Select("Eintrag = '" & Eintrag & "'")
                        newRow(0)("Value") = Value
                    End If

                End Using

                '// Settings schreiben
                dssettings.WriteXml(myConfigfile)

            End Using

        Catch ex As Exception
            '// System.Windows.Forms.MessageBox.Show(ex.ToString)
        End Try

    End Sub
    Public Shared Function GetSetting(ByVal Sektion As String, ByVal Eintrag As String, Optional ByVal configfile As String = "") As String

        Try

            Using dssettings As New DataSet("Settings")


                Dim myConfigfile As String = Application.StartupPath & "\Settings.xml"

                If configfile.Length > 1 Then
                    myConfigfile = Application.StartupPath & "\" & configfile
                End If

                '// existiert ein Settings File ?
                '   wenn ja dann einlesen
                If Not File.Exists(myConfigfile) Then
                    Return "-"
                Else
                    dssettings.ReadXml(myConfigfile)
                End If

                Using t As New DataTable(Sektion)

                    '// gibt es diese Tabelle schon ?
                    If dssettings.Tables.Count = 0 OrElse Not dssettings.Tables.Contains(Sektion) Then
                        Return "-"
                    End If

                    Dim pk(0) As DataColumn
                    pk(0) = dssettings.Tables(Sektion).Columns("Eintrag")
                    dssettings.Tables(Sektion).PrimaryKey = pk

                    '// gibt es den Eintrag schon ?
                    If dssettings.Tables(Sektion).Rows.Find(Eintrag) Is Nothing Then
                        Return "-"
                    Else
                        '// ja dann Updaten
                        Dim newRow() As Data.DataRow
                        newRow = dssettings.Tables(Sektion).Select("Eintrag = '" & Eintrag & "'")
                        Return newRow(0)("Value").ToString
                    End If

                End Using

            End Using

        Catch ex As Exception
            '// System.Windows.Forms.MessageBox.Show(ex.ToString)
            Return "-"
        End Try

    End Function
#End Region


End Class

... in der Hoffnung endlich mal wieder eine positive Bewertung meiner
Beiträge zu bekommen :-)

Jens
 
Danke vielmals Jens

P.S. ich habe dir schon eine positive Bewertung weiter oben gegeben, mehr lässt das System leider derzeit nicht zu, muss also erst andere positiv bewerten, bevor es wieder geht, trotzdem nochmals vielen Dank für deine umfangreiche Hilfe
 
Hallo Jens, ich nochmal...

Da ja die XML Datei als Speicher schon mal da ist, wäre es ein Problem darin noch mehr zu speichern?

Ich habe noch eine GroupBox mit 5 Radiobuttons, von welchem einer auf Checked steht. Wenn möglich würde ich aber ebenso wie die Druckerauswahl, auch dort den entsprechend ausgewählten Radiobutton in der XML Datei speichern und nach Neustart wieder dort hingesetzt haben, wo er beim Beenden war. Ist das möglich?

Wie gestalte ich den Aufruf (Laden) bzw. das Abspeichern des ausgewählten Buttons?

Z.B.:

Me.Groupbox1.FindStringExact(clsSettings.GetSetting("Groupbox", "Button", "DeineConfigDatei.xml"))

(oder für den Radiobutton einzeln?)

Oder muss ich das vielleicht anders lösen?
 
Hallo Matze,

du kannst beliebig viele Einträge (Sektionen oder Gruppen sowie Einträge)
in dem XML File speichern.

Nur... du musst schon die entsprechende Eigenschaft des Radiobuttons speichern
und nicht das Button bzw. dessen Namen.
Bei einem RadioButton wäre das die Checked Eigenschaft.

also Freihand :-)
Speichern:

clsSettings.SaveSetting("Radiobuttons","RadioButton1",Me.RadioButton1.Checked,"xyz.xml")

Abrufen dann mit:

Hier musst du den String nach Boolean Casten.

Me.RadioButton1.Checked = CBool(clsSetting.GetSetting("RadioButtons","RadioButton1","xyz.xml"))

Nimms mir nicht übel...
Ich helfe ja jedem sehr gerne, aber du musst dich ernsthaft mit den Grundlagen von VB.NET
auseinandersetzen.
Es ist noch kein Meister vom Himmel gefallen und das braucht seine Zeit und wird von heute auf
Morgen nix :-)
Auch ich lerne immer wieder, manchmal sogar täglich dazu. Obwohl ich einige Jahre VB6 und VB.NET C#
hinter mir habe...

Gruß
Jens
 
Zuletzt bearbeitet:
Danke vielmals Jens...

Ich werde mir das noch mal genauer anschauen.

Man lernt ja nie aus, auf jeden Fall hast du mir sehr geholfen. DANKE!
 
Zurück