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

Langage Delphi Discussion :

Livebinding TEdit avec changement via code


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 992
    Par défaut Livebinding TEdit avec changement via code
    Bonjour ,

    Je débute avec Livebinding, J'utilise une Tobjectlist<TObject>
    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
      TPath = Class
      Private
        FPathType, FOS, FDirectory: String;
        Procedure SetPathType(Const Value: String);
        Procedure SetOS(Const Value: String);
        procedure SetDirectory(const Value: String);
      Public
        Constructor Create(APathType, AOS, ADirectory: String);
        Property PathType: String Read FPathType Write SetPathType;
        Property OS: String Read FOS Write SetOS;
        Property Directory: String Read FDirectory write SetDirectory;
      End;
     
      TPathList = Class(TObjectList<TPath>)
        Procedure LoadFromFile(AFileName: String);
        Procedure SaveToFile(AFileName: String);
        Constructor Create;
        Destructor Destroy; Override;
      End;
    dans TPrototypeBindSource.OnCreateAdaptater j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      ABindSourceAdapter := TListBindSourceAdapter<TPath>.Create(self, PathList, False);
    Ensuite j'ai relié visuellement une TStringGrid, TBindNavigator et 3 TEdit. À l'exécution ça fonctionne tout est relié lorsque j'ai sélectionne une ligne dans la TSringGrid les TEdit Affiche les données correspondantes Je peux les changer et dans le navigateur j'ai plus qu'à valider la modification.

    Problème si dans le code je change le contenu d'un TEdit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          eModelPathDirectory.Text := FileOpenDialog1.FileName;
    Le TBindNavigator Ne change pas d'état je ne peux pas valider la modification, Quelle est la bonne méthode ? J'ai trouvé une pseudo parade après l'affectation je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          TLinkObservers.ControlChanged(eModelPathDirectory);
    mais sa valide directement le changement, Je voudrais plutôt Le fonctionnement normal comme quand on change le texte dans le TEdit à la main

    Merci par avance pour votre aide

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Cela semble multi-OS donc FMX ?

    Je voudrais plutôt Le fonctionnement normal comme quand on change le texte dans le TEdit à la main
    Tu pourrais expliquer ce que pense être le fonctionnement normal ?

    Ton cas me fait penser au tutoriel Introduction au LiveBindings avec Delphi - LiveBindings avec TObject et TObjectList
    Faudrait regarder si il ne te manque pas un objet à créer par code


    J'aurais tendance à dire que modifier l'Edit directement n'est pas une bonne chose, si l'on compare le LiveBinding avec l'approche DataSet, si cela est comparable en terme de philosophie View <-> Data ?
    Est-ce-que l'on doit modifier par code c'est la source de données donc l'instance de l'objet TPath en cours et non l'Edit ?


    Il arrive souvent que la modification par code ne déclenche pas certains évènements que la modification par UI, en tout cas en VCL c'est le cas, il n'y a pas de cas bien clair, certains c'est même gênant que par code cela déclenche un event.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 992
    Par défaut
    Merci pour ta réponse, Lorsqu'on modifie les données dans le TEdit Le composant navigateur active le bouton pour valider les modifications celui avec la flèche verte, on peut donc valider les modifications ou abandonner. Avec mon code actuel ça valide directement les changements du TEdit

    En fait à côté du TEdit J'ai mis un bouton qui permet d'ouvrir la boîte de dialogue pour sélectionner un dossier et j'assigne la nouvelle valeur au TEdit

    J'ai trouvé il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPrototypeBindSource.AutoPoste := False;

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Bonjour, je commence à être rouillé côté Livebindings
    Citation Envoyé par ShaileTroll
    Cela semble multi-OS donc FMX ?
    Non, tu peux très bien utiliser Livebindings avec VCL
    Citation Envoyé par ShaileTroll
    Ton cas me fait penser au tutoriel Introduction au LiveBindings
    je ne l'ai jamais aimé celui-ci c'est même pour cela que j'en avais "pondu" un certains nombre dont celui-ci qui semble correspondre, a peu près, au cas posé.



    Cependant, j'avoue que changer le contenu par code, je ne pense pas que cela m'ait effeure l'esprit

    eModelPathDirectory : ok, cela doit être le dit TEdit, lié au prototypebindsource, colonne 'Directory' même si j'eusse plutôt vu ExtractFilePath(FileOpenDialog1.FileName) ou alors, ce n'est pas vraiment le bon nom de propriété

    Reste que les liaisons, j'aurais aimé les voir.

    J'aurais plus écrit quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    aPathObject : TPath;
    begin
    aPathObject:=PathList[x];
    if FileOPenDialog1.execute then
    begin
      aPathObject.Directory:=ExtractFilePath(FileOpenDialog1.FileName);
      .....  
    end;
    AH, en écrivant ce code sans passer par EDI, je viens de voir ce qui me choquait !!!! Le nom de la classe. Il va y avoir une sacré confusion si tu utilises system.IOUtils ou, en FMX, FMX.Objects.TPath (déjà qu'en FMX system.ioutils et fmx.objects.tpath ensemble c'est la galère

  5. #5
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 992
    Par défaut
    J'ai fait comme ça :

    Nom : livebinding.jpg
Affichages : 54
Taille : 195,2 Ko

    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
    Procedure TMain.SpeedButton1Click(Sender: TObject);
    Var
      FileOpenDialog1: TFileOpenDialog;
    Begin
      FileOpenDialog1                 := TFileOpenDialog.Create(self);
      Try
        FileOpenDialog1.Options       := [fdoPickFolders];
        FileOpenDialog1.Title         := 'Select a directory';
        FileOpenDialog1.DefaultFolder := eModelPathDirectory.Text;
        If FileOpenDialog1.Execute Then
        Begin
          eModelPathDirectory.Text := FileOpenDialog1.FileName;
     
          // tell LiveBinding we change value
          TLinkObservers.ControlChanged(eModelPathDirectory);
        End;
      Finally
        FileOpenDialog1.Free;
      End;
    End;
    Ci dessous 3 captures d'écran imbriquées avant de cliquer sur le bouton, lorsque Je clique sur le bouton pour sélectionner un autre dossier et après on voit que le bouton valider et annuler dans le navigateur s'active.
    Nom : livebinding2.jpg
Affichages : 54
Taille : 140,0 Ko

    Je ne vois pas comment on peut éviter le code pour afficher une boîte de dialogue afin que l'utilisateur choisisse un dossier au lieu de le taper dans le Tedit

    Effectivement le nom de classe n'est pas correct je vais modifier merci

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

Discussions similaires

  1. Code pour l'Envoi mail avec asp via outlook
    Par youça dans le forum ASP
    Réponses: 8
    Dernier message: 23/03/2015, 12h03
  2. Réponses: 4
    Dernier message: 06/11/2012, 21h30
  3. Evenement avec changement d'enregistrement
    Par SegmentationFault dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/08/2004, 15h30
  4. Probleme avec changement du mot de passe utilisateur
    Par Davenico dans le forum Outils
    Réponses: 2
    Dernier message: 19/12/2003, 14h42
  5. [CR 9] [ASPX][C#]connexion via code
    Par nannous dans le forum Connectivité
    Réponses: 3
    Dernier message: 20/08/2003, 15h12

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