Fichier Ini et ValueExists

Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
- - Dernière réponse : ni69
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
- 11 févr. 2006 à 12:30
'lut bande de Djeunzzzz :)

Et une petite question à propos des fichiers ini. Verifier qu'une section existe : if SectionExists, okay. Verifier qu'une clef existe : if ValueExists, okay.

Seulement voila, vu que le system est capable de coller une valeur par default à une clef si elle est introuvable dans la section demandée, c'est qu'il teste quelque part que la clef existe, et que sinon il doit charger la valeur par défaut.

Ma question est donc : y a t'il un moyen de savoir que le cas de figure s'est présenté, sans avoir a tester l'existence de chaque clef avant de tenter de la lire

Je me pose la question car je me retrouve a faire un prog avec un bon paquet de sections dans son Ini, et un bon paquet de clefs par section, et si je dois tester chacune avant de les lires, beeeeehhhh ca va prendre des heures à charger. ( et ca va me pomper l'air grave d'aligner des lignes et des lignes de test, juste pour remonter un message par section , du genre
"Missing Key In Section Truc, Default Value Loaded")

Yo les Dieux du Delphi, z'avez des idées
Afficher la suite 

10 réponses

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
0
Merci
Salut,
Delphi n'effectue pas un teste pour savoir si la clef où la section existe mais si un il y a un problème lors de la lecture dans ce cas
il revoie la valeur par défaut c'est aussi simple que ça, aucune erreur n'est déclanchée si clef, section où valeur n'existe pas.
Ce qui permet, par exemple si le fichier ini est vide, de poursuivre l'exécution de l'application en toutes circonstances.

Par contre il existes d'autres fonctions qui te permettent de savoir si une section où une valeur existe :
function SectionExists(const Section: string): Boolean;
function ValueExists(const Section, Ident: string): Boolean; virtual;

Tu as également la possibilité de lire toutes les données d'une section en une seul passe :
procedure ReadSection(const Section: string; Strings: TStrings); override;
procedure ReadSections(Strings: TStrings); override;

Et toutes les valeurs d'une section en une seul passe :
procedure ReadSectionValues(const Section: string; Strings: TStrings); override;

Voilà avec tout ça tu as le choix des méthodes et procédures qui te conviendront le mieux.
On peut donc dire que tu as l'embarras du choix où le choix de l'embarras

@+
Cirec
Commenter la réponse de Cirec
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
Mmouais... t'as pas lu les 4ere lignes de mon post touah, nan ?

Charger une valeur par defaut si y a une erreur, pour moi c'est un test.

En fait relis bien mon post quoi
Commenter la réponse de DeltaFX
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
0
Merci
Bon,

alors en premier j'ai bien lu ton post, mais toi tu ne veux rien entendre
je n'ai jamais écris "Charger une valeur par defaut si y a une erreur"
et il serait plus juste de dire que toi tu n'as pas tout lu. Comme dans mon post je n'allait pas dans ta direction tu t'es dis il a tout faux celui-là
Je l'ai bien expliquer donc je ne reviendrai pas dessus (à lire plus haut) . Quand Delphi lit un entier il utilise d’abord un string puisque c'est un fichier texte et ensuite il le convertit en entier

StrToIntDef(LeString, ValeurDefaut)
Donc même si LeString est égal à '' où [mailto:'@!$%&' '@!$%&'] il n'y a pas de teste c'est la fonction StrToIntDef qui s'en charge
Est ce que c'est plus claire comme ça
Et si ce n'est pas le cas il te reste encore l'aide de Delphi
@+
Cirec
Commenter la réponse de Cirec
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
7
0
Merci
DeltaFX, je reprends tes propos : "y a t'il un moyen de savoir que le cas de figure s'est présenté?"
=> ça sous-entend bien de faire un test, non ? Parce-que si tu trouves le moyen de réaliser un test sans en faire un, c'est un peu antithétique...

