none
listbox et lecture dans un fichier txt RRS feed

  • Question

  • Bonjour /Bonsoir

    Alors, est t'il posible d'afficher dans une listbox le contenu d'un fichier txt avec un rafraichisement permanent.

    J'arrive a ecrire dans mais pas a lire.

    Merci

     

    vendredi 21 mai 2010 13:05

Réponses

  • Bonjour,

    Au lien d'un Timer qui consomme de la ressource, préférez l'utilisation du composant FileSystemWatcher qui permet de surveiller un fichier (et donc son changement). Il déconseillé d'utiliser la méthode DoEvents(), préférez l'utilisation des méthodes BeginUpdate() / EndUpdate().

    Solution optimisée :

    Ajoutez un FileSystemWatcher et définissez le avec les propriétés suivantes :

    • EnableRaisingEvents à False
    • NotifyFilter à LastWrite
    Private Sub FileSystemWatcher1_Changed(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed
      Me.Rafraichir()
    End Sub
    
    Private Sub Rafraichir()
      Dim alpha As String
      Dim cheminPlusNom As String = My.Application.Info.DirectoryPath & "\fic_5_lignes.txt"
      Using p1 As StreamReader = New StreamReader(cheminPlusNom)
        ListBox1.BeginUpdate()
        ListBox1.Items.Clear()
        While p1.Peek() >= 0
          alpha = p1.ReadLine()
          ListBox1.Items.Add(alpha)
        End While
        ListBox1.EndUpdate()
      End Using
    End Sub
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
      ' Surveiller le fichier ci dessous
      Me.FileSystemWatcher1.Path = My.Application.Info.DirectoryPath
      Me.FileSystemWatcher1.Filter = "fic_5_lignes.txt"
    
      ' Déclencher la surveillance
      Me.FileSystemWatcher1.EnableRaisingEvents = True
    
      ' Rafraichir la liste
      Me.Rafraichir()
    End Sub

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    samedi 22 mai 2010 13:00
    Modérateur

Toutes les réponses

  • Bonjour,

    Oui on peut, mais si tu veux un exemple, faudrait dire à l'aide de quel critère tu veux couper ton texte pour le mettre dans la liste, car schématiquement une liste est une suite de ligne de texte, alors qu'un texte est une sorte de grande ligne unique et continue q'uil faut couper en tronçons pour la liste (généralement par les codes Ascii 13+10 (vbCrLf)), à condition que ça ne dépasse pas la largeur de la liste sinon il faudra faire défiler, ce qui ne sera pas très pratique ?

    Pour le rafraîssement du tout, le "Timer" par exemple.

    Cordialement.

     


    Joe ___ Romans et Logiciels ___ http://irolog.free.fr
    vendredi 21 mai 2010 14:39
  • Et bien en faite j'aimerai que au chargement de mon form il aye récupérer la premiere ligne de mon fichier txt.

    Pas de crainte pour la longueur il y a juste 5 mots.

     

    Merci

    vendredi 21 mai 2010 16:58
  • Bonsoir,

    Voici chef, c'est testé, chat marche, attention, le fichier, sauf indication contraire va aller dans Bin\Debug, y a plus qu'à copier/coller et mettre les deux objets dans la form.

    Option Explicit On ' objets : form1, listbox1, timer1 = 3
    Public Class Form1
    
     Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     Dim cheminPlusNom As String = My.Application.Info.DirectoryPath & "\fic_5_lignes.txt"
     Dim p1 As New System.IO.StreamWriter(CStr(cheminPlusNom))
     Timer1.Enabled = False ' création du fichier pour le test
     Timer1.Interval = 2000 ' 2'
     p1.WriteLine("ligne une")
     p1.WriteLine("ligne deux")
     p1.WriteLine("ligne trois")
     p1.WriteLine("ligne quatre")
     p1.WriteLine("ligne cinq")
     p1.Close()
     p1.Dispose()
     p1 = Nothing
     Timer1.Enabled = True
     End Sub
    
     Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
     Dim alpha As String
     Dim cheminPlusNom As String = My.Application.Info.DirectoryPath & "\fic_5_lignes.txt"
     Dim p1 As New System.IO.StreamReader(CStr(cheminPlusNom))
     ListBox1.Items.Clear()
     My.Application.DoEvents()
     System.Threading.Thread.Sleep(50)
     While p1.Peek() >= 0
      alpha = p1.ReadLine()
      ListBox1.Items.Add(alpha)
     End While
     p1.Close()
     p1.Dispose()
     p1 = Nothing
     End Sub
    
     Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
     End
     End Sub
    
    End Class

    Ne pas oublier de cliquer dans le petit rectangle où il y a le triangle vert, en haut à gauche de ma réponse... pour ma décoration, merci :o)

    Cordialement.


    Joe ___ Romans et Logiciels ___ http://irolog.free.fr
    • Proposé comme réponse EhJoe vendredi 21 mai 2010 18:09
    vendredi 21 mai 2010 18:08
  • Bonjour,

    Au lien d'un Timer qui consomme de la ressource, préférez l'utilisation du composant FileSystemWatcher qui permet de surveiller un fichier (et donc son changement). Il déconseillé d'utiliser la méthode DoEvents(), préférez l'utilisation des méthodes BeginUpdate() / EndUpdate().

    Solution optimisée :

    Ajoutez un FileSystemWatcher et définissez le avec les propriétés suivantes :

    • EnableRaisingEvents à False
    • NotifyFilter à LastWrite
    Private Sub FileSystemWatcher1_Changed(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed
      Me.Rafraichir()
    End Sub
    
    Private Sub Rafraichir()
      Dim alpha As String
      Dim cheminPlusNom As String = My.Application.Info.DirectoryPath & "\fic_5_lignes.txt"
      Using p1 As StreamReader = New StreamReader(cheminPlusNom)
        ListBox1.BeginUpdate()
        ListBox1.Items.Clear()
        While p1.Peek() >= 0
          alpha = p1.ReadLine()
          ListBox1.Items.Add(alpha)
        End While
        ListBox1.EndUpdate()
      End Using
    End Sub
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
      ' Surveiller le fichier ci dessous
      Me.FileSystemWatcher1.Path = My.Application.Info.DirectoryPath
      Me.FileSystemWatcher1.Filter = "fic_5_lignes.txt"
    
      ' Déclencher la surveillance
      Me.FileSystemWatcher1.EnableRaisingEvents = True
    
      ' Rafraichir la liste
      Me.Rafraichir()
    End Sub

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    samedi 22 mai 2010 13:00
    Modérateur
  • Bonjour Gilles,

    Ho... là j'ai perdu ma décoration, ce sont des instructions que je ne connais pas du tout, alors ça serait ça du vbNet :o)

    Mais les évènements "rafraichir, update, event... il faut bien eux aussi qu'ils aillent au travail touts les x millièmes de secondes voir ce qui se passe dans le fichier, alors quelle est la différence en temps ; car à la rigueur on peut en sus fignoler en lisant et mémorisant l'heure de MAJ du fichier, et donc ne pas aller le lire ni toucher à la liste s'il n'a pas été modifié, c'est d'ailleurs peut-être ça qui se passe, ah ?

    Cordialement.

     


    Joe ___ Romans et Logiciels ___ http://irolog.free.fr
    samedi 22 mai 2010 13:41
  • Bonjour,

    Non, le FileSystemWatcher se déclenche lors d'un réel changement (c'est l'OS qui réalise la notification). Il n'y a pas de Timer utilisé. Donc le FileSystemWatcher est plus performant !

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    samedi 22 mai 2010 14:39
    Modérateur
  • Merci ehjoe Sa a l'air de fonctionner...mais je voudrai plus d'info sur ce code avant de validé.

    alors ma question comment faire pour écrire sur une seule des lignes en laissant la valeur des autres lignes?

     (action sur un bouton par exemple)

    Ensuite merci à Gilles pour sa pierre a l'édifice :D

    J'ai bien compris à quoi sa sert

    Mais j'arrive pas a faire un mixe des deux codes

    Il ne me reconnait pas StreamReader. A tu une petite idée sur cette parti de code.

     

    Merci a tout deux. bon week

     

    samedi 22 mai 2010 18:19
  • Salut Mini,

    Ah, merci pour ton point.

    Gille t'a fait un code parfait dans le pur style vbNet, moi c'est plutôt du code VB "lato sensu", peut être moins performant, moins optimisé, mais beaucoup plus simple et compréhensible au début, d'autant que pour 5 lignes il n'y a pas de différence de vitesse.

    Alors pour n'avoir qu'une ligne du fichier tu fais ça (2 variables + le if) dans le code.

     dim n as long = x ' n° de la ligne que tu veux
     dim i as long = 0
     While p1.Peek() >= 0
     i = i + 1
     if i = n then 
      alpha = p1.ReadLine()
      ListBox1.Items.Add(alpha)
     end if
     End While
    

    Cordialement et merci pour mon point futur :o)

     


    Joe ___ Romans et Logiciels ___ http://irolog.free.fr
    • Proposé comme réponse EhJoe samedi 22 mai 2010 18:55
    samedi 22 mai 2010 18:55