IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 124, nombre de questions : 929, dernière mise à jour : 31 décembre 2023  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).

Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.

L'équipe Delphi de Developpez.com.

SommaireSystèmeFichiers .INI (14)
précédent sommaire suivant
 

L'accès aux fichiers ini est effectué par l'objet TIniFile situé dans l'unité IniFiles.
Le constructeur Create ouvre un fichier ini ou le crée s'il n'existe pas. Un fichier INI est un fichier ASCII structuré de la maniére suivante, il contient un ou plusieurs nom de section notée entre caractère '['. Chaque section contient des noms de clé et chaque clé possède une valeur.

Code other : Sélectionner tout
1
2
3
4
5
6
7
[Section] 
NomDeClé=Valeur 
  
[Section2] 
NomDeClé1=Valeur 
NomDeClé2=Valeur 
...
Il n'y a aucun contrôle sur la structure de type .ini on peut donc ouvrir un fichier texte quelconque.
La lecture de nom de clé et de nom de section renvoyant un résultat aléatoire, la plupart du temps une valeur nulle. L'écriture par contre reste possible.
Code delphi : Sélectionner tout
1
2
3
4
5
var 
  DelphiIni: TIniFile; 
begin 
  DelphiIni := TIniFile.Create('C:\Temp\Test.ini');  
end;
Note : sous Windows Me/98/95 le système met en cache une version du fichier Win.ini afin d'augmenter les performances.
Vous pourrez donc être amener à appelez la méhode UpdateFile pour nettoyer les lectures et les écritures du tampon depuis et vers le fichier INI sur disque. UpdateFile est utile sous Windows Me/98/95, mais n'a aucun effet sous Windows NT car NT ne met pas de lectures et d'écritures de fichier INI dans un tampon.

Mis à jour le 14 janvier 2014 Laurent Dardenne

On utilise après la création d'un fichier .Ini les différentes procédures Writexxxx.
Il existe une méthode par type de donnée supportées dans un fichier ini, qui sont aux nombre de 7 :

  • WriteString pour les clés de type String.
  • WriteBool pour les clés de type Boolean.
  • WriteInteger pour les clés de type Integer.
  • WriteFloat pour les clés de type Flottant.
  • WriteDateTime pour les clés de type DateTime.
  • WriteDate pour les clés de type Date.
  • WriteTime pour les clés de type Time.

Ces méthodes créent ou mettent à jour la valeur d'une clé dans une section. Leurs déclarations sont identique excepté le type du paramètre value
Code delphi : Sélectionner tout
procedure WriteString(const Section, Ident, Value: String);
  • Section identifie la section du fichier qui contient la clé à écrire.
  • Ident est le nom de la clé pour laquelle il faut affecter une valeur.
  • Value est la valeur à écrire. (Son type est déterminé par la fin du nom de méthode)

Dans cet exemple nous créons un fichier .ini
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Var FileIni : TIniFile; 
  
    Chaine   : String; 
    Etat     : Boolean; 
    Position : Integer; 
    Flottant : Double; 
    SysDateTime  : TDateTime; 
  
begin 
 FileIni:=TIniFile.Create('C:\Temp\Test.ini'); // Ouvre ou crée le fichier 
 Try 
  // Initialise les différentes valeurs pour les nouvelles clés 
  Chaine   :='Chaine de caractére'; 
  Etat     :=True; 
  Position :=2004; 
  Flottant := Sqr(3.14); 
  SysDateTime :=Now; 
  
   // Crée ou met à jour les valeurs 
  FileIni.WriteString('Section Chaine', 'NomClé String', Chaine); 
  FileIni.WriteBool('Section Boolean', 'NomClé Boolean', Etat); 
  FileIni.WriteInteger('Section Integer', 'NomClé Integer',Position); 
  FileIni.WriteFloat('Section Flottant', 'NomClé Flottante',Flottant); 
  FileIni.WriteDateTime('Section DateTime', 'NomClé DateTime',SysDateTime); 
  FileIni.WriteDate('Section Date', 'NomClé Date',SysDateTime); 
  FileIni.WriteTime('Section Time', 'NomClé Time',SysDateTime); 
 finally 
  FileIni.Free ; 
 end ; 
end;
Le résultat correspondant à ceci, sauf pour les clés de type Date :
Code other : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Section Chaine] 
NomClé String=Chaine de caractére 
  
[Section Boolean] 
NomClé Boolean=1 
  
