cs_FredY68
Messages postés11Date d'inscriptionsamedi 5 juillet 2003StatutMembreDernière intervention 8 juin 2009
-
13 oct. 2006 à 17:23
cs_FredY68
Messages postés11Date d'inscriptionsamedi 5 juillet 2003StatutMembreDerniè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;
cs_FredY68
Messages postés11Date d'inscriptionsamedi 5 juillet 2003StatutMembreDerniè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
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 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'
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_FredY68
Messages postés11Date d'inscriptionsamedi 5 juillet 2003StatutMembreDerniè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;