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 :

ComboBox et récupération de ligne


Sujet :

Delphi

  1. #1
    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 ComboBox et récupération de ligne
    Salut ,

    Pour alimenter un comboBox via une BDD, j'utilise la methode AddObject pour le remplir avec la description et la clé primaire (entier) d'une Table comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    While Not IBQUERY.eof do
    begin
       Combo.AddObject(FieldByName('DESC').Asstring,Pointer(FieldByName(ID).Asinteger));
       Next;
    end;
    je peux avoir l'ID correspondant à la ligne selectionné par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Id := Integer(combo.Items.Objects[combo.itemIndex]);
    Imaginons que je connais Id et j'aimerais retrouver l'item correspondant à Id.
    J'ai bidoulé une solution en parcourant et testant les items du combo,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     For i := 0 to Combo.Items.Count -1 do
     begin
       if  Integer(combo.Items.Objects[i]) =  Id then
       begin
          Desc :=  Combo.Items[i];
          break;
       end;   
     end
    mais c'est carrément long s'il y a pas mal d'items.
    Est ce que quelqu'un a une suggestion

    Merci

  2. #2
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Pourquoi ne pas faire une requête sur la base pour récupérer le libellé correspondant ?

    Sinon, autre possibilité : tu stockes tes ID dans un TStringList trié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    While Not IBQUERY.eof do 
    begin 
      // Associe l'ID à l'indice dans la combo
       listeTriee.AddObject(FieldByName(ID).AsString,pointer(combo.Items.Count));
     
       Combo.AddObject(FieldByName('DESC').Asstring,Pointer(FieldByName(ID).Asinteger)); 
       Next; 
    end;
    en supposant que ta combo ne soit pas triée, sinon les indices ne seront plus bons. Si tu veux la trier, trie la requête qui l'alimente.

    Bloon

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    une question: Pointer(FieldByName(ID).Asinteger)) point sur quoi exactement?
    si sur une donnée qui est une résultat d'une requete et si la requete change? alors... c'est le crache
    peut être que je

  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
    Salut,

    - A Bloon :
    Faire une nouvelle requête est la solution facile mais, j'essaie de speeder mes executions.
    - A eadm,
    Pointer(...) est à mon avis un Cast tout comme Integer(....).

    En faites, j'ai trouvé comment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Combo.ItemIndex := Combo.Items.IndexOfObject(Pointer(Id));

    Merci à vous tous

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 79
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    ce sujet m'interresse. Je voulais le faire remonter pour savoir si Andry avait trouvé une solution ?

    Merci d'avance.

  6. #6
    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 AlexB59
    Bonjour,

    ce sujet m'interresse. Je voulais le faire remonter pour savoir si Andry avait trouvé une solution ?

    Merci d'avance.
    AlexB59,
    La solution que j'ai trouvé est dans mon dernier post la haut.
    Mais, ceci ne marche que si l'identifiant est un entier.
    Sinon, explique ton problème.
    A+

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 73
    Points
    73
    Par défaut
    Bonjour à tous,

    Je fais remonter ce sujet parce que j'ai une question. Pour quoi dis-tu que celà ne marche que si l'identifiant est un entier.
    J'ai exactement la meme situation que toi sauf que moi l'identifiant est un string... et en effet ca ne marche pas. Il ne me trouve pas l'objet.

    Est ce que tu as une idée pour contourner le problème?

    Vince

  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
    Salut,
    Je pense que ceci est lié au fait que avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    While Not IBQUERY.eof do 
    begin 
       Combo.AddObject(FieldByName('DESC').Asstring,Pointer(FieldByName(ID).Asinteger)); 
       Next; 
    ....
    ....
    Combo.ItemIndex := Combo.Items.IndexOfObject(Pointer(Id)); 
    end;
    il y a un cast d'un entier vers un pointeur, et etant donné que les deux sont codé en 32Bits, ça passe, et l'inverse aussi marche.
    Mais je ne sais pas trop pourquoi ça ne passe pas avec un String, du moins , je n'ose pas trop m'aventurer.

    A+

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Par curiosité, tu peux te retrouver avec combien d'items dans ta combobox ?

    Parce que si tu en as vraiment beaucoup tu ne vas pas avoir 36000 solutions :

    - d'abord Quicksort sur tes id d'entiers, en gardant une correspondance entre tes ids et tes items avec un tableau à deux colonnes (ID et pointeur sur Item)
    - puis recherche dychotomique.

    sincèrement je ne vois pas ce qui pourrait être plus optimisé...

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par plante20100
    Bonjour à tous,

    Je fais remonter ce sujet parce que j'ai une question. Pour quoi dis-tu que celà ne marche que si l'identifiant est un entier.
    J'ai exactement la meme situation que toi sauf que moi l'identifiant est un string... et en effet ca ne marche pas. Il ne me trouve pas l'objet.

    Est ce que tu as une idée pour contourner le problème?

    Vince
    J'avais proposé quelque chose sur le forum, ici :
    http://www.developpez.net/forums/vie...bobox&start=15

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    La solution IndexOfobject ne peut marcher qu'avec des éléments "simples" (byte, char, integer, pointer) mais pas avec des objets (strings, tstringlist, ...).

    C'est du au fait que la property "Objects" contient des pointeurs.
    On peut donc "caster" les pointers avec des éléments simples (4 octets max).
    Lorsqu'il s'agit de pointeurs de string (ou de tout autre objet), il faudrait pour avoir un résultat connâitre l'addresse de la string (ou de l'objet)recherché(e), alors que ce que l'on on a est son contenu.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Il y a une solution pour le stockage des chaines dans un TStrings. Il faut effectivement passer par un pointeur intermédiaire.

    Voilà la solution :

    1- On stocke la valeur chaîne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Combo.Items.addObject('abcd', TObject(Longint(NewStr('toto'))));
    2- On lit la valeur chaîne de l'item sélectionné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str := PString(Combo.Items.Objects[Combo.ItemIndex])^;
    3- Ne pas oublier de détruire les objets crées (dans le OnDestroy, par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For i := 0 to Combo.Items.Count - 1 do
      DisposeStr(PString(combo.Items.Objects[i]));
    Cela fonctionne, je l'utilise

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/12/2006, 20h30
  2. [Débutant] Récupération de lignes
    Par wizardman dans le forum C++
    Réponses: 8
    Dernier message: 30/05/2006, 07h53
  3. Réponses: 9
    Dernier message: 15/05/2006, 17h51
  4. [AWK] récupération de lignes qui se suivent
    Par PtiNico dans le forum Linux
    Réponses: 2
    Dernier message: 12/04/2005, 19h44
  5. [PointBase][Probleme] Récupération de ligne
    Par cibouseb dans le forum Autres SGBD
    Réponses: 7
    Dernier message: 28/07/2003, 14h51

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