Fichier ini et combobox [Résolu]

Messages postés
16
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
25 août 2012
- - Dernière réponse : cs_Pierre95870
Messages postés
16
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
25 août 2012
- 17 oct. 2011 à 08:42
Bonjour,

Dans mon application, je sélectionne un item dans des combobox.
A la fermeture de celle ci, j'enregistre ces items dans un fichier ini.
A l'ouverture suivante, je souhaiterais retrouver ces items affichés dans les combobox, mais je n'y parviens pas.
C'est toujours le premier item qui est affiché.
Voici le code pour la sauvegarde des items:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
Var i     : integer;
    Ini   : TIniFile;
    Edit  : TEdit;
    Combo : TComboBox;
begin
  Ini := TIniFile.Create(extractFilePath(application.exename)
         + 'Parameters.tdb');
  try
//parcourir les composants sur le Panneau
  for i:=0 to ComponentCount - 1 do
  begin
//si le composant trouvé est du type recherché
    if (Components[i] is TEdit) then
    begin
      Edit := TEdit(Components[i]);
      Ini.WriteString('DATA', Edit.Name, Edit.Text);
    end;
    If (Components[i] is TComboBox) then
    begin
      Combo:= TComboBox(Components[i]);
      Ini.WriteString('DATA', Combo.Name,Combo.Text);
    end;
  end;
//btnVerifyFile.Enabled := True;
  finally
  Ini.Free;
end;
  Liste.Free;
  AD.Free;
  Runways.Free;
  Pistes.Free;
  Intersec.Free;
  Inter.Free;
  ClearStop.Free;
  Clear.Free;
  Obstacles.Free;
  Obst.Free;
end;


Et voici le code pour la restauration qui ne fonctionne pas:

procedure TForm1.FormCreate(Sender: TObject);
var
i     : integer;
Ini   : TIniFile;
Edit  : TEdit;
Combo : TComboBox;
begin
  JvgPageControl1.TabIndex:= 0;
  Ini := TIniFile.Create(extractFilePath(application.exename)
         + 'Parameters.tdb');
  try
  For i:=0 to ComponentCount - 1 do
  begin
    if Components[i] is Tedit then
    begin
      Edit := Components[i] as TEdit;
      Edit.Text := Ini.ReadString('DATA', Edit.Name, 'N/A');
    end;
    if Components[i] is TComboBox then
    begin
      Combo := Components[i] as TComboBox;
      Combo.Text:= Ini.ReadString('DATA', Combo.Name, '');
    end;
  end;
    EditAirport.Color   := clWhite;
  finally
    Ini.Free;
  end;


Pourriez vous m'indiquer où se situe mon erreur?
Merci d'avance
Cordialement
Pierre
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
22
3
Merci
Bonjour Pierre,

Quand tu crois sauvegarder la liste contenue dans le TCombobox, en réalité tu ne sauvegardes que l'élément affiché.
Pour sauvegarder la liste des éléments contenus dans Combo, il faut utiliser Combo.Items.CommaText. Sachant que, par défaut, cette propriété est une liste de chaine séparée par des virgules. Si cela te pose problème, tu peux opter pour un autre séparateur. Pour cela, voir Items.Delimiter de type Char.

Ton code devient alors pour la sauvegarde :
procedure TForm6.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
Var i     : integer;
    Ini   : TIniFile;
    Edit  : TEdit;
    Combo : TComboBox;
begin
    Ini := TIniFile.Create(extractFilePath(application.exename)
         + 'Parameters.tdb');
    try
      //parcourir les composants sur le Panneau
      for i:=0 to ComponentCount - 1 do
      begin
        //si le composant trouvé est du type recherché
        if (Components[i] is TEdit) then
        begin
          Edit := TEdit(Components[i]);
          Ini.WriteString('DATA', Edit.Name, Edit.Text);
        end;
        If (Components[i] is TComboBox) then
        begin
          Combo:= TComboBox(Components[i]);
          Ini.WriteString('DATA', Combo.Name,Combo.Items.CommaText);
          //sauve l'élément éventuellement sélectionné
          Ini.WriteInteger('DATA',  Combo.Name + '_index' ,Combo.ItemIndex);
        end;
      end;
    finally
      Ini.Free;
     end;
end;


et pour la restauration :
procedure TForm6.FormCreate(Sender: TObject);
var
  i     : integer;
  Ini   : TIniFile;
  Edit  : TEdit;
  Combo : TComboBox;
  IniFileName: TFileName;
begin
  IniFileName := extractFilePath(application.exename) + 'Parameters.tdb';
  if FileExists(IniFileName) then
  begin
    Ini := TIniFile.Create(IniFileName);
    try
      For i:=0 to ComponentCount - 1 do
      begin
        if Components[i] is Tedit then
        begin
          Edit := Components[i] as TEdit;
          Edit.Text := Ini.ReadString('DATA', Edit.Name, 'N/A');
        end;
        if Components[i] is TComboBox then
        begin
          Combo := Components[i] as TComboBox;
          Combo.Text := '';
          Combo.Items.CommaText:= Ini.ReadString('DATA', Combo.Name, '');
          //Restaure le dernier élément sélectionné à la fermeture de l'appli
          Combo.ItemIndex := Ini.ReadInteger('DATA', Combo.Name + '_index', -1);
        end;
      end;
    finally
      Ini.Free;
    end;
  end;
end;


En prime, je t'ai ajouté la sauvegarde et la restauration de l'élément sélectionné.

Bien cordialement.

May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 154 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Delphiprog
3
Merci
Salut

Pourquoi utilises tu les variables suivantes ?

Edit : TEdit;
Combo : TComboBox;


Tu peux t'en passer :

 if (Components[i] is TEdit) then
 With TEdit(Components[i])Do
  Ini.WriteString('DATA',Name, Text);


Pareil pour le TCombobox

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 154 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
22
3
Merci
Salut,

Ok avec toi Francky. Mais ne connaissant pas le niveau de la personne qui pose la question, je n'ai pas souhaité embrouiller le code.
De plus, quand tu dois déboguer, le type d'écriture que tu proposes ne facilites pas les choses car tu ne peux plus accéder aux valeurs des propriétés du fait de l'optimisation.


May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 154 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Delphiprog
Messages postés
16
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
25 août 2012
0
Merci
Merci DelphiProg, ta réponse résout parfaitement mon problème.

Bien cordialement
Pierre
Commenter la réponse de cs_Pierre95870
Messages postés
16
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
25 août 2012
0
Merci
Merci de vos conseils, Je vais remplacer le code par celui de Francky.
Merci encore aussi à DelphiProg, mais cette partie du code fonctionne maintenant perfaitement.

Bonne journée à tous

Cordialement
Pierre
Commenter la réponse de cs_Pierre95870