| |
VB.NET - Ein- und UmsteigerFarbwert aus .ini für neue Form | | | Autor: Erwin1 | Datum: 16.11.17 22:29 |
| Hallo,
ich habe eine Form erstellt, in der Farbeinstellungen getätigt werden können und diese in einer .ini gespeichert werden. Nun möchte ich in einer neuen Form diese Farbeinstellung benutzen. Aber irgendwie gelingt mir das nicht.
' Speichern der Farbe
Dim Hintergrundfarbe As Integer = Bdbackground.BackColor.ToArgb
Dim SavedHintergrundfarbe As Integer = CInt(Hintergrundfarbe)
ColorDialog1.Color = Color.FromArgb(SavedHintergrundfarbe)
WritePrivateProfileString("Einsellung", "Hintergrundfarbe", _
Hintergrundfarbe, ".\Einstellung.ini") und so wollte ich laden
Dim Hintergrundfarbe As Integer = PnAnzeige.BackColor.ToArgb
Dim LoadedHintergrundfarbe As Integer = CInt(Hintergrundfarbe)
PnAnzeige.BackColor = Color.FromArgb(LoadedHintergrundfarbe)
GetPrivateProfileString("Einstellung", "Hintergrundfarbe", _
Hintergrundfarbe, ".\Einstellung.ini") Könnte mir da bitte jemand helfen?
Beitrag wurde zuletzt am 16.11.17 um 22:34:41 editiert. | |
Re: Farbwert aus .ini für neue Form | | | Autor: Franki | Datum: 17.11.17 00:33 |
| Hallo,
auf den ersten Blick: Einsellung <> Einstellung
Ist ds fehlende t per Copy Paste verloren gegangen oder hast du den Code abgetippt? Schau mal nach vielleicht ist das schon der Fehler.
Gruß
Frank | |
Re: Farbwert aus .ini für neue Form | | | Autor: Manfred X | Datum: 17.11.17 06:04 |
| Hallo!
Settings programmiert man nicht selbst (Anwendungs-Framework):
IDE: Eigenschaftenfenster -> Applicationsettings -> PropertyBinding ->
BackColor -> New
Ini-Variante:
Die API-Einbindung in VB:
<System.Runtime.InteropServices.DllImport("kernel32.dll", _
SetLastError:=True)> _
Private Shared Function GetPrivateProfileString(ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As _
System.Text.StringBuilder, _
ByVal nSize As Integer, _
ByVal lpFileName As String) As Integer
End Function
<System.Runtime.InteropServices.DllImport("kernel32.dll", _
SetLastError:=True)> _
Private Shared Function WritePrivateProfileString(ByVal lpAppName As _
String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As Integer
End Function Einige Hilfsfunktionen für Farb-Schlüssel:
Public Function IniColorDialog(ByVal DefaultColor As Color, _
ByRef UserColor As Color) As Boolean
'Weitere Details: http://www.vbarchiv.net/tipps/details.php?id=2241
Using colordia As New System.Windows.Forms.ColorDialog
Dim dc As Integer
With DefaultColor
dc = Microsoft.VisualBasic.Information.RGB(.R, .G, .B)
End With
With colordia
.CustomColors() = {dc}
.Color = DefaultColor
.SolidColorOnly = True
If .ShowDialog = Windows.Forms.DialogResult.Cancel Then
UserColor = Nothing
Return False
Else
UserColor = .Color
Return True
End If
End With
End Using
End Function
Private Function CheckIniParams(ByVal IniFile As String, _
section As String, Keyname As String) As Boolean
If Not IO.File.Exists(IniFile) Then Return False
If Not (IO.Path.GetExtension(IniFile).ToLower) = ".ini" Then Return _
False
If String.IsNullOrWhiteSpace(section) Then Return False
If String.IsNullOrWhiteSpace(Keyname) Then Return False
Return True
End Function
Private Function SetColorToIni(IniFile As String, _
Section As String, Keyname As String, _
ColorToSet As System.Drawing.Color) As Boolean
If Not CheckIniParams(IniFile, Section, Keyname) Then Return False
Dim keyvalue As String = ColorToSet.ToArgb.ToString()
Dim result As Integer = WritePrivateProfileString _
(Section, Keyname, keyvalue, IniFile)
Return result > 0
End Function
Private Function GetColorFromIni(ByVal IniFile As String,
Section As String, Keyname As String,
ByRef ColorFromIni As System.Drawing.Color) As Boolean
If Not CheckIniParams(IniFile, Section, Keyname) Then Return False
Dim keyvalue As New System.Text.StringBuilder(100)
Dim defaultcolor As String = Color.White.ToArgb.ToString
Dim result As Integer = GetPrivateProfileString _
(Section, Keyname, defaultcolor, keyvalue, keyvalue.Capacity, _
IniFile)
ColorFromIni = Color.FromArgb(CInt(keyvalue.ToString))
Return True
End Function Anwendungsbeispiel:
'Angemessener Pfad der Ini-Datei
Dim IniFilename As String = _
IO.Path.Combine( _
My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData, _
"Einstellungen.ini")
'Schlüssel für Ini
Dim section As String = "Farbeinstellungen"
Dim keyname As String = "Hintergrundfarbe"
'Ini-Datei ggf. erstellen und einrichten
If Not IO.File.Exists(IniFilename) Then
Using sw As IO.StreamWriter = IO.File.CreateText(IniFilename)
sw.WriteLine("[" & section & "]")
sw.WriteLine(keyname & "=" & Me.BackColor.ToArgb.ToString)
End Using
End If
Dim defaultcolor, usercolor, inicolor As Color
GetColorFromIni(IniFilename, section, keyname, defaultcolor)
If IniColorDialog(defaultcolor, usercolor) Then
'Schlüsselwert (Farbe) eintragen
If Not SetColorToIni(IniFilename, section, keyname, usercolor) Then
MsgBox("Farbe kann nicht eingetragen werden")
Else
'Schlüsselwert (Farbe) lesen
If Not GetColorFromIni(IniFilename, section, keyname, inicolor) Then
MsgBox("Farbe kann nicht gelesen werden")
Else
Me.BackColor = inicolor
End If
End If
End If
Beitrag wurde zuletzt am 17.11.17 um 06:11:08 editiert. | |
Re: Farbwert aus .ini für neue Form | | | Autor: Erwin1 | Datum: 17.11.17 19:03 |
| Hallo und Danke schon mal.
@ Frank, das ist leider nur beim abtippen passiert, aber gut beobachtet.
@ Manfred, sorry das ich Dich schon wieder belästigen muss, aber vielleicht bin ich auch zu blind oder dumm.
Die API Einbindung hatte ich so, wie Du Sie geschrieben hast. In meiner .ini steht als Beispiel
[Einstellung]
Hintergrundfarbe=-128 für die zufällig gewählte Farbe aus dem ColorDialog ( ein helles Gelb). Diese kann sich auch ändern mit der Einstellung und wird dann auch in der .ini verändert.
Jetzt soll in einer neuen Form, in der ein Panel ist, diese Hintergrundfarbe als BackColor genommen werden.
Danke
Beitrag wurde zuletzt am 17.11.17 um 19:12:29 editiert. | |
Re: Farbwert aus .ini für neue Form | | | Autor: Manfred X | Datum: 17.11.17 22:45 |
| Hallo!
Am einfachsten wäre es, Du öffnest in VB-IDE die Form
Projekt -> Einstellungen -> Anwendung und sorgst dafür,
daß Haken gesetzt sind bei
- Anwendungsframework aktivieren
- My.Settings beim Herunterfahren speichern
Dann öffnest Du die Form
Projekt -> Einstellungen -> Einstellungen
Dort gibst Du in der Liste in der Spalte "Name" Panel_BackColor ein,
in der Spalte "Typ" wählst Du Color und in der Spalte "Wert"
legst Du einen Startwert fest. Als "Bereich" Nutzer.
Diese Eigenschaft kann überall in Deinem Projekt-Code durch
My.Settings.Panel_BackColor gelesen oder gesetzt werden.
Beim Beenden des Programms wird der aktuelle Wert automatisch
gespeichert.
Die Farbgebung in Formularen muß einen hinreichenden Kontrast
zwischen Vorder- und Hintergrund aufweisen. Beliebig auswählbare
Farben sollte man deshalb nicht benutzen.
Gewöhnlich werden Systemfarben verwendet z.B. "SystemColors.Window".
Der ColorDialog bietet dafür keine direkte Auswahl - eventuell
dort Systemfarben als "CustomColors" vorgeben (vgl mein Beispiel).
Ich würde ein eigenes Formular erstellen, wo der Nutzer aus
vorgegebenen Paaren von geeigneten Vorder- und Hintergrundfarben
ein Paar auswählen kann.
Für den Zugriff auf die Ini-Datei kannst Du dem Projekt eine Klasse
namens "IniAccess" hinzufügen.
Dort trägst Du die oben von mir angegebenen Api-DLLImporte und die
Hilfsfunktionen ein - mit den Schlüsselworten "Public Shared",
also z.B.
Public Shared Function SetColorToIni(IniFile As String, _
Section As String, Keyname As String, _
ColorToSet As System.Drawing.Color) As Boolean
If Not CheckIniParams(IniFile, Section, Keyname) Then Return False
Dim keyvalue As String = ColorToSet.ToArgb.ToString()
Dim result As Integer = WritePrivateProfileString _
(Section, Keyname, keyvalue, IniFile)
Return result > 0
End Function Du kannst danach überall im Projekt durch
IniAccess.SetColorToIni(...) bzw. IniAccess.GetColorFromIni(...)
auf die Ini-Datei Farbschlüssel zugreifen.
Ergänze in dieser Klasse noch entsprechende Hilfs-Routinen
für andere Schlüssel-Typen:
SetStringToIni, GetStringFromIni
oder
SetNumberToIni, GetNumberFromIni (mit CDEC-Konvertierung). | |
Re: Farbwert aus .ini für neue Form | | | Autor: Erwin1 | Datum: 18.11.17 16:30 |
| Hallo Manfred,
mit einem Farbpaar komme ich nicht hin, da der Benutzer in den Einstellungen fünf verschiedene Farben für verschieden Panele wählen können soll.
Ich bin jetzt zu mindestens schon mal so weit, das er im Hintergrund etwas machen möchte, aber wahrscheinlich noch nicht ganz mit der Farbe hinkommt. Es wird mir nur ein weißer Hintergrund mit zwei roten diagonalen Strichen angezeigt. Deshalb denke ich, das ich dem Ziel schon sehr nahe bin. Der Code sieht jetzt so aus, natürlich sind die API-Einbindungen vorangestellt.
Dim keyvalue As New System.Text.StringBuilder(10000)
Dim defaultcolor, inicolor As Color
Dim IniFilename As String = _
IO.Path.Combine( _
My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData, _
".\Einstellung.ini")
'Schlüssel für Ini
Dim section As String = "Farbeinstellung"
Dim keyname As String = "Hintergrundfarbe"
defaultcolor = Color.FromArgb(CStr(keyvalue.ToString))
If GetColorFromIni(IniFilename, section, keyname, defaultcolor) Then
End If
PnAnzeige.BackColor = inicolor | |
Re: Farbwert aus .ini für neue Form | | | Autor: Manfred X | Datum: 19.11.17 06:48 |
| Erstelle eine neue Klasse namens "IniAccess".
Public Class IniAccess
<System.Runtime.InteropServices.DllImport("kernel32.dll", _
SetLastError:=True)> _
Private Shared Function GetPrivateProfileString _
'...... ergänzen
End Function
<System.Runtime.InteropServices.DllImport("kernel32.dll", _
SetLastError:=True)> _
Private Shared Function WritePrivateProfileString _
'.......
End Function
Private Shared _IniFilename As String
Public Shared Property IniFileName() As String
Set(value As String)
If Not IO.File.Exists(value) Then
Throw New ArgumentException("Datei nicht vorhanden")
End If
_IniFilename = value
End Set
Get
Return _Inifilename
End Get
End Property
Private Shared Function CheckIniParams(section As String, _
Keyname As String) As Boolean
If Not IO.File.Exists(_IniFilename) Then Return False
If Not (IO.Path.GetExtension(_IniFilename).ToLower) = ".ini" Then _
Return False
If String.IsNullOrWhiteSpace(section) Then Return False
If String.IsNullOrWhiteSpace(Keyname) Then Return False
Return True
End Function
Public Shared Function SetStringToIni(Section As String, Keyname As String,
StringToIni As String) As Boolean
If Not CheckIniParams(Section, Keyname) Then Return False
Dim result As Integer = WritePrivateProfileString _
(Section, Keyname, StringToIni, _IniFilename)
Return result > 0
End Function
Public Shared Function GetStringFromIni _
(ByVal Section As String, keyname As String,
ByRef StringFromIni As String, _
Optional ByVal DefaultString As String = "leer") As Boolean
Dim defstring As String
If String.IsNullOrWhiteSpace(DefaultString) Then
defstring = "leer"
Else
defstring = DefaultString
End If
StringFromIni = defstring
If Not CheckIniParams(Section, keyname) Then Return False
Dim keyvalue As New System.Text.StringBuilder(1024)
Dim result As Integer = GetPrivateProfileString _
(Section, keyname, defstring, keyvalue, _
keyvalue.Capacity, _IniFilename)
If result = 0 Then
Return False
Else
StringFromIni = keyvalue.ToString
Return True
End If
End Function
Public Shared Function SetColorToIni _
(Section As String, Keyname As String, _
ColorToSet As System.Drawing.Color) As Boolean
If Not CheckIniParams(Section, Keyname) Then Return False
Dim keyvalue As String = ColorToSet.ToArgb.ToString()
Return SetStringToIni(Section, Keyname, keyvalue)
End Function
Public Shared Function GetColorFromIni _
(Section As String, Keyname As String,
ByRef ColorFromIni As System.Drawing.Color, _
Optional ByVal Defaultcolor As Color = Nothing) As Boolean
ColorFromIni = Defaultcolor
If Not CheckIniParams(Section, Keyname) Then Return False
Dim defcolor As String
If Defaultcolor = Nothing Then
defcolor = Color.White.ToArgb.ToString
Else
defcolor = Defaultcolor.ToArgb.ToString
End If
Dim keyvalue As String = ""
If GetStringFromIni(Section, Keyname, keyvalue, defcolor) Then
Try
ColorFromIni = Color.FromArgb(CInt(keyvalue.ToString))
Catch
Return False
End Try
Return True
Else
Return False
End If
End Function
End Class Im Load-Eventhandler des Starformulars weist Du den Pfad der Ini-Datei
auf diese Klasse zu:
Dim IniFilename As String = _ IO.Path.Combine _
(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData, _
"Einstellungen.ini")
IniAccess.IniFileName = IniFilename Überall in Deinem Projekt ist es möglich zuzuweisen und abzufragen:
'Zuweisung:
Dim section As String = "Farbeinstellungen"
Dim keyname As String = "Hintergrundfarbe"
Dim Usercolor as Color
'ggf. zunächst Dialogabfrage der Farbe (UserColor)
'dann:
IniAccess.SetColorToIni(section, keyname, usercolor)
'Abfrage:
'optional kann eine DefaultColor vorgegeben werden
Dim IniColor as Color
IniAccess.GetColorFromIni(section, keyname, inicolor)
PbAnzeige.BackColor = inicolor | |
Re: Farbwert aus .ini für neue Form | | | Autor: Erwin1 | Datum: 20.11.17 10:26 |
| Hallo Manfred,
Danke für Deine aufgewendete Zeit und das ausführliche Skript. Aber leider bekomme ich es so nicht am laufen. Nach weiterer intensiver Suche habe ich im Netz die Lösung meines Problem's gefunden. Wen es interessiert, kann hier nachschauen : https://www.vb-paradise.de/index.php/Thread/51730-Farben-laden-aus-Ini/
Noch mal vielen Dank | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere Infos
|