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 :

de l'usage des RTTI sur les composants a structure complexe


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut de l'usage des RTTI sur les composants a structure complexe
    Bonjour,

    Je cherche a tester l'usage des RTTI sur une Form .
    Pour cela , j'ai créer une form contenant divers composants et je cherche a modifier si la propriété existe les couleurs .

    ceci de cette manière
    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
     
    // rtti dans la clause uses
    procedure TForm13.ColorButton1Click(Sender: TObject);
    var
      ctx: TRttiContext;
      t: TRttiType;
      p: TRttiProperty;
      i : Longint;
    begin
      ctx := TRttiContext.Create;
      try
        for I := 0 to ComponentCount - 1 do
        begin
         t:=ctx.GetType(Components[i].ClassInfo);
         p:=t.GetProperty('Color');
         if assigned(p)   then  p.SetValue(Components[i],clGreen);
        end;
      finally
        ctx.Free
      end;
    end;
    pour une propriété 'simple' pas de soucis

    je me suis ensuite laissé aller à mettre des composants plus complexe : des tmsSmoothButtons,tmsSmoothMessageDialog,tmsSmoothExpanderPanel
    là les choses se compliquent
    pour le tmsSmoothButton pas de soucis , la propriété Color existe , le changement se fait

    pour les 2 autres les couleurs sont gérées dans une structure TGDIPFill ( propriété Fill ) et là je ne vois pas comment faire

    j'ai rajouté ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
         p:=t.GetProperty('Fill');
         if assigned(p)
             then begin
               if t.Name='TAdvSmoothMessageDialog' then
               begin
               TAdvSmoothMessageDialog(Components[i]).Fill.Color  :=clgreen;
               TAdvSmoothMessageDialog(Components[i]).Fill.ColorTo:=clolive;
               end;
               if t.Name='TAdvSmoothExpanderPanel' then
               begin
                 TAdvSmoothExpanderPanel(Components[i]).Fill.Color  :=clgreen;
                 TAdvSmoothExpanderPanel(Components[i]).Fill.ColorTo:=clolive;
               end;
    Qui est plus qu'inélégant .

    Comment faire pour toucher à la propriété Fill et faire d'une pierre 2 coup dans mon cas ?
    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
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    déjà au lieu de .Name ou .ClassName, il y a is ou InheritsFrom

    Donc sans même des RTTI, tu as tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
               if Components[i] is TAdvSmoothMessageDialog then
               begin
                 TAdvSmoothMessageDialog(Components[i]).Fill.Color  :=clgreen;
                 TAdvSmoothMessageDialog(Components[i]).Fill.ColorTo:=clolive;
               end;
               if Components[i] is TAdvSmoothExpanderPanel then
               begin
                 TAdvSmoothExpanderPanel(Components[i]).Fill.Color  :=clgreen;
                 TAdvSmoothExpanderPanel(Components[i]).Fill.ColorTo:=clolive;
               end;
    Dommage que TAdvSmoothMessageDialog et TAdvSmoothExpanderPanel n'hérite pas d'un objet commun ou n'implémente une interface IAdvSmoothable !

    sinon avec les RTTI (uses TypInfo, le vieux)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      ObjProp: TObject;
    ...
     
               ObjProp:= TypInfo.GetObjectProp(Components[i], 'Fill');
               if ObjProp is TGDIPFill then
               begin
                 TGDIPFill(ObjProp).Color  :=clgreen;
                 TGDIPFill(ObjProp).ColorTo:=clolive;
               end;

    Avant de tenter le RTTI nouvelle génération, tu devrais voir si les RTTI qui existent depuis 10 ans ne font pas quelques choses de similaires en plus simple !


    tu devrais voir aussi TAdvAppStyler et TAdvFormStyler pour que tous les composants TMS conserve le même thème !

    Enfin, je n'ai pas testé, je me base sur la Doc uniquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var
      v: TValue;
    ...
      p :=t.GetProperty('Fill');
      if assigned(p) then
      begin
        v = p.GetValue();
        //if v.IsType(TGDIPFill) then
        if v.IsObject then
        begin
          ObjProp := v.AsObject();
          if ObjProp is TGDIPFill then
          begin
             ...
    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
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Merci Shai , la seconde solution est tout a fait satisfaisante et même plus que prévue .
    -J'avais complètement oublié (ou jamais maitrisé) le TypInfo
    - PS J'avais aussi oublié d'indiquer que j'utilisais D2010
    ces 2 constatations indiquent qu'il est temps de prendre de vraies vacances

    pour la troisième , une toute petite erreur dans le GetValue
    mais du coup pas besoin d'utiliser typInfo et cela donne
    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
     
    var 
      t: TRttiType;
      p: TRttiProperty;   
      v : TValue;   // valeur de la propriété
    ....
        p:=t.GetProperty('Fill');
         if assigned(p)
             then begin
               v:=p.GetValue(Components[i]);    
               if v.isObject AND (v.AsObject is TGDIPFill) then
               begin
                 TGDIPFill(v.AsObject).Color  :=clgreen;
                 TGDIPFill(v.AsObject).ColorTo:=clolive;
                 TGDIPFill(v.AsObject).ColorMirror:=clNone;
               end;
    Citation Envoyé par ShaileTroll
    tu devrais voir aussi TAdvAppStyler et TAdvFormStyler pour que tous les composants TMS conserve le même thème !
    je ne maitrise pas les TMS et n'ai que la version de base fournie . Dans ces tests , j'essaie justement de découvrir les possibilités . L'idée d'utiliser les RTTI vient du Codeway Tour NANTES (cela parait si simple quand Thierry Laborde fait les démos )
    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
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Merci Shai , la seconde solution est tout a fait satisfaisante et même plus que prévue .
    Cela me rassure que cela fonctionne

    Citation Envoyé par SergioMaster Voir le message
    - PS J'avais aussi oublié d'indiquer que j'utilisais D2010
    Je l'avais deviné, les nouvelles RTTI ne doivent exister que depuis 2009 ou 2010

    Citation Envoyé par SergioMaster Voir le message
    pour la troisième , une toute petite erreur dans le GetValue
    Ah oui, je n'avais pas ouvert la documentation de TRttiProperty.GetValue, effectivement, il lui fait l'instance contenant la propriété Fill


    Citation Envoyé par SergioMaster Voir le message
    . L'idée d'utiliser les RTTI vient du Codeway Tour NANTES (cela parait si simple quand Thierry Laborde fait les démos )
    Lol, Thierry Laborde perd déjà la moitié de ses auditeurs lorsqu'ils parlent de remplacer un BDE TTable par un DBExpress et le trio infernal TSQLDataSet, TDataSetProvider et TClientDataSet (plus pédagogique que le TSimpleDataSet) ... alors lorsqu'il évoque les RTTI, ça commence à faire fondre le bulbe de certains qui n'avaient même jamais entendu parler des anciennes RTTI
    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

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Lol, Thierry Laborde perd déjà la moitié de ses auditeurs lorsqu'ils parlent de remplacer un BDE TTable par un DBExpress et le trio infernal TSQLDataSet, TDataSetProvider et TClientDataSet (plus pédagogique que le TSimpleDataSet) ... alors lorsqu'il évoque les RTTI, ça commence à faire fondre le bulbe de certains qui n'avaient même jamais entendu parler des anciennes RTTI
    Surtout après le repas

    Quant aux 'anciennes' RTTI , effectivement je ne les avais que survolées et pas dans l'optique composants . Mon bulbe a émis des petites bulles lors de sa démonstration post-repas et courte (genre :'Quelqu'un utilise les RTTI ? grande minute de silence 'Je vais vous montrer ce que l'on peut faire avec' ...5-10mn de démo ... 'des questions? re-grande minute de silence de gens abasourdis ou digèrant les infos ou le repas ?)

    C'est en 'devoir de vacances' que je me suis posé la question que pourrait-on en faire et l'idée de jouer sur les couleurs m'est venue au bulbe : "un pseudo skin d'application why not"
    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

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Moi je fais plein de choses avec les RTTI

    Ne fût-ce que l'inspecteur d'objets en runtime de la JVCL, TJvInspector : ce truc est juste génial

    Il y a aussi mon serializer de structures (tout sauf objets et interfaces), que j'avais fait un jour pour répondre à une question sur le forum.

    Et bien sûr le système de sérialisation d'objets que j'utilise dans FunLabyrinthe à la place du ReadComponentRes totalement désuet de Delphi
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Idem, les RTTI, je les utilisent massivement pour la couche OR métier utilisant la DB pour lire et écrire !
    L'utilisation d'un Fichier local, c'est rarissime !

    Parfois, par flemme, je fais un TComponent avec published, et cet objet contient la configuration, souvent dans des minis projet sans DB, pourquoi m'embêter avec les fichiers ini capricieux avec vista, un bon vieux dfm texte suffit et cela reste modifiable avec notepad

    Sinon, TMS Script et Greatis, idem, dans 2 applis que j'ai maintenu, il y a avait un mini IDE embarqué pour les variables personnalisées, et même mieux dans la 2nde applis, c'était même quasiment toutes les données qui était personnalisé pour gérer en live des DFM via XML\XSLT ! Mon chef de projet de l'époque avait bcp d'imagination !
    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

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/12/2010, 12h52
  2. Mettre des options sur les composants
    Par Djelangelo dans le forum Langage
    Réponses: 1
    Dernier message: 02/12/2010, 16h39
  3. effectuer des operations sur les composants graphiques
    Par Zorgz dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 19/10/2006, 14h34
  4. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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