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 :

Delphi et les LiveBindings - Épisode 1


Sujet :

Delphi

  1. #1
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 858
    Points
    20 858
    Billets dans le blog
    84
    Par défaut Delphi et les LiveBindings - Épisode 1
    Nom : img1.png
Affichages : 2131
Taille : 12,2 Ko

    Serge Girard, bien connu des habitués du forum Delphi sous le pseudonyme de SergioMaster, vous propose le premier tutoriel d'une série dédiée aux LiveBindings.

    L'objectif de cette première partie est de comprendre pourquoi les LiveBindings sont apparus et ce qu'ils peuvent vous apporter aussi bien avec FireMonkey qu'avec la VCL.

    http://serge-girard.developpez.com/t...ngs/Episode-1/

    Que pensez-vous de ce tutoriel ?

    Quelle expérience avez-vous des LiveBindings ?

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 670
    Points : 3 679
    Points
    3 679
    Billets dans le blog
    2
    Par défaut
    Merci SergioMaster pour cette introduction aux LiveBindings. A titre personnel, je n'ai pas encore utilisé ces fonctionnalités.
    J'ai hâte de voir la suite avec des objets plus complexes et liaisons avec une base de données.

    Il est à noter que :
    - une propriété x de l'objet A peut être liée à plusieurs propriétés de l'objet B. Dans l'exemple du tutoriel, on pourrait en plus de lier la valeur du TrackBar à la position.X du cercle, lier la valeur du trackBar à la scale.x du cercle par exemple. Ainsi, le changement de valeur du trackBar joue sur 2 propriétés du cercle : déplacement sur X et étirement sur X également.
    - il est possible de lier la propriété x de l'objet A à une propriété y de l'objet B et à une propriété z de l'objet C. Dans l'exemple du tutoriel, en plaçant un TLabel sur la forme, il est possible de lier la valeur du TrackBar à la propriété Text du label. Ainsi, lorsqu'on bouge le trackBar, le cercle se déplace et le label affiche la valeur X en temps réel sans avoir à coder quoi que se soit.

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 286
    Points : 41 722
    Points
    41 722
    Billets dans le blog
    64
    Par défaut
    Bonjour,

    @Gbegreg En ce qui concerne tes notes, c'est tout à fait vrai les possibilités sont nombreuses mais, intentionnellement je suis resté hyper-simple dans cette introduction pour pouvoir faire la comparaison entre la méthode du tout par code et celle que permet les LiveBindings.

    Pour tout dire, plutôt qu'un simple cercle qui se déplace j'avais envisagé un programme qui aurait représenté les phases de la lune (donc déplacement horizontal et vertical) ce qui m'a arrêté c'est la codification de l'ombre à porter sur la "lune" trop complexe pour une simple introduction.

    Le second épisode est en relecture technique (programme associé : un convertisseur de monnaie € <-> devise, je n'en ai fait que la partie VCL car son pendant FMX n'apporte rien). J'y joue toujours sur une seule propriété (texte) mais de deux TEdits et surtout avec les "fonctions" d'un "objet" qui n'est pas un composant/contrôle de la forme (les mots fonctions et objet sont des termes à débattre).

    En vous laissant saliver dans l'attente de l'épisode suivant

  4. #4
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 353
    Points
    4 353
    Billets dans le blog
    2
    Par défaut
    Bonjour Serge,

    je viens tout juste de commencer à lire tes tutoriels sur les liveBindings avec Delphi CE
    Dans cette première partie (plutôt très simple) Il y a une petite chose qui m'embête et que je ne m'explique pas.

    Est-ce normal lorsque tu lies la propriété Value du TTrackBar à la poisition.x du TCircle, que la propriété Value du TTrackBar change automatiquement ? Celle-ci n'est plus à 0. J'ai essayé de lier (clic droit --> Lier visuellement) en commençant par le TCircle et ensuite j'ai essayé en commençant avec le TTrackbar. C'est plutôt gênant comme comportement.

    Aurais tu une explication ? Y-a-t-il une chose que j'aurais mal compris ?

    Pour corriger le problème j'ai du rajouté un OnCreate sur la Form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Trackbar1.Value := 0;
    end;
    Merci

    Bonne journée

  5. #5
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 353
    Points
    4 353
    Billets dans le blog
    2
    Par défaut
    Pour info la propriété value prend celle de postion.x du TCircle. Je peux remettre Value à 0. J'enregistre le projet. Je ferme tout puis j'ouvre de nouveau le projet. Value est de nouveau définie avec la valeur du TCircle.Position.X est-ce un bug ??? Très déstabilisant comme truc !

    Sa commence bien, je sens que j'ai vite laisser tomber cette façon de faire du coup et faire l'impasse sur l'utilisation des LiveBindings

    PS : en forçant Value à zero à la conception, à l'exécution Value = TCircel.Position.X

  6. #6
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 510
    Points : 2 782
    Points
    2 782
    Billets dans le blog
    10
    Par défaut
    Nom : Capture.PNG
