Page 1 sur 2

Toute les fonctions de PureBasic

Publié : lun. 29/mars/2004 20:00
par Chris
Je viens de finir un nouveau petit prog. (Pas tout à fait fini, mais bon...)

Par contre, je ne sais pas si il va fonctionner chez tout le monde, car il se base sur un fichier texte qui s'appelle PBFunctionListing.txt, contenu dans le dossier "Compilers", et je ne sais pas si il est généré par PureBasic ou par jaPBe.

Donc, vérifiez si vous l'avez, avant de me dire que ça ne fonctionne pas :lol:

Alors c'est simple, ce fichier regroupe toutes les commandes, y compris celles incluses dans les librairies utilisateur, avec une description, (en anglais, malheureusement), si le programmeur en a mis une.

Pour l'utiliser, vous ouvrez le fichier, et toutes les fonctions s'affichient dans la liste. Si vous cliquez sur un des petits boutons à gauche, seules les fonctions dont le nom commence par le lettre choisie s'affichent.

Voilà le code:

Code : Tout sélectionner

Structure PB_FONCTIONS
  Fonction.s
  Description.s
EndStructure
NewList Type.PB_FONCTIONS()

;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Editor_0
  #Button_Open
  #Button_Quit
  #BtnA
  #BtnB
  #BtnC
  #BtnD
  #BtnE
  #BtnF
  #BtnG
  #BtnH
  #BtnI
  #BtnJ
  #BtnK
  #BtnL
  #BtnM
  #BtnN
  #BtnO
  #BtnP
  #BtnQ
  #BtnR
  #BtnS
  #BtnT
  #BtnU
  #BtnV
  #BtnW
  #BtnX
  #BtnY
  #BtnZ
  #BtnAll
EndEnumeration

Declare FillList(Lettre.s)
Declare LoadFile(Index, Path$)
Declare CallBack(Hnd,Mess,wParam,lParam)
Declare Open_Window_0()

Procedure LoadFile(Index, Path$)
  ClearList(Type())
  
  If ReadFile(Index,Path$)
    Tmp$ = ReadString()
    Repeat
      Tmp$ = ReadString()
      Pos = FindString(Tmp$," - ",0)
      If Pos = 0
        StrLeft$ = Tmp$
        StrRight$ = ""
      Else
        StrLeft$ = Left(Tmp$,Pos)
        StrRight$ = Right(Tmp$,Len(Tmp$)-(Pos+1))
      EndIf
      AddElement(Type())
      Type()\Fonction = StrLeft$
      Type()\Description = StrRight$
    Until Eof(Index)
    CloseFile(Index)
    
    FillList("")
  EndIf
EndProcedure

