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 :

Casse tête listbox..


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut Casse tête listbox..
    Bonjour,

    Je vais essayer de m'expliquer au mieux.

    J'ai un projet contenant 3 listbox (que je dénommerai Liste1, Liste2 et liste3)

    Liste1 comprend des données (1, 2, 3, 4 par exemple)
    Liste2 comprend des données (5, 6, 7, 8 par exemple)

    Liste1 et Liste2 ont chacunes des boutons '+' pour ajouter les items sélectionnés dans Liste3.

    Liste3 n'est donc qu'un rassemblement des choix faits dans Liste1 et/ou Liste2.

    J'ai créé un bouton '-' pour Liste3. Ce bouton doit pouvoir lorsque l'on clique sur un item de Liste3, de renvoyer cet item vers sa Listbox d'origine.

    Exemple :
    Dans Liste1, je sélectionne 1 et 3 (via le bouton '+' associé à Liste1)
    Dans Liste2, je sélectionne 5 et 7 (via le bouton '+' associé à Liste2)

    Les items de Liste3 est donc 1, 3, 5 et 7.

    J'aimerais que lorsque je clique sur 5 (par exemple) je renvoie cet item dans sa Listbox d'origine, c'est à dire Liste2. Idem pour un item d'une autre liste.


    Est-ce possible avec un AddObject? comment réussir pour programmer ceci?
    Je tiens, à ajouter, que tous les items des Listbox sont différents (pas de doublons, donc pas de question à se poser pour le renvoi dans la lisbox).

    J'ai pas mal cherché sur la FAQ, le forum et sur le net, mais je n'ai rien trouvé.

    Merci d'avance.

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Salut;

    Pour comprendre le mécanisme je te conseil de faire Fichier-->Nouveau-->autre sélectionnes l'onglet Fiches là tu dois trouver des modèles, choisis Boite double liste. Une fois tu l'ouvre tu as devant toi toutes les routines nécessaires à la manipulation des items.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut
    Merci pour le conseil, je suis déja passé par là.

    C'est aisé à comprendre pour une double liste, mais le problème se complique quand on a plusieurs listes.

    A quelle liste appartient l'item sélectionné... Quelle est sa liste d'origine...

    C'est là mon problème.

  4. #4
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Il n'y a pas de magie mon ami.
    Si tu veux remettre l'item sélectionne dans sa liste d'origine, il te faut mémoriser l'action qui a été faite avant.
    utilise une autre liste invisible pour le mémoriser.

    A+
    On progresse .....

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 735
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 735
    Points : 13 262
    Points
    13 262
    Par défaut
    Tu peux assigner la liste d'origine à la propriété Objects.

  6. #6
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    comme tu peux faire un tableaux à deux dimensions (liste, élément). ceci revient à dire qu'il faut mémoriser !
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Salut,

    Voici une petite idée.
    Tu dois créer un objet dans lequel tu mets par exemple un champ position et un champ Value.
    Tu crés deux instance de cette objet.
    Tu enregistres dans Position, la position de ta valeur dans ListBox1 et ton texte dans Value.
    Tu fais la même chose pour ta deuxième ListBox2.
    Ensuite quand tu fais le bouton moins qui est lié à ta ListBox3, tu compares ta ligne sélectionnée avec un des deux objets que tu as créer puis tu fais un insert dans ta ListBox en prenant position comme valeur où il doit repositionner ton texte et Value comme String.

    Voici le code, ce sera peut être un peu plus clair

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TObj = class(TObject)
        Position: integer;
        Value   : string;
      end;
     
      TForm1 = class(TForm)
        ListBox1: TListBox;
        ListBox2: TListBox;
        ListBox3: TListBox;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Déclarations privées }
        Obj1: TObj;
        Obj2: TObj;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Obj1:= TObj.Create;
      Obj1.Position:= ListBox1.ItemIndex;
      Obj1.Value   := ListBox1.Items[ListBox1.ItemIndex];
      ListBox3.AddItem(ListBox1.Items[ListBox1.ItemIndex], Obj1);
      ListBox1.DeleteSelected;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Obj2:= TObj.Create;
      Obj2.Position:= ListBox2.ItemIndex;
      Obj2.Value   := ListBox2.Items[ListBox2.ItemIndex];
      ListBox3.AddItem(ListBox2.Items[ListBox2.ItemIndex], Obj2);
      ListBox2.DeleteSelected;
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      if ListBox3.Items.Objects[ListBox3.ItemIndex] = Obj1 then
        ListBox1.Items.Insert(Obj1.Position, Obj1.Value)
      else
        ListBox2.Items.Insert(Obj2.Position, Obj2.Value)
    end;
     
    end.
    Bon code

    Jeankiki

  8. #8
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Tu peux assigner la liste d'origine à la propriété Objects.
    Si tu n'as pas besoin de conserver la position dans la liste d'origine, la méthode de Andnotor est la meilleur.
    Ci-attaché la source.
    Fichiers attachés Fichiers attachés
    On progresse .....

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 735
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 735
    Points : 13 262
    Points
    13 262
    Par défaut
    Citation Envoyé par Andry Voir le message
    Si tu n'as pas besoin de conserver la position dans la liste d'origine
    Concerver la position ne fonctionnerait que si les annulations sont faites exactement dans l'ordre inverse de l'insertion .
    De plus l'insertion d'une chaîne au-délà de Count -1 entraîne une AV. Tu as meilleur temps de travailler avec des listes triées.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut
    Ok, j'opte pour les listes triées. Merci pour vos conseils.

    Je créée en fait une Stringgrid de 3 colonne par listbox (pour des raisons perso).

    Dans la colonne 1, je mets le texte de l'item sélectionné
    Dans la colonne 2, sa listbox d'origine
    Dans la colonne 3, son ItemIndex.

    Une dernière question cepedant (pas facile d'être autodidacte) :
    Lors de l'appui sur mon bouton '-' de ma liste 3 pour renvoyer l'item sélectionné vers sa listbox d'origine, je dois lire toutes les valeurs contenues dans toutes les stringgrid, et comparer l'item sélectionné au contenu de chaque celulle. Quand la chaine est similaire (aucune chaine identique dans toutes mes listbox, je le rappelle), je le renvoie en prenant les informations dans les 3 colonnes.

    Est-il possible de scruter toutes les cellules de toutes mes stringgrid et faire la comparaison du contenu des cellules avec l'item sélectionné?

    Merci encore.

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 735
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 735
    Points : 13 262
    Points
    13 262
    Par défaut
    Je créée en fait une Stringgrid de 3 colonne par listbox (pour des raisons perso).

    Dans la colonne 1, je mets le texte de l'item sélectionné
    Dans la colonne 2, sa listbox d'origine
    Dans la colonne 3, son ItemIndex.
    Pourquoi faire simple quand on peut faire compliqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Row := StringGrid1.Cols[1].IndexOf(ListBox3.Items[ListBox3.ItemIndex]);

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut
    Est-ce sensé m'aider? Je ne comprends pas ce que tu veux me dire.

    Row est une variable de type string?

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 735
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 735
    Points : 13 262
    Points
    13 262
    Par défaut
    IndexOf te renvoi la ligne (Row = integer) contenant ton texte dans le StringGrid. La lecture (string) se fait ensuite par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringGrid1.Cells[2, Row];
    A toi d'adapter les indices de colonnes.

  14. #14
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Concerver la position ne fonctionnerait que si les annulations sont faites exactement dans l'ordre inverse de l'insertion .
    De plus l'insertion d'une chaîne au-délà de Count -1 entraîne une AV. Tu as meilleur temps de travailler avec des listes triées.
    C'est sur. Faut activé sorted au niveau de chaque ListBox et le tour est joué.
    On progresse .....

Discussions similaires

  1. [Tableaux] Casse têtes de boucles
    Par Anduriel dans le forum Langage
    Réponses: 5
    Dernier message: 28/06/2006, 00h24
  2. Casse tête chinois
    Par Jahjouh dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 15/03/2006, 09h04
  3. requête SQL un peu casse tête
    Par hellbilly dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/12/2005, 10h03
  4. Classe, pile, pointeurs et casse-tête!
    Par zazaraignée dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2005, 16h57
  5. casse-tête excel
    Par gregius dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 16h38

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