Bonjour,
J'ai échangé avec Yanick à propos de sa demande en dehors de la liste pour
ne pas encombrer.
A présent que le programme écrit semble correspondre à ses attentes je vous
partage le code proposé :
jérôme
;déclaration des constantes identifiants chaque objet
Enumeration
#W_main ;fenêtre principale
#K_enter ;touche entrée
#K_escape ;touche échap
#zds ;zone de saisie
#ld ;liste déroulante
#btn_ok ;bouton OK
#f_ini ;fichier des adresses
#f_svg ;fichier sauvegarde
EndEnumeration
;déclaration des constantes
#nomIni = "fichier.ini" ;nom du fichier des adresses
#nomSvg = "fichier.svg" ;nom du fichier sauvegarde
#FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
;-------------------------------------
; DEFINITION DES STRUCTURES
;-------------------------------------
Structure Site
theme.s
adresse.s
EndStructure
;-------------------------------------
; DECLARATION DES VARIABLES GLOBALES
;-------------------------------------
;variable de type bouléen
Global Quit.b = #False
Global position.l, longueur.l, chaine.s
;liste chainée structurée
Global NewList lcs_site.Site()
;tableau dynamique structuré
Global Dim tds_Site.Site(0)
Global rg_tds_Site.l ;indice du tableau dynamique structuré
Procedure HandleError(Result.l, Text.s)
;affiche un message d'erreur et arrête le programme
;lorsqu'une instruction renvoie un code retour à zéro
If Result = 0
MessageRequester("Error", Text, #PB_MessageRequester_Ok)
End
EndIf
EndProcedure
Procedure SupprimerFichier(id.l, nom.s)
;suppression d'un fichier après avoir vérifié que ce dernier existe
If ReadFile(id, nom)
CloseFile(id)
DeleteFile(Nom)
EndIf
EndProcedure
Procedure Chargement()
;réinitialisation de la liste déroulante
ClearGadgetItems(#ld)
;réinitialisation de la liste chainée structurée
ClearList(lcs_site())
;ouverture du fichier des adresses
HandleError(ReadFile(#f_ini, #nomIni), "Impossible d'oubrir le fichier
"+#nomIni)
;boucle jusqu'à atteindre la fin de fichier
While Eof(#f_ini) = 0
;lecture d'une ligne du fichier des adresses
chaine = ReadString(#f_ini)
longueur = Len(chaine)
Position = FindString(chaine, "=", 1)
If position > 0 ;la ligne lue contient le signe égal
;ajout d'une occurence à la liste chainée structurée
AddElement(lcs_site())
;la chaine de caractères avant le égal correspond au thème
lcs_site()\theme = Mid(chaine, 1, position -1)
;la chaine de caractères après le égal correspond à l'adresse
lcs_site()\adresse = Mid(chaine, position +1)
EndIf
Wend ;fin de la boucle while
;fermeture du fichier des adresses
CloseFile(#f_ini)
;la liste est triée par thème
SortStructuredList(lcs_site(), #PB_Sort_Ascending,
OffsetOf(Site\theme),TypeOf(Site\theme))
rg_tds_Site = -1 ;parce que le premier indice du tableau est zéro
;parcours de tous les éléments de la liste chainée structurée
ForEach lcs_site()
rg_tds_Site +1
;le tableau dynamique structuré est redimentionné
ReDim tds_Site.Site(rg_tds_Site)
;chargement de l'adresse dans la nouvelle occurence du tableau dynamique
structuré
tds_Site(rg_tds_Site)\adresse = lcs_site()\adresse
;ajout d'un item avec le thème dans la liste déroulante
AddGadgetItem(#ld, -1, lcs_site()\theme)
Next ;fin de la boucle ForEach
EndProcedure
Procedure btn_ok_click()
;si la zone de saisie est vide
If GetGadgetText(#zds) = ""
;affichage d'un message d'erreur
MessageRequester("Information","la zone de saisie doit être renseignée
")
;positionnement du focus sur la zone de saisie
SetActiveGadget(#zds)
ProcedureReturn #False ;sortie du traitement
EndIf
;si aucun item sélectionné dans la liste déroulante
If GetGadgetState(#ld) = -1
;affichage d'un message d'erreur
MessageRequester("Information","sélectionnez un élément dans la liste ")
;positionnement du focus sur la liste déroulante
SetActiveGadget(#ld)
ProcedureReturn #False ;sortie du traitement
EndIf
;on récupère le texte dans la zone de saisie
saisie$ = GetGadgetText(#zds)
;on récupère le rang de l'item sélectionné dans la liste déroulante
rg_tds_Site = GetGadgetState(#ld)
;on récupère dans le tableau dynamique
;l'adresse correspondant à l'item sélectionné dans la liste déroulante
adresse$ = tds_Site(rg_tds_Site)\adresse
;suppression du fichier sauvegarde
SupprimerFichier(#f_svg, #Nomsvg)
;création d'un nouveau fichier sauvegarde
HandleError(OpenFile(#f_svg, #NomSvg), "Impossible d'oubrir le fichier
"+#NomSvg)
;écriture d'une ligne dans le fichier sauvegarde
WriteStringN(#f_svg, adresse$)
;fermeture du fichier sauvegarde
CloseFile(#f_svg)
;recherche de %s dans l'adresse
Position = FindString(adresse$, "%s", 1)
;si %s est présent dans l'adresse
if position > 0
;l'adresse est découpée autour de %s
debut$ = Mid(adresse$, 1, position -1)
fin$ = Mid(adresse$, position +2)
else ;%s n'est pas présent dans l'adresse
debut$ = adresse$
fin$ = ""
endIf
; MessageRequester("Information",debut$+saisie$+fin$)
;ouverture de la page web correspondant à l'adresse
RunProgram(debut$+trim(saisie$)+fin$)
quit = #True ;pour arrêter le programme
EndProcedure
Procedure btn_annuler_click()
End
EndProcedure
;========================================
;=== programme principal
;========================================
;création de la fenêtre principale ID X Y largeur hauteur titre options
HandleError(OpenWindow(#W_Main, 0, 0, 700, 400, "utilitaire", #FLAGS),
"Impossible d'oubrir la fenêtre")
;SetWindowColor(#W_MAIN, RGB(0, 0, 0)) ;couleur du fond noir
;ajout des raccourcis clavier
AddKeyboardShortcut(#W_MAIN, #PB_Shortcut_Return, #K_Enter)
AddKeyboardShortcut(#W_MAIN, #PB_Shortcut_Escape, #K_Escape)
;création des gadgets de la fenêtre principale
;zone de saisie
StringGadget(#zds, 50, 50, 200, 21, "")
;liste déroulante
ListViewGadget(#ld, 300,50,250,90)
;bouton
ButtonGadget(#btn_ok, 600, 50, 50, 20, "OK")
;création du fichier ini s'il n'existe pas
If ReadFile(#f_ini, #nomIni)
CloseFile(#f_ini)
Else
HandleError(OpenFile(#f_ini, #NomIni), "Impossible d'oubrir le fichier
"+#NomIni)
tmp$ = "nvda=http://www.webbie.org.uk/nvda/api/%s-module.html"
WriteStringN(#f_ini, tmp$)
CloseFile(#f_ini)
EndIf
;chargement des données du fichier
Chargement()
;ouverture du fichier sauvegarde en lecture
If ReadFile(#f_svg, #nomSvg)
;lecture de la ligne du fichier sauvegarde
tmp$ = ReadString(#f_svg)
;fermeture du fichier sauvegarde
CloseFile(#f_svg)
;recherche d'une correspondance dans la liste chainée structurée
I.i = -1
ForEach lcs_site()
I +1
If tmp$ = lcs_site()\adresse
;on mémorise le rang de la correspondance
rg_tds_Site = i
EndIf
Next
Else ;si aucune correspondance trouvée on prendra le premier item
rg_tds_Site = 0
EndIf
;sélectionne le dernier item sauvegardé
SetGadgetState(#ld,rg_tds_Site)
;positionnement du focus sur la zone de saisie
SetActiveGadget(#zds)
Repeat
Event.l = WaitWindowEvent() ;quel évènement ?
;analyse de l'évènement
Select Event
Case #PB_Event_Menu ;évènement de menu
Select EventMenu()
Case #K_Enter : btn_ok_click()
Case #K_Escape : btn_annuler_click()
EndSelect ; EventMenu()
Case #PB_Event_Gadget ;évènement sur un objet de la fenêtre
Select EventGadget()
Case #btn_ok : btn_ok_click()
EndSelect ; EventGadget()
EndSelect ; Event
Until Event = #PB_Event_CloseWindow Or Quit = #True
End
; IDE Options = PureBasic 5.22 LTS (Windows - x86)
; CursorPosition = 139
; FirstLine = 137
; Folding = -
; EnableXP
Progliste :
Pour se désinscrire de la liste :
mailto:[email protected]?subject=unsubscribe
Pour voir les archives de la liste :
http://www.mail-archive.com/[email protected]/
Je vous rappelle que les pièces jointe sont activés leur taille est limité à 2
MO
Pour accéder aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en privé, je
vous répondrez en privé.