Oppure

Loading
28/06/21 21:51
Carlo
I valori li puoi mettere in un array, se il primo deve essere 0 lo imposti a zero:
Dim valori(7) As Integer
valori(0) = 0 'il vlore che andrà su PaletteRemap0
valori(1) = 7 'il vlore che andrà su PaletteRemap1
'...
valori(7) = 7 'il vlore che andrà su PaletteRemap7
Dim pos as integer = 0
For p = 0 To 7
        pos = XML.IndexOf("<PaletteRemap" & p.ToString, pos) ' indice del nome progressivo
        XML = XML.Remove(pos + 37, 1).Insert(pos + 37, valori(p)) ' sostituzione con il valore voluto
Next


Il pos su: XML.IndexOf("<PaletteRemap" & p.ToString, pos)
serve ad indicare ad IndexOf la posizione di ricerca di partenza, se viene omesso la ricerca avviene sempre dall'inizio.
Ultima modifica effettuata da Carlo 28/06/21 22:09
in programmazione tutto è permesso
30/06/21 13:00
bernie
Ciao Carlo
Grazie per i due esempi , sono entrambi validi , al momento la necessità è di cambiare tutti i campi dall'1 al 7 con lo stesso valore,non escludo in futuro la necessità di avere valori differenti tra loro nei vari campi . Per il momento ho adottato la prima soluzione adattandola al mio bisogno .
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        XML = File.ReadAllText("C:\Digitalframe\XUSB.xml") ' carico il file
        Dim pos As Integer = 1 ' lo uso anche come startindex, ricerca in sequenza
        For p = 1 To 7
            pos = XML.IndexOf("<PaletteRemap" & p.ToString, pos) ' indice del nome progressivo
            XML = XML.Remove(pos + 37, 1).Insert(pos + 37, livello.ToString) ' sostituzione con valore livello
        Next
        File.WriteAllText("C:\Digitalframe\XUSB.xml", XML)
End Sub

Così facendo modifico solo da 1 a 7 e il valore da inserire(livello) è il risultato di un calcolo eseguito in altro posto .
Grazie di nuovo
aaa
30/06/21 15:13
Carlo
Perfetto,
Così facendo modifico solo da 1 a 7 e il valore da inserire(livello) è il risultato di un calcolo eseguito in altro posto .

perché il for parte da 1, non perché hai messo pos=1 nell'istruzione in riga 3:
Dim pos As Integer = 1

Questa correzione mi ha fatto capire che non hai compreso il duplice compito di pos.

pos è la posizione in cui si trova il primo carattere di: "<PaletteRemap" & p.ToString
ma pos è anche il punto di partenza di ricerca di IndexOf: XML.IndexOf("<PaletteRemap" & p.ToString, pos)

Averlo messo a uno nella dichiarazione, significa che la prima ricerca che effettuerai per trovare: "<PaletteRemap" & p.ToString, partirà dalla posizione 1 nel file invece che da 0, di fatto non cambia nulla.
Mentre il ciclo For con p=1, fa quello che vuoi, iniziare da "<PaletteRemap1"

Il ciclo For p = 1 To 7 funziona così:
pos = 0
p = 1
IndexOf scorrerà tutto il file XML a partire dalla posizione zero, e quando trova la prima occorrenza di: "<PaletteRemap1", si ferma e mette nella variabile pos la posizione del primo carattere di: "<PaletteRemap1" (4480)

al secondo ciclo pos=4480
p = 2

IndexOf scorrerà il file XML a partire dalla posizione 4480, e quando trova la prima occorrenza di: "<PaletteRemap2", si ferma e mette nella variabile pos la posizione del primo carattere di: "<PaletteRemap2" (4532)

e così via, praticamente il file XML viene scansionato sequenzialmente senza ripartire dall'inizio ogni volta.

Sono piccolezze, ma la consapevolezza di quello che si fa e perché è essenziale per scrivere un programma con la propria testa.

Ultima modifica effettuata da Carlo 15/07/21 18:00
in programmazione tutto è permesso
30/06/21 15:41
bernie
AHHHH
Grazie per la spiegazione, infatti non lo avevo capito. Quindi lui scansiona tutto il file,a partire dalla posizione 0, poi quando trova la stringa allora cambia il valore. Il secondo giro riparte da dove si era fermato prima. Hai fatto benissimo, perché per assurdo, se dovevo scansionate un file dove la stringa interessata era in posizione 0 non lo avrei mai trovato.
Grazie 1000
Gentilissimo.
aaa
30/06/21 18:47
Carlo
Esatto!!! :rotfl::k:
in programmazione tutto è permesso