Probleme d'execution

Résolu
lyoko17 Messages postés 13 Date d'inscription mardi 19 décembre 2000 Statut Membre Dernière intervention 20 janvier 2010 - 29 juil. 2009 à 13:57
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 30 juil. 2009 à 16:01
Voila, je n'arrive pas a trouvé l'erreur de ce code

var
i : integer;
begin

for i := 0 to checklistbox1.items.Count-1 do
begin
if checklistbox1.Checked[i] then checklistbox1.Items.Delete[i];
end;
end;

merci de m'aider

13 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
29 juil. 2009 à 17:49
voici LA bonne methode :

var I : integer;
begin
  CheckListbox1.Items.BeginUpdate;
  try
    for I := CheckListbox1.Items.Count-1 downto 0 do
      if CheckListbox1.Checked[I] then 
        CheckListbox1.Items.Delete[I];
  finally
    CheckListbox1.Items.EndUpdate;
  end;
end;
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 juil. 2009 à 14:58
bonjour,
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i := checklistbox1.items.Count - 1 downto 0 do
  begin
    if checklistbox1.Checked[i] then
      checklistbox1.Items.Delete(i);
  end;
end;


cantador
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 juil. 2009 à 15:03
bonjour,

il faut boucler à l'envers sinon tu auras une erreur d'index hors limites car la boucle va trop loin en cas de suppression..

et

delete(i) et non delete[i]
car danc ce cas, il s'agit du paramètre et non de l'index d'un tableau en l'occurence celui de l'index de l'enregistrement de la liste.

cantador
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
29 juil. 2009 à 15:29
note importante : dans une boucle for, les bornes sont evaluées au premier appel. Donc, si dans ta boucle le count est modifié, la valeur max de i sera le count au debut de la boucle, d'où la necessité de parcourir a l'envers comme le dit Cantador, ou d'utiliser un while (perso je prefere la boucle a l'anvers quand c'est possible)

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

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 juil. 2009 à 16:03
1. En utilisant l'asm. Permet de conserver une boucle ascendante, pratique dans certains cas, mais un peu plus long au niveau du temps d'exécution.
var 
 I: integer; 
begin 
 with CheckListBox1 do
  for I := 0 to Pred(Items.Count) do 
  if Checked[I] then
   begin
    Items.Delete[I];
    asm DEC I end;
   end;
end;


2. En parcourant la boucle à l'envers. Plus rapide que la boucle ascendante, elle peut néanmoins être néfaste si l'on doit traiter les éléments du premier au dernier.
var 
 I: integer; 
begin 
 with CheckListBox1 do
  for I := Pred(Items.Count) downto 0 do 
   if Checked[I] then Items.Delete[I];
end;


3. En utilisant une boucle while.
404 not found.


On peut améliorer en plaçant des BeginUpdate et EndUpdate correctement, pour des grandes chaînes :

try
 CheckListBox1.Items.BeginUpdate;
 // Traitement ...
finally
 CheckListBox1.Items.EndUpdate;
end;


Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 juil. 2009 à 17:52
Exactement !
C'est quoi ce bug qui met un espace entre chaque ligne de code au fait ?

Cordialement, Bacterius !

PS : f0xi, entre Pred(X) et X - 1 c'est quoi le plus optimisé ? Ca revient au même au niveau de la compilation ?
lyoko17 Messages postés 13 Date d'inscription mardi 19 décembre 2000 Statut Membre Dernière intervention 20 janvier 2010
29 juil. 2009 à 18:09
Merci pour tout cela je vais me debrouiller
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
29 juil. 2009 à 18:22
Bacterius -> Aaaaaah ! Je suis pas le seul a avoir les lignes en trop ! Peut être qu'il y aura une correction un jour alors.
  for nI:= 0 to Memo1.Lines.Count - 1 do
    ShowMessage(IntToStr(nI));
  for nI:= 0 to Pred(Memo1.Lines.Count) do
    ShowMessage(IntToStr(nI));

C'est strictement équivalent. Suffit de mettre un point d'arrêt et de faire ctrl+alt+C et de jouer aux sept différences.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 juil. 2009 à 18:32
Merci pour cette précision rt15 :)

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 juil. 2009 à 22:52
@f0xi:
CheckListbox1.Items.Delete[I];

cantador
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 juil. 2009 à 23:25
Bien vu cantador !

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
30 juil. 2009 à 13:56
et sans mes lunettes !

cantador
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 juil. 2009 à 16:01
Le pire c'est les accolades/parenthèses avec un écran dont les polices ne sont pas lissées ... c'est la même chose

Cordialement, Bacterius !
Rejoignez-nous