Avatar billede madssch Nybegynder
09. marts 2006 - 14:49 Der er 31 kommentarer og
1 løsning

Rette i XML fil

Hej Eksperter!

Hvad skal jeg gøre for at rette i et XML dokument?

Bruger følgende kode til at læse med, og det virker fint:

        Dim SystemReader As New System.IO.StreamReader("Settings.xml")
        Dim XMLTextReader As New System.Xml.XmlTextReader(SystemReader)
        Dim SettingsDoc As New System.Xml.XmlDocument

        SettingsDoc.Load(XMLTextReader)

        Dim SettingItems As System.Xml.XmlNodeList = SettingsDoc.SelectNodes("settings/items")

        Dim SoundAlert As System.Xml.XmlNode = SettingItems.Item(0).SelectSingleNode("soundalert")
        Dim PopupAlert As System.Xml.XmlNode = SettingItems.Item(0).SelectSingleNode("popupalert")

        SoundAlertActive = SoundAlert.InnerText
        PopupAlertActive = PopupAlert.InnerText

        XMLTextReader.Close()
        SystemReader.Close()

Prøvede så at ændre koden til:

        SoundAlert.InnerText = "xxx"
        PopupAlert.InnerText = "xxx"

...men det virker naturligvis ikke.

Ligger nogen inde med den korrekte kode?

Mit XML dokument ser i øvrigt sådan ud:

<settings>
    <items>
        <soundalert>True</soundalert>
        <popupalert>False</popupalert>
    </items>
</settings>
Avatar billede arne_v Ekspert
09. marts 2006 - 17:10 #1
SoundAlert.Value = "xxx"

eller

SoundAlert.FirstChild.Value = "xxx"

vil jeg tro
Avatar billede madssch Nybegynder
09. marts 2006 - 17:19 #2
Muligvis. Jeg tænker bare - jeg har jo kaldt en Reader. Kan man skrive til den?
Avatar billede madssch Nybegynder
09. marts 2006 - 17:21 #3
Dine forslag returnerer ingen fejl, men heller ingen ting bliver skrevet til XML'en...
Avatar billede arne_v Ekspert
09. marts 2006 - 17:56 #4
hvis du mener filen saa skal dit XmlDocument naturligvis skrives tilbage til filen
for at det bliver gemt permanent
Avatar billede arne_v Ekspert
09. marts 2006 - 18:02 #5
hint: Save metoden
Avatar billede madssch Nybegynder
09. marts 2006 - 18:30 #6
Den tanke jeg har naturligvis også selv haft. Men så får jeg beskeden:

'Save' is not a member of 'System.Xml.XmlTextReader'..?
Avatar billede arne_v Ekspert
09. marts 2006 - 18:36 #7
nej

den er et member af XmlDocument
Avatar billede madssch Nybegynder
09. marts 2006 - 18:39 #8
Dvs. SettingsDoc.Save() eller SettingsDoc.Save(XMLTextReader) ?

Ingen af dem virker.

Er helt grøn i det her, så jeg fatter muligvis ikke en bjælle af, hvad du forsøger at fortælle mig...  :)
Avatar billede arne_v Ekspert
09. marts 2006 - 18:56 #9
SettingsDoc.Save("Settings.xml")

er nok det nemmeste men du kan fgodt bruge Writer ogsaa
Avatar billede madssch Nybegynder
09. marts 2006 - 18:59 #10
Ser rigtigt ud, men får denne fejl:

Processen kan ikke få adgang til filen 'E:\Microsoft Visual Basic 2005 Projects\CheckNewOrder\CheckNewOrder\bin\Debug\Settings.xml', fordi den bliver brugt af en anden proces
Avatar billede arne_v Ekspert
09. marts 2006 - 19:30 #11
faar du kaldt SystemReader.Close() inden du kalder Save ?
Avatar billede madssch Nybegynder
09. marts 2006 - 19:32 #12
Nej, skal jeg det?

Koden:

    Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveButton.Click

        Dim NewSoundSetting As String
        Dim NewPopupSetting As String

        If Me.SoundCheckBox.Checked Then
            NewSoundSetting = "True"
        Else
            NewSoundSetting = "False"
        End If

        If Me.PopupCheckBox.Checked Then
            NewPopupSetting = "True"
        Else
            NewPopupSetting = "False"
        End If


        SystemSettings.Instance.SoundAlertActive = NewSoundSetting
        SystemSettings.Instance.PopupAlertActive = NewPopupSetting


        Dim SystemReader As New System.IO.StreamReader("Settings.xml")
        Dim XMLTextReader As New System.Xml.XmlTextReader(SystemReader)
        Dim SettingsDoc As New System.Xml.XmlDocument

        SettingsDoc.Load(XMLTextReader)

        Dim SettingItems As System.Xml.XmlNodeList = SettingsDoc.SelectNodes("settings/items")

        Dim SoundAlert As System.Xml.XmlNode = SettingItems.Item(0).SelectSingleNode("soundalert")
        Dim PopupAlert As System.Xml.XmlNode = SettingItems.Item(0).SelectSingleNode("popupalert")

        SoundAlert.FirstChild.Value = NewSoundSetting
        PopupAlert.FirstChild.Value = NewPopupSetting

        SettingsDoc.Save("Settings.xml")

        XMLTextReader.Close()
        SystemReader.Close()

        Me.Close()

    End Sub
Avatar billede madssch Nybegynder
09. marts 2006 - 19:35 #13
Jamen det var det jeg skulle!

Det synes jeg ikke lige giver mening, men hvad...  :)