[Section Integer] 
NomClé Integer=2004 
  
[Section Flottant] 
NomClé Flottante=9,8596 
  
[Section DateTime] 
NomClé DateTime=05/06/2004 17:39:17 
  
[Section Date] 
NomClé Date=05/06/2004 
  
[Section Time] 
NomClé Time=17:39:17

Mis à jour le 27 avril 2016 Laurent Dardenne

On utilise après l'ouverture d'un fichier .Ini les différentes procédures Readxxxx.
Il existe une méthode par type de donnée supportées dans un fichier ini, qui sont aux nombre de 7 :

  • ReadString pour les clés de type String.
  • ReadBool pour les clés de type Boolean.
  • ReadInteger pour les clés de type Integer.
  • ReadFloat pour les clés de type Flottant.
  • ReadDateTime pour les clés de type DateTime.
  • ReadDate pour les clés de type Date.
  • ReadTime pour les clés de type Time.

Ces méthodes lisent la valeur d'une clé d'une section particulière.
Leurs déclarations sont identique excepté le type du paramètre Default et leurs valeur de retour
Code delphi : Sélectionner tout
function ReadString(const Section, Ident, Default: string): string;
  • Section identifie la section du fichier qui contient la clé voulue.
  • Ident est le nom de la clé dont on doit lire la valeur.
  • Default est la valeur à renvoyer dans les situations suivantes :
    • Si la section n'existe pas.
    • Si la clé n'existe pas.
    • Si aucune valeur de donnée n'est affectée à la clé.
  • Le type de donné du paramètre Default est déterminé par la fin du nom de méthode utilisée.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Var FileIni  : TIniFile; 
  
    Chaine   : String; 
    Etat     : Boolean; 
    Position : Integer; 
    Flottant : Double; 
    SysDateTime : TDateTime; 
    SysDate : TDateTime; 
    SysTime : TDateTime; 
  
begin 
 FileIni:=TIniFile.Create('C:\Temp\Test.ini'); // Ouvre ou crée le fichier 
 try 
   // Lit les informations, si la clé n'existe pas on utilise la valeur par défaut 
  Chaine:=FileIni.ReadString('Section Chaine', 'NomClé Chaine', 'Valeur par Défaut' ); 
  Etat:=FileIni.ReadBool('Section Boolean', 'NomClé Boolean', True); 
  Position:=FileIni.ReadInteger('Section Integer', 'NomClé Integer',256); 
  Flottant:=FileIni.ReadFloat('Section Flottant', 'NomClé Flottante',3.14); 
  SysDateTime:=FileIni.ReadDateTime('Section DateTime', 'NomClé DateTime',Now); 
  SysDate:=FileIni.ReadDate('Section Date', 'NomClé Date',Now); 
  SysTime:=FileIni.ReadTime('Section Time', 'NomClé Time',Now); 
  
 finally 
  FileIni.Free ; 
 end ; 
end;

Mis à jour le 27 avril 2016 Laurent Dardenne

La méthode DeleteKey efface la valeur de donnée associée à une entrée du fichier INI.

Code delphi : Sélectionner tout
procedure DeleteKey(const Section, Ident: String);
Section est une chaîne contenant le nom d'une section de fichier INI. Ident une chaîne contenant le nom de la clé à laquelle il faut affecter la valeur nil.

Remarque : Les tentatives d'effacement d'une valeur de donnée dans une section qui n'existe pas, ou d'effacement d'une donnée pour une clé qui n'existe pas, ne constituent pas des erreurs. Dans ces situations, DeleteKey crée la section et la clé, et affecte à cette dernière une valeur initiale vide.

Mis à jour le 13 janvier 2014 Laurent Dardenne

La méthode EraseSection efface la valeur de donnée associée à une entrée du fichier INI.

Code delphi : Sélectionner tout
procedure EraseSection(const Section: String);

Mis à jour le 13 janvier 2014 Laurent Dardenne

Le TColor est en fait un Integer, il donc donc possible de d'écrire et lire une valeur de type TColor avec les méthodes WriteInteger et ReadInteger.

Mis à jour le 13 janvier 2014 Nono40

La méthode ValueExists permet de déterminer si une clé existe ou non dans le fichier INI.

Code delphi : Sélectionner tout
function ValueExists (const Section, Ident: String): Boolean;
  • Section spécifie la section du fichier INI dans laquelle rechercher la clé.
  • Ident spécifie le nom de la clé à rechercher.

