Petit bout de code qui pourra peut être servir

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Aliass
Messages : 23
Inscription : lun. 17/sept./2012 8:09

Petit bout de code qui pourra peut être servir

Message par Aliass »

Bonjour à tous,

J’ai été confronté au problème suivant :
Une application utilise un fichier XML pour son paramétrage (messages d’alerte, menus, etc.).
Si le fichier XML n’est pas disponible, l’application ne peut pas s’initialiser.
Une solution qui m’a semblée intéressante était de créer dans l’application une section data qui contiendrait les informations de base pour créer le fichier XML de paramétrage « par défaut » de l’application.
Le plus facile pour créer cette section data était de partir du fichier XML lui-même.
J’ai donc écrit ce petit bout de code pour générer un fichier dont le contenu est une section data qu’il suffit de recopier dans le code de l’application.
Si l’application détecte que son fichier de paramétrage n’est pas disponible, elle pourra le générer simplement à partir de ces data.

Code : Tout sélectionner

Enumeration #PB_Compiler_EnumerationValue
  #FichierXML
  #FichierData
EndEnumeration

; Choisir le fichier xml à convertir
leFichier$=OpenFileRequester("Choix du fichier XML à Dataïser",GetCurrentDirectory()+"*.xml","Fichier xml|*.xml",0)

