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

  1. #1
    Responsable Delphi

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    février 2013
    Messages
    1 347
    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 347
    Points : 18 128
    Points
    18 128
    Billets dans le blog
    74

    Par défaut Delphi et les LiveBindings - Épisode 1

    Nom : img1.png
Affichages : 260
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 ?
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    412
    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 : 412
    Points : 2 292
    Points
    2 292

    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.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    9 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 9 598
    Points : 23 366
    Points
    23 366
    Billets dans le blog
    15

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Berlin, Tokyo) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  4. #4
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 861
    Points : 2 399
    Points
    2 399
    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
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 861
    Points : 2 399
    Points
    2 399
    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
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Membre expérimenté
    Avatar de ALWEBER
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    981
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : mars 2006
    Messages : 981
    Points : 1 539
    Points
    1 539
    Billets dans le blog
    5

    Par défaut

    Nom : Capture.PNG
Affichages : 44
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
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 861
    Points : 2 399
    Points
    2 399
    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
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

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

    Informations forums :
    Inscription : mars 2005
    Messages : 3 169
    Points : 9 138
    Points
    9 138

    Par défaut

    Que vaut InitializeControlValue dans ton dfm, que l'on voit False dans un exemple de LiveBinding d'ALWEBER ?
    Delphi 5 Pro - Delphi 10.2 Tokyo Community Edition - CodeTyphon 6.50 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre expérimenté
    Avatar de ALWEBER
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    981
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : mars 2006
    Messages : 981
    Points : 1 539
    Points
    1 539
    Billets dans le blog
    5

    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
    Inscrit en
    janvier 2007
    Messages
    9 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 9 598
    Points : 23 366
    Points
    23 366
    Billets dans le blog
    15

    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 : 33
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  
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Berlin, Tokyo) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  11. #11
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 861
    Points : 2 399
    Points
    2 399
    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 : 28
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
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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