Problemes fichier ini [Résolu]

elt93 46 Messages postés jeudi 13 mars 2008Date d'inscription 9 février 2009 Dernière intervention - 4 mai 2008 à 00:01 - Dernière réponse : elt93 46 Messages postés jeudi 13 mars 2008Date d'inscription 9 février 2009 Dernière intervention
- 4 mai 2008 à 12:40
Bonjour,
Je rencontre un probleme dans mon code que je n'arrive pas à résoudre, lors de l'écriture d'un fichier ini, j'ai un message d'ereur me disant que je fais une "violation d'accés à l'adresse ....... dans le module .....", voici le code :
var
f : Tinifile;
pni: string;
po: string;
nii: string;
nff: string;
n11: string;
n22: string;
calc: string;
calc2: string;
calc3: string;
begin
if not DirectoryExists('c:\Program Files\Elcalculator\save\')
then CreateDir('c:\Program Files\Elcalculator\save\') ;
pni:= nini.Text;
po:= p.Text;
nii:= ni.Text;
nff:= nf.Text;
n11:= n1.Text;
n22:= n2.Text;
calc:= cone.Text;
calc3:= c3.Text;
f.Create('c:\Program Files\Elcalculator\save\'+Edit1.Text+'.ini');
f.WriteString('pni', 'pni', pni);
f.WriteString('po', 'po', po);
f.WriteString('nii', 'nii', nii);
f.WriteString('nff', 'nff', nff);
f.WriteString('n11', 'n11', n11);
f.WriteString('n22', 'n22', n22);
f.WriteString('calc', 'calc', calc);
f.WriteString('calc2', 'calc2', calc2);
f.WriteString('calc3', 'calc3', calc3);
f.Free;
panel5.Hide;

end;
 Merci d'avance pour votre aide
Afficher la suite 

7 réponses

Répondre au sujet
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 4 mai 2008 à 11:52
+3
Utile
Si le debugger te surligne la ligne WriteString('po', 'po', po);
c'est que le problème vient en fait de la ligne du dessus, c'est à dire la première d'opération d'écriture : WriteString('pni', 'pni', pni);
Il ne faut pas mettre de " " dans le nom du fichier, c'est une erreur de ma part désolé.

Attention, ne met jamais deux free sur le même objet qui risquent de s'exécuter successivement, car c'est violation d'accès assurée en cas d'erreur sur le code qui suit le premier (ici par exemple si panel5.Hide; renvoie une erreur - oui c'est possible ! Il suffit d'une mauvaise organisation de fenêtres modales ou autres bizarreries...).

Même si ce cas d'erreur semble ici très rare, cela dépend totaement du code suivant le premier free, il vaut donc mieux être prudent et prendre l'habitude d'imbriquer les deux blocs try...except et try...finally

  with TIniFile.Create( ExtractFilePath(Application.ExeName) + 'save\' + Edit1.Text + '.ini') do
  try
    try
      WriteString('pni', 'pni', pni);
      WriteString('po', 'po', po);
      WriteString('nii', 'nii', nii);
      WriteString('nff', 'nff', nff);
      WriteString('n11', 'n11', n11);
      WriteString('n22', 'n22', n22);
      WriteString('calc', 'calc', calc);
      WriteString('calc2', 'calc2', calc2);
      WriteString('calc3', 'calc3', calc3);
    except
      ShowMessage('Impossible de sauver, verifiez la validité du nom de fichier');
    end;
  finally
    Free;
  end;

@+
Nico { http://www.ni69.info }
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ni69
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 4 mai 2008 à 12:01
+3
Utile
reprend le code de F0xi au lieu de passer par des variables inutiles:

  with TIniFile.Create(Path+Edit1.Text+'.ini') do
  try
    WriteString('pni', 'pni', nini.Text);
    WriteString('po', 'po', p.Text);
    WriteString('nii', 'nii', ni.Text);
    WriteString('nff', 'nff', nf.Text);
    WriteString('n11', 'n11', n1.Text);
    WriteString('n22', 'n22', n2.Text);
    WriteString('calc', 'calc', calc);
    WriteString('calc2', 'calc2', cone.Text);
    WriteString('calc3', 'calc3', c3.Text);
  finally
    Free;
  end;

 
@+
Cirec

<hr siz="" />
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 4 mai 2008 à 01:05
0
Utile
Coucou,
Pour la prochaine fois, merci de préciser sur quelle ligne pointe le debugger lorsque tu rencontres une erreur !

Au lieu de :
f.Create('c:\Program Files\Elcalculator\save\'+Edit1.Text+'.ini');
Mets plutôt :
FichierIni:= TIniFile.Create('"c:\Program Files\Elcalculator\save\'+Edit1.Text+'.ini"');

Conseil : Evite de coder en dur les chemins d'accès comme 'C:\Program Files\', il vaut mieux les retrouver à partir des paramètres systèmes (voir de nombreux posts sur ce site qui parlent de cela).
Un autre conseil : vérifie quelque-part que Edit1.Text contient un nom de fichier valide, ou bien encadre ce code d'un gestionnaire d'exception (try ... except ... end)... On est jamais trop prudent !

@+
Nico { http://www.ni69.info }
Commenter la réponse de ni69
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 4 mai 2008 à 01:15
0
Utile
var
  path : string;
begin
  path := EctractFilePath(ParamStr(0))+'save\';
  if not DirectoryExists(Path) then
    CreateDir(Path);

  with TIniFile.Create(Path+Edit1.Text+'.ini') do
  try
    WriteString('pni', 'pni', nini.Text);
    WriteString('po', 'po', p.Text);
    WriteString('nii', 'nii', ni.Text);
    WriteString('nff', 'nff', nf.Text);
    WriteString('n11', 'n11', n1.Text);
    WriteString('n22', 'n22', n2.Text);
    WriteString('calc', 'calc', calc);
    WriteString('calc2', 'calc2', cone.Text);
    WriteString('calc3', 'calc3', c3.Text);
  finally
    Free;
  end;

  panel5.Hide;
end;






<hr size="2" width="100%" />
Commenter la réponse de f0xi
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 4 mai 2008 à 01:25
0
Utile
Instruction à privilégier à CreateDir :
ForceDirectories( Dir: string );
qui à l'avantage de créer l'arborescence manquante complète, contrairement à CreateDir qui ne crée que le répertoire de plus haut niveau.

Par exemple, si "C:\Dossier1" n'existe pas, CreateDir n'aura aucun effet et renverra une erreur, alors que ForceDirectories effectuera l'action escomptée :

CreateDir( 'C:\Dossier1\Dossier2' );  // Erreur
ForceDirectories( 'C:\Dossier1\Dossier2' ); // Tout marche bien !

@+
Nico { http://www.ni69.info }
Commenter la réponse de ni69
elt93 46 Messages postés jeudi 13 mars 2008Date d'inscription 9 février 2009 Dernière intervention - 4 mai 2008 à 10:51
0
Utile
Merci beaucoup pour votre aide,
J'ai fait ce que vous m'avez dit et maintenant mon code est comme ceci (j'ai mis le forcedirectories dans Form.Create) : with TIniFile.Create('"C:\Program Files\Elcalculator\save\'+Edit1.Text+'.ini"') do
try
WriteString('pni', 'pni', pni);
WriteString('po', 'po', po);
WriteString('nii', 'nii', nii);
WriteString('nff', 'nff', nff);
WriteString('n11', 'n11', n11);
WriteString('n22', 'n22', n22);
WriteString('calc', 'calc', calc);
WriteString('calc2', 'calc2', calc2);
WriteString('calc3', 'calc3', calc3);
Free;
panel5.Hide;
except
ShowMessage('Impossible de sauver, verifiez la validité du nom de fichier') ;
f.Free;
panel5.Hide;
end;

end;

Mais maintenant le message d'erreur est "impossible d'ecrire dans "C:\Program Files\Elcalculator\save\'+Edit1.Text+'.ini" et le debogueur me surligne la ligne :
WriteString('po', 'po', po);
Merci encore pour votre aide.
Commenter la réponse de elt93
elt93 46 Messages postés jeudi 13 mars 2008Date d'inscription 9 février 2009 Dernière intervention - 4 mai 2008 à 12:40
0
Utile
Ok merci beaucoup à tous !
Commenter la réponse de elt93

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.