Affichages : 989
Taille : 18,9 Ko
    Tu copies le code ci dessous et tu le colle dans une fiche fmx vierge
    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
      object TrackBar1: TTrackBar
        CanParentFocus = True
        Max = 360.000000000000000000
        Orientation = Horizontal
        Position.X = 48.000000000000000000
        Position.Y = 104.000000000000000000
        TabOrder = 1
      end
      object Button1: TButton
        Position.X = 208.000000000000000000
        Position.Y = 104.000000000000000000
        TabOrder = 4
        Text = 'Button1'
      end
      object BindingsList1: TBindingsList
        Methods = <>
        OutputConverters = <>
        Left = 20
        Top = 5
        object LinkControlToPropertyRotationAngle: TLinkControlToProperty
          Category = 'Liaisons rapides'
          Control = TrackBar1
          Track = False
          ComponentProperty = 'RotationAngle'
        end
        object LinkControlToPropertyRotationAngle2: TLinkControlToProperty
          Category = 'Liaisons rapides'
          Control = TrackBar1
          Track = False
          Component = Button1
          ComponentProperty = 'RotationAngle'
          InitializeControlValue = False
        end
      end

  7. #7
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 353
    Points
    4 353
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Ca va me servir à quoi de recopier dans une fiche vierge ? De plus l'exemple dans le tuto c'est un TCircle et un TTrackbar. Ce n'est pas une solution que tu me proposes. Je ne vois aucun intérêts à faire ça

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 404
    Points
    11 404
    Billets dans le blog
    6
    Par défaut
    Que vaut InitializeControlValue dans ton dfm, que l'on voit False dans un exemple de LiveBinding d'ALWEBER ?

  9. #9
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 510
    Points : 2 782
    Points
    2 782
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Bonjour,
    Ca va me servir à quoi de recopier dans une fiche vierge ? De plus l'exemple dans le tuto c'est un TCircle et un TTrackbar. Ce n'est pas une solution que tu me proposes. Je ne vois aucun intérêts à faire ça
    Je n'avais que peu de visibilité sur le travail que tu a réalisé. Je t'ai proposé un modele alternatif pour que tu puisse comparer avec ton exemple.
    Cordialement

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 286
    Points : 41 722
    Points
    41 722
    Billets dans le blog
    64
    Par défaut
    Bonjour,

    Enfin un lecteur Bon, désolé de ne pas avoir répondu plus tôt je pense que tu t'es simplement planté entre la propriété du composants à modifier et la source ou bien alors il ne s'agit pas du bon type de liaison ?

    Prend ceci comme une réponse rapide

    Sans relire mon tutoriel et en fonction de mes progrès dans le domaine

    La première chose qui me vient à l'esprit et qui expliquerait le comportement que tu décris est que tu as utilisé le concepteur visuel et que tu parles d'un lien de type LinkControlToProperty et non un TBindExpression. (Le concepteur visuel est pratique mais produit ce genre de piège)

    Voilà comment je le ferai maintenant
    Nom : Capture.PNG
Affichages : 1089
Taille : 41,0 Ko
    mais cela nécessite d'introduire une notion de "données" (le prototypebindsource) qui risque d'en échauder plus d'un (un peu comme les premiers pas de dbexpress et sa litanie de composants à mettre avant de pouvoir établir une simple query)

    Après avoir relu rapidement mon tuto
    cela doit bien être un LinkControlToProperty qui est utilisé et Tourlourou pointe sur le bon coupable
    Citation Envoyé par Tourlourou
    Que vaut InitializeControlValue dans ton dfm ?

    En conclusion : faut-il que je revisite le tutoriel à l'aune de mes progrès en livebindings ?

    A te lire ...
    Images attachées Images attachées  

  11. #11
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 353
    Points
    4 353
    Billets dans le blog
    2
    Par défaut
    Bonjour

    @ALWEBER : pas de probleme

    @Sergio : J'ai suivi ton tuto à la lettre

    Comme il s'agit dans un premier temps d'une introduction, nous utiliserons la première solution. Un petit clic droit sur la forme et la sélection de l'option « Lier visuellement... »* nous ouvre, en bas de l'écran, une fenêtre de conception visuelle.
    ...
    Juste en dessous de cette dernière propriété, il y a CustomFormat. Pour cette dernière nous indiquerons notre calcul, selon la formule suivante :

    Formule : Position.X + Value*Width/Max - Owner.Circle1.Width/2
    ....
    Surprise ? Pas une seule ligne de code et pourtant, cela fonctionne ! Où est passé notre calcul ? On le retrouve dans le source de la forme, c'est-à-dire dans le fichier d'extension .fmx correspondant :
    Voici une capture

    Nom : 2018-09-30_150151.jpg
