IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Bug dans le TCheckListBox ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Par défaut Bug dans le TCheckListBox ?
    Bonjour,

    J'ai un TcheckListbox que je remet à jour à la volé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    // 1° je vide mon checkListbox
      edtDetailLock.Items.clear;
     
    // JE recupere les donné que je veux mettre dedans. Le resultat est un set de TSvtDetailLock.
      FEnabledLocked := [];
      for AShapeIndex := Low(TSvtGridShapeType) to High(TSvtGridShapeType) do begin
        if AShapeIndex in FMode then begin
          FLocked.LockedEnabled(AShapeIndex, FEnabledLocked, False);
        end;
      end;
     
    // 3° pour toutes mes valeurs désirez, je teste si je doit ajouter la valeur et je l'ajoute si necessaire
      for AIndex := Low(TSvtDetailLock) to High(TSvtDetailLock) do begin
        if AIndex in FEnabledLocked then begin
           AName := FLocked.LockedName[AIndex];
           AI := edtDetailLock.Items.Count;
           edtDetailLock.Items.Add(AName);
    // en théorie, ce teste est inutil, mais il m'indique le problème
           if AI <> edtDetailLock.Items.Count then
             edtDetailLock.Checked[AI] := FLocked.LockedValue[AIndex]
        end;
      end;
    Si l'utilisateur à un comportement absurde, et qu'il ne cesse de changer les valeurs (selectionner un curseur de track bar et aller d'un bout a l'autre de l'écran allez retour sans jamais s'arréter. Fair mumuse quoi mais il faut bien aussi prévoir ce cas).
    Le TCheckboxList finit par se laisser dépasser par les événement et par ne pas ajouter les éléments quand je fais "edtDetailLock.Items.Add(AName);".
    Je pense qu'il doit se perdre dans un nombre de message trop important ou arrivant en desordre, mais je n'es suis pas sur.
    quelqun connait il ce problème ?

    Merçi

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Oui, j'ai déjà eu le problème avec ce composant, sous Delphi 5 (certainement sous D6 à D8 aussi, d'ailleurs).

    J'ai (partiellement) résolu le problème en utilisant un Items.BeginUpdate/Items.EndUpdate, et en insérant de force des éléments EmptyStr pour "réserver" la taille des items à l'avance, car il semblait que ce soit l'extension de la liste qui générait ces problèmes.

    Les problèmes de corruption ont été résolus, mais pas les problèmes de vitesse d'affichage (ça restait très très lent).

    La protection par un mutex (TCriticalSection ou TMultiReadExclusiveWriteSynchronizer par exemple) au sein des gestionnaires d'évènements pourrait aussi résoudre ton problème si tu utilises plusieurs threads.
    Un appel à "Application.ProcessMessages" est parfois nécessaire au sein d'un gestionnaire d'évènement qui va impacter d'autres composants que le celui auquel il appartient : essaie, ça ne coûte rien ! ;-)
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Par défaut
    Merci,
    Je n’avais pas penser au beginUpdate/EndUpdate (j'avais essayer update et apllication.processmessages).
    Cela devrait résoudre mes problèmes

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 474
    Par défaut
    salut

    J'utilise regulierement ceci et je n'est jamais eu de probleme

    pos := Cb.Items.Add(Name);// me donne l'indice ou est
    // ajouté l'élément
    Cb.Checked[pos] := true;

    dans ton cas tu prend toujours l'avant dernier je ne sais pas si c'est volontaire

    @+ Phil

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Par défaut
    Bonjour,

    Prendre l'avant dernier correspond, en théorie, a prendre le count-1. C'est à dire la bonne valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Items.clear;  
     
    AIndex := Items.Count; // Items.count := 0;
    Items.Add('bonjour');
    if Items.Count <> AIndex + 1 then 
      ShowMessage('Erreure: D'ajout d''item')
    else
      ShowMessage(Items[AIndex]);  // ShowMessage('Bonjour');
    Cela m'a permis de tester mon appli et de detecter l'erreure

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 474
    Par défaut
    salut

    effectivement dans les fait tu as raison de te dire que le count devrait te donnée l'avant dernier elements mais par principe je prefere
    utilise la position renvoyé par la fonction add elle correspond exactement
    a l'indice a laquelle l'ement a etait inseré

    le probleme n'est pas tant de gerer un Tstring (Items) mais
    de gerer et de synchroniser les elements checker ce qui ce fait par des evenements afin de dialoguer avec windows .

    voir les fonctions de TCustomListBox

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Perform(LB_GETITEMRECT, Index, Longint(@Result))

    @+ Phil

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Par défaut
    Certe,
    mais dans le cas présent (fonctionement anormale du composant) il ne me permet pas de détecter le bug. J'ai mis un "certain temps" pour savoir ce qui se passait car a l'origine j'utilisait (count - 1) au lieu de mémoriser l'ancienne valeur et de comparer avec le count apres ajout.
    N'oublez pas le contexte S.V.P.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment mettre des lignes de couleur dans une TCheckListBox ?
    Par Isa31 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 31/03/2005, 09h40
  2. Bug dans les expressions régulières ?
    Par SergioF dans le forum Linux
    Réponses: 8
    Dernier message: 12/05/2004, 16h14
  3. [PROPERTIES] Bug dans java.util.Properties ?
    Par mathieu dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 28/04/2004, 16h11
  4. bug dans une base Access
    Par bizouard dans le forum Access
    Réponses: 5
    Dernier message: 29/12/2003, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo