Utilisation de TIniFile et TMemIniFile

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des fichiers ini et du registre système

Le format de fichier INI est toujours utilisé, et de nombreux fichiers de configuration (comme le fichier DSK de configuration du bureau) sont dans ce format. Ce format est particulièrement utile dans des applications, où vous ne pouvez pas toujours compter sur une base de registres pour stocker les informations de configuration. La VCL/RTL fournit deux classes, TIniFile and TMemIniFile, pour faciliter grandement la lecture et l'écriture des fichiers INI.

TIniFile travaille directement avec le fichier INI sur disque, tandis que TMemIniFile stocke toutes les modifications en mémoire et ne les écrit sur disque que lorsque vous appelez la méthode UpdateFile.

Remarque : Lors de l'utilisation de TMemIniFile, vous pouvez utiliser la propriété AutoSave pour enregistrer automatiquement les modifications en mémoire dans le fichier INI. En utilisant cette propriété, vous évitez la perte des informations qui peuvent être produites lors de l'appel du destructeur avant l'appel de la méthode UpdateFile.

Quand vous instanciez l'objet TIniFile ou TMemIniFile, il faut transmettre au constructeur un paramètre spécifiant le nom du fichier INI. Si le fichier n'existe pas déjà, il est créé automatiquement. Vous êtes alors libre de lire les valeurs en utilisant différentes méthodes de lecture, comme ReadString, ReadDate, ReadInteger ou ReadBool. Par ailleurs, si vous souhaitez lire une section entière du fichier INI, vous pouvez utiliser la méthode ReadSection. De même, vous pouvez écrire des valeurs en utilisant WriteBool, WriteInteger, WriteDate ou WriteString.

L'exemple suivant lit des informations de configuration d'un fichier INI dans le gestionnaire d'événement OnCreate d'une fiche et écrit des valeurs dans le gestionnaire d'événement OnClose.

Delphi :
 
 procedure TForm1.FormCreate(Sender: TObject);
 var
   Ini: TIniFile;
 begin
   Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
   try
     Top     := Ini.ReadInteger( 'Form', 'Top', 100 );
     Left    := Ini.ReadInteger( 'Form', 'Left', 100 );
     Caption := Ini.ReadString( 'Form', 'Caption', 'New Form' );
     if Ini.ReadBool( 'Form', 'InitMax', false ) then
       WindowState := wsMaximized
     else
       WindowState := wsNormal;
   finally
     Ini.Free;
   end;
 end;
 
 procedure TForm1.FormClose(Sender: TObject; var Action TCloseAction)
 var
   Ini: TIniFile;
 begin
   Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
   try
     Ini.WriteInteger( 'Form', 'Top', Top);
     Ini.WriteInteger( 'Form', 'Left', Left);
     Ini.WriteString( 'Form', 'Caption', Caption );
     Ini.WriteBool( 'Form', 'InitMax', WindowState = wsMaximized );
   finally
     Ini.Free;
   end;
 end;
C++ :
 __fastcall TForm1::TForm1(TComponent *Owner) : TForm(Owner)
 {
    TIniFile *ini;
    ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
    Top    =  ini->ReadInteger( "Form", "Top", 100 );
    Left   =  ini->ReadInteger( "Form", "Left", 100 ); 
    Caption = ini->ReadString ( "Form", "Caption", "Default Caption" );
    ini->ReadBool( "Form", "initMax", false ) ?
          WindowState = wsMaximized :
          WindowState = wsNormal;

    delete ini;
  }

  void __fastcall TForm1::FormClose)TObject *Sender, TCloseAction &Action)
  {
    TIniFile *ini;
    ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ) );
    ini->WriteInteger( "Form", "Top", Top );
    ini->WriteInteger( "Form", "Left", Left );
    ini->WriteString ( "Form", "Caption", Caption );
    ini->WriteBool   ( "Form", "InitMax", WindowState == wsMaximized );

  delete ini;
  }

Chacune des routines de lecture prend trois paramètres. Le premier identifie la section du fichier ini. Le deuxième paramètre identifie la valeur à lire et le troisième est une valeur par défaut à utiliser si la section ou la valeur n'existe pas dans le fichier ini. De même que les méthodes Read gèrent de manière élégante la non existence d'une section ou d'une valeur, les routines Write créent la section et/ou la valeur si elles n'existent pas. L'exemple précédent crée un fichier ini la première fois qu'il est exécuté, et ce fichier est de la forme :

[Form]
Top=100
Left=100
Caption=Default Caption
InitMax=0

Lors des exécutions ultérieures de cette application, les valeurs ini sont lues lors de la création de la fiche et réécrites dans l'événement OnClose.

Voir aussi