@+
Nico { http://www.ni69.new.fr/ }

<hr size="2" width="100%">
N'oubliez pas de cliquer sur Réponse Acceptée lorsque la réponse vous convient !
Commenter la réponse de ni69
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
Sortez du cadre de delphi, autour de delphi y a zindows ! La fonction en question elle utilise les ressources de zindoz et puisque cette fonction est capable de détecter que la clef que je lui demande de charger n'existe pas et de charger la valeur par défaut, c'est que quelquepart y a une erreur qui survient, qui est interceptée et traitée. C'est l'interception de cette erreur dans windoz qui m'interresse.

Et non Cirec t'as pas lu, ou t'as pas saisi. Quand j'écris " Verifier qu'une section existe : if SectionExists, okay. Verifier qu'une clef existe : if ValueExists, okay." Si ca, ca signifie pas que je suis au courant de l'existance de ces fonctions..... et toi tu me cite les memes.

Bon enfin, on va pas rester la dessus 107 ans.....
Commenter la réponse de DeltaFX
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
0
Merci
ça n'a rien a voir avec windows regarde les sources si tu les as et tu comprendras peut être mais bon je doute quand même vu tes réponses, tu campes sur tes positions
dans ce cas il te reste une solution : lit l'aide de Delphi peut être que tu voudras accepter ce que tu pourras lire dedans.
ce sont des procédures et fontions internes à Delphi qui gèrent les fichiers Ini si tu refuses de comprendre alors je ne peut rien pour toi, en plus je t'explique comment se déroule ce soit disant contrôle où vérification mais là encore tu ne veux rien entendre et je te signal que l'on se débrouille tous avec, il n'y a que toi qui cherche midi à quatorze heures
Et au passage si je te cite ces fonctions et procédures c'est tout simplement que ce sont les seuls qui sont disponibles et je n'ai jamais dit que tu n'étais pas au courant seulement que c'est à toi de te débrouiller avec, il n'y a pas 36 solutions

pourquoi viens-tu chercher de l'aide ici si tu la contestes ?

Voilà le sujet clot maintenant

@+
Cirec
Commenter la réponse de Cirec
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
Rien à voir avec windoz....

GetPrivateProfileString...... (le coeur de ReadInteger......)

M'enfin ca m'aide pas, y a pas d'evenement zindoz déclenché quand GetPrivateProfileString ne trouve pas la clef.
Commenter la réponse de DeltaFX
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
0
Merci
GetPrivateProfileString(PChar(Section),
PChar(Ident), PChar(Default), Buffer, SizeOf(Buffer), PChar(FFileName)) (c'est le coeur de ReadString) mais bon ça ne change rien
et on en revient au même point si GetPrivateProfileString ne trouve pas c'est Default qui est pris en compte
bon et en dehors de GetPrivateProfileString (qui, autant pour moi, fait partie de Windows ) le reste est interne à Delphi

Mais tu peux faire par Ex :
If ReadString(Section, Ident, 'Defaut') = 'Defaut' Then ShowMessage('Valeur part Defaut chargée');
ce qui est une forme de contrôle où teste

@+
Cirec
Commenter la réponse de Cirec
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24
0
Merci
Je confirme les propos de Cirec au sujet de GetPrivateProfileString : cette fonction fait bien partie de Windows :

Déclaration :
function GetPrivateProfileString(lpAppName, lpKeyName, lpDefault: PChar;
  lpReturnedString: PChar; nSize: DWORD; lpFileName: PChar): DWORD; stdcall;
{$EXTERNALSYM GetPrivateProfileString}

Implémentation :
function GetPrivateProfileString; external kernel32 name 'GetPrivateProfileStringA';


La gestion des exceptions est implémentée dans certains langages. En aucun cas il ne s'agit d'une facilité offerte par Windows.
Il n'y a donc aucun moyen de savoir si la lecture d'une entrée d'un fichier INI a déclenché une erreur ou pas.

Tout ce que dit le Win 32 SDK au sujet de GetPrivatePrifileString et de la valeur retournée est :
Return Values


If the function succeeds, the return value is the number of characters copied to the buffer, not including the terminating null character.
If neither lpAppName nor lpKeyName is NULL and the supplied destination buffer is too small to hold the requested string, the string is truncated and followed by a null character, and the return value is equal to nSize minus one.
If either lpAppName or lpKeyName is NULL and the supplied destination buffer is too small to hold all the strings, the last string is truncated and followed by two null characters. In this case, the return value is equal to nSize minus two.

Il ne te reste plus qu'à écrire une classe dérivant de TCustomIniFile et déclenchant des exceptions en fonction des indications ci-dessus.
Bon courage...



<HR color=#008000>



Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
7
0
Merci
Merci pour cet éclaircissement Delphiprog !

@+
Nico { http://www.ni69.new.fr/ }

<hr size="2" width="100%">
N'oubliez pas de cliquer sur Réponse Acceptée lorsque la réponse vous convient !
Commenter la réponse de ni69