Erreur enregistremet listview1

Résolu
hacker591 Messages postés 34 Date d'inscription mardi 10 juin 2014 Statut Membre Dernière intervention 26 janvier 2022 - 2 sept. 2014 à 13:21
jordane45 Messages postés 37545 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 juin 2023 - 9 sept. 2014 à 16:43
Bonjour,
voici en image mon projet :

voici mon code des lecture :
Private Sub ReadFile(FilePath As String)
        Me.ListView1.Items.Clear()
        Dim input As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read)
        Dim reader As New BinaryReader(input)
        reader.BaseStream.Position = &H270
        Dim num As Integer = 1
        Dim num2 As Integer = 0
        Do
            Dim position As Long = reader.BaseStream.Position - 10
            Dim hex As Byte() = reader.ReadBytes(8)
            Dim num3 As String = BitConverter.ToString(hex).Replace("-", "")
            Dim hex2 As Byte() = reader.ReadBytes(2)
            Dim num4 As String = BitConverter.ToString(hex2).Replace("-", "")
            reader.BaseStream.Position += 14
            Dim lvi As New ListViewItem("&H" & Conversion.Hex(position))
            lvi.SubItems.AddRange(New String() {Convert.ToString(num3), Convert.ToString(num4)})
            Me.ListView1.Items.Add(lvi)
            num += 1
            num2 = (num2 + 1)
        Loop While (num2 <= &H167)
        reader.Close()
        input.Close()
    End Sub


voici mon code enregistrer :
Private Sub WriteFile(FilePath As String)
Dim output As New FileStream(FilePath, FileMode.Open, FileAccess.Write, FileShare.Write)
Dim writer As New BinaryWriter(output)
writer.BaseStream.Position = &H278
For Each item As ListViewItem In ListView1.Items
writer.Write(item.SubItems(2).Text)
Next
writer.Close()
output.Close()
Interaction.MsgBox("Fichier Sauvegarder.", MsgBoxStyle.Information, "")
End Sub

Mon probléme, c'est quand je modifier le code couleur (ex : 2 colonne 0000 par 9999) et j'enregistre. quand je vérifie mon fichier HXD.
voici en image ce que me donne quand j'enregistre:

voici mon fichier originale :


Comment faire pour enregistrer dans Listview1 en hex.
Pouvez-vous m'aider a corriger ce petit problème?

13 réponses

vb95 Messages postés 3418 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 31 mai 2023 165
6 sept. 2014 à 21:04
voici le code complet pour la feuille Form1
Fair en vrai VB net sans la référence à Microsoft.Visual.Basic dans les références du projet ! Cette référence ne sert que pour la compatibilité avec les anciens codes VB 6 en utilisant la syntaxe VB6
J'utilise VB Net 2013 Express ! mon code est-il compatible à 100% avec ta version de VB net ! Je pense que oui ! Dans le cas contraire dis-moi quelle est ta version de VB net !


Imports System.IO

Public Class Form1

Private FilePath As String
Private codehex(0 To 7) As Byte
Private couleurhex(0 To 1) As Byte

Private Sub OuvrirToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles OuvrirToolStripMenuItem.Click

