Probleme d'execution [Résolu]

lyoko17 13 Messages postés mardi 19 décembre 2000Date d'inscription 20 janvier 2010 Dernière intervention - 29 juil. 2009 à 13:57 - Dernière réponse : Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention
- 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
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 29 juil. 2009 à 17:49
3
Merci
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;

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de f0xi
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 29 juil. 2009 à 14:58
0
Merci
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
Commenter la réponse de cs_cantador
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 29 juil. 2009 à 15:03
0
Merci
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
Commenter la réponse de cs_cantador
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 29 juil. 2009 à 15:29
0
Merci
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)
Commenter la réponse de Guillemouze
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 29 juil. 2009 à 16:03
0
Merci
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 !
Commenter la réponse de Bacterius
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 29 juil. 2009 à 17:52
0
Merci
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 ?
Commenter la réponse de Bacterius
lyoko17 13 Messages postés mardi 19 décembre 2000Date d'inscription 20 janvier 2010 Dernière intervention - 29 juil. 2009 à 18:09
0
Merci
Merci pour tout cela je vais me debrouiller
Commenter la réponse de lyoko17
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 29 juil. 2009 à 18:22
0
Merci
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.
Commenter la réponse de cs_rt15
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 29 juil. 2009 à 18:32
0
Merci
Merci pour cette précision rt15 :)

Cordialement, Bacterius !
Commenter la réponse de Bacterius
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 29 juil. 2009 à 22:52
0
Merci
@f0xi:
CheckListbox1.Items.Delete[I];

cantador
Commenter la réponse de cs_cantador
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 29 juil. 2009 à 23:25
0
Merci
Bien vu cantador !

Cordialement, Bacterius !
Commenter la réponse de Bacterius
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 30 juil. 2009 à 13:56
0
Merci
et sans mes lunettes !

cantador
Commenter la réponse de cs_cantador
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 30 juil. 2009 à 16:01
0
Merci
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 !
Commenter la réponse de Bacterius

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.