DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 2009
-
9 févr. 2006 à 23:48
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDerniè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")
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 10 févr. 2006 à 02:16
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
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 10 févr. 2006 à 12:36
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 dabord 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
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 10 févr. 2006 à 16:51
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...
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 10 févr. 2006 à 21:51
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.....
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 10 févr. 2006 à 22:23
ç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 ?
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 10 févr. 2006 à 23:35
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
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.