Procedure FillList(Lettre.s)
  ClearGadgetItemList(#Editor_0)
  If Lettre = ""
    ForEach Type()
      AddGadgetItem(#Editor_0,-1,Type()\Fonction+Chr(10)+Type()\Description)
    Next
  Else
    ForEach Type()
      If Left(Type()\Fonction,1) = Lettre
        AddGadgetItem(#Editor_0,-1,Type()\Fonction+Chr(10)+Type()\Description)
      EndIf
    Next
  EndIf
EndProcedure

Procedure CallBack(Hnd,Mess,wParam,lParam)
  WH = WindowHeight() : WW = WindowWidth()
  Select Mess
    Case #WM_SIZE
      ResizeGadget(#Button_Quit, WW-80, WH-35, 75, 30)
      ResizeGadget(#Button_Open, WW-160, WH-35, 75, 30)
      ResizeGadget(#Editor_0, 0, 0, WW, WH-40)
      
      ResizeGadget(#BtnA,5,WH-35,15,15)
      ResizeGadget(#BtnN,5,WH-20,15,15)
      ResizeGadget(#BtnB,20,WH-35,15,15)
      ResizeGadget(#BtnO,20,WH-20,15,15)
      ResizeGadget(#BtnC,35,WH-35,15,15)
      ResizeGadget(#BtnP,35,WH-20,15,15)
      ResizeGadget(#BtnD,50,WH-35,15,15)
      ResizeGadget(#BtnQ,50,WH-20,15,15)
      ResizeGadget(#BtnE,65,WH-35,15,15)
      ResizeGadget(#BtnR,65,WH-20,15,15)
      ResizeGadget(#BtnF,80,WH-35,15,15)
      ResizeGadget(#BtnS,80,WH-20,15,15)
      ResizeGadget(#BtnG,95,WH-35,15,15)
      ResizeGadget(#BtnT,95,WH-20,15,15)
      ResizeGadget(#BtnH,110,WH-35,15,15)
      ResizeGadget(#BtnU,110,WH-20,15,15)
      ResizeGadget(#BtnI,125,WH-35,15,15)
      ResizeGadget(#BtnV,125,WH-20,15,15)
      ResizeGadget(#BtnJ,140,WH-35,15,15)
      ResizeGadget(#BtnW,140,WH-20,15,15)
      ResizeGadget(#BtnK,155,WH-35,15,15)
      ResizeGadget(#BtnX,155,WH-20,15,15)
      ResizeGadget(#BtnL,170,WH-35,15,15)
      ResizeGadget(#BtnY,170,WH-20,15,15)
      ResizeGadget(#BtnM,185,WH-35,15,15)
      ResizeGadget(#BtnZ,185,WH-20,15,15)
      ResizeGadget(#BtnAll,200,WH-35,30,30)
      SendMessage_(GadgetID(#Editor_0),#LVM_SETCOLUMNWIDTH,0,WW/3)
      SendMessage_(GadgetID(#Editor_0),#LVM_SETCOLUMNWIDTH,1,(WW/3)*2)
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure 

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 530, 420,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "PB-Functions")
    WH = WindowHeight() : WW = WindowWidth()
    
    If CreateGadgetList(WindowID())
      ListIconGadget(#Editor_0,0,0,WW,WH-40,"Fonction",WW/3,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
      AddGadgetColumn(#Editor_0,2,"Description",(WW/3)*2)
      ButtonGadget(#Button_Quit, WW-80, WH-35, 75, 30, "Quitter")
      ButtonGadget(#Button_Open, WW-160, WH-35, 75, 30, "Ouvrir")
      
      ButtonGadget(#BtnA,5,WH-35,15,15,"A")
      ButtonGadget(#BtnN,5,WH-20,15,15,"N")
      ButtonGadget(#BtnB,20,WH-35,15,15,"B")
      ButtonGadget(#BtnO,20,WH-20,15,15,"O")
      ButtonGadget(#BtnC,35,WH-35,15,15,"C")
      ButtonGadget(#BtnP,35,WH-20,15,15,"P")
      ButtonGadget(#BtnD,50,WH-35,15,15,"D")
      ButtonGadget(#BtnQ,50,WH-20,15,15,"Q")
      ButtonGadget(#BtnE,65,WH-35,15,15,"E")
      ButtonGadget(#BtnR,65,WH-20,15,15,"R")
      ButtonGadget(#BtnF,80,WH-35,15,15,"F")
      ButtonGadget(#BtnS,80,WH-20,15,15,"S")
      ButtonGadget(#BtnG,95,WH-35,15,15,"G")
      ButtonGadget(#BtnT,95,WH-20,15,15,"T")
      ButtonGadget(#BtnH,110,WH-35,15,15,"H")
      ButtonGadget(#BtnU,110,WH-20,15,15,"U")
      ButtonGadget(#BtnI,125,WH-35,15,15,"I")
      ButtonGadget(#BtnV,125,WH-20,15,15,"V")
      ButtonGadget(#BtnJ,140,WH-35,15,15,"J")
      ButtonGadget(#BtnW,140,WH-20,15,15,"W")
      ButtonGadget(#BtnK,155,WH-35,15,15,"K")
      ButtonGadget(#BtnX,155,WH-20,15,15,"X")
      ButtonGadget(#BtnL,170,WH-35,15,15,"L")
      ButtonGadget(#BtnY,170,WH-20,15,15,"Y")
      ButtonGadget(#BtnM,185,WH-35,15,15,"M")
      ButtonGadget(#BtnZ,185,WH-20,15,15,"Z")
      ButtonGadget(#BtnAll,200,WH-35,30,30,"Tout")
    EndIf
  EndIf
EndProcedure

Open_Window_0()
SetWindowCallback(@CallBack())

Chemin$ = Space(256)
GetCurrentDirectory_(#MAX_PATH,@Chemin$)
If Right(Chemin$,1)<>"\"
  Chemin$+"\"
EndIf

Repeat
  Select WaitWindowEvent()
    
    Case #PB_EventGadget
      If EventGadgetID() >=#BtnA And EventGadgetID()<=#BtnZ
        FillList(GetGadgetText(EventGadgetID()))
      EndIf
      
      Select EventGadgetID()
        Case #Editor_0
          
        Case #Button_Open
          File$ = OpenFileRequester("Ouvrir un fichier",Chemin$+"PBFunctionListing.txt","Text file|*.txt|All Files|*.*",0)
          LoadFile(0,File$)
          
        Case #Button_Quit : quit = 1
          End
          
        Case #BtnAll
          FillList("")
          
        EndSelect
        
    Case #PB_EventCloseWindow : quit = 1
      
  EndSelect
Until quit = 1

End
Dans une prochaine version, il devrai y avoir la possibilité de coller la fonction dans l'éditeur. Enfin... peut-être :)

Chris :)

Publié : lun. 29/mars/2004 20:21
par nico
On en rêvait, Chris nous l'a fait.

Il fallait y penser! :D

Publié : lun. 29/mars/2004 20:53
par Oliv
Pas mal :D , le fichier est avec l'éditeur de PB :wink:

Publié : lun. 29/mars/2004 20:56
par Chris
Oliv a écrit :Pas mal :D , le fichier est avec l'éditeur de PB :wink:
Super, comme ça, tout le monde pourra en profiter :)

Chris :)

Publié : lun. 29/mars/2004 23:03
par ZapMan
Chouette !

Il manque la possibilité de faire un copier/coller ou un glisser déposé pour ne pas avoir à retaper une fonction quand on l'a trouvée.

Publié : lun. 29/mars/2004 23:24
par Chris
C'est bien pour ça que j'avais mis "(Pas tout à fait fini, mais bon...)" dans mon premier message.

Voilà le code avec le copier/coller, et la sauvegarde du chemin du fichier.

Pour copier la fonction, il faut double-cliquer dessus pour qu'elle s'affiche dans la zone du bas, et ensuite, cliquer sur le bouton "Copier".

J'avais pensé faire la copie directement dans le presse-papier au double clic, mais ça permet de vérifier que c'est la bonne fonction qui a été cliquée.

Code : Tout sélectionner

Structure PB_FONCTIONS
  Fonction.s
  Description.s
EndStructure
NewList Type.PB_FONCTIONS()

;- Window Constants
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
Enumeration
  #Editor_0
  #Button_Open
  #Button_Quit
  #Button_Copy
  #Button_Cancel
  #Edit
  #BtnA
  #BtnB
  #BtnC
  #BtnD
  #BtnE
  #BtnF
  #BtnG
  #BtnH
  #BtnI
  #BtnJ
  #BtnK
  #BtnL
  #BtnM
  #BtnN
  #BtnO
  #BtnP
  #BtnQ
  #BtnR
  #BtnS
  #BtnT
  #BtnU
  #BtnV
  #BtnW
  #BtnX
  #BtnY
  #BtnZ
  #BtnAll
EndEnumeration

Declare LoadFile(Index, Path$)
Declare FillList(Lettre.s)
Declare CallBack(Hnd,Mess,wParam,lParam)
Declare Open_Window_0()

Procedure LoadFile(Index, Path$)
  ClearList(Type())
  If ReadFile(Index,Path$)
    Tmp$ = ReadString()
    Repeat
      Tmp$ = ReadString()
      Pos = FindString(Tmp$," - ",0)
      If Pos = 0
        StrLeft$ = Tmp$
        StrRight$ = ""
      Else
        StrLeft$ = Left(Tmp$,Pos)
        StrRight$ = Right(Tmp$,Len(Tmp$)-(Pos+1))
      EndIf
      AddElement(Type())
      Type()\Fonction = StrLeft$
      Type()\Description = StrRight$
    Until Eof(Index)
    CloseFile(Index)
    FillList("")
    CreatePreferences("PB_Func.ini")
    PreferenceGroup("Chemin")
    WritePreferenceString("Chemin", Path$)
    ClosePreferences()
  EndIf
EndProcedure

Procedure FillList(Lettre.s)
  ClearGadgetItemList(#Editor_0)
  If Lettre = ""
    ForEach Type()
      AddGadgetItem(#Editor_0,-1,Type()\Fonction+Chr(10)+Type()\Description)
    Next
  Else
    ForEach Type()
      If Left(Type()\Fonction,1) = Lettre
        AddGadgetItem(#Editor_0,-1,Type()\Fonction+Chr(10)+Type()\Description)
      EndIf
    Next
  EndIf
EndProcedure

Procedure CallBack(Hnd,Mess,wParam,lParam)
  WH = WindowHeight() : WW = WindowWidth()
  Select Mess
    Case #WM_SIZE
      ResizeGadget(#Button_Quit, WW-80, WH-35, 75, 30)
      ResizeGadget(#Button_Open, WW-160, WH-35, 75, 30)
      ResizeGadget(#Button_Copy, WW-240,WH-35,75,30)
      ResizeGadget(#Button_Cancel,WW-320,WH-35,75,30)
      ResizeGadget(#Editor_0, 0, 0, WW, WH-65)
      ResizeGadget(#Edit,5,WH-60,WW-10,20)
      
      ResizeGadget(#BtnA,5,WH-35,15,15)
      ResizeGadget(#BtnN,5,WH-20,15,15)
      ResizeGadget(#BtnB,20,WH-35,15,15)
      ResizeGadget(#BtnO,20,WH-20,15,15)
      ResizeGadget(#BtnC,35,WH-35,15,15)
      ResizeGadget(#BtnP,35,WH-20,15,15)
      ResizeGadget(#BtnD,50,WH-35,15,15)
      ResizeGadget(#BtnQ,50,WH-20,15,15)
      ResizeGadget(#BtnE,65,WH-35,15,15)
      ResizeGadget(#BtnR,65,WH-20,15,15)
      ResizeGadget(#BtnF,80,WH-35,15,15)
      ResizeGadget(#BtnS,80,WH-20,15,15)
      ResizeGadget(#BtnG,95,WH-35,15,15)
      ResizeGadget(#BtnT,95,WH-20,15,15)
      ResizeGadget(#BtnH,110,WH-35,15,15)
      ResizeGadget(#BtnU,110,WH-20,15,15)
      ResizeGadget(#BtnI,125,WH-35,15,15)
      ResizeGadget(#BtnV,125,WH-20,15,15)
      ResizeGadget(#BtnJ,140,WH-35,15,15)
      ResizeGadget(#BtnW,140,WH-20,15,15)
      ResizeGadget(#BtnK,155,WH-35,15,15)
      ResizeGadget(#BtnX,155,WH-20,15,15)
      ResizeGadget(#BtnL,170,WH-35,15,15)
      ResizeGadget(#BtnY,170,WH-20,15,15)
      ResizeGadget(#BtnM,185,WH-35,15,15)
      ResizeGadget(#BtnZ,185,WH-20,15,15)
      ResizeGadget(#BtnAll,200,WH-35,30,30)
      SendMessage_(GadgetID(#Editor_0),#LVM_SETCOLUMNWIDTH,0,WW/3)
      SendMessage_(GadgetID(#Editor_0),#LVM_SETCOLUMNWIDTH,1,(WW/3)*2)
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure 

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 630, 320,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "PB-Functions")
    WH = WindowHeight() : WW = WindowWidth()
    If CreateGadgetList(WindowID())
      ListIconGadget(#Editor_0,0,0,WW,WH-65,"Fonction",WW/3,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
      AddGadgetColumn(#Editor_0,2,"Description",(WW/3)*2)
      
      ButtonGadget(#Button_Quit, WW-80, WH-35, 75, 30, "Quitter")
      ButtonGadget(#Button_Open, WW-160, WH-35, 75, 30, "Ouvrir")
      ButtonGadget(#Button_Copy, WW-240,WH-35,75,30, "Copier")
      ButtonGadget(#Button_Cancel,WW-320,WH-35,75,30,"Effacer")
      StringGadget(#Edit,5,WH-60,WW-10,20,"",#PB_String_ReadOnly|#ES_READONLY )
      
      ButtonGadget(#BtnA,5,WH-35,15,15,"A")
      ButtonGadget(#BtnN,5,WH-20,15,15,"N")
      ButtonGadget(#BtnB,20,WH-35,15,15,"B")
      ButtonGadget(#BtnO,20,WH-20,15,15,"O")
      ButtonGadget(#BtnC,35,WH-35,15,15,"C")
      ButtonGadget(#BtnP,35,WH-20,15,15,"P")
      ButtonGadget(#BtnD,50,WH-35,15,15,"D")
      ButtonGadget(#BtnQ,50,WH-20,15,15,"Q")
      ButtonGadget(#BtnE,65,WH-35,15,15,"E")
      ButtonGadget(#BtnR,65,WH-20,15,15,"R")
      ButtonGadget(#BtnF,80,WH-35,15,15,"F")
      ButtonGadget(#BtnS,80,WH-20,15,15,"S")
      ButtonGadget(#BtnG,95,WH-35,15,15,"G")
      ButtonGadget(#BtnT,95,WH-20,15,15,"T")
      ButtonGadget(#BtnH,110,WH-35,15,15,"H")
      ButtonGadget(#BtnU,110,WH-20,15,15,"U")
      ButtonGadget(#BtnI,125,WH-35,15,15,"I")
      ButtonGadget(#BtnV,125,WH-20,15,15,"V")
      ButtonGadget(#BtnJ,140,WH-35,15,15,"J")
      ButtonGadget(#BtnW,140,WH-20,15,15,"W")
      ButtonGadget(#BtnK,155,WH-35,15,15,"K")
      ButtonGadget(#BtnX,155,WH-20,15,15,"X")
      ButtonGadget(#BtnL,170,WH-35,15,15,"L")
      ButtonGadget(#BtnY,170,WH-20,15,15,"Y")
      ButtonGadget(#BtnM,185,WH-35,15,15,"M")
      ButtonGadget(#BtnZ,185,WH-20,15,15,"Z")
      ButtonGadget(#BtnAll,200,WH-35,30,30,"Tout")
    EndIf
  EndIf
EndProcedure

Open_Window_0()
SetWindowCallback(@CallBack())

Chemin$ = Space(256)
GetCurrentDirectory_(#MAX_PATH,@Chemin$)
If Right(Chemin$,1)<>"\"
  Chemin$+"\"
EndIf

Repeat;{
  Select WaitWindowEvent()
    Case #PB_EventGadget
      If EventGadgetID() >=#BtnA And EventGadgetID()<=#BtnZ
        FillList(GetGadgetText(EventGadgetID()))
      EndIf
      
      Select EventGadgetID()
        Case #Button_Open
          OpenPreferences("PB_Func.ini")
          PreferenceGroup("Chemin")
          P$ = ReadPreferenceString("Chemin", "")
          ClosePreferences()
          If P$ = "":P$ = Chemin$+"PBFunctionListing.txt":EndIf
          File$ = OpenFileRequester("Ouvrir un fichier",P$,"Fichier de fonctions|PBFunctionListing.txt|Fichiers Texte|*.txt|Tout Type|*.*",0)
          LoadFile(0,File$)
          
        Case #Button_Quit : quit = 1
          End
          
        Case #BtnAll
          FillList("")
          
        Case #Editor_0
          If EventType() = #PB_EventType_LeftDoubleClick
            SetGadgetText(#Edit, GetGadgetItemText(#Editor_0,GetGadgetState(#Editor_0),0))
          EndIf
          
        Case #Button_Copy
          If GetGadgetText(#Edit) <> ""
            ClearClipboard()
            SetClipboardText(GetGadgetText(#Edit))
          EndIf
          
        Case #Button_Cancel
          SetGadgetText(#Edit,"")
          
      EndSelect
    Case #PB_EventCloseWindow : quit = 1
  EndSelect
Until quit = 1
End;}
Je suis en train de chercher un moyen de faire afficher l'aide à la bonne page quand on double-clique du bouton droit sur une des fonctions.

J'ai un peu épluché les sources de jaPBe et de l'éditeur de PB, mais c'est pas dans la poche.

Ou alors, je vais peut-être décompiler le fichier et le recompiler, pour
récupérer le fichier d'index créé par MachinWorkShop de MicroMou. :)

Si Fred m'y autorise, évidemment. Fred???

Chris :)

Publié : mar. 30/mars/2004 9:32
par Fred
Vazy vazy.. Je te conseille quand meme de reprendre la routine 'OpenHelp' de l'editeur du pure, ce sera plus simple..

Publié : mar. 30/mars/2004 18:32
par Invité
et la je vais passer pour mon avatar mais

ça va servir a quoi exactement ton truc ?? 8O

Publié : mar. 30/mars/2004 19:38
par Aranoth
excellent, mais bon...y'a l'aide déjà pour ca^^ :wink:

Publié : mer. 31/mars/2004 19:41
par filperj
Mais l'aide ne donne pas la liste des fonctions qui sont dans le dossier "Userlibs"...
Bonne idées Chris :wink:

Publié : ven. 02/avr./2004 15:50
par Chris
La dernière version se trouve ici, avec prise en charge de l'aide.

Pour le moment, il n'y a que les fonctions de PureBasic qui disposent de l'aide, parce que pour les libs utilisateur, au niveau de l'aide, c'est bien souvent tout et n'importe quoi, et encore, quand il y en a une! :mad:

On verra ça plus tard!

Pour l'instant, le prog tourne avec un fichier qui donne le chemin et le nom des pages html du fichier, parce que j'ai pas encore tout compris, en ce qui concerne les routines qui sont dans le source de PureBasic. :oops:

Bon, maintenant, je prends les devant, pour les grincheux!!! (Je ne cite personne, il se reconnaîtront. :roll: )
Le Grincheux a écrit :Le programme devrait charger automatiquement le fichier d'aide
Ben oui, mais quand on a plusieurs versions de PureBasic, le chemin retourné par la fonction qui va bien, est celui de la dernière intallée.
Et si on ne travaille pas avec cette version, et qu'on oublie de changer le chemin, l'aide n'est pas la bonne !
Le Grincheux qui insiste lourdement a écrit :La fenêtre devrait rester au premier plan!
Et si la fenêtre du programme est ouverte au maximum, on ne voit plus l'aide!
Le Grincheux qui va s'en prendre une a écrit :Oui, mais....!
:mad: :evil: :snipersmile:

Chris :)

Publié : mar. 06/avr./2004 18:52
par Anonyme2
Pour le moment, il n'y a que les fonctions de PureBasic qui disposent de l'aide, parce que pour les libs utilisateur, au niveau de l'aide, c'est bien souvent tout et n'importe quoi

:cry: Avec tout le mal que je me donne pour faire l'aide en 2 langues de mes librairies!

Tant pis (Bon, je te pardonne :mrgreen: )

Sinon, il te faudrait un fichier txt pour chaque lib perso ?

Publié : mar. 06/avr./2004 19:05
par Chris
Non, au contraire, un fichier .chm, c'est très bien :)

Mais j'ai trouvé d'autres lib avec du txt, du doc, du rtf, etc...

Et avec ca, je ne peux rien faire, parce que si je veux faire afficher l'aide de l'élément cliqué, il faudrait faire tout un code pour chaque type de fichier.

J'ai déjà pas réussi à trouver une description compréhensible du format .chm pour coder un truc qui créerait automatiquement l'index du fichier d'aide, alors si je dois coder des routines pour tous les formats...

Chris :)

Publié : dim. 09/janv./2005 20:20
par gansta93
Bien pratique ça :-D.
Bravo.

Publié : lun. 10/janv./2005 10:25
par Torp
Slt,

Le lien vers la dernière version est mort...

++