Mis à jour le 13 janvier 2014 Laurent Dardenne

La méthode SectionExists permet de déterminer si une section existe ou non dans le fichier INI.

Code delphi : Sélectionner tout
function SectionExists (const Section: String): Boolean;
Section indique la section de fichier INI dont SectionExists détermine l'existence.

Mis à jour le 13 janvier 2014 Laurent Dardenne

La méthode ReadSection lit tous les noms de clés à partir d'une section particulière d'un fichier INI dans une liste de chaînes.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Var FileIni  : TIniFile; 
  
begin 
 FileIni:=TIniFile.Create('C:\Temp\Test.ini'); // Ouvre ou crée le fichier 
 try 
    // Lit tous les noms de clés à partir d'une section particulière 
    // d'un fichier INI dans une liste de chaînes. 
  FileIni.ReadSection('Section Chaine',Memo1.Lines); // RAZ de la TStrings 
  Memo1.Lines.Add('Lecture d''une section effectué'); 
  
 finally 
  FileIni.Free ; 
 end ; 
end;
Remarque : Cette méthode effectue un appel la méthode Clear de l'objet TStrings utilisé.

Mis à jour le 27 avril 2016 Laurent Dardenne

La méthode ReadSections lit les noms de toutes les sections d'un fichier INI et les stocke dans une liste de chaînes.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Var FileIni  : TIniFile; 
  
begin 
 FileIni:=TIniFile.Create('C:\Temp\Test.ini'); // Ouvre ou crée le fichier 
 try 
    // Lit les noms de toutes les sections d'un fichier INI et 
    // les stocke dans une liste de chaînes. 
  Memo1.Lines.Add('Lecture des sections dans la liste Section'); 
  FileIni.ReadSections(Memo1.Lines); 
  
 finally 
  FileIni.Free ; 
 end ; 
end;

Mis à jour le 27 avril 2016 Laurent Dardenne

La méthode ReadSectionValues lit les valeurs de toutes les clés d'une section d'un fichier INI et les stocke dans une liste de chaînes.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Var FileIni  : TIniFile; 
  
begin 
 FileIni:=TIniFile.Create('C:\Temp\Test.ini'); // Ouvre ou crée le fichier 
 try 
    // Lit les valeurs de toutes les clés d'une section d'un fichier INI et 
    // les stocke dans une liste de chaînes. 
  Memo1.Lines.Add('Lecture des valeurs des Section dans la liste valeur'); 
  FileIni.ReadSectionValues('Section Chaine',Memo1.Lines); 
  
 finally 
  FileIni.Free ; 
 end ; 
end;

Mis à jour le 27 avril 2016 Laurent Dardenne

On combine l'appel des méthodes ReadSections et ReadSectionValues.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Var FileIni  : TIniFile; 
    Compteur : Integer; 
    Section,Valeurs  : TStringList; 
  