Affichages : 1014
Taille : 177,4 Ko

    @tourlourou : pas de InitializeControlValue dans le DFM
    et voici le DFM tel que créé par l'EDI

    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
    object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Form1'
      ClientHeight = 240
      ClientWidth = 589
      FormFactor.Width = 320
      FormFactor.Height = 480
      FormFactor.Devices = [Desktop]
      OnCreate = FormCreate
      DesignerMasterStyle = 0
      object TrackBar1: TTrackBar
        CanParentFocus = True
        Orientation = Horizontal
        Position.X = 40.000000000000000000
        Position.Y = 184.000000000000000000
        Size.Width = 529.000000000000000000
        Size.Height = 19.000000000000000000
        Size.PlatformDefault = False
        TabOrder = 0
        Value = 22.000000000000000000
      end
      object Circle1: TCircle
        Position.X = 22.000000000000000000
        Position.Y = 104.000000000000000000
        Size.Width = 50.000000000000000000
        Size.Height = 50.000000000000000000
        Size.PlatformDefault = False
      end
      object BindingsList1: TBindingsList
        Methods = <>
        OutputConverters = <>
        Left = 28
        Top = 13
        object LinkControlToPropertyPositionX: TLinkControlToProperty
          Category = 'Liaisons rapides'
          Control = TrackBar1
          Track = False
          Component = Circle1
          ComponentProperty = 'Position.X'
          CustomFormat = 'Position.X+(Value*(width/max)) -( owner.Circle1.width / 2)'
        end
      end
    end
    Et voila le DFM dans le tuto :

    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
    object Form8: TForm8
      Left = 0
      Top = 0
      Caption = 'Jeu de balle'
      ClientHeight = 123
      ClientWidth = 549
      FormFactor.Width = 320
      FormFactor.Height = 480
      FormFactor.Devices = [Desktop]
      DesignerMasterStyle = 0
      object Circle1: TCircle
        Fill.Color = claRed
        Position.Y = 24.000000000000000000
        Size.Width = 40.000000000000000000
        Size.Height = 50.000000000000000000
        Size.PlatformDefault = False
        Stroke.Color = claRed
      end
      object TrackBar1: TTrackBar
        Align = Bottom
        CanParentFocus = True
        Orientation = Horizontal
        Margins.Left = 20.000000000000000000
        Margins.Right = 20.000000000000000000
        Margins.Bottom = 10.000000000000000000
        Position.X = 20.000000000000000000
        Position.Y = 94.000000000000000000
        Size.Width = 509.000000000000000000
        Size.Height = 19.000000000000000000
        Size.PlatformDefault = False
        TabOrder = 1
      end
      object BindingsList1: TBindingsList
        Methods = <>
        OutputConverters = <>
        Left = 76
        Top = 5
        object LinkControlToPropertyPositionX: TLinkControlToProperty
          Category = 'Liaisons rapides'
          Control = TrackBar1
          Track = False
          Component = Circle1
          ComponentProperty = 'Position.X'
          CustomFormat = 'Position.X + Value*Width/Max - Owner.Circle1.Width/2'
        end
      end
    end
    A n'y rien comprendre.

    Du coup Tourlourou a raison il manque le fait qu'il faut définir InitializeControlValue à FALSE dans ton tuto Serge. Rien de bien méchant pour le coup. Je vais pouvoir continuer ma lecture


    Merci de vos réponses. Problème

    A bientôt

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/10/2005, 15h38
  2. Delphi et les fichiers texte
    Par the watcher dans le forum Langage
    Réponses: 5
    Dernier message: 28/10/2005, 16h31
  3. [IB7][Delphi 7] Les Blobs
    Par kmsoft dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 20/11/2004, 19h13
  4. Delphi - récupérer les infos d'un utilisateur
    Par jlf dans le forum Débuter
    Réponses: 2
    Dernier message: 26/06/2004, 12h34

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