FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 2024 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.
- Comment créer/ouvrir un fichier .ini ?
- Comment créer la structure d'un fichier .ini ?
- Comment lire une clé d'un fichier .ini ?
- Comment supprimer une clé dans un fichier .ini ?
- Comment supprimer une section dans un fichier .ini?
- Comment écrire un TColor dans un fichier .ini ?
- Comment savoir si une clé existe dans un fichier .ini?
- Comment savoir si une section existe dans un fichier .ini ?
- Comment lire les noms de clés à partir d'une section particulière dans un fichier .ini ?
- Comment lire les noms de toutes les sections d'un fichier .ini?
- Comment lire les valeurs de toutes les clés d'une section d'un fichier .ini ?
- Comment lire l'intégralité du contenu d'un fichier .ini ?
- Comment gérer des noms de clés dupliqués ?
- Comment stocker la valeur d'un ensemble dans un fichier .ini ?
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 ... |
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; |
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.
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; |
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 |
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; |
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);
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.
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);
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.
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.
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;
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; |
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; |
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; |
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; |
À 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; |
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 |
Options.Option1 :
Code other : | Sélectionner tout |
1 2 | Ligne 1 Ligne 2 |
Code other : | Sélectionner tout |
123
Code other : | Sélectionner tout |
1 2 3 4 | Ligne1 Ligne2 La ligne suivante est ignorée Quatrième ligne |
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; |
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; |
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; |
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.
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 çaLes 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.