• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Visual Basic - zapisywanie ustawień

Mały hosting, OGROMNE możliwości
+1 głos
920 wizyt
pytanie zadane 14 czerwca 2022 w Visual Basic przez MaroR Nowicjusz (150 p.)
Cześć. Jestem mega początkujący więc wiadomo...

Pisze programik, który ma dwa przyciski. Jeden z nich otwiera okno explorera i w nim wskazuję lokalizację folderu na dysku. Po wybraniu folderu, program powinien zapisać sobie wskazaną lokalizację po to, aby drugi przycisk otwierał ten folder.

Probel mam z tym że program nie zapisuje mi ustawień i od razu się wywala. Nie działa u mnie taki kod:

     My.Settings.ZMIENNA = SelectedPath
     My.Settings.Save()
komentarz 14 czerwca 2022 przez VBService Ekspert (256,580 p.)
Jaki jest komunikat błędu?
komentarz 14 czerwca 2022 przez MaroR Nowicjusz (150 p.)
System.Configuration.ConfigurationErrorsException: „Configuration system failed to initialize”
komentarz 14 czerwca 2022 przez VBService Ekspert (256,580 p.)
edycja 14 czerwca 2022 przez VBService

Napisałeś

Cześć. Jestem mega początkujący więc wiadomo...

więc dopytuje, czy ustawiłeś zmienną o nazwie ZMIENNA tak jak na obrazku

a później np.

 

Form1.vb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ChangeZmienna("Wartość typu string dla ZMIENNA")
    End Sub

    Sub ChangeZmienna(ByVal newZmienna As String)
        My.Settings.ZMIENNA = newZmienna
        My.Settings.Save()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If (FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK) Then
            ChangeZmienna(FolderBrowserDialog1.SelectedPath)
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        MsgBox(My.Settings.ZMIENNA)
    End Sub
End Class

 

  1. Uruchom aplikacje
  2. Naciśnij Button2 zobacz wynik działania
  3. Naciśnij Button1 - wybierz folder
  4. Naciśnij Button2 zobacz wynik działania
  5. Zamknij aplikacje

teraz zmień  (w Form1_Load)

Public Class Form1 
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Za komentuj linię poniżej
        ' ChangeZmienna("Wartość typu string dla ZMIENNA")
    End Sub
 
    Sub ChangeZmienna(ByVal newZmienna As String)
        My.Settings.ZMIENNA = newZmienna
        My.Settings.Save()
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If (FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK) Then
            ChangeZmienna(FolderBrowserDialog1.SelectedPath)
        End If
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        MsgBox(My.Settings.ZMIENNA)
    End Sub
End Class
  1. Uruchom aplikacje
  2. Naciśnij Button2 zobacz wynik działania  smiley
