Fichier ini et combobox [Résolu]

cs_Pierre95870 16 Messages postés mardi 11 novembre 2008Date d'inscription 25 août 2012 Dernière intervention - 14 oct. 2011 à 17:50 - Dernière réponse : cs_Pierre95870 16 Messages postés mardi 11 novembre 2008Date d'inscription 25 août 2012 Dernière intervention
- 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
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 15 oct. 2011 à 21:46
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.

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 76 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Meilleure réponse
Utilisateur anonyme - 16 oct. 2011 à 11:40
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

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 76 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Meilleure réponse
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 16 oct. 2011 à 19:59
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.

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 76 internautes ce mois-ci

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

Bien cordialement
Pierre
Commenter la réponse de cs_Pierre95870
cs_Pierre95870 16 Messages postés mardi 11 novembre 2008Date d'inscription 25 août 2012 Dernière intervention - 17 oct. 2011 à 08:42
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

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.