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 :

Comment accéder aux liaisons des composants


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 597
    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 597
    Billets dans le blog
    65
    Par défaut Comment accéder aux liaisons des composants
    Bonjour,

    Même si Livebindings est plus utilisé en FMX, c'est aussi une question VCL. Dans le cadre de mes recherches sur les entetes de colonnes pour afficher un glyphe de tri
    je me heurte désormais à un écueil
    Nom : Capture.PNG
Affichages : 236
Taille : 24,2 Ko
    Comme vous voyez dans cette image, même si le lien LinkGridtodataSource..... semble être une propriété de la grille ce n'est pas le cas donc Grid1.Livebindings.LinkGridtodatasource... ce n'est pas possible. Du coup, je ne vois pas comment accéder au liens pour obtenir le champ utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Grid1HeaderClick(Column: TColumn);
    begin
    // comment obtenir LinkGridToDataSourcePrototypeBindSource1 à partir de Grid1 ???? ou mieux de column ;)
    var s:=LinkGridToDataSourcePrototypeBindSource1.Columns[column.OriginalIndex].MemberName;
    Memo1.lines.Add(format('Colonne %d nom colonne : %s, champ %s',[Column.Originalindex,column.name,s]));
    end;
    Autre "originalité" Column.name est vide

  2. #2
    Membre chevronné Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 343
    Par défaut
    Bonjour !

    Pas testé, mais la semaine dernière je suis tombé la dessus : https://stackoverflow.com/questions/...dings-via-code.

    ça semble fonctionner "dans l'autre sens" : c'est plutôt le LinkGridtodatasource qui possède la (propriété) Grid.

    J'espère que ça pourra t'aider.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 597
    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 597
    Billets dans le blog
    65
    Par défaut
    Merci, hier, je n'avais pas les idées très claires. Le lien m'a permis, ce matin, de me replonger dans la création de liaison au runtime (épisode largement ante-COVID pour moi puisque datant de ma présentation parisienne sur le sujet !)
    En fait je n'avis été confronté à ce cas avant de m'y pencher.

    ce petit code m'a permis de trouver comment faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for var i := 0 to Bindingslist1.BindCompCount-1 do
       begin
         memo1.Lines.Add(i.tostring+'    '+Bindingslist1.BindComps[i].ControlComponent.Name);
         if Bindingslist1.BindComps[i].ControlComponent=grid1 then
          begin
           memo1.lines.add(Bindingslist1.BindComps[i].name);
           break;
          end;
       end;
    une fonction, permettra donc d'obtenir le lien facilement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function TForm5.getcomponentbinding(
      aComponent : TComponent): TContainedBindComponent;
    begin
    for var i := 0 to Bindingslist1.BindCompCount-1 do
       begin
         if Bindingslist1.BindComps[i].ControlComponent=aComponent then
          begin
           exit(Bindingslist1.BindComps[i]);
           break;
          end;
       end;
     result:=nil;
    end;
    reste que, à ce stade, Bindingslist1 peut très bien être renommé en autre nom donc il faut aussi que je fasse recherche dans la forme mais ça ce n'est aussi compliqué.
    cela donne alors
    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
    function TForm5.getcomponentbinding(
      aComponent : TComponent): TContainedBindComponent;
    var BindingsList : TBindingsList;
    begin
    BindingList:=nil;
    for var i:=0 to self.ComponentCount-1 do
      if (self.Components[i] is TBindingsList) then
       begin
        bindingslist:=TBindingsList(self.Components[i]);
        break;
       end;
    if not assigned(bindingslist) then exit(nil);
     
    for var i := 0 to Bindingslist.BindCompCount-1 do
       begin
         if Bindingslist1.BindComps[i].ControlComponent=aComponent then
          begin
           exit(Bindingslist1.BindComps[i]);
           break;
          end;
       end;
     result:=nil;
    end;
    mais je soupçonne qu'il y a encore mieux niveau code

    Cette fonction a été testé également pour d'autre type de composant (tlabel,tedit)

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 597
    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 597
    Billets dans le blog
    65
    Par défaut
    Voici le programme test en pièce jointe
    Je me pose désormais la question : comment en faire un helper, ce qui serait certainement plus agréable
    Fichiers attachés Fichiers attachés

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    J'ai essayé de compiler, mais il ne trouve pas gridhelper.pas ... c'est un fichier delphi ou un fichier à toi ?
    En le retirant du projet, ça se compile.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 597
    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 597
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par navyg Voir le message
    il ne trouve pas gridhelper.pas .
    C'est la prochaine étape que je n'ai pas encore réussie.
    mais il y a encore souci : généralement bindingslist est sur la forme mais une grille peut ne pas être enfant de la forme mais d'un autre composant (panel, tabcontrol, layout ....)
    donc pour rédiger le helper putatif, j'ai besoin de retrouver Tform à coup sûr à part via une boucle genre tant que parent<>TForm je ne vois pas mais ça ne me plait qu'à moitié
    enfin voilà quand même le helper
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    unit gridhelper;
     
    interface
     uses
         System.classes,
         Fmx.Forms,
         Fmx.Types,
         Fmx.Grid,
         Fmx.Bind.Grid,
         Data.Bind.Components,
         Data.Bind.Grid;
     type
      TGridHelper = class helper for TGrid
        function get_componentbinding : TContainedBindComponent;
        function get_columnfield(binding : TContainedBindComponent; Column : TColumn) : String;
      end;
     
    implementation
     
     
     
    { TGridHelper }
     
    function TGridHelper.get_columnfield(binding: TContainedBindComponent;
      Column: TColumn): String;
    begin
     result:=TLinkGridToDataSource(binding).Columns[column.OriginalIndex].MemberName;
    end;
     
    function TGridHelper.get_componentbinding : TContainedBindComponent;
    var BindingsList : TBindingsList;
        P : TfmxObject;
    begin
    P:=Self.Parent;
    while not (p is Tform) do p:=p.Parent;
    BindingsList:=nil;
    for var i:=0 to p.ComponentCount-1 do
      if (p.Components[i] is TBindingsList) then
       begin
        bindingslist:=TBindingsList(p.Components[i]);
        break;
       end;
    if not assigned(bindingslist) then exit(nil);
     
    for var i := 0 to Bindingslist.BindCompCount-1 do
       begin
         if Bindingslist.BindComps[i].ControlComponent=self then
          begin
           exit(Bindingslist.BindComps[i]);
           break;
          end;
       end;
     result:=nil;
    end;
     
    end.
    pour bien faire il faudrait qu'il s'applique à TCustomGrid plutôt que TGrid
    utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Grid1HeaderClick(Column: TColumn);
    begin
    var s:=grid1.get_columnfield(grid1.get_componentbinding,Column);
    Memo1.lines.Add(format('Colonne %d, champ %s',[Column.Originalindex,s]));
    end;

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2007, 10h26
  2. Réponses: 6
    Dernier message: 25/09/2006, 17h08
  3. Réponses: 4
    Dernier message: 06/12/2005, 16h41
  4. [Module de données] Comment masquer le nom des composants ?
    Par PpPool dans le forum Composants VCL
    Réponses: 7
    Dernier message: 02/10/2005, 19h38
  5. Réponses: 4
    Dernier message: 02/07/2004, 10h31

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