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 :

Combobox et "keyvalue" ?


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut Combobox et "keyvalue" ?
    Bonjour,

    Si j'ai bien compris les livebindings on peut faire l'équivalent d'un VCL.DBCombobox de la manière suivante :

    On pose un comboxbox , on lie le comboxbox aux données qui nous intéresse et la messe est dite .
    Sauf que , s'il s'agit de récupérer le texte sélectionné c'est facile , mais comment récupérer la 'SelectedValue' (cette propriété semble bien exister puisque l'on peut faire la liaison) et pourtant , de base, impossible (propriété inconnue) . Comment accède t-on à cette valeur (la fameuse keyvalue d'un VCL.DBCombobox) ?

    Question subsidiaire en livebindings le combobox propose par défaut les liaisons :
    1. SelectedValue (objet de ma première question)
    2. Synch
    3. Item.Text
    4. Item.LookData

    si je n'ai aucun problème à comprendre Item.text, qu'est-ce que les deux autres ?

    en fait mon objectif est simple : faire sélectionner dans ma combobox et récupérer la "keyvalue' comme paramètre d'une query (là aussi , serait-il possible de "livebinder", je doute ?)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Finalement , je suis revenu a des 'classiques' , un combobox sans livebindings (et donc chargé par programme) .
    pour en faire un 'DBCombobox' du coup , j'ai du faire appel a mes vieilles bases "Delphiesque"

    une classe pour définir l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      TKey = class
       private
         fCode: string;
       public
         property Code : string read fCode;
         constructor Create(const Code : string) ;
       end;
    un bout de code pour 'charger'
    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
    if Datas.LignesProduits.Active then
    with LPBox do
     begin
       Items.Clear;
       Items.AddObject('pas de ligne de produit',TLigneProduit.Create(''));
       datas.LignesProduits.First;
       while not Datas.LignesProduits.Eof do
        begin
          Items.AddObject(Datas.LignesProduitsLIBELLE_LIGNE.AsString,TLigneProduit.Create(Datas.LignesProduitsCODE_LIGNE.AsString));
          Datas.LignesProduits.Next;
        end;
        if Datas.LignesProduits.Locate('CODE_LIGNE',Node.Attributes['ligneproduit'],[])
         then ItemIndex:=Items.IndexOf(Datas.LignesProduitsLIBELLE_LIGNE.asString)
         else ItemIndex:=0;
     end;
    Datas.LignesProduits.Active:=False;
    et on récupère la keyvalue par exemple via l’événement onChange de la combobox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CodeLigne.Text:=TLigneProduit(LPbox.Items.Objects[LPBox.ItemIndex]).Code;
    j'ai l'impression de régresser
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre éclairé Avatar de alves1993
    Homme Profil pro
    Développeur Java/Dart/Javascript/Android (FullStack)
    Inscrit en
    Décembre 2012
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java/Dart/Javascript/Android (FullStack)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 222
    Points : 659
    Points
    659
    Par défaut
    salut Mr SergioMaster j'ai le même problème que vous avez rencontrez mais vu votre solution je suis un peu troublé

    Pouvez vous expliquer votre solution à un jeune Delphiste qui à un niveau moyen
    Un geek ne vieillit pas, il se met à jour.

    Pour plus d'informations sur Android regarder la faq Android.
    Ensuite les tutoriels Android sont disponibles ici
    Pour les mecs, qui n'arrivent pas toujours à digérer le Javascript, Dart peut-être une solution pour vous.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par alves1993 Voir le message
    j'ai le même problème que vous avez rencontrez mais vu votre solution je suis un peu troublé
    Pouvez vous expliquer votre solution à un jeune Delphiste qui à un niveau moyen
    en fait , difficilement et ce n'est qu'un contournement , il doit certainement y avoir un moyen plus simple , mais les livebindings je ne les maitrise certainement pas assez .
    le seul 'truc' que j'ai trouvé à été d'utiliser une liste d'objet . L'objet est défini dans le premier code , ajouté (via une boucle sur la table) dans la liste des Items (donc au lieu d'utilisé le Items.Add('un libellé'); j'utilise Items.addObject) en simplifiant (en ôtant les fioritures nécessaires à mon programme c.a.d. ôter le cas ou il n'y a pas de ligne de produits (objet 0) et le positionnement fait après remplissage)

    soit table une table composée d'une CLE et un LIBELLE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var tobjet : Tkey;  // c'est peut être ça qui manquait ?
    ....
    Datas.table.Active:=True;
    with combobox do
     begin
       while not Datas.table.Eof do
        begin
          Items.AddObject(Datas.tableLIBELLE.AsString,TObjet.Create(Datas.TableCLE.AsString));
          Datas.table.Next;
        end;
     end;
    Datas.Table.Active:=False;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut
    Bonjour Serge,

    Je ne sais pas si tu l'as remarqué mais lorsque tu rajoutes un lien ( visuellement avec LiveBinding ), il crée un composant qui gère le lien, par exemple pour un combobox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        ComboBox1: TComboBox;
        LinkFillControlToField1: TLinkFillControlToField;
    Après on peut utiliser LinkFillControlToField1 pour récupérer certaines valeurs, par exemple pour récupérer le nom de la colonne liée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LinkFillControlToField1.FillDisplayFieldName;
    Je ne sais pas si cela peut t'aider mais il y a aussi d'autres propriétés de TLinkFillControlToField qui sont peut être être intéressantes ( à voir )

  6. #6
    Membre habitué
    Homme Profil pro
    Chef de projets
    Inscrit en
    Août 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 127
    Points : 195
    Points
    195
    Par défaut
    Bonjour,


    Je viens de me poser, la même question et je viens de trouver une solution. Je me permets donc de la proposer ici, car je suis tombé sur votre poste.


    Le binding sur la combo propose 4 propriétés :
    - SelectedValue
    - Synch
    - Item.Text
    - Item.LookupData


    Si l'on veut charger la combo et qu'elle change de valeur comme pour une DBCombo nous devons avoir :
    - Une source de données contenant la liste "DataListe"
    - Une source de données contenant une référence à l'item de la liste "DataGeneral"


    On va connecter DataGeneral.idDataListe sur la propriété SelectValue. Cette propriété va déterminer quel indice de la liste il faut sélectionner.
    Ensuite on va connecter DataListe.idDataListe sur la propriété Item.LookupData. Cette propriété contient la clé de l'item
    Et enfin on va connecter DataListe.TextDataListe sur la propriété Item.Text. Cette propriété contient le texte à afficher dans la combo.


    Je suppose que depuis le temps vous aviez trouvé une solution, mais ça pourra peut-être aider quelque d'autre.


  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par joc02 Voir le message
    Je suppose que depuis le temps vous aviez trouvé une solution, mais ça pourra peut-être aider quelque d'autre.
    Oui, le sujet était d'ailleurs résolu. J'ai surtout changé de versions et fait un peu plus attention à certains "pièges" du livebinding.
    Je crois que j'ai indiqué comment faire dans un autre sujet
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

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