Pb de case à cocher avec un TCheckListBox

Résolu
cs_FredY68 Messages postés 11 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 8 juin 2009 - 13 oct. 2006 à 17:23
cs_FredY68 Messages postés 11 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 8 juin 2009 - 16 oct. 2006 à 20:13
Bonjour à tous
J'ai un problème de reconnaissance de case cochée ou non cochée dans un checklistbox.
les informations du checklistbox sont stockées dans un fichier de type txt,
par exemple :
c:\fich\1\passe.bmp        
c:\fich\1\perd.bmp
c:\fich\2\blanc.bmp
c:\fich\2\carreau.bmp
1001  ( ici la référence des cases cochées ou non cochées [- voir *** -] ) 

possibilité de sauvegarder les informations du Checklistbox sous differents fichiers
exemple :
fichiers1.txt
fichiers2.txt
fichiers3.txt
etc

Le probléme est que lorsque j'efface la liste du checklistbox et que je charge un autre fichier
il y a une perte en lecture, des indications des cases à cocher, comme un décalage en lecture, vraisemblablement une mauvaise lecture de la ligne ***soit au lieu d'avoir un résultat visuel de 1001 cela donne un visuel de 0100.

Je n'arrive pas résoudre ce problème,
J'espère avoir été assez explicite
 merci à celles et ceux qui se pencheront sur mon poste.

Voici le code que j'utilise

procedure TForm1.FormCreate(Sender: TObject);
Var
    N : integer;   
begin
 //--- Verification dans la Base de registre 
 Reg := Tregistry.Create;
 Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run',true);
 startwindow.Checked := Reg.ValueExists('ADC');
 Reg.CloseKey;
 LstView.Clear;
 LstCkeck.Clear;
 if Reg.KeyExists(RegKey) then
  begin
   Reg.OpenKey(RegKey + '\Fichiers', true);
   Reg.GetValueNames(LstCheck.Items);
   if LstCheck.Items.Count > 0 then
      for N := 0 to LstCkeck.Items.Count - 1 do
          LstCkeck.Checked[N] := Reg.ReadBool(LstCkeck.Items.Strings[N]);
   Reg.CloseKey;
  end;
   Reg.Free;
end;



// ---- POUR SAUVEGARDER LA LISTE ---- \\

procedure TForm1.SauvegardeClick(Sender: TObject);
Var
    F, E, D, C : String;
    L : TStringList;
    N : integer;
begin
 if SaveLst.Execute then
  begin
   L := TStringList.Create;
   L.Assign(LstCheck.Items);
   C := ' ';


   For N := 0 to Pred(L.Count) do
    if LstCkeck.Checked[N] then C := C + '1'
    else
       C := C + '0';
   D := ExtractFilePath(SaveLst.FileName);
   E := ExtractfileExt(SaveLst.FileName);


   if D[length(D)] <> '\' then D := D + '\';


   F := ExtractFileName(SaveLst.FileName);
   F := Copy(F,1,Length(F) - Length(E));
   E := D + F + '.adc';


   L.Add(C);
   L.SaveToFile(E);
   L.Free;
  end;
end;



// ---- POUR CHARGER LA LISTE ---- \\

procedure TForm1.ChargementClick(Sender: TObject);
var
    E, C : String;
    L : TStringList;
    N : integer;
begin
 if OpenLst.Execute then
  begin
   E := uppercase(ExtractFilePath(OpenLst.FileName));


   if E = uppercase(ExtractFilePath(OpenLst.FileName)) then
    begin
     L := TstringList.Create;
     L.LoadFromFile(OpenLst.FileName);
     C := L.Strings[L.Count-1];
     // pour ne pas afficher la ligne contenant les indications de LstCheck.Checked -- '0' et '1' --
     L.Delete(L.Count-1);    // ***   
     LstS.Items.Assign(L);
     L.Free;
    end;


    begin
       for N := 0 to Pred(LstCheck.Items.Count) do 
       LstCheck.Checked[N] := C[N]='1';
    end;
  end;
end;

FredY68
A voir également:

7 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
13 oct. 2006 à 23:33
Salut,