; Extraire le chemin du fichier sélectionné
chemin$=GetPathPart(leFichier$)
; Lite le nom du fichier XML source
fichierXML$=GetFilePart(leFichier$)
; Construire le nom du fichier de sortie (Même nom que le fichier XML avec .data comme extension)
fichierData$=ReplaceString(fichierXML$,".xml",".data",#PB_String_NoCase)

; Test si le fichier XML peut être lu
If ReadFile(#FichierXML,leFichier$)
  ; Test si le fichier de sortie peut être créé
  If CreateFile(#FichierData,chemin$+fichierData$)
    ; Ecriture de la première ligne
    WriteStringN(#FichierData,"DataSection")
    
    ; Création de l'étiquette de la zone Data (chaîne "XML" plus nom du fichier source sans l'extension
    WriteStringN(#FichierData,Chr(9)+"XML"+ReplaceString(GetFilePart(leFichier$),".xml",":",#PB_String_NoCase))
    
    ; Boucle de traitement des lignes du fichier XML
    Repeat
      ; Lire la ligne courante dans le fichier source
      ligneXML$=ReadString(#FichierXML)
      
      ; Retourner la chaine de caractères pour la nettoyer (enlever en fin de la ligne les espaces existants et les tabulations)
      ligneXML$=ReverseString(ligneXML$)
      
      ; Si le caractère '>' est trouvé enlever tous les caractéres avant
      If FindString(ligneXML$,">",1)
        ligneXML$=Mid(ligneXML$,FindString(ligneXML$,">",1))
      EndIf
      
      ; Remettre la ligne dans le bon ordre
      ligneXML$=ReverseString(ligneXML$)
      
      ; Remplacer les " par "+chr(34+"
      ligneData$=ReplaceString(ligneXML$,Chr(34),Chr(34)+"+Chr(34)+"+Chr(34))
      
      ; Traitement des tabulation de début de ligne
      compteTab=CountString(ligneXML$,Chr(9))
      If compteTab<>0
        ligneData$=InsertString(ligneData$,Chr(34),compteTab+1)
        ligneData$=ReplaceString(ligneData$,Chr(9),"Chr(9)+")
      Else
        ligneData$=Chr(34)+ligneData$
      EndIf
      
      ; Ajouter l'instruction Data.s et " de fin de ligne
      ligneData$="Data.s "+ligneData$+Chr(34)
      
      ; Enregistre la ligne dans le fichier 
      WriteStringN(#FichierData,Chr(9)+ligneData$)
    Until Eof(#FichierXML)
    
    ; Marquer la fin des datas
    WriteStringN(#FichierData,Chr(9)+"Data.s "+Chr(34)+"~Fin~"+Chr(34))
    
    ; Fermer la section data en fin de fichier
    WriteStringN(#FichierData,"EndDataSection")
    
    ; Fermer le fichier de sortie
    CloseFile(#FichierData)
  Else
    ; Message d'erreur si le fichier de sortie n'a pu être créé
    MessageRequester("Erreur","Impossible de créer le fichier '"+fichierData$+"'",#PB_MessageRequester_Ok)
  EndIf
  
  ; Fermer le ficher XML
  CloseFile(#FichierXML)
Else
  ; Message d'erreur si le fichier XML n'a pu être lu
  MessageRequester("Erreur","Impossible d'ouvrir le fichier '"+fichierXML$+"'",#PB_MessageRequester_Ok)
EndIf
Si vous avez l'occasion de tester, je suis preneur des retours...
Dernière modification par Aliass le mer. 31/oct./2012 11:46, modifié 1 fois.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Petit bout de code qui pourra peut être servir

Message par Golfy »

Bonjour Aliass

je ne connais pas suffisamment XML pour juger de ton code mais l'énoncé me rappelle des besoins sur les fichiers de préférences :
Jettes un oeil sur les fonctions OpenPreferences(), ReadPreferencesXXXX(), etc.
Cela peut te faciliter une partie du travail :roll: (ou peut-être n'ai-je pas compris ce dont tu as besoin :oops: )
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Aliass
Messages : 23
Inscription : lun. 17/sept./2012 8:09

Re: Petit bout de code qui pourra peut être servir

Message par Aliass »

Merci pour cette information, je ne connaissais par la bibliothèque "Preference".
Toutefois, je crois que l'objectif n'est pas le même.
"Preference" semble idéale pour initialiser un environnement.

Un fichier XML peut être utiliser pour initialiser les texte affichés dans l'application dans la langue qui aura été choisie (et sauvegardée avec la bibliothèque Preference)
Le fichier XML pourra être complété à la demande en recopiant le bloc de base et en adaptant les textes à une nouvelle langue.
Exemple d'un bloc de base :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?>
<Langues>
	<Region Langue="Français">
		<Messages>
			<Message Index="ProbConf">
				<TexteFenetre>Info</TexteFenetre>
				<Texte>Texte de la boite d'alerte</Texte>
			</Message>
			<Message Index="Fin">
				<TexteFenetre>Confirmation</TexteFenetre>
				<Texte>Etes-vous sure de vouloir quitter l'application ?</Texte>
			</Message>
		</Messages>
		<Fenetres>
			<Fenetre Nom="Fenetre1">Titre de la fenêtre 1</Fenetre>
			<Fenetre Nom="Fenetre2">Titre de la fenêtre 2</Fenetre>
		</Fenetres>
		<Menus>
			<Menu>
				<Titre>Menu 1</Titre>
				<Entree>Entrée 1</Entree>
				<Entree>Entrée 2</Entree>
			</Menu>
			<Menu>
				<Titre>Menu 2</Titre>
				<Entree>Entrée 1</Entree>
				<Entree>Entrée 2</Entree>
				<Entree>-</Entree>
				<Entree>Entrée 3</Entree>
			</Menu>
		</Menus>
	</Region>
</Langues>
Fichier enrichi d'une localisation (désolé pour la traduction)

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?>
<Langues>
	<Region Langue="Français">
		<Messages>
			<Message Index="ProbConf">
				<TexteFenetre>Info</TexteFenetre>
				<Texte>Texte de la boite d'alerte</Texte>
			</Message>
			<Message Index="Fin">
				<TexteFenetre>Confirmation</TexteFenetre>
				<Texte>Etes-vous sure de vouloir quitter l'application ?</Texte>
			</Message>
		</Messages>
		<Fenetres>
			<Fenetre Nom="Fenetre1">Titre de la fenêtre 1</Fenetre>
			<Fenetre Nom="Fenetre2">Titre de la fenêtre 2</Fenetre>
		</Fenetres>
		<Menus>
			<Menu>
				<Titre>Menu 1</Titre>
				<Entree>Entrée 1</Entree>
				<Entree>Entrée 2</Entree>
			</Menu>
			<Menu>
				<Titre>Menu 2</Titre>
				<Entree>Entrée 1</Entree>
				<Entree>Entrée 2</Entree>
				<Entree>-</Entree>
				<Entree>Entrée 3</Entree>
			</Menu>
		</Menus>
	</Region>
	<Region Langue="English">
		<Messages>
			<Message Index="ProbConf">
				<TexteFenetre>Info</TexteFenetre>
				<Texte>Text of alert box</Texte>
			</Message>
			<Message Index="Fin">
				<TexteFenetre>Confirmation</TexteFenetre>
				<Texte>Are you sure to want to leave the application?</Texte>
			</Message>
		</Messages>
		<Fenetres>
			<Fenetre Nom="Fenetre1">Title of the window 1</Fenetre>
			<Fenetre Nom="Fenetre2">Title of the window 2</Fenetre>
		</Fenetres>
		<Menus>
			<Menu>
				<Titre>Menu 1</Titre>
				<Entree>Entry 1</Entree>
				<Entree>Entry 2</Entree>
			</Menu>
			<Menu>
				<Titre>Menu 2</Titre>
				<Entree>Entry 1</Entree>
				<Entree>Entry 2</Entree>
				<Entree>-</Entree>
				<Entree>Entry 3</Entree>
			</Menu>
		</Menus>
	</Region>
</Langues>
Cela permettra de proposer autant de langues qu'il y aura eu d'adaptation des textes de base.

L'idée initiale du petit bout de code était de pouvoir stocker dans la section data les éléments nécessaires pour recréer le fichier XML de base s'il venait à disparaitre ce qui empêcherait le lancement de l'application.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Petit bout de code qui pourra peut être servir

Message par Ar-S »

Aliass a écrit :Merci pour cette information, je ne connaissais par la bibliothèque "Preference".
Toutefois, je crois que l'objectif n'est pas le même.
"Preference" semble idéale pour initialiser un environnement.

Un fichier XML peut être utiliser pour initialiser les texte affichés dans l'application dans la langue qui aura été choisie (et sauvegardée avec la bibliothèque Preference)
Le fichier XML pourra être complété à la demande en recopiant le bloc de base et en adaptant les textes à une nouvelle langue.
Exemple d'un bloc de base :
(...)
Cela permettra de proposer autant de langues qu'il y aura eu d'adaptation des textes de base.

L'idée initiale du petit bout de code était de pouvoir stocker dans la section data les éléments nécessaires pour recréer le fichier XML de base s'il venait à disparaitre ce qui empêcherait le lancement de l'application.
La bibliothèque préférence peut tout à faire servir à cela. Idem pour ce qui est de "recopier le bloc de base..."

Code : Tout sélectionner

; Creation du fichier Pref avec 2 langues
If CreatePreferences("Preferences.prefs")
  PreferenceGroup("FR")
  WritePreferenceString("WELCOME", "Bienvenue")
  WritePreferenceString("ABOUT", "A propos")
  
  PreferenceGroup("UK")
  WritePreferenceString("WELCOME", "Welcome")
  WritePreferenceString("ABOUT", "About")
  
  ClosePreferences()
EndIf


; Lecture des prefs



OpenPreferences("Preferences.prefs")
PreferenceGroup("FR") ; On choisit la langue FR
Debug ReadPreferenceString("WELCOME", "")
Debug ReadPreferenceString("ABOUT", "")

PreferenceGroup("UK") ; On choisit la langue UK
Debug ReadPreferenceString("WELCOME", "")
Debug ReadPreferenceString("ABOUT", "")

ClosePreferences()
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Petit bout de code qui pourra peut être servir

Message par Golfy »

Comme l'indique Ar-S, bien que ce ne soit pas du code XML, les fichiers gérés par cette bibliothèque ont une structure précise (et des sections), un peu comme les fichiers "WIN.INI" ou les fichiers INI sous Windows :

Code : Tout sélectionner

[General]
Server = 192.168.1.1
Port = 8138

[FR]
Welcome = Bienvenue
Cancel = Annulation
...

[UK]
Welcome = Welcome
Cancel = Cancel
...
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Répondre