komentarz 14 czerwca 2022 przez MaroR Nowicjusz (150 p.)
Nie mam pojęcia co robię źle :(
Poniżej link do filmu - https://drive.google.com/file/d/1XO8q3nYHfss0HjtQBBJaKyYh2SG2pAIa/view?usp=sharing
komentarz 14 czerwca 2022 przez VBService Ekspert (256,580 p.)
edycja 14 czerwca 2022 przez VBService

1:14 (czas na Twoim filmie) Nie tworzysz zmiennej, klikasz poza oknem Settings co skutkuje pustym polem

wpisałeś nazwę zmiennej ZMIENNA ale nie nacisnąłeś Enter-a lub nie przeniosłeś kursora do wiersza niżej (tam gdzie jest ta mała czarna kropka)

co skutkuje 1:52 (czas)  masz czerwony szlaczek pod kodem

co oznacz ze nie utworzono w My.Settins zmiennej. 

Jak utworzysz prawidłowo zmienną to powinna się Tobie w podpowiedziach pokazać w czasie pisania kodu

 

komentarz 14 czerwca 2022 przez MaroR Nowicjusz (150 p.)
Faktycznie robiąc ten filmik nie dodała mi się zmienna. Po napawieniu tego błędu dzieje się to co na filmiku. Przebobiłem już z 10 tutoriali z YouTuba które i tak to samo pokazują co Ty podesłałeś i za każdym razem jak używam lini kodu My.Settings. itd. to program się wywala.
Nowy filmik - https://drive.google.com/file/d/12NbWX8mS4UhkWmlGS6IhTylMk44CWc82/view?usp=sharing
komentarz 15 czerwca 2022 przez VBService Ekspert (256,580 p.)
edycja 15 czerwca 2022 przez VBService

System.Configuration.ConfigurationErrorsException
  HResult=0x80131902
  Message=Configuration system failed to initialize
  Source=System.Configuration.ConfigurationManager

Wygląda, że to jest znany problem (gdy chcesz użyć Settings w aplikacji) od ponad roku

 

Pod tym linkiem znajdziesz opis problemu

Setting do not work on NEW VB .Net 5 Winforms application

a tu opis obejścia

https://github.com/dotnet/project-system/issues/7448#issuecomment-1000601472

 

Tu znajdziesz więcej opisów tego problemu

komentarz 15 czerwca 2022 przez VBService Ekspert (256,580 p.)
edycja 15 czerwca 2022 przez VBService

Z tego co udało Mi się doczytać to problem występuje przy .NET 5 i 6

Możesz sprawdzić jakiej wersji .NET-a używasz za pomocą komend w linii poleceń

dotnet --list-sdks

i

dotnet --list-runtimes

 

Ja ciągle używam 3 na x64 (na razie nie miałem potrzeby instalować "wyższej" wersji angel ) i dlatego nie miałem tego problemu.

i 4 x86

komentarz 15 czerwca 2022 przez VBService Ekspert (256,580 p.)
edycja 15 czerwca 2022 przez VBService

Możesz też spróbować zaimplementować swój własny system zapisywania ustawień oparty o plik xml.

Utwórz plik np. MySettings.xml w katalogu gdzie masz swój skompilowany program do exe. (w przykładowym kodzie poniżej dla Form1.vb znajdziesz kod jak znaleść ten katalog wink)

U Mnie to wygląda np. tak

 

MySettings.xml  (przykładowa zawartość)

<?xml version="1.0" encoding="utf-8"?>
<root>
  <SelectedPath></SelectedPath>
</root>

 

Form1.vb  (przykładowy kod)

Public Class Form1
    Private MySettings As Xml.XmlDocument = New Xml.XmlDocument
    Private SelectedPath As String = vbNullString

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MySettings.Load("MySettings.xml")

        ' pokaże się folder gdzie znajduje się Twój exe.
        Process.Start("explorer.exe", "/select," + Application.ExecutablePath)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim message As String
        message = "SelectedPath from xml:" + vbNewLine + MySettings.DocumentElement("SelectedPath").InnerText _
                + vbNewLine + vbNewLine _
                + "SelectedPath as variable:" + vbNewLine + SelectedPath
        MsgBox(message)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            MySettings.DocumentElement("SelectedPath").InnerText = FolderBrowserDialog1.SelectedPath
            SelectedPath = MySettings.DocumentElement("SelectedPath").InnerText
        End If
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        MySettings.Save("MySettings.xml")
    End Sub
End Class

 

1
komentarz 15 czerwca 2022 przez MaroR Nowicjusz (150 p.)

BARDZO BARDZO DZIĘKUJĘ! za pomoc :)

Z zewnętzrnym xml działa tak ja chciałem tylko ostatnie pytanie. Obecnie w xml linia ze ściążką jest oznaczana jako <SelectedPath>. Ja takich setów przycisków będę miał 15 wiec musze mieć 15 róznych lini z różnymi ścieżkami.  Pozmieniałem Twoje nazwy w kodzie SelectedPath na np PS_W i program się wywalił. Podsumowując jak mam zmienić tę nazwę na swoją ?

  Private MySettings As Xml.XmlDocument = New Xml.XmlDocument
    Private PS_W As String = vbNullString


    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles btn_Photoshop_W2.Click

          If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            MySettings.DocumentElement("SelectedPath").InnerText = FolderBrowserDialog1.SelectedPath
            PS_W = MySettings.DocumentElement("SelectedPath").InnerText
        End If

        MySettings.Save("MySettings.xml")

    End Sub


    Private Sub Button23_Click_1(sender As Object, e As EventArgs) Handles btn_Photoshop_W.Click
        Process.Start("explorer.exe", MySettings.DocumentElement("SelectedPath").InnerText)
    End Sub

 

 

1
komentarz 15 czerwca 2022 przez MaroR Nowicjusz (150 p.)
Już wiem :) Dziękuję :)
komentarz 15 czerwca 2022 przez VBService Ekspert (256,580 p.)

Widzę, że "szybko" się uczysz  wink

  Private Sub Button23_Click_1(sender As Object, e As EventArgs) Handles btn_Photoshop_W.Click
      Process.Start("explorer.exe", MySettings.DocumentElement("SelectedPath").InnerText)
  End Sub

 