où encore essaye comme ceci :

    begin
       for N := 1 to Length(C) do 
       LstCheck.Checked[N - 1] : = C[N]= '1';
    end ;

ce qui reviens au même
 
@+
Cirec

<hr size ="2" />
3
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
13 oct. 2006 à 23:03
Essaye :

begin
       for N := 0 to Pred(LstCheck.Items.Count) do 
       LstCheck.Checked[N] := C[N +1 ] ='1';
    end;

pour voir...
0
cs_FredY68 Messages postés 11 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 8 juin 2009
14 oct. 2006 à 13:19
Salut cirec,
ton code fonctionne mais avec un ajout des deux lignes rouge

(00)    begin
            L := TstringList.Create; 
            for N := 1 to Length(C) do
            LstCheck.Checked[N -1] := C[N]='1';
            L.Free; 
         end;

Je n'avais pas penser à LstCheck.Checked[N -1]
MERCI


Salut japee,
Le code fonctionne également , mais il provoque à l'exécution un message d'erreur
Indice de liste hors limite (4)  ( si la liste est de 4 )

Je n'ai pas encore testé toutes les possibilités, mais celle ci-dessus (00)
ne fonctionne pas.
En tout cas je te remercie de t'être penché sur ma question

MERCI A TOUS LES DEUX

FredY68
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
14 oct. 2006 à 14:16
Salut,

Tu dis :

"Le code fonctionne également , mais il provoque à l'exécution un message d'erreur
Indice de liste hors limite (4)  ( si la liste est de 4 )"

Impossible...
Si  LstCheck.Items.Count vaut 4, Pred(LstCheck.Items.Count) vaut 3, etc...
Je voudrais attirer ton attention sur le fait que N parcourt ta CheckListBox de 0 à Count -1, alors que ton string lui commence à 1.

Bonne prog'
0

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

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
15 oct. 2006 à 13:13
Salut,

il y a un truc que je ne comprend pas ...

que viens faire la TStringList dans ce code

Elle est crée au début puis libéré à la fin mais pas utilisé

Théoriquement le code de Japee et le miens devrait donner le même résultat

et que la List commence à 0 et le String à 1 ça fait partie des bases que l'on apprend au début

donc que l'on fasse N - 1 d'un coté où N + 1 de l'autre ça revient au même
c'est justement pour recuperer le décalage entre List et String

 
@+
Cirec

<hr size="2" />
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
15 oct. 2006 à 14:00
Salut,

Ben oui, tout à fait d'accord avec Cirec.

Et en effet, à quoi sert la StringList "L", puisque tu ne t'en sers pas entre sa création et sa destruction...
Pourrais-tu nous éclairer, stp ? 

Bonne prog' du dimanche 

japee
0
cs_FredY68 Messages postés 11 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 8 juin 2009
16 oct. 2006 à 20:13
Salut Cirec - Salut Japee


J'ai revu mon code et effectivement pas besoin de la StringList 'L' 
( correction en rouge ).

De cette façon les codes, aussi bien de japee que cirec, fonctionnent.
--- Mea culpa   japee ---

Mais j'avais un bug, incompréhensible, avec ton code japee, j'ai supprimé la procédure, éffectué un compilage puis réécrit la procédure et cela a fonctionné.

procedure TForm1.ChargeClick(Sender: TObject);
var
    E, C : String;
    L : TStringList;
    N : integer;
  begin
  if OpenLst.Execute then
  begin
   E := uppercase(ExtractFilePath(OpenLst.FileName));
   if E = uppercase(ExtractFilePath(OpenLst.FileName))
   then
    begin
     L := TstringList.Create;
     L.LoadFromFile(OpenLst.FileName);
     C := L.Strings[L.Count-1];
     L.Delete(L.Count-1);
     LstCheck.Items.Assign(L);
//    end; 
//    begin
//       L := TstringList.Create;
       for N := 1 to Length(C) do
       LstCheck.Checked[N -1] := C[N] = '1';
       L.Free;
{ ou celui de japee
        for N := 0 to Pred(LstCheck.Items.Count) do
        LstCheck.Checked[N] := C[N +1] = '1';
 }
     end;
  end;
end;

FredY68
0
Rejoignez-nous