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 :

Livebindings (encore) les trucs qui me rendent dingues


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 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut Livebindings (encore) les trucs qui me rendent dingues
    Bonjour,

    je me bat, encore, avec les Livebindings. Jusqu'à présent je n'ai eu affaires qu'à des champs texte simples mais maintenant cela se complexifie et je me heurte à plusieurs problèmes !

    1- Un TEdit pour un numéro de téléphone France (donc avec le 0 devant) impossible de l'enregistrer correctement il perd toujours son 0 ! sauf si je met des espaces entre les chiffre i.e. 02 04 03 01 12 (livebindings prend des liberté avec le type de champ ) il y a certainement une astuce dans CustomParse
    2- Comment faire pour lier un TPopuBox, itemIndex, la valeur que je lie ne l'est que de Champ vers Composant mais pas l'inverse (non dataaware)
    [Edit]2 bis - Comment lier un ComboEdit, c'est presque la même chose que le Popupbox, à la différence près que il est dataAware (avec SelectedValue) mais le comportement de ce dernier me semble bizarre : Il faut sélectionner dans la liste mais ensuite il semblerait qu'il faille taper sur Enter ou Tab pour valider le choix et cerise sur le gâteau si l'on peut dire SelectNext n'existe pas en FMX
    3- Comment lier une liste contenu dans un mémo et bien sur la mettre à jour
    4- Comment lier un groupe de RadioButton à une valeur (et bien sur la mettre à jour)
    par exemple : 4 radiobutton et selon la valeur 0-3 un seul des RB est actif ?
    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 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Pour le point n°2 la piste serait peut être de faire comme indiqué dans ce tutoriel (pour TTrackbar) le hic quel messages suis-je censé utiliser dans le cas du PopupEdit ?
    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
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    le point 2 est enfin résolu.
    j'avais fait plusieurs tentatives réussies mais toujours mettant en oeuvre du code pour pouvoir détecter les changements et mettre à jour les données. Il me semblait improbable qu'aucun équivalent du TDBLookupComboBox n'existe finalement j'ai réussi à maitriser ce livebinding tout bête à priori mais seulement si on le découvre !

    tout d'abord, pour les pressés le shéma
    Nom : CaptureLVLookup.PNG
Affichages : 301
Taille : 29,7 Ko
    puis les explications
    le secret réside dans l'utilisation de Item.LookupData qui positionne dans la liste et SelectedValue qui est la valeur que l'on recherche et/ou modifie
    prenons tout d'abord le premier combobox (combobox1) celui ci est relié pour le remplir via Item.text à une table (FDTable2 , BindSourceDB22) cependant ce que je voulait était lié l'IDMAGASIN de la table1 à cette deuxième Table tout en affichant bien sûr le Nom du Magasin pour cela il faut lier Item.LookupData à l'IDMAGASIN de la table remplissant la liste (table2) et l'IDMAGASIN de la table1 à SelectedValue .

    Evident n'est-ce pas ? reste que tout ce que j'avais lu jusqu'à présent avait tendance à utiliser les tags des Items (donc via un remplissage par code)

    Pour le second combobox c'est un peu plus complexe . En fait mon objectif était plutôt d'avoir une liste figée (donc saisie dans items)
    '',
    'M.',
    'Mme',
    'Mlle'
    et de récupérer la valeur de ItemIndex, sauf que, ItemIndex n'est pas bidirectionnel
    pour l'instant j'ai choisi la solution d'utiliser une Query SQLite créée de cette manière
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT 0 AS I, '' as CIVIL
    UNION
    SELECT 1,'M.'
    UNION
    SELECT 2,'Mme'
    UNION
    SELECT 3,'Mlle'
    mais je ne désespère pas de trouver la solution qui doit résider dans les propriétés CustomParse et CustomFormat

    Affaire à suivre
    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

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut Comment lier un ComboEdit, suite et fin du point 2
    Bonjour,

    la solution d'une requête SQLite était quand même tiré par les cheveux

    dans le même ordre d'idée je suis passé par un TPrototypeBindSource déclaré avec deux champs Valeur (entier) et Nom (string)
    bien sur il faut un peu plus de code pour remplir cette source
    tout d'abord il faut déclarer une classe
    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
     TValueItem = Class
      private
        FValeur: Integer;
        FNom: string;
        procedure SetNom(const Value: string);
        procedure SetValeur(const Value: Integer);
      published
         property Nom : string read FNom write SetNom;
         property Valeur : Integer read FValeur write SetValeur;
      End;
     
    .... 
    procedure TValueItem.SetNom(const Value: string);
    begin
    FNom:=Value;
    end;
     
    procedure TValueItem.SetValeur(const Value: Integer);
    begin
    FValeur:=Value;
    end;
    puis le remplir
    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
     
    uses System.Generics.Collections;
    ....
     
    procedure TForm2.PrototypeBindSource1CreateAdapter(Sender: TObject;
      var ABindSourceAdapter: TBindSourceAdapter);
    var PotentielListe:TObjectList<TValueItem>;
        aPotentiel : TValueItem;
    begin
      PotentielListe:= TObjectList<TValueItem>.Create(true);
      aPotentiel:=TValueItem.Create;
      aPotentiel.Nom:='';
      aPotentiel.Valeur:=0;
      PotentielListe.Add(aPotentiel);
      aPotentiel:=TValueItem.Create;
      aPotentiel.Nom:='M.';
      aPotentiel.Valeur:=1;
      PotentielListe.Add(aPotentiel);
      aPotentiel:=TValueItem.Create;
      aPotentiel.Nom:='Mme';
      aPotentiel.Valeur:=2;
      PotentielListe.Add(aPotentiel);
      aPotentiel:=TValueItem.Create;
      aPotentiel.Nom:='Mlle';
      aPotentiel.Valeur:=3;
      PotentielListe.Add(aPotentiel);
      ABindSourceAdapter:=TListBindSourceAdapter<TValueItem>.Create(self,PotentielListe,True);
    end;
    Avant de lier comme au dessus.

    Reste, que cela fait beaucoup de code

    LA SOLUTION SANS CODE
    J'ai enfin trouvé "le moyen" plus simple, la création d'un TBindLink. Dès lors qu'il y a un TBindList sur la forme double cliquer dessus pour obtenir l'écran listant les Liaisons. Ajouter un BindLink (Nouvelle liaison puis TBindLink ou Nouveau BindLink)

    une fois ce dernier créé, remplir ses propriétés
    Controlcomponent := le nom de la combobox
    SourceComponent := le BindSource de la Table/Query
    SourceMemberName:= le nom du champ

    Toujours dans les propriétés, cliquer sur les ... de FormatExpressions, ajouter en une nouvelle
    renseigner les propriétés
    ControlExpression:= ItemIndex
    SourceExpression:=Value

    retourner sur le BindLink créé et cliquer sur les ... de ParseExpressions, ajouter en une nouvelle avec les mêmes propriétés que précédemment
    et Bingo! la liaison est faite , bidirectionnelle et sensible aux données

    Ouf, je suis sûr que cela mériterait un petit tutoriel pour rassembler tout ça (peut être pour le prochain week-end)

    je n'ai toujours pas de solution pour les points 1,3 et 4 donc le post est toujours ouvert
    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

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