Quand on utilise la fonction SaveFileRequester(), le fichier est sauvegardé en utilisant le nom, tel qu'il est fourni dans la boîte de dialogue, même si aucune extension n'a été indiquée, ou si elle correspond pas à ce qui a été prévu initialement dans les filtres.
Il faut donc, à chaque fois, créer un code qui fasse les vérifications avant la sauvegarde.
C'est le but de cette procédure.
Explication:
Si plusieurs extensions sont contenues dans le filtre, (ex: *.jpg;*.jpeg;*.bmp) et si vous ne spécifiez pas d'extension dans le titre du fichier, ou si vous mettez une extension qui n'est pas contenue dans le filtre, (ex: .png), le fichier sera sauvegardé avec la première extension trouvée dans le filtre choisi (ex: .jpg)
Si vous mettez une extension qui est contenue dans le filtre, le fichier sera sauvegardé avec l'extension que vous avez entrée.
Si vous choisissez "Tous types (*.*)", vous pouvez sauvegarder le fichier avec l'extension que vous voulez. (Ex: .glop), et si vous ne mettez pas d'extension, le fichier n'en aura pas.
Code : Tout sélectionner
Procedure.s SaveFile(Titre$, Defaut$, Filtre$, Position)
;{- Récupération des filtres et des index associés
Structure SAUVEFICHIERS
id.w
Extens.s
EndStructure
NewList Extensions.SAUVEFICHIERS()
Num = 0 : I = 1 : J = 2
Repeat
Typ$ = StringField(Filtre$, I, "|")
Ext$ = StringField(Filtre$, J, "|")
If Ext$
If FindString(Ext$, ";", 1)
Count = CountString(Ext$, ";")
For k = 0 To Count
n$ = StringField(Ext$, k + 1, ";")
AddElement(Extensions())
Extensions()\id = Num
Extensions()\Extens = StringField(n$, 2, ".") ;n$
Next
Else
AddElement(Extensions())
Extensions()\id = Num
Extensions()\Extens = StringField(Ext$, 2, ".") ;Ext$
EndIf
EndIf
I + 2 : J + 2 : Num + 1
Until Ext$ = "" Or Typ$ = ""
;}-
;{- Traitement du nom de fichier
; Résultat de la boite
Full_Path$ = SaveFileRequester(Titre$, Defaut$, Filtre$, Position)
If Full_Path$
; Vérifie que le chemin ne se termine pas par un point
If Right(Full_Path$,1) = "."
Full_Path$ = Left(Full_Path$, Len(Full_Path$)-1)
EndIf
; Récupère les données concernant le fichier
Fic_Chemin$ = GetPathPart(Full_Path$)
Fic_Extension$ = GetExtensionPart(Full_Path$)
Fic_Fichier$ = StringField(GetFilePart(Full_Path$),1,".")
Fic_Index = SelectedFilePattern()
; Vérifie que le choix n'est pas "*.*".
ForEach Extensions()
If Extensions()\id = Fic_Index And Extensions()\Extens = "*"
If Fic_Extension$
ProcedureReturn Fic_Chemin$+Fic_Fichier$+"."+Fic_Extension$
Else
ProcedureReturn Fic_Chemin$+Fic_Fichier$
EndIf
Break
EndIf
Next
ResetList(Extensions())
; Si le choix est différent de "*.*"
ForEach Extensions()
If Extensions()\id = Fic_Index
P = ListIndex(Extensions())
Fic_Def$ = Extensions()\Extens
Break
EndIf
Next
If Fic_Extension$
SelectElement(Extensions(),P)
While Extensions()\id = Fic_Index
If Extensions()\Extens = Fic_Extension$
Extension$ = Extensions()\Extens
Break
Else
Extension$ = Fic_Def$
EndIf
NextElement(Extensions())
Wend
Else
Extension$ = Fic_Def$
EndIf
NomFichier$ = Fic_Chemin$ + Fic_Fichier$ + "." + Extension$
ClearList(Extensions())
ProcedureReturn NomFichier$
Else
ClearList(Extensions())
ProcedureReturn
EndIf ;}
EndProcedure
;-================== Test de la procédure ==================
T$ = "Sauvegarder le fichier"
D$ = "\..\PureBasic\ParDefaut.txt"
F$ = "Fichiers texte (*.txt)|*.txt|Texte enrichi (*.rtf,rtx,rty,rtz)|*.rtf;*.rtx;*.rty;*.rtz|Format Word (*.doc,*.dog,*.dod)|*.doc;*.dog;*.dod|Tous types (*.*)|*.*"
P = 0
CheminFichier$ = SaveFile(T$,D$,F$,P) ; appel de la procédure
If CheminFichier$
MessageRequester("Fichier sauvé", "Le fichier a été sauvé dans:"+Chr(10) + CheminFichier$, #MB_ICONINFORMATION)
If CreateFile(0, CheminFichier$)
CloseFile(0)
EndIf
EndIf