begin 
 FileIni:=TIniFile.Create('C:\Temp\Test.ini'); // Ouvre ou crée le fichier 
 try 
  Section:=TStringList.Create; 
  Valeurs:=TStringList.Create;  
  FileIni.ReadSections(Section); 
  
  For Compteur:=0 to Section.Count-1 do 
   begin 
       // Lecture des valeurs de la section Section[Compteur] 
      Memo1.Lines.Add(#13#10+'['+Section[Compteur]+']'); 
      FileIni.ReadSectionValues(Section[Compteur],Valeurs); 
      Memo1.Lines.AddStrings(Valeurs); 
   end; 
  
 finally 
  Valeurs.Free; 
  Section.Free; 
  FileIni.Free ; 
 end ; 
end;

Mis à jour le 27 avril 2016 Laurent Dardenne

À l'origine les fichiers ini se basent sur l'unicité des noms de clés. Si on souhaite utiliser la duplication de noms de clés mais portant des valeurs différentes, on doit procéder de la sorte.

Note :
Cette unité référence la classe TSjrdStrings, disponible dans le paquet SjrdUnits.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
uses 
  SjrdLists, ...; 
  
var 
  Options : record 
    Option1 : TStringList; 
    Option2 : integer; 
    Option3 : TStringList; 
  end; 
  
... 
  
procedure LitINI; 
var Fichier : TSjrdStrings; 
    Section : TSjrdStrings; 
    I, J : integer; 
begin 
  Fichier := TSjrdStrings.CreateFromFile('Options.ini'); 
  try 
    Section := TSjrdStrings.Create; 
    try 
      Fichier.Append('[FinFichier]'); 
  
       // première section 
      Options.Option1.Clear; 
      I := Fichier.IndexOf('[Options1Et2]'); 
       // La section existe 
      if I <> -1 then 
      begin 
        inc(I); 
        J := Fichier.FindAtPos('[', 1, I); 
        Section.CopyFrom(Fichier, I, J-I); 
  
         // Pour les clés uniques : 
        I := Section.IndexOfName('Option1'); 
        if I <> -1 then 
          Options.Option2 := StrToIntDef(Temp, Section.ValueFromIndex[I]) 
        else 
          Options.Option2 := 0; 
  
         // Pour les clés multiples : 
        for I := 0 to Section.Count-1 do if Section.Names[I] = 'Option1' then 
          Options.Option1.Append(Section.ValueFromIndex[I]); 
      end else 
       // la section n'existe pas 
      begin 
        Options.Option2 := 0; 
      end; 
  
       // Section qui contient une stringlist 
      I := Fichier.IndexOf('[Option3]'); 
       // la section existe 
      if I <> -1 then 
      begin 
        inc(I); 
        J := Fichier.FindAtPos('[', 1, I); 
        Section.CopyFrom(Fichier, I, J-I); 
         // Suppression des lignes vides 
        I := 0; 
        while I < Section.Count do 
          if Section[I] = '' then Section.Delete(I) else inc(I); 
        Options.Option3.Assign(Section); 
      end else 
       // la section n'existe pas 
      begin 
        Options.Option3.Clear; 
      end; 
    finally 
      Section.Free; 
    end; 
  finally 
    Fichier.Free; 
  end; 
end;
Voici un fichier INI qui peut être lu avec cette fonction :
Code other : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
[Option3] 
Ligne1 
Ligne2 
La ligne suivante est ignorée 
  
Quatrième ligne 
  
[Options1Et2] 
Option1=Ligne 1 
Option2=123 
Option1=Ligne 2
Après lecture de ce fichier voici ce que contiendra chaque champ de la variable Options :

Options.Option1 :
Code other : Sélectionner tout
1
2
Ligne 1 
Ligne 2
Options.Option2 :
Code other : Sélectionner tout
123
Options.Option3 :
Code other : Sélectionner tout
1
2
3
4
Ligne1 
Ligne2 
La ligne suivante est ignorée 
Quatrième ligne

Mis à jour le 17 janvier 2014 sjrd

Présentation du package SjrdUnits, par Sébastien Doeraene

Les types ensembles (Set Of) ne peuvent pas être stockés directement dans un fichier INI car il ne sont ni une chaine ni un type scalaire. Pour les stocker sous forme de chaine voici une méthode pour en obtenir la représentation Hexa et à l'inverse obtenir l'ensemble à partir de sa représentation Hexa.

Pour convertir l'ensemble en chaine :

Code delphi : Sélectionner tout
1
2
3
4
5
function SetToText(var ASet; Size: Integer): string;  
begin  
  SetLength(Result,Size * 2);  
  BinToHex(@ASet, @Result[1], Size);  
end;
Notez que pour l'appel de cette procédure il faut donner en deuxième paramètre la taille de l'ensemble. Cette taille est donnée par la fonction SizeOf(). L'utilisation d'un paramètre ASet non typé permet de passer tout type d'ensemble à cette fonction.
Exemple d'appel :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
Var 
  Ens : Set Of (Zero,Un,Deux,Trois,Quatre); 
... 
begin 
  Ens := [Trois]; 
  ShowMessage(SetToText(Ens,SizeOf(Ens))); 
end;
Pour retrouver l'ensemble à partir d'une chaine :
Code delphi : Sélectionner tout
1
2
3
4
procedure TextToSet(TextValue: string; var ASet);  
begin  
  HexToBin(PChar(TextValue), @ASet, Length(TextValue) div 2);  
end;
Ici il n'est pas nécessaire de donner la taille de l'ensemble vu qu'il est implicitement donné par la longueur de la chaine.
Remarque : Cette méthode ne comporte aucune vérification de type, vous devez donc vous assurer directement que les valeurs converties de chaines en ensemble sont bien du bon type.

Mis à jour le 13 janvier 2014 Nono40 Pierre Castelain

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.