ExplorerListGadget - Gros problème

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

ExplorerListGadget - Gros problème

Message par Le Soldat Inconnu »

oula, gros problème ou bug, je sais pas mais j'ai beau tourné mon programme dans tous les sens, ça plante.

Je suis sous XP, et j'ai testé sur 2 PC différents

Voici, mon problème, l'explorerListgadget n'affiche pas les icônes des fichiers mais l'icône main (comme pour les dossier partagé etc ... si vous connaissez)
et ça seulement après un SetGadgetState pour changer le dossier de l'ExplorerListGadget

bon, c'est pas très clair.

voici un aperçu :
Image

comme vous les voyez, les icônes déconnent à fond

et voici le code

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Explication du programme :

#MaxFichier = 100
#MaxDossier = 50
Dim Dossier.s(#MaxFichier, #MaxDossier)
Dim Temp.s(#MaxFichier)

NewList Explorer.s()

Global Position
Position = -1

Enumeration
  #Arbre
  #Explorer
EndEnumeration

ProcedureDLL.s GetProgramDirectory2() ; Récupère le dossier d'exécution
  Protected Dossier.s
  Dossier = Space(255)
  GetCurrentDirectory_(255, @Dossier)
  If Right(Dossier, 1) <> "\" ; si l'adresse ne finit pas par "\"
    Dossier = Dossier + "\" ; on rajoute le "\"
  EndIf
  ProcedureReturn Dossier
EndProcedure

Procedure ListeDossier(Numero, Dossier.s, PositionDepart)
  
  If n > #MaxDossier
    MessageRequester("Erreur", "Dépassement de capacité des dossiers", 0)
    End
  EndIf
  
  ; Debug Dossier + " = " + Str(Numero)
  
  If ExamineDirectory(Numero, Dossier, "*.*")
    
    ;- Analyse du contenu du dossier
    
    Cpt_Dossier = -1
    
    Repeat
      
      FileType = NextDirectoryEntry()
      Nom.s = DirectoryEntryName()
      
      If FileType = 2 And Nom <> "." And Nom <> ".."
        Cpt_Dossier + 1
        If Cpt_Dossier > #MaxFichier
          MessageRequester("Erreur", "Dépassement de capacité des fichiers", 0)
          End
        EndIf
        
        Temp(Cpt_Dossier) = Nom
        
      ElseIf FileType = 1
        Nom = LCase(Nom)
        If Nom = "setup.exe" Or Nom = "setup.lnk" Or Nom = "setup.msi" Or Nom = "autorun.inf"
          Installation = 1
        EndIf
      EndIf
      
    Until FileType = 0
    
    ;- Triage des fichiers et dossiers
    SortArray(Temp(), 2, 0, Cpt_Dossier)
    
    ; Transfert
    For n = 0 To Cpt_Dossier
      Dossier(n, Numero) = Temp(n)
    Next
    
    ;- Affichage
    
    For n = 0 To Cpt_Dossier
      Position + 1
      AddElement(Explorer())
      Explorer() = Dossier + "\" + Dossier(n, Numero) + "\"
      AddGadgetItem(#Arbre, Position, Dossier(n, Numero))
      OpenTreeGadgetNode(#Arbre)
      ListeDossier(Numero + 1, Dossier + "\" + Dossier(n, Numero), Position)
      CloseTreeGadgetNode(#Arbre)
    Next
    
    ; On ouvre le noeud
    If Numero And Installation = 0
      SetGadgetItemState(#Arbre, PositionDepart, #PB_Tree_Expanded)
    EndIf
    
  EndIf
EndProcedure





; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 600, 400, #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget, "Logithèque") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

TreeGadget(#Arbre, 0, 0, 300, 400)
ListeDossier(0, GetProgramDirectory2(), 0)

ExplorerListGadget(#Explorer, 300, 0, 300, 400, GetProgramDirectory2(), #PB_Explorer_NoFolders | #PB_Explorer_NoParentFolder)
; ChangeListIconGadgetDisplay(#Explorer, 0)

Repeat
  Event = WaitWindowEvent()
  
  If Event = #WM_SIZE
    
  ElseIf Event = #PB_Event_Gadget
    Select EventGadgetID()
      Case #Arbre
        Position = GetGadgetState(#Arbre)
        If Position >= 0
          SelectElement(Explorer() , Position)
          Debug Explorer()
          SetGadgetText(#Explorer, Explorer())
        EndIf
        ; SetGadgetText(#Explorer, "C:\Program Files\PureBasic\")
    EndSelect
  EndIf
  
Until Event = #PB_EventCloseWindow
pour changer le dossier affiché à droite, il suffit de cliquer dans l'arbre

pour tester, il faut mettre le code à un endroit ou il y a des sous dossiers (éviter "c:\"), dans le dossier de PB par exemple.


Bon, j'ai testé l'ExplorerListGadget avec un code simple et je n'ai eu aucun problème :

Code : Tout sélectionner

NewList Dossier.s()

OpenWindow(0, 0, 0, 500, 500, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Test")

CreateGadgetList(WindowID())

TreeGadget(2, 400, 0, 100, 500)
AddGadgetItem(2, -1, "PureBasic")

ExplorerListGadget(0, 0, 0, 400, 480, "c:\", #PB_Explorer_NoFolders | #PB_Explorer_NoParentFolder)
ButtonGadget(1, 0, 480, 400, 20, "cliquez ici pour voir le bug")

Repeat 
  Event = WaitWindowEvent() 

  If Event = #PB_Event_Gadget
    Select EventGadgetID()
      Case 1
        SetGadgetText(0, "C:\Program files\PureBasic\")
    EndSelect
  EndIf

Until Event = #PB_Event_CloseWindow
Alors je n'y comprend plus rien :cry:

Si quelqu'un peut m'aider, merci
Dernière modification par Le Soldat Inconnu le mer. 15/déc./2004 23:12, modifié 1 fois.
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)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je n'ai pas le problème. :roll:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Manque une procédure dans ton code. GetProgramDirectory
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

bon, d'accord, je vire le ExplorerListGadget et je le programme moi même, ça ira plus vite :?

Pourtant, j'ai le même problème sous 2 machines différentes avec XP Pro SP1 :?: #pendu
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)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Merci chris, j'avais oublié un "2" après la function (elle est en librairie chez moi), c'est corrigé
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
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Je l'ai rajouté, chez moi, ça fonctionne

Correction, il y a la main sur certains fichiers, les .exe, par exemple
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Pfouu, ça m'énerve, y'a que sur mes PC que ça plante

quelqu'un peut me compiler le code et me le passer, histoire de savoir si ça vient de mon PB ou de windows, merci.

Edité : Comme chris dis que ça plante chez lui aussi, ouf, on est 2, je suis pas encore fou
Dernière modification par Le Soldat Inconnu le mer. 15/déc./2004 23:26, modifié 1 fois.
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)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

ha, oui, sur les fichiers affichés au début, il marche après :oops:
comme sur mon aperçu plus haut, les extension *.pb marche mais pas les autres car les *.pb étaient affichés lors du premier affichage de l'explorerlistgadget

mais par exemple, si on prend un fichier ico dans le dossier de départ, puis qu'on change de dossier, tous les fichier *.ico ont le même icône alors qu'il sont tous différents
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)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

ouf, j'ai trouvé.

regardé ce bel exemple du bug

Code : Tout sélectionner

OpenWindow(0, 0, 0, 500, 500, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Test") 

CreateGadgetList(WindowID()) 

ExplorerListGadget(0, 0, 0, 500, 480, "c:\", #PB_Explorer_NoFolders | #PB_Explorer_NoParentFolder) 
ButtonGadget(1, 0, 480, 500, 20, "cliquez ici pour voir le bug") 

Repeat 
  Event = WaitWindowEvent() 

  If Event = #PB_Event_Gadget 
    Select EventGadgetID() 
      Case 1 
        SetGadgetText(0, "C:\Program files\\PureBasic\") 
    EndSelect 
  EndIf 

Until Event = #PB_Event_CloseWindow

La raison, elle n'est pas compliqué :
j'avais fais une erreur dans l'adresse des dossiers, à savoi celle-ci :
C:\Program files\\PureBasic\

et le ExplorerListGadget interprête l'adresse comme :
\\PureBasic\
d'ou l'icone main qui correspond à une donnée en réseau

Bizarre comme comportement ??
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