Dim open As New OpenFileDialog
open.Filter = "FICHIER PS3 |SYS-DATA"
If open.ShowDialog = Windows.Forms.DialogResult.OK Then
FilePath = open.FileName
ReadFile(FilePath)
Else
MessageBox.Show("Fichier non chargé", "Attention", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End If

End Sub

Private Sub ReadFile(FilePath As String)

ListView1.Items.Clear()
Dim input As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim reader As New BinaryReader(input)
reader.BaseStream.Position = 16
For i = 0 To 16
Dim position As Long = reader.BaseStream.Position - 10
Dim code As String = BitConverter.ToString(reader.ReadBytes(8)).Replace("-", "")
Dim couleur As String = BitConverter.ToString(reader.ReadBytes(2)).Replace("-", "")
reader.BaseStream.Position += 14
Dim lvi As New ListViewItem("&H" & position.ToString("X4"))
lvi.SubItems.AddRange(New String() {code, couleur})
ListView1.Items.Add(lvi)
Next
reader.Close()
input.Close()
TextBox1.Text = String.Empty
TextBox1.Refresh()

End Sub

Private Sub EnregistrerToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles EnregistrerToolStripMenuItem.Click

Dim output As New FileStream(FilePath, FileMode.Open, FileAccess.Write, FileShare.Write)
Dim writer As New BinaryWriter(output)
writer.BaseStream.Position = 16
For Each item As ListViewItem In ListView1.Items
Dim position As Long = writer.BaseStream.Position - 10
Dim code As String = item.SubItems.Item(1).Text ' chaine code en héxadécimal
Dim couleur As String = item.SubItems.Item(2).Text ' chaine couleur en héxadécimal
codehex = converthex(code, codehex) ' on convertit la chaine héxa-ASCII en un tableau de 8 octets
couleurhex = converthex(couleur, couleurhex) ' on convertit la chaine héxa-ASCII en un tableau de 2 octets
writer.Write(codehex) ' on écrit les 8 octets du code la voiture
writer.Write(couleurhex) ' on écrit les 2 octets de la couleur de la voiture
writer.BaseStream.Position += 14
Next
writer.Close()
output.Close()
MessageBox.Show("Fichier sauvegardé", "", MessageBoxButtons.OK, MessageBoxIcon.Information)

End Sub

Private Function converthex(chaine As String, octets() As Byte) As Byte()

For i = 0 To (chaine.Length / 2) - 1
octets(i) = Convert.ToByte(chaine.Substring(i * 2, 2), 16)
Next
converthex = octets

End Function

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

If ListView1.SelectedItems.Count > 0 Then
TextBox1.Text = TextBox1.Text.ToUpper
Dim couleurhex As String = TextBox1.Text
If couleurhex.Length <> 4 Or String.IsNullOrWhiteSpace(couleurhex) = True Then
MessageBox.Show("La couleur saisie doit comportée 4 caractères héxadécimaux", "", MessageBoxButtons.OK, MessageBoxIcon.Warning)
TextBox1.Text = String.Empty
TextBox1.Refresh()
Exit Sub
End If
For i = 0 To 3
Dim caractere As String = couleurhex.Substring(i, 1)
If (caractere >= "0" And caractere <= "9") Or (caractere >= "A" And caractere <= "F") Then
For Each item As ListViewItem In ListView1.SelectedItems
item.SubItems(2).Text = couleurhex
Next
Else
MessageBox.Show("Les caractères ne sont pas tous héxadécimaux (de 0 à 9 et de A à F)", "", MessageBoxButtons.OK, MessageBoxIcon.Warning)
TextBox1.Text = String.Empty
TextBox1.Refresh()
End If
Next
Else
MessageBox.Show("Aucune sélection faite dans la liste", "", MessageBoxButtons.OK, MessageBoxIcon.Warning)
TextBox1.Text = String.Empty
TextBox1.Refresh()
End If

End Sub

Private Sub ListView1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListView1.SelectedIndexChanged

If ListView1.SelectedItems.Count > 0 Then
For Each item As ListViewItem In ListView1.SelectedItems
TextBox1.Text = ListView1.SelectedItems(0).SubItems(2).Text.ToUpper
Next
End If
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub
End Class
1
cs_Le Pivert Messages postés 7894 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 9 juin 2023 136
2 sept. 2014 à 15:14
Bonjour,

Essaie ceci:

    Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
Private Sub ReadFile(ByVal FilePath As String, ByVal list As ListView)
'Lire la liste
        If File.Exists(FilePath) Then
            Using fs As New System.IO.FileStream(FilePath, IO.FileMode.Open)
                List.Items.AddRange(bf.Deserialize(fs).ToArray(GetType(ListViewItem)))
            End Using
        End If
    End Sub
    Private Sub WriteFile(ByVal FilePath As String, ByVal list As ListView)
        ' Sauver la liste
        Using fs As New System.IO.FileStream(FilePath, IO.FileMode.Create)
            bf.Serialize(fs, New ArrayList(list.Items))
        End Using
    End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
  'adapter listview     
 ListVpath.View = View.Details
        ListVpath.Columns.Add("Noms", 150, HorizontalAlignment.Left)
        ListVpath.Columns.Add("Chemin", 350, HorizontalAlignment.Left)
        ListVpath.Items.Clear()
        ReadFile("Chemin fichier.txt", ListVpath)'adapter listview
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        WriteFile("Chemin fichier.txt", ListVpath)'adapter listview
    End Sub

0
Bonjour,

avez-vous une solution avec WriteFile pour enregistrer seulement:
item.SubItems(2).Text

par rapport a mon code de lecture comment enregistrer dans WriteFile?
Merci pour votre aide.
0
vb95 Messages postés 3418 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 31 mai 2023 165
6 sept. 2014 à 08:51
il vient d'où ton fichier HXD ? et que représente-t-il et comment le crées-tu ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vb95 Messages postés 3418 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 31 mai 2023 165
6 sept. 2014 à 12:59
writer.Write(item.SubItems(2).Text)

cette ligne inscrit le texte de l'item de la listview dans le fichier et nom les valeurs héxadécimales que ce texte représente

si tu as 20 en héxadécimal soit 32 en décimal comme valeur dans la listview le Write met dans le fichier les valeurs héxa 32 et 30 ( soit les codes ASCII des chiffres 2 et 0)
il faut passer par l'écriture d'octets directement et par par l'écriture de texte !
0
hacker591 Messages postés 34 Date d'inscription mardi 10 juin 2014 Statut Membre Dernière intervention 26 janvier 2022
Modifié par hacker591 le 6/09/2014 à 15:12
bonjour,
Voici le lien de mon projet : http://www.mediafire.com/download/b0b1a0931q56sp5/teste+1.rar

Pouvez-vous regarder mon projet, j'ai un probléme enregistrement par rapport mon fichier DATA. N'oublier pas faire une double copie du fichier DATA.
Merci
0
vb95 Messages postés 3418 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 31 mai 2023 165
6 sept. 2014 à 17:24
ton souci est résolu chez moi !
le code couleur est une valeur en héxadécimal sur 2 octets ( donc 4 caractères héxadécimaux )
0
hacker591 Messages postés 34 Date d'inscription mardi 10 juin 2014 Statut Membre Dernière intervention 26 janvier 2022
Modifié par hacker591 le 6/09/2014 à 18:12
pouvez-vous me dire comment vous avez écrire le code? Merci de votre réponse
0
vb95 Messages postés 3418 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 31 mai 2023 165
6 sept. 2014 à 21:05
il faut lite "Fait en VB net" et non "Fair en VB net"
Excuse
0
Merci vb95,

grâce a toi, tu as résolu a un probléme depuis deuxième semaine que je suis dessus.

Merci encore,
0
vb95 Messages postés 3418 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 31 mai 2023 165
6 sept. 2014 à 22:58
De rien !
Tout le plaisir est pour moi aussi !
N'oublie pas de clcquer sur "Problème résolu" stp !
0
vb95 Messages postés 3418 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 31 mai 2023 165
6 sept. 2014 à 23:37
Modifie le code de cette procédure ainsi !
Risque d'erreur si saisie de caractères non héxadécimaux car on modifie tout de même la couleur dans la listview


Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

If ListView1.SelectedItems.Count > 0 Then
TextBox1.Text = TextBox1.Text.ToUpper
Dim couleurhex As String = TextBox1.Text
If couleurhex.Length <> 4 Or String.IsNullOrWhiteSpace(couleurhex) = True Then
MessageBox.Show("La couleur saisie doit comportée 4 caractères héxadécimaux", "", MessageBoxButtons.OK, MessageBoxIcon.Warning)
TextBox1.Text = String.Empty
TextBox1.Refresh()
Exit Sub
End If
Dim ok As Integer = 0
For i = 0 To 3
Dim caractere As String = couleurhex.Substring(i, 1)
If (caractere >= "0" And caractere <= "9") Or (caractere >= "A" And caractere <= "F") Then
ok += 1
Else
MessageBox.Show("Les caractères ne sont pas tous héxadécimaux (de 0 à 9 et de A à F)", "", MessageBoxButtons.OK, MessageBoxIcon.Warning)
TextBox1.Text = String.Empty
TextBox1.Refresh()
End If
Next
If ok = 4 Then
For Each item As ListViewItem In ListView1.SelectedItems
item.SubItems(2).Text = couleurhex
Next
End If
Else
MessageBox.Show("Aucune sélection faite dans la liste", "", MessageBoxButtons.OK, MessageBoxIcon.Warning)
TextBox1.Text = String.Empty
TextBox1.Refresh()
End If

End Sub
0
hacker591 Messages postés 34 Date d'inscription mardi 10 juin 2014 Statut Membre Dernière intervention 26 janvier 2022
Modifié par hacker591 le 9/09/2014 à 16:17
Merci de votre réponse,

Je voudrais savoir c'est possible arrêter de lire quand il y a 16 zéros automatique en hex?

For i = 0 To 16


Merci de votre réponse.
0
jordane45 Messages postés 37545 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 juin 2023 341
9 sept. 2014 à 16:43
Bonjour,

1 - Quel est le rapport entre cette ligne de code :
For i = 0 To 16
... et ta question ?


2 - De toutes façons...Ta question initiale : Enregistrement de tes valeurs en Hexa dans ton fichier.... est résolue non ??
Si oui... Merci de mettre ce sujet en RESOLU puis d'ouvrir une nouvelle discussion pour ta nouvelle question.
0