Smider du et svar?
Avatar billede arne_v Ekspert
09. marts 2006 - 19:42 #14
jo

fordi indtil den Close bliver kaldt er filen aaben

og svar

NB: man kan ogsaa kalde Load med bare filnavn - det var maaske nemmere !
Avatar billede madssch Nybegynder
09. marts 2006 - 19:46 #15
Kalde Load med bare filnavn? Eksempel?
Avatar billede arne_v Ekspert
09. marts 2006 - 19:58 #16
SettingsDoc.Load("Settings.xml")

og fjern alt med Reader'erne
Avatar billede madssch Nybegynder
09. marts 2006 - 20:02 #17
Jamen det er smukt!  :)

Skal dokumentet ikke lukkes igen på en måde? (Plejer at være god kode-stil).
Avatar billede arne_v Ekspert
09. marts 2006 - 20:09 #18
nej

Load og Save laver begge baade Open og Close for dig
Avatar billede madssch Nybegynder
09. marts 2006 - 20:17 #19
Jamen så er alt jo som det skal være.

Nu jeg har fat i dig...:

Mod flere points - kan du så fortælle om/hvordan man minimerer til den del af Windows System Tray hvor bl.a. uret befinder sig?
Avatar billede arne_v Ekspert
09. marts 2006 - 20:49 #20
det ved jeg ikke
Avatar billede madssch Nybegynder
09. marts 2006 - 20:55 #21
Ok. Kender du så tilfældigvis til publicering gennem Visual Studio 2005 Express - eller en anden Visual Studio?

:D
Avatar billede arne_v Ekspert
09. marts 2006 - 21:05 #22
helller ikke det

jeg bruger ikke Visual Studio
Avatar billede madssch Nybegynder
09. marts 2006 - 21:10 #23
Ok.

Thanx anyway...
Avatar billede bernhof Nybegynder
09. marts 2006 - 21:28 #24
For at minimere til System Tray, kan du placere en NotifyIcon komponent på din form (findes i Toolbox'en). Denne opretter et ikon i System Tray'et. Herefter kan du så, når du minimerer din form, gøre den usynlig, og når du klikker på dit ikon i System Tray'et, kan du vise formen igen.
Avatar billede madssch Nybegynder
09. marts 2006 - 21:40 #25
Vist ikke helt..?!  :(

Det ser nu ud som om, at filerne bliver medtaget, men:

1. Wav-filen bliver placeret i en undermappe kaldet "Resources"
2. Min txt-fil bliver placeret i undermappen "bin/debug"

Er dette normalt?

Kan naturligvis ændre referencerne i koden, men vil bare lige tjekke...
Avatar billede madssch Nybegynder
09. marts 2006 - 21:55 #26
Ovenstående indlæg hørte vist ikke til hér..!  :D
Avatar billede bernhof Nybegynder
09. marts 2006 - 21:56 #27
Hehe nej.

Men du siger det ikke virker fremragende? Hvor har du problemer?
Avatar billede madssch Nybegynder
09. marts 2006 - 22:09 #28
For det første viser den et andet ikon end det jeg har valgt.

For det andet, når jeg minimerer programmet ligger den minimeret lige over min "Start".

For det tredje kan jeg ikke maksimere igen ved at dobbeltklikke på ikonet.

Er det bare mig, eller..?
Avatar billede bernhof Nybegynder
09. marts 2006 - 22:25 #29
Kan ikke lige gennemskue, hvorfor den viser et andet ikon? Det har jeg da aldrig været ude for :o)

Hvis du har sat formens ShowInTaskbar egenskab til False, vil den ikke blive minimeret til taskbaren, men derimod over Start menuen. Men det er sådan set heller ikke noget problem. Det du skal gøre er selv at lave aktiv kode, som skjuler formen (men ikke ikonet i System Tray) når du minimerer, og viser den igen ved et dobbeltklik på ikonet.

Eksempel:


  Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
    If Me.WindowState = FormWindowState.Minimized Then
      Me.Visible = False
    End If
  End Sub

  Private Sub NotifyIcon1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick
    If Me.WindowState = FormWindowState.Minimized Then
      Me.Visible = True
      Me.WindowState = FormWindowState.Normal
    Else
      Me.Activate()
    End If
  End Sub


I ovenstående undersøger jeg, når formens størrelse ændrer sig (dvs. fx når den bliver minimeret) og formen er blevet minimeret. I så fald gør jeg den usynlig (så den ikke ligger og roder over start menuen).

Desuden, hvis jeg dobbelt-klikker på System Tray ikonet, undersøger jeg om formen er minimeret. Hvis den er det, viser jeg formen igen (sætter først Visible = True, og derefter WindowState = Normal). Hvis formen derimod ikke er minimeret, skal den blot aktiveres. Prøv ad.
Avatar billede madssch Nybegynder
09. marts 2006 - 22:49 #30
Det ser sgu rigtig godt ud - og så virker det!

En lille tvist: programmet tjekker løbende om en vis tilstand er aktiveret. hvis den er det, viser den en MessageBox med en besked.

Er programmet minimeret, kommer min MessageBox godt nok - men i minimeret tilstand.

Bliver jeg her nødt til at maksimere hele applikationen?
Avatar billede madssch Nybegynder
09. marts 2006 - 23:07 #31
Det gør faktisk ikke noget, at jeg skal maksimere hele programmet.

Det fungerer faktisk fint.

Har smidt lidt points til dig:

http://www.eksperten.dk/spm/693963
Avatar billede bernhof Nybegynder
09. marts 2006 - 23:08 #32
okay, godt det virker :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester