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é.
        
        

Répondre à