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 FMX Delphi Discussion :

ListBox et doublons


Sujet :

Composants FMX Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2021
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : décembre 2021
    Messages : 116
    Points : 132
    Points
    132
    Par défaut ListBox et doublons
    Bonjour,

    Je suis en train de découvrir les ListBox pour remplacer certains StringGrid (l'idée m'est venue en lisant ce qui se dit/fait par ici) seulement j'ai apparemment un problème de doublons à l'exécution.

    J'aimerais donc savoir à partir de quelle information les doublons sont déterminés, car chaque enregistrement étant unique, j'ai du mal à saisir d'où le problème vient réellement :
    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
    25
    26
    27
     
    procedure TForm1.addItem(Client,TypeContrat, DateS,DateT,Etat,Com,Num,id: String);
    var
      lo : TLayout;
      lb : TListBoxItem;
    begin
      LNomClient.Text := Client; //Label à l'interieur de la GroupBox 
      LDateSignature.Text := DateS;  //Label à l'interieur de la GroupBox 
      LDateEtat.Text := DateT;           //Label à l'interieur de la GroupBox 
      LEtatContrat.Text := Etat;          //Label à l'interieur de la GroupBox 
      GBContrat.Text :=TypeContrat+' ' +Num +' '+ Com; //GroupBox qui regroupe les TLabels
      lb := TListBoxItem.Create(LBContrat);
      lb.Width := LBContrat.Width;
      lb.Height := GBContrat.Height + 12;
      lb.Selectable := False; //opsional
      lb.FontColor := $00FFFFFF; //opacity
      lb.Text := Client+ DateS+DateT+Etat+TypeContrat+Num;
      lb.Name := 'Dos'+Id;
      lb.StyledSettings := [];
      lo := TLayout(GBContrat.Clone(lb));
      lo.Width := lb.Width - 32;
      lo.Position.X := 16;
      lo.Position.Y := 0;
      lo.Visible := True;
      lb.AddObject(lo);
      LBContrat.AddObject(lb);
    end;
    Et je la remplie de cette maniere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    With Form1.QueryStat2 Do
          If FindFirst Then while Not Eof Do
          Begin
            Form1.AddItem(FieldByName('CLIENT').AsString,FieldByName('CONTRAT').AsString
                   ,FieldByName('DATES').AsString,FieldByName('DATET').AsString,
                    FieldByName('ETAT').AsString,FieldByName('COM').AsString,FieldByName('Ref_contrat').AsString
                    ,FieldByName('id').AsString);
            Next;
          End;
    Et la GroupBox qui me sert de modele :
    Nom : screen.png
Affichages : 97
Taille : 4,0 Ko
    Le FieldByName 'id' est unique pour chaque enregistrement donc je peux m'en servir pour rendre chaque Item unique.

    Le plus bizarre dans cette histoire c'est que j'ai ce problème de manière aléatoire, des fois ça marche! c'est à n'y rien comprendre ..

  2. #2
    Membre expert Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    juin 2013
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2013
    Messages : 1 602
    Points : 3 015
    Points
    3 015
    Par défaut
    Je ne vois rien de louche dans ton code, à part peut-être l'ajout de l'objet cloné dans l'item, mais je suppose que tu as tes raisons de faire comme ça plutôt que de mettre un lien vers l'objet d'origine simplement en TagObject ou par AddObject.

    Par contre, sans visualiser le problème, "j'ai des doublons mais c'est aléatoire" va pas aider beaucoup à t'aider.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 105
    Points : 38 173
    Points
    38 173
    Billets dans le blog
    59
    Par défaut
    Bonjour,

    J'ai du mal à comprendre, certainement parce que, trop habitué aux Livebindings, TListview et apparence dynamique je réduis fortement mon code et ne fait aucun ajout d'item.

    La première question qui me vient est : il y a t-il plusieurs sortes d'items dans la liste ?
    si oui alors effectivement un TListbox et peut-être des styles
    si non alors envisager un Tlistview d'apparence dynamique

    J'ai écrit de nombreuses choses sur le sujet

    4 articles sur les TListViews à retrouver ici
    1 article sur les styles pour un tlistbox (toujours au même endroit)
    et de nombreux billets https://www.developpez.net/forums/bl...7&tag=listview
    P.S. d'autres billets en parlent aussi, mais je n'ai pas toujours mis le tag

    Côté code, le FindFirst me gêne, je lui préfèrerai un simple First et encore généralement, je joue simplement Open() de FDQuery (qui en fait, exécute un Close; Open;) positionnant au début du dataset
    Côté rendu d'informations, j'ajouterai, avant cette boucle, un LBContrat.BeginUpdate et et bien sûr en fin un LBContrat.EndUpdate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
         LBContrat.BeginUpdate;
         LBContrat.Clear; // vider la liste 
          With QueryStat2 Do
          First;
         while Not Eof Do
          Begin
             AddItem(FieldByName('CLIENT').AsString,FieldByName('CONTRAT').AsString
                   ,FieldByName('DATES').AsString,FieldByName('DATET').AsString,
                    FieldByName('ETAT').AsString,FieldByName('COM').AsString,FieldByName('Ref_contrat').AsString
                    ,FieldByName('id').AsString);
            Next;
          End;
         LBContrat.EndUpdate;
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2021
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : décembre 2021
    Messages : 116
    Points : 132
    Points
    132
    Par défaut
    à part peut-être l'ajout de l'objet cloné dans l'item, mais je suppose que tu as tes raisons de faire comme ça plutôt que de mettre un lien vers l'objet d'origine simplement en TagObject ou par AddObject.
    En fait j'utilise cette méthode parce que c'est l'exemple que j'ai trouvé, je n'ai aucune idée de la différence entre ces méthodes .

    Par contre, sans visualiser le problème, "j'ai des doublons mais c'est aléatoire" va pas aider beaucoup à t'aider.
    Oui je me doutais que c'était pas très pertinenent comme demande mais je n'avais pas vraiment trouvé de meilleure façon de l'écrire, d'ailleurs j'ai trouvé la réponse! En fait j'ouvre ma Query dans un Thread pour que mon écran de chargement prenne le relai mais on dirait qu'il y a que sous Windows qu'il fonctionne, avec IOS/Android, si la Query est trop longue (3s) il plante

    Pour ce qui est de la question ListBox et ListView, les premiers tests que j'ai fait n'étaient pas très concluant (il faut bien chercher) j'ai trouvé l'interface et la méthode de gestion assez compliqué à prendre en main, mais effectivement maintenant que j'ai compris comment ça marche (ça m'auras pris une bonne matinée ^^) , c'est beaucoup plus simple, et surtout beaucoup plus rapide!

    La fonction pouvait mettre entre 5 et 10s à s'exécuter en fonction de la connexion/ création des Items, c'est pour ça que j'avais mis un Thread, maintenant ça prend moins de 2s pour s'exécuter et le résultat est tout aussi propre!

    Longue vie au TListView
    Et merci à vous!

  5. #5
    Membre expert Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    juin 2013
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2013
    Messages : 1 602
    Points : 3 015
    Points
    3 015
    Par défaut
    Content que ce soit résolu.

    Juste trois rappels :
    - ne pas manipuler de composants liés à l'écran depuis un thread secondaire, toujours les synchroniser avec le thread principal dans un Thread.Synchronize() pour éviter d'éventuelles violations d'accès
    - effectivement BeginUpdate / EndUpdate pour bloquer le rafraichissement de leur affichage sur les composants visuels en FMX lorsqu'on met du temps à les remplir ne fait pas de mal
    - l'utilisation des composants de base de données en thread peut aussi générer des anomalies, il y a quelques précautions à prendre selon où on les déclare, le type de composant utilisé, et bien entendu ce qu'on en fait (avec FireDAC il faut une connexion par thread fournie par le TFDManager pour éviter les couacs)

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2021
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : décembre 2021
    Messages : 116
    Points : 132
    Points
    132
    Par défaut
    Effectivement je comprend mieux , je vais me renseigner sur ces points

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 105
    Points : 38 173
    Points
    38 173
    Billets dans le blog
    59
    Par défaut
    Citation Envoyé par PetitBoutDeCode Voir le message
    Longue vie au TListView
    Tant qu'il s'agit d'un seul ensemble de données, c'est la meilleure option.

    Pour ce qui est des Threads, il n'y en avait aucune mention dans la première question.
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

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

Discussions similaires

  1. [MySQL] listbox sans doublon avec disabled
    Par akara dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/03/2009, 16h17
  2. listbox sans doublons
    Par casefayere dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/02/2009, 23h14
  3. listbox sans doublons
    Par abouhossam dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 22/10/2008, 19h13
  4. ListBox sans Doublons
    Par pobrouwers dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 20/02/2007, 18h41
  5. [ListBox] Supprimer doublons
    Par mohamed dans le forum Delphi
    Réponses: 6
    Dernier message: 14/11/2006, 18h00

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