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

 Delphi Discussion :

Synchroniser deux listBox


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut Synchroniser deux listBox
    Bonsoir à tous ,


    J'ai deux listBox et je voudrais synchroniser les Items, si je clique sur le premier index ListBox1 , L'index 1 de la listBox2 sera sélectionner aussi et ainsi de suite.
    J'ai essayé plusieurs code , mais le résultat est faux .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     var j: integer;
    begin
     
    For j := 0 to ListBox1.Count - 1 do
      if ListBox1.Selected[j] //si on sélectionne  le premier Item
    then 
     ListBox2.Selected[j];// logiquement le 1er Item de la LBox1 sera séléctionner.




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Listbox1.ItemIndex:= ListBox2.ItemIndex;



    Ces deux code ne font pas ce que l'ont voudrait faire .
    Merci pour toute suggestion.
    Images attachées Images attachées  

  2. #2
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    un truc comme sa peut-être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Var
      I:Integer;
    Begin
      For I := 0 To ListBox1.Items.Count - 1 Do
        ListBox2.Selected[I] := ListBox1.Selected[I];
    il manque := True; à ton 1er code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListBox2.Selected[j] := True;
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  3. #3
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Au-delà de la remarque judicieuse de ouiouioui, quelque-chose comme ça ?

    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
    procedure SynchroListBox(ASrc, ADest: TListBox);
    var
      I: Integer;
    begin
      if ASrc.MultiSelect and ADest.MultiSelect then
        for I := 0 to ASrc.Items.Count - 1 do
          ADest.Selected[I] := ASrc.Selected[I];
      ADest.TopIndex := ASrc.TopIndex;
      ADest.ItemIndex := ASrc.ItemIndex;
    end;
     
    procedure TForm1.ListBox1Click(Sender: TObject);
    begin
      SynchroListBox(ListBox1, ListBox2);
    end;
     
    procedure TForm1.ListBox2Click(Sender: TObject);
    begin
      SynchroListBox(ListBox2, ListBox1);
    end;
    Marche avec ou sans MultiSelect.

    @+

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par ouiouioui Voir le message
    un truc comme sa peut-être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Var
      I:Integer;
    Begin
      For I := 0 To ListBox1.Items.Count - 1 Do
        ListBox2.Selected[I] := ListBox1.Selected[I];
    il manque := True; à ton 1er code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListBox2.Selected[j] := True;
    Bonsoir,

    Merci oui oui oui , le code est ok mais ça mets indice hors limite ( on lis en dehors du tableau (ListBox1) ) .




    Citation Envoyé par Cl@udius Voir le message
    Salut

    Au-delà de la remarque judicieuse de ouiouioui, quelque-chose comme ça ?

    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
    procedure SynchroListBox(ASrc, ADest: TListBox);
    var
      I: Integer;
    begin
      if ASrc.MultiSelect and ADest.MultiSelect then
        for I := 0 to ASrc.Items.Count - 1 do
          ADest.Selected[I] := ASrc.Selected[I];
      ADest.TopIndex := ASrc.TopIndex;
      ADest.ItemIndex := ASrc.ItemIndex;
    end;
     
    procedure TForm1.ListBox1Click(Sender: TObject);
    begin
      SynchroListBox(ListBox1, ListBox2);
    end;
     
    procedure TForm1.ListBox2Click(Sender: TObject);
    begin
      SynchroListBox(ListBox2, ListBox1);
    end;
    Marche avec ou sans MultiSelect.

    @+

    Salut Claudius ;

    Le Code utilisé est parfait et fonctionnel .
    Je voulais ajouter et ajourné le code en ajoutant une 3 éme ListBox pour que les trois soient synchro , mais le résultat est faux , juste les 02 premiéres qui sont synchro pas la 3 éme .


    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
    procedure SynchroListBox(ASrc1, ASrc2,  ADest: TListBox  );
    var
      I: Integer;
     
     
    begin
      if ASrc1.MultiSelect and  ASrc2.MultiSelect   and  ADest.MultiSelect
      then
     
        for I := 0 to ASrc1.Items.Count - 1 do
     
          ADest.Selected[I]:= ASrc1.Selected[I];
          ADest.Selected[I]:= ASrc2.Selected[I];
     
      ADest.TopIndex := ASrc1.TopIndex;
      ADest.ItemIndex := ASrc1.ItemIndex;
      ADest.TopIndex := ASrc2.TopIndex;
      ADest.ItemIndex := ASrc2.ItemIndex;
     
     
     
    end;


    Merci pour vos suggestions .
    Images attachées Images attachées  

  5. #5
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Vu le code modifié à l'arrache, ce n'est pas étonnant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for I := 0 to ASrc.Items.Count - 1 do begin
          ADest.Selected[I] := ASrc.Selected[I];
          autres instructions;
          end;
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Vu le code modifié à l'arrache, ce n'est pas étonnant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for I := 0 to ASrc.Items.Count - 1 do begin
          ADest.Selected[I] := ASrc.Selected[I];
          autres instructions;
          end;

    Bonjour qi130 ,

    J'ai essayé ce code , mais les 3 listbox ne sont pas synchroniser lorsque je clique sur un Item de la première Listbox .

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Points : 102
    Points
    102
    Par défaut
    ...
    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
    procedure SynchroListBox(ASrc, ADest1, ADest2: TListBox);
    var
      I: Integer;
    begin
      if ASrc.MultiSelect and ADest1.MultiSelect and ADest2.MultiSelect then
        for I := 0 to ASrc.Items.Count - 1 do
        begin
          ADest1.Selected[I] := ASrc.Selected[I];
          ADest2.Selected[I] := ASrc.Selected[I];
        end;
      ADest1.TopIndex := ASrc.TopIndex;
      ADest1.ItemIndex := ASrc.ItemIndex;
      ADest2.TopIndex := ASrc.TopIndex;
      ADest2.ItemIndex := ASrc.ItemIndex;
    end;
    @+

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par nuxtay Voir le message
    ...
    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
    procedure SynchroListBox(ASrc, ADest1, ADest2: TListBox);
    var
      I: Integer;
    begin
      if ASrc.MultiSelect and ADest1.MultiSelect and ADest2.MultiSelect then
        for I := 0 to ASrc.Items.Count - 1 do
        begin
          ADest1.Selected[I] := ASrc.Selected[I];
          ADest2.Selected[I] := ASrc.Selected[I];
        end;
      ADest1.TopIndex := ASrc.TopIndex;
      ADest1.ItemIndex := ASrc.ItemIndex;
      ADest2.TopIndex := ASrc.TopIndex;
      ADest2.ItemIndex := ASrc.ItemIndex;
    end;
    @+


    Bonjour ,


    Oui en effet j'avais oublier le begin et end;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       begin
          ADest1.Selected[I] := ASrc.Selected[I];
          ADest2.Selected[I] := ASrc.Selected[I];
        end;

    Merci à toi , probléme résolu .
    Merci à Claude , QI130 et à OuiOuiOui.
    Bonne journée.

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Il y a pourtant une FAQ Synchroniser deux ListBox
    Cette exemple montre comment synchroniser l'affichage du 1er Element, en ajoutant ItemIndex, on synchronise le Focus, et la modification de la propriété Selected est effectivement la cerise sur le gateau !

    Marley_T, pense à la touche F1 = Aide de Delphi, prend le temps de lire la documentation de la TListBox !
    Et fais l'effort comprendre le code, il n'est pas suffisant de copier-coller sans aucune réflexion ! c'est fort dommage !

    Pour éviter les Problèmes d'index, une petite modification du code de nuxtay

    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
    procedure SynchroListBox(ASrc, ADest1, ADest2: TListBox);
    var
      I: Integer;
    begin
      if ASrc.MultiSelect and ADest1.MultiSelect and ADest2.MultiSelect then
      begin
      for I := 0 to ASrc.Items.Count - 1 do
        begin
          if I < ADest1.Items.Count then
            ADest1.Selected[I] := ASrc.Selected[I];
          if I < ADest2.Items.Count then
            ADest2.Selected[I] := ASrc.Selected[I];
        end;
      end;
     
      ADest1.TopIndex := Min(ASrc.TopIndex, ADest1.Items.Count - 1);
      ADest1.ItemIndex := IfThen(ASrc.ItemIndex < ADest1.Items.Count , ASrc.ItemIndex, -1); // Si Hors limite pas de sélection
      ADest2.TopIndex := Min(ASrc.TopIndex, ADest2.Items.Count - 1);
      ADest2.ItemIndex := IfThen(ASrc.ItemIndex < ADest2.Items.Count , ASrc.ItemIndex, -1); // Si Hors limite pas de sélection
    end;
    Math a inclure dans les uses;

    Citation Envoyé par Marley_T Voir le message
    Bonjour ,
    Oui en effet j'avais oublier le begin et end;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     for I := 0 to ASrc1.Items.Count - 1 do
     
          ADest.Selected[I]:= ASrc1.Selected[I];
          ADest.Selected[I]:= ASrc2.Selected[I];
    Tu n'as vais que oublié begin end, tu as inversé Source Multiple et Destination Unique alors que c'est évidemment Source Unique vers Destination Multuple, tu as fait un double affectation de la Destination, d'où mes remarques de se poser et de réflechir ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Il y a pourtant une FAQ Synchroniser deux ListBox
    Cette exemple montre comment synchroniser l'affichage du 1er Element, en ajoutant ItemIndex, on synchronise le Focus, et la modification de la propriété Selected est effectivement la cerise sur le gateau !

    Marley_T, pense à la touche F1 = Aide de Delphi, prend le temps de lire la documentation de la TListBox !
    Et fais l'effort comprendre le code, il n'est pas suffisant de copier-coller sans aucune réflexion ! c'est fort dommage !

    Pour éviter les Problèmes d'index, une petite modification du code de nuxtay

    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
    procedure SynchroListBox(ASrc, ADest1, ADest2: TListBox);
    var
      I: Integer;
    begin
      if ASrc.MultiSelect and ADest1.MultiSelect and ADest2.MultiSelect then
      begin
      for I := 0 to ASrc.Items.Count - 1 do
        begin
          if I < ADest1.Items.Count then
            ADest1.Selected[I] := ASrc.Selected[I];
          if I < ADest2.Items.Count then
            ADest2.Selected[I] := ASrc.Selected[I];
        end;
      end;
     
      ADest1.TopIndex := Min(ASrc.TopIndex, ADest1.Items.Count - 1);
      ADest1.ItemIndex := IfThen(ASrc.ItemIndex < ADest1.Items.Count , ASrc.ItemIndex, -1); // Si Hors limite pas de sélection
      ADest2.TopIndex := Min(ASrc.TopIndex, ADest2.Items.Count - 1);
      ADest2.ItemIndex := IfThen(ASrc.ItemIndex < ADest2.Items.Count , ASrc.ItemIndex, -1); // Si Hors limite pas de sélection
    end;
    Math a inclure dans les uses;


    Tu n'as vais que oublié begin end, tu as inversé Source Multiple et Destination Unique alors que c'est évidemment Source Unique vers Destination Multuple, tu as fait un double affectation de la Destination, d'où mes remarques de se poser et de réflechir ...


    Bonjour ShaiLeTroll,


    Oui , j'avais vu la source de Nono_40( Bruno), mais je voulais créer une autre fonction plus adaptée et congrue à ce que je voulais faire .
    Merci pour tes conseils et ton interventions , je te souhaite une belle journée.

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

Discussions similaires

  1. focus entre deux listbox
    Par krokmitaine dans le forum Delphi
    Réponses: 6
    Dernier message: 13/12/2006, 07h18
  2. Comment synchroniser deux bases de données
    Par apoingsfermes dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 15/11/2006, 22h41
  3. Synchroniser deux zones de listes en VBA
    Par gaelj dans le forum Access
    Réponses: 3
    Dernier message: 03/09/2006, 19h55
  4. Synchroniser deux listes
    Par Mahefasoa dans le forum Access
    Réponses: 4
    Dernier message: 02/08/2006, 10h31
  5. Synchroniser deux CPU (deux algos)
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 28/04/2006, 14h46

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