1
komentarz 15 czerwca 2022 przez MaroR Nowicjusz (150 p.)
GOTOWE DZIAŁA !!! BARDZO DZIĘKUJĘ :) !!!
komentarz 15 czerwca 2022 przez MaroR Nowicjusz (150 p.)

Jednak jeszcze musze o coś spytać. Klikając na button w którym wybieram folder/ścieżkę do zapamiętania, chciałbym żeby otwerając okno dialogowe otworzyło się na ścieżce z xml,

 

     If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            MySettings.DocumentElement("CSF").InnerText = FolderBrowserDialog1.SelectedPath
            CSF = MySettings.DocumentElement("CSF").InnerText
        End If

 

komentarz 15 czerwca 2022 przez MaroR Nowicjusz (150 p.)
Dobrze to wymyśliłem że tyle ile chcę okien do wyszukiwania folderów tyle muszę mieć FolderBrowserDislogów ?
1
komentarz 15 czerwca 2022 przez MaroR Nowicjusz (150 p.)

Bazdury wypisuję z tą ilością :)

Wystarczyło zrobić tak:

    Private Sub Button39_Click(sender As Object, e As EventArgs) Handles btn_Photoshop_S2.Click

        info.Visible = False

        FolderBrowserDialog.SelectedPath = MySettings.DocumentElement("PS_S").InnerText + "\"

        info.Visible = True
        info.Text = MySettings.DocumentElement("PS_S").InnerText

        If FolderBrowserDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
            MySettings.DocumentElement("PS_S").InnerText = FolderBrowserDialog.SelectedPath
        End If

        MySettings.Save("MySettings.xml")

    End Sub

a w kolejnym tak:
 

    Private Sub Button37_Click(sender As Object, e As EventArgs) Handles btn_Illustrator_S2.Click


        info.Visible = False

        FolderBrowserDialog.SelectedPath = MySettings.DocumentElement("AI_S").InnerText + "\"

        info.Visible = True
        info.Text = MySettings.DocumentElement("AI_S").InnerText

        If FolderBrowserDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
            MySettings.DocumentElement("AI_S").InnerText = FolderBrowserDialog.SelectedPath
        End If

        MySettings.Save("MySettings.xml")

    End Sub

 

komentarz 15 czerwca 2022 przez VBService Ekspert (256,580 p.)

Jeżeli chodzi o kilka przycisków, które wykonują ten sam kod można pokusić się o taki zapis

 

MySettings.xml

<?xml version="1.0" encoding="utf-8"?>
<root>
  <PS_W></PS_W>
  <CS_F></CS_F>
  <PS_S></PS_S>
  <AI_S></AI_S>
</root>

 

 

Form1.vb

Public Class Form1
    Private MySettings As Xml.XmlDocument = New Xml.XmlDocument

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MySettings.Load("MySettings.xml")
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        GetPathToFolder("PS_W")
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        GetPathToFolder("CS_F")
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        GetPathToFolder("PS_S")
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        GetPathToFolder("AI_S")
    End Sub

    Private Sub GetPathToFolder(ByVal VariableName As String)
        Timer_ClearInfo.Enabled = False

        FolderBrowserDialog.Description = "Ustaw ścieżkę dla " + VariableName
        FolderBrowserDialog.SelectedPath = MySettings.DocumentElement(VariableName).InnerText
        info.Text = VariableName + ": " + MySettings.DocumentElement(VariableName).InnerText

        If FolderBrowserDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
            MySettings.DocumentElement(VariableName).InnerText = FolderBrowserDialog.SelectedPath + "\"
        End If

        Timer_ClearInfo.Enabled = True
        MySettings.Save("MySettings.xml")
    End Sub

    Private Sub Timer_ClearInfo_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_ClearInfo.Tick
        info.Text = vbNullString
        Timer_ClearInfo.Enabled = False
    End Sub

End Class

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 105 wizyt
–1 głos
1 odpowiedź 4,243 wizyt
pytanie zadane 13 lutego 2017 w Systemy operacyjne, programy przez niezalogowany
0 głosów
1 odpowiedź 815 wizyt
pytanie zadane 22 grudnia 2016 w C i C++ przez zkkf56 Dyskutant (8,710 p.)

93,715 zapytań

142,629 odpowiedzi

323,260 komentarzy

63,257 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...