Fichier ini et combobox

Résolu
cs_Pierre95870 Messages postés 16 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 25 août 2012 - 14 oct. 2011 à 17:50
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

5 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
15 oct. 2011 à 21:46
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.
3
Utilisateur anonyme
16 oct. 2011 à 11:40
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
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
16 oct. 2011 à 19:59
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.
3
cs_Pierre95870 Messages postés 16 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 25 août 2012
16 oct. 2011 à 08:11
Merci DelphiProg, ta réponse résout parfaitement mon problème.

Bien cordialement
Pierre
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
0
Rejoignez-nous