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

Composants FMX Delphi Discussion :

Création de composant 1 : cacher une propriété du parent


Sujet :

Composants FMX 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 657
    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 657
    Billets dans le blog
    65
    Par défaut Création de composant 1 : cacher une propriété du parent
    Bonjour,

    tout est dans le titre mais je vais être plus précis.

    Je crée un composant dérivé de TBitmap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    type
      [ObservableMember('NomFichierImage')]
      TFileNamedImage = class(TImage)
      private
        FNomFichierImage : TFileName;  // ajout de la propriété
        procedure ObserverToggle(const AObserver: IObserver; const Value: Boolean);
      protected
        function CanObserve(const ID: Integer): Boolean; override;
        procedure ObserverAdded(const ID: Integer; const Observer: IObserver); override;
        procedure DrawImage(Value : TFileName);
      published
        property NomFichierImage : TFileName read FNomFichierImage write DrawImage;
      end;
    Jusque là rien de plus simple, seulement au design je ne voudrai pas voir la propriété MultiresBitmap du parent, comment dois-je m'y prendre ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu ne peux pas réduire la visibilité d'une propriété.

    La seule solution que j'ai trouvé pour l'instant c'est d'avoir une classe qui contient mon objet et ou je publie uniquement les propriétés que je veux..

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 657
    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 657
    Billets dans le blog
    65
    Par défaut Solution
    L'utilité de faire une unité Runtime et une autre pour le Design se confirme !
    Dans l'unité de design

    préalable, il faut indiquer que le paquet requiert designide.dcp
    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
     
    unit FMX.Tutoriel;
     
    interface
     
    uses System.SysUtils, System.Classes,
         Data.Bind.Components,
         DesignIntf,                     // pour UnlistPublishedProperty
         FileNamedImage;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('Tutoriel', [TFileNamedImage]);
    end;
     
    initialization
     // cache la propriété 
      UnlistPublishedProperty(TFileNamedImage, 'MultiresBitmap');  
     // affiche dans le concepteur de lien visuel (dommage, une seule propriété possible)
      Data.Bind.Components.RegisterObservableMember(TArray<TClass>.Create(TFileNamedImage), 'NomFichierImage', 'FMX'); 
     
    finalization
     // déréférence 
      Data.Bind.Components.UnregisterObservableMember(TArray<TClass>.Create(TFileNamedImage));
    end.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 657
    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 657
    Billets dans le blog
    65
    Par défaut Bémol
    Bonjour,

    je croyais avoir trouvé la solution pour cacher la propriété mais
    Nom : Bemol_ImageFMX.PNG
Affichages : 481
Taille : 39,4 Ko
    Comme le montre l'image je retrouve toujours celle-ci dans le panneau structure
    en soit c'est pas gênant mais c'est un peu fort de café !

    D'un autre côté, TImage de FMX, beaucoup plus complexe que le TImage VCL, utilise un interface (IMultiResBitmapObject)
    donc sauf à dériver ma classe de manière beaucoup plus compliquée je ne vois pas comment je pourrais cacher la propriété dans la structure

  5. #5
    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
    Billets dans le blog
    84
    Par défaut
    Bonjour Serge,

    Comme l'a indiqué retwas, tu ne peux pas réduire la visibilité d'une propriété. C'est une application stricte du principe SOLID selon lequel les éléments de programmation doivent être ouverts à l'extension , mais pas à la modification (Open/closed principle). Avec ta technique de contournement, tu contreviens à un autre principe SOLID, à savoir que les objets doivent pouvoir être remplacés par des instances de leurs sous-types sans altérer la correction du programme (Liskov substitution principle) : en effet, en faisant disparaître artificiellement une propriété, tu interdis à l'ancêtre (ici, ta classe TImage) d'être remplacé par son descendant, car tu courrais le risque d'avoir utilisé une propriété devenue inaccessible puisque soustraite.
    Moralité : en théorie d'une bonne POO, la démarche n'est pas recevable .

    Maintenant, la difficulté tient aussi à l'architecture même du framework qui n'est pas toujours bien pensée et qui conduit à chercher des "trucs" pour en contourner les défauts. C'est le problème avec la POO : la moindre faiblesse dans l'architecture et les problèmes s'accumulent. Avec FireMonkey, le composant TImage descend directement de TControl en implémentant deux interfaces (IBitmapObject et IMultiResBitmapObject). Avec la VCL, TImage descend directement de TGraphicControl, une classe moins généraliste que TControl, mais à peine puisqu'elle s'occupe surtout du canevas. Dans cette hiérarchie, il manque une classe intermédiaire qui implémenterait tout ce qu'il faut, mais sans forcément le rendre publique : ce serait une classe TCustomImage. Ce que je dis n'est pas une abstraction puisque c'est le choix fait par les concepteurs de la LCL de Free Pascal . Comme ils ont été d'emblée confrontés à des plates-formes différentes, cette sorte de classe intermédiaire s'est sans doute imposée d'elle-même.




    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    je croyais avoir trouvé la solution pour cacher la propriété mais

    Comme le montre l'image je retrouve toujours celle-ci dans le panneau structure
    en soit c'est pas gênant mais c'est un peu fort de café !

    D'un autre côté, TImage de FMX, beaucoup plus complexe que le TImage VCL, utilise un interface (IMultiResBitmapObject)
    donc sauf à dériver ma classe de manière beaucoup plus compliquée je ne vois pas comment je pourrais cacher la propriété dans la structure
    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

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 657
    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 657
    Billets dans le blog
    65
    Par défaut
    Bonjour Gilles,

    Bon c'est clair cependant je ne voulais pas (pour le tutoriel en cours Livebindings : Composants observables , partie que tu n'as pas encore pu lire) rajouter en complexité en créant une classe intermédiaire.
    Donc soit j'abandonne l'idée de cacher la propriété peu gênante au design soit je colle tes explications soit ?
    du coup, je ne sais pas si, une fois des Multires indiqués, il ne va pas y avoir un problème avec mon chargement d'image en FMX (Bitmap.LoadFromFile)

    NB. ajouter en complexité ne me parait pas une solution acceptable car je voulais par la suite fusionner FMX et VCL en un seul source

  7. #7
    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
    Billets dans le blog
    84
    Par défaut
    Bonjour,

    Je crains que les explications alourdisse le tutoriel. En fait, je vois deux solutions : tu ignores cette visibilité indésirable ou tu hérites d'un autre composant. Pourquoi ne pas partir de TPaintBox ? Il descend lui aussi de TControl (pour FMX), mais il est plus léger que TImage et n'utilise pas les deux interfaces dont celle qui te gêne. L'image n'est cependant pas permanente... Comme je ne sais pas exactement ce que tu veux montrer à travers cet exemple, je ne peux pas en dire plus . Bon courage !
    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

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

Discussions similaires

  1. PropertyGrid : cacher une propriété
    Par lolo5935 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 15/04/2011, 09h57
  2. Réponses: 2
    Dernier message: 15/08/2007, 15h27
  3. [Composant] publier une propriété avec un type perso
    Par jpc34 dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/10/2004, 08h39
  4. [composant] liste déroulante pour une propriété ?
    Par BoBoToTo dans le forum Composants VCL
    Réponses: 4
    Dernier message: 24/05/2004, 16h16
  5. Réponses: 10
    Dernier message: 19/02/2004, 12h58

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