salut tout le monde! voici un petit UDF (basé sur marshal.au3) qui propose de créer des variables sauvegardé c'est a dire qui restent les même entre deux lancement avec la valeur par défaut et le toutim, vous avez un exemple d'utilisation vers la fin
attention, les variables sont typé et ont une taille défini, pour le type, voir les dllstruct et pour la taille utilisez sizeof
les savedvariables sont toujours créé dans le global scope
vous pouvez y stocker des données non autorisé puisque c'est utilisable comme des variables normal mais ne le faites pas sous peine de plantage ou bien de sauvegarde corrompu
utilisez saveall() dans la case (ou la fonction) associé à $GUI_EVENT_CLOSE pour sauvegarder à chaque fermeture
les variables sont automatiquement récupéré ou bien initialisé à la valeur par défaut voulue (si le fichier de sauvegarde n'existe pas)
pensez à utiliser les wide char (wchar) si vous voulez stocker du texte contenant des accents par exemple (au prix d'un doublement de la taille en mémoire donc si vous êtes sûr utilisez les char plus léger)
de même pour les nombre, les double sont souvent superflu, préférez le float, pour les petit entier un byte est souvent suffisant (pour stocker l'age d'une personne qui ne dépasse pas 255 que je sache) voir un short dans certain cas, le int et le int64 sont plus lourd et rarement vraiment utiliser à leur plein potentiel laissant des zéros inutile dans la sauvegarde
le but de tout ça est d'économiser de la place sur le disque sans risquer les problèmes, si votre script compte 100 personnes sauvegardé par leur age avec un int, et leur nom avec un wchar[100] votre fichier prend 20ko de mémoire contre 5ko si vous préférez l'utilisation de wchar[25] et de byte en sachant que les personnes ne peuvent avoir plus de 255 ans (ou -4 ans) et que les prénom de 100 caractère ben heu c'est pas vraiment courant (déjà que 25 c'est beaucoup)
ha et enfin j'y pense, autoit stock ses booléens sur 8 bit donc si vous en avez un grand nombre, faites des manip' vous même pour en stocker 8 sur un byte ce qui est plus économe (j'entend par là faire un truc type $bin = 01100111b et utiliser bitand($bin, 01000000b) pour tester le second bit par exemple)
► Afficher le textesavedvariable.au3
Code : Tout sélectionner
#include <marshal.au3>
; #FUNCTION# ====================================================================================================================
; Name...........: SavedVariable
; Description ...: créer une variable qui sera sauvegardé
; Syntax.........: SavedVariable($name, $datatype, $len, $value)
; Parameters ....: $name: nom de variable autoit classique sans le "$"
; $datatype: les variables sauvegardé sont typé !!!
; $len: longueur du type de donnée utilisé
; $value: valeur d'innitialisation si la variable n'existe pas encore
;
; Return values .: Success - rien
; Failure - rien
; Author ........: Poke123
; Remarks .......: pour accéder au contenu d'une savedvariable, faite le comme pour une variable classique
; ===============================================================================================================================
func SavedVariable($name, $datatype, $len, $value = "")
if not IsDeclared("savedVairableMarshal") then global $savedVairableMarshal = marshal("SavedVariable.msv")
if FileExists("SavedVariable.msv") then $value = marshalread($savedVairableMarshal, $datatype, $len)
sv_push($name & "|" & $datatype & "|" & $len)
Assign($name,$value, 2)
EndFunc
; #FUNCTION# ====================================================================================================================
; Name...........: SaveAll
; Description ...: sauvegarde toute les savedVariable
; Syntax.........: SaveAll()
; Return values .: Success - rien
; Failure - rien
; Author ........: Poke123
; Remarks .......: aucune
; ===============================================================================================================================
func SaveAll()
FileDelete("SavedVariable.msv")
FileWrite("SavedVariable.msv","")
if not IsDeclared("savedVairableMarshal") then global $savedVairableMarshal = marshal("SavedVariable.msv")
for $i = 1 to sv_upile()
$v = StringSplit(sv_Pileread($i), "|")
MarshalWrite($savedVairableMarshal, $v[2], $v[3], eval($v[1]))
Next
EndFunc
; #FUNCTION# ====================================================================================================================
; Name...........: Sizeof
; Description ...: retourne la taille d'un type de donnée
; Syntax.........: Sizeof($type)
; Return values .: Success - la taille
; Failure - -1
; Author ........: Poke123
; Remarks .......: sizeof("int[5]") (par exemple) fonctionne
; ===============================================================================================================================
func SizeOf($type)
switch StringRegExpReplace($type, "\[(.*?)\]","")
case "int", "float", "HANDLE", "HWND", "ULONG", "UINT", "BOOL", "long", "DWORD"
$single = 4
case "WCHAR", "short", "USHORT", "WORD"
$single = 2
case "BYTE", "BOOLEAN", "char"
$single = 1
case "double", "UINT64", "INT64"
$single = 8
case Else
return SetError(1,0,-1)
EndSwitch
if StringInStr($type, "[") and StringInStr($type, "]") then
$a = _StringBetween($type, "[", "]")
$single *= $a[0]
EndIf
return $single
EndFunc
func SavedVariableExemple()
;création des variables sauvegardé
SavedVariable("nom", "char[10]", 10, "georges")
SavedVariable("age", "int", 4, 45)
SavedVariable("gain_mensuel", "float", 4, 1564.14)
;affichage de leurs contenu
ConsoleWrite("nom: "&$nom&@crlf&"age: "&$age&@crlf&"gain mensuel: "&$gain_mensuel&@crlf)
;contenu binaire du fichier
$f = FileOpen("SavedVariable.msv", 16)
ConsoleWrite("contenue binaire du fichier:"&@crlf&FileRead($f)&@crlf)
FileClose($f)
;modification pour le prochain lancement
$nom = "roberta"
$age = 41
$gain_mensuel = 2142.34
SaveAll()
EndFunc
#region pile spécial pour les saved variables (ne pas utiliser !)
global $sv_ASM_Like_Pile[1] = [0]
func sv_Push($val)
redim $sv_ASM_Like_Pile[ubound($sv_ASM_Like_Pile) + 1]
$sv_ASM_Like_Pile[0] += 1
$sv_ASM_Like_Pile[ubound($sv_ASM_Like_Pile) - 1] = $val
EndFunc
func sv_PileRead($offset = - 1)
if ubound($sv_ASM_Like_Pile) < $offset then return 0
if $offset <= 0 then return $sv_ASM_Like_Pile[ubound($sv_ASM_Like_Pile) - 1]
return $sv_ASM_Like_Pile[$offset]
EndFunc
func sv_Upile()
return $sv_ASM_Like_Pile[0]
EndFunc
#endregion