OpenFile depuis ListViewGadget ou ListIconGadget ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

OpenFile depuis ListViewGadget ou ListIconGadget ?

Message par Jacobus »

:( Salut, j'ai un bean's

Avec la procédure suivante dans une boucle d'évènements
je sélectionne et j'affiche le contenu d'un répertoire dans une
ListView (ou une ListIcon)
Là aucun problème ça tourne.

Code : Tout sélectionner

Case #Choix_rep
        ClearGadgetItemList(#ListView_TextFiles)
        FileName$ = "" 
        Rep$ = PathRequester("Choisissez un répertoire puis cliquez sur OK pour afficher son contenu", AppliDir$)
        NbFiles = 0
          
        If ExamineDirectory(#PB_Any, Rep$, "*.txt")
                      
              Repeat
                FileType = NextDirectoryEntry()
                If FileType
                  FileName$ = DirectoryEntryName()
                  
                  AddGadgetItem(#ListView_TextFiles, -1, FileName$)
                  NbFiles  = NbFiles  + 1
                EndIf
              Until FileType = 0
             EndIf 
C'est après que ça se complique car je voudrais ouvrir
l'un des fichiers texte qui est affiché dans la ListView et
l'envoyer dans un EditorGadget.
(je n'avais pas encore essayé jusqu'à maintenant, l'OpenFileRequester me suffisait )
J'ai donc commis la procédure suivante, dans la boucle, en me basant sur l'OpenFileRequester. Et là ça me prend la tête car je n'arrive à ouvrir de mon fichier sélectionné qu'une ligne vide 8O

Code : Tout sélectionner

Case #ListView_TextFiles     
       Select EventType() 
          Case #PB_EventType_LeftDoubleClick
            PosElement = GetGadgetState(#ListView_TextFiles)
            NomFichier$ = GetGadgetText(#ListView_TextFiles)           
            If PosElement >= 0                                 
               Resultat= OpenFile(#fichier_ouvert, NomFichier$)
            If Resultat <>0                         
            Repeat
            Texte.s = ReadString()
            AddGadgetItem(#gadget_editeur, -1 ,Texte)
           Until Eof(#fichier_ouvert)
         CloseFile(#fichier_ouvert)
         Else 
         MessageRequester("ERREUR","Ouverture IMPOSSIBLE",16)
       EndIf
     EndIf
  SetGadgetText(#nombre_lignes,"Le document en cours est composé de :  "+ Str(CountGadgetItems(#gadget_editeur))+" lignes")
  EndSelect
Ma question est la suivante. Est-ce que vous voyez où j'a merdé ?
J'ai fatalement omis une chose importante :?
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Code : Tout sélectionner

            Repeat 
            Texte.s = ReadString() 
            AddGadgetItem(#gadget_editeur, -1 ,Texte) 
           Until Eof(#fichier_ouvert)

Code : Tout sélectionner

*Tampon=AllocateMemory(Lof())
ReadData(*Tampon, Lof())
Texte=PeekS(*Tampon,Lof())
FreeMemory(*Tampon)
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Merci Nico, je vais voir ça de vive voix, :D
et si j'entend quelque chose, je te tiens à l'oeil.
Euh... enfin tu m'as compris :lol:
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Oui, j'aurais du te dire que pour que ça marche dans ton premier post, tu aurais dû faire:

Texte.s = Texte+ReadString() +chr(13)+chr(10)

Sinon, il vaut mieux utiliser une boucle du type:

Code : Tout sélectionner

;/ Ne rentre dans la boucle que si le fichier contient des données
While eof()=0
...
Wend
La méthode la plus rapide est celle que je t'ai donné, attention toutefois à la taille du Fichier, car si celle-ci dépasse 64Ko, il faut que tu initialises un Buffer.

Voir le lien: http://purebasic.hmt-forum.com/viewtopic.php?t=1963

Je t'ai bien entendu. :lol:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

l'erreur me semble ici

Code : Tout sélectionner

NomFichier$ = GetGadgetText(#ListView_TextFiles) 
et le dossier, tu le récupère ou ?
car tu ne récupères que le nom du fichier. il manque le Rep$

derrière tu passes par un OpenFile (qui crée le fichier s'il n'existe pas)
passe par un ReadFile déjà, ça évitera les problèmes

sinon, dans le dossier de ton code, tu dois avoir des fichiers textes vides portant le nom des fichier txt que tu as voulu ouvrir (car openfile crée le fichier si il n'existe pas et comme tu n'as pas de nom de dossier, ça crée le fichier dans le répertoire du programme)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

et le dossier, tu le récupère ou ?
:oops: Ben en effet, je me doutais bien que j'avais oublié
quelque chose d'important. :roll:

Merci de ta perspicacité Régis, du coup ça me simplifie bien les choses.
Je conserve l'OpenFile pour des besoins de réécriture dans le fichier ouvert. Ce qui était le but initial, un choix et une ouverture rapides de fichiers textes.
Donc voici la nouvelle procédure, qui fonctionne parfaitement.

Code : Tout sélectionner

Case #ListView_TextFiles  
   
       Select EventType() 
          Case #PB_EventType_LeftDoubleClick
            PosElement = GetGadgetState(#ListView_TextFiles)
            NomFichier$ = GetGadgetText(#ListView_TextFiles)                     
            If PosElement >= 0 
  ;ajout du répertoire au nom de fichier
 ;Rep$ qui aura été préalablement déclaré en Global afin de servir aux 2 procédures, voir 1er post.                                
            Resultat= OpenFile(#fichier_ouvert, Rep$+NomFichier$)
          If Resultat <>0                                    
            Repeat
           Texte.s = ReadString()            
             AddGadgetItem(#gadget_editeur, -1 ,Texte)
            Until Eof(#fichier_ouvert)
            CloseFile(#fichier_ouvert)
            Else 
         MessageRequester("ERREUR","Ouverture IMPOSSIBLE",16)
       EndIf
     EndIf
;La ligne de code ci-dessous est juste un compteur de lignes dans un Textgadget qui s'actualisera à chaque ouverture de fichier texte dans l'EditorGadget.
  SetGadgetText(#nombre_lignes,"Le document en cours est composé de :  "+ Str(CountGadgetItems(#gadget_editeur))+" lignes")

  EndSelect
car openfile crée le fichier si il n'existe pas et comme tu n'as pas de nom de dossier, ça crée le fichier dans le répertoire du programme
En effet j'ai retrouvé plein de fichiers de 0 octets, :? Arg!

@Nico : je ne comprenais pas pourquoi avec ta méthode de mise en mémoire tampon, j'avais toujours un retour de bug sur AllocateMemory qui se trouvait affecté de 0. Comprend mieux vu que le chemin du fichier était incomplet.

Code : Tout sélectionner

Case #ListView_TextFiles 
    
       Select EventType() 
          Case #PB_EventType_LeftDoubleClick
            PosElement = GetGadgetState(#ListView_TextFiles)
            NomFichier$ = GetGadgetText(#ListView_TextFiles) 
                      
            If PosElement >= 0                                 
             Resultat= OpenFile(#fichier_ouvert, Rep$+NomFichier$)
             If Resultat <>0 
               *Tampon=AllocateMemory(Lof())                                               
                 ReadData(*Tampon, Lof()) 
                  Texte$=PeekS(*Tampon,Lof())                            
                    AddGadgetItem(#gadget_editeur, -1 ,Texte$)
                  CloseFile(#fichier_ouvert)
                 FreeMemory(*Tampon)           
               SetGadgetText(#String_DocOpen,NomFichier$)          
         Else 
         MessageRequester("ERREUR","Ouverture IMPOSSIBLE",16)
       EndIf
     EndIf   
  SetGadgetText(#nombre_lignes,"Le document en cours est composé de :  "+ Str(CountGadgetItems(#gadget_editeur))+" lignes")
  EndSelect
Cela fonctionne très bien, le résultat escompté est là, mais est-ce que la syntaxe est bonne ?

Merci à vous deux :D
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

remplace OpenFile par ReadFile car tu lis le fichier, tu ne l'édite pas (prob avec un fichier utilisé ou en lecture seul possible)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre