Salut.
Voici un exemple fonctionnel.
Ta fenetre s'ouvre, tu cliques sur le bouton "Pc_CreerFichierEtRemplirListe" et pendant que ta "ListIconGadget" se remplie, ta fenêtre principale n'est pas bloquée tu peux la déplacer et même voir ta "ListIconGadget" se remplir au fur et à mesure.
Code : Tout sélectionner
EnableExplicit
Enumeration ; Gadgets
#GAD_LS_NOMS
#GAD_LIB_PRENOM
#GAD_CP_PRENOM
#GAD_LIB_NOM
#GAD_CP_NOM
#GAD_ED_DESC
#GAD_BT_QUITTER
EndEnumeration
Global Event,Gadget,TypeEvenmt
Global.s Fichier
Fichier="C:\temp.txt"
Procedure Pc_CreerFichierEtRemplirListe(parametre.i)
Protected.i Compteur
; **** Creation d'un fichier sur disque volotairement long pour illustrer le problème
If CreateFile(0,"C:\temp.txt")=0:End:EndIf
For Compteur=1 To 50000
AddGadgetItem(#GAD_LS_NOMS,-1,"NOM"+Str(Compteur))
WriteStringN(0,"NOM"+Str(Compteur)+Chr(9)+"PRENOM"+Str(Compteur)+Chr(9)+"LIGNE1;LIGNE2;LIGNE3")
Next
CloseFile(0)
EndProcedure
Procedure Pc_AfficherDetailNom(ArgNom.s)
Protected.s Chaine
Protected.i Compteur
DisableWindow(0,#True)
; Mise à blanc des champs
SetGadgetText(#GAD_CP_NOM,"")
SetGadgetText(#GAD_CP_PRENOM,"")
SetGadgetText(#GAD_ED_DESC,"")
Debug "Valeur Nom : "+GetGadgetText(#GAD_CP_NOM)
; Boucle pour ralentir un peu le processus (pour simuler d'autres traitements qui ne rendent pas la main à la gestion d'évènements)
For Compteur=1 To 50000000:Next
; ******************
; ******************
; ******************
;
; Erreur de débutant ???
; Qu'est ce qui fait que les StringGadget ne sont pas mis à blanc avant la boucle et avant la saisie de nouvelles valeurs
; Alors que la ligne 2 de l'EditorGadget soit effacée et pas les lignes 1 et 3 ???
;
; ******************
; ******************
; ******************
; Recherche du nom dans le fichier
If ReadFile(0,Fichier)=0:Goto Pc_AfficherDetailNom_Fin:EndIf
While Not Eof(0)
Chaine=ReadString(0)
If StringField(Chaine,1,Chr(9))=ArgNom
; MAJ des champs
SetGadgetText(#GAD_CP_NOM,StringField(Chaine,1,Chr(9)))
SetGadgetText(#GAD_CP_PRENOM,StringField(Chaine,2,Chr(9)))
Chaine=ReplaceString(StringField(Chaine,3,Chr(9)),";",Chr(10))
SetGadgetText(#GAD_ED_DESC,Chaine)
Break
EndIf
Wend
Pc_AfficherDetailNom_Fin:
DisableWindow(0,#False)
EndProcedure
If OpenWindow(0,40,40,400,400,"Titre")
ListIconGadget(#GAD_LS_NOMS,10,10,200,360,"Nom",200)
TextGadget(#GAD_LIB_NOM,230,10,60,20,"Nom")
StringGadget(#GAD_CP_NOM,230,30,160,20,"")
TextGadget(#GAD_LIB_PRENOM,230,60,60,20,"Prénom")
StringGadget(#GAD_CP_PRENOM,230,80,160,20,"")
EditorGadget(#GAD_ED_DESC,230,120,160,60)
ButtonGadget(#GAD_BT_QUITTER,310,374,80,20,"Quitter")
ButtonGadget(100,216,200,180,20,"Pc_CreerFichierEtRemplirListe")
;ButtonGadget(101,240,240,180,20,"Pc_AfficherDetailNom")
;Pc_CreerFichierEtRemplirListe()
Repeat
Event=WaitWindowEvent():Gadget=EventGadget():TypeEvenmt=EventType()
Select Event
Case #PB_Event_Gadget
Select Gadget
Case #GAD_LS_NOMS
If TypeEvenmt=#PB_EventType_LeftClick
Pc_AfficherDetailNom(GetGadgetText(Gadget))
EndIf
Case 100
; On lance un thread pour éviter que la fenetre principale ne soit bloquée.
; Pendant que le traitement de la procedure s'effectue
CreateThread(@Pc_CreerFichierEtRemplirListe(), 0)
Case #GAD_BT_QUITTER
If TypeEvenmt=#PB_EventType_LeftClick
DeleteFile(Fichier)
End
EndIf
EndSelect
Case #PB_Event_CloseWindow
DeleteFile(Fichier)
End
EndSelect
ForEver
EndIf
Inconvénient de la chose, il faut cliquer sur un bouton.
En Delphi il y avait OnCreateForm et là-dedans on mettait ce qu'on voulait qu'il se passe à l'ouverture de la fenêtre.
Je n'ai pas trouvé l'équivalent en PureBasic mais un vieux de la vieille aura peut-être la réponse. Problème résolu dans le Post ci-dessous.
Il est possible de procéder de la même façon pour "Pc_AfficherDetailNom(ArgNom.s)" mail il faudra modifier quelques bricoles.
J'imagine que ArgNom est le nom à trouver dans la liste?
1) Tu utilises EnableExplicit et c'est très bien, c'est une des 1ères choses que j'ai appris à faire.
Inconvénient c'est qu'il faut déclarer ses variables.
Toi tu as mis Define pour que le compilo arrête de te saôuler mais regarde comment j'ai défini les variables dans les procédures.
Cela évite que dans du code externe si tu utilises une variable avec le même nom que dans une de tes procédure, cela ne foute le merdier à l'extérieur.
Bien évidemment parfois on est obligé d'en Globaliser certaines.
2) Perso à la place de ArgNom.s je préfère ArgNom$, pourquoi?
Parce que si tu files ton prog à d'autres, ou si tu ouvres ton prog dans 3 mois et que tu as une procédure de 400 lignes
Si à la 382ème ligne tu as "ArgNom", tu ne sauras plus si la variable doit recevoir un entier ou une chaine et tu devras parcourir ton prog à la recherche de ta var (Bon CTRL + F ira plus vite

), alors que si tu vois "ArgNom$" tu sais tout de suite qu'elle reçoit une chaine.
Bye.