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

C++Builder Discussion :

Images comme sous-propriété d'une composante


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut Images comme sous-propriété d'une composante
    Bonjour à tous,

    Je crée une nouvelle composante dérivée de TGraphicControl dans laquel j'aimerais avoir des paramètres comme "sous-propriété" de la composante. Ces paramètres étant soit une images soit une liste d'images et un numéro d'index.

    J'ai donc créé une première classe qui contient les paramètres (dont l'image)
    et j'intègre cette classe dans ma classe principale.

    Mes problèmes sont:
    - En runtime, mes paramètres sont vides (alors qu'en design-time j'arrive bien à charger une image)
    - J'ai une erreur lorsque j'essaye de lier un TImageList* à la propriété "Images" des paramètres en design-time
    - Comment puis-je lier faire pour que l'index soit associé à la liste ?

    PS: je me suis inspiré de TJvTransparentButton pour faire cette classe.

    Les "sous-paramètres":
    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
     
    class TMyButtonImages : public TPersistent {
      protected:
        Graphics::TPicture * FImage;     //!< Default Picture (created in ctor)
        TCustomImageList* FImages;       //!< List of images (created in ctor)
        TImageIndex FImagesIndex;        //!< Index of the image in the list
     
        //----- Accessors -----
        void __fastcall SetImage(Graphics::TPicture* Value);
        void __fastcall SetImages(TCustomImageList* Value);
        void __fastcall SetImagesIndex(TImageIndex Value);
     
      __published:
        __property Graphics::TPicture*  Image = {read=FImage, write=SetImage}; 
        __property TCustomImageList* Images={read=FImages,write=SetImages };
        __property TImageIndex       ImagesIndex={read=FImagesIndex,write=SetImagesIndex,default=-1};
     
    };
    La classe principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class PACKAGE TMyButton : public TGraphicControl {
     
      public:
        TMyButtonImages *FImages;  //!< The  images  (created in ctor)
        //! Get the list of images
        TMyButtonImages*  __fastcall GetImages() const;
        //! Set the list of images
        void __fastcall SetImages(TMyButtonImages* him);
     
      __published:
        __property TMyButtonImages* Images={read=GetImages,write=SetImages};
     
    };

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Est-ce qu'il ne faut pas rajouter PACKAGE dans la déclaration de TMyButtonImages ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class PACKAGE TMyButtonImages : public TPersistent {
    - Comment puis-je lier faire pour que l'index soit associé à la liste ?
    Tu voudrais avoir une propriété du genre de ceci ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      TImage* __fastcall GetUneImage(int indice);
      void __fastcall SetUneImage(int indice, TImage* nouvelleImage);
    ...
    __property TImage* UneImage[int indice] = {read=GetUneImage, write=SetUneImage};

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    J'ai essayé avec PACKAGE mais ça ne change rien :-(

    Pour les propriétés, j'aimerais plutôt qu'on puisse choisir l'index en design-time depuis une combo qui affiche la liste des images stockées dans la TCustomImageList. Comme pour une Action d'un TActionList: on choisi la TImageList dans la TActionList et l'ImageIndex pour une TAction.

    Mais pour commencer, je n'arrive même pas à sélectionner un TCustomImageList à ma propriété "Images"


  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Sous 2007 ce qui suit à l'air de gazer, en design et à l'exécution:

    GraphicControl1.h:
    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
    #ifndef GraphicControl1H
    #define GraphicControl1H
     
    #include <SysUtils.hpp>
    #include <Classes.hpp>
    #include <Controls.hpp>
     
    class TMyButtonImages : public TPersistent {
      protected:
        Graphics::TPicture * FImage;     //!< Default Picture (created in ctor)
        TCustomImageList* FImages;       //!< List of images (created in ctor)
        TImageIndex FImagesIndex;        //!< Index of the image in the list
     
        //----- Accessors -----
        void __fastcall SetImage(Graphics::TPicture* Value) { FImage = Value; }
        void __fastcall SetImages(TCustomImageList* Value) { FImages = Value; }
        void __fastcall SetImagesIndex(TImageIndex Value) {   FImagesIndex = Value; }
     
        public:
        __fastcall TMyButtonImages(void) { FImage = new TPicture; }
        __fastcall ~TMyButtonImages(void) { delete FImage; }
      __published:
        __property Graphics::TPicture*  Image = {read=FImage, write=SetImage};
        __property TCustomImageList* Images={read=FImages,write=SetImages };
        __property TImageIndex       ImagesIndex={read=FImagesIndex,write=SetImagesIndex,default=-1};
     
    };
     
    class PACKAGE TMyButton : public TGraphicControl
    {
    private:
    protected:
    public:
        TMyButtonImages *FImages;  //!< The  images  (created in ctor)
        //! Get the list of images
        TMyButtonImages*  __fastcall GetImages() const { return FImages; }
        //! Set the list of images
        void __fastcall SetImages(TMyButtonImages* him) { FImages  = him; }
     
      __fastcall TMyButton(TComponent* Owner) : TGraphicControl(Owner) { FImages = new TMyButtonImages; }
      __fastcall ~TMyButton(void) { delete FImages; }
    __published:
        __property TMyButtonImages* Images={read=GetImages,write=SetImages};
    };
    #endif
    GraphicControl1.cpp:
    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
    #include <vcl.h>
     
    #pragma hdrstop
    #include "GraphicControl1.h"
    #pragma package(smart_init)
     
    static inline void ValidCtrCheck(TMyButton *)
    {
      new TMyButton(NULL);
    }
    namespace Graphiccontrol1
    {
      void __fastcall PACKAGE Register()
      {
         TComponentClass classes[1] = {__classid(TMyButton)};
         RegisterComponents("Samples", classes, 0);
      }
    }
    --

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Merci beaucoup!

    J'ai regardé et je crois que mes problèmes venaient que j'avais mis tout mon composant dans un namespace différent. Ca marche avec "un seul niveau" de propriétés mais plus lorsque j'ai une classe comme sous-propriété.

    J'ai repris tes classes et ça marche bien chez moi (sauf le "ImageIndex" qui n'affiche pas une combobox comme dans la copie d'écran de mon post précédent, mais c'est mineur comme problème).

    Je vais faire plus de tests demain mais je crois que c'était ça le problème.


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

Discussions similaires

  1. [Débutant] Appeler une sous propriété via une chaine de caractère
    Par chtinis dans le forum VB.NET
    Réponses: 1
    Dernier message: 12/06/2015, 14h48
  2. insérer une image comme objet ole dans une table
    Par Loutron dans le forum Modélisation
    Réponses: 4
    Dernier message: 29/12/2011, 19h11
  3. image comme arriere plan d'une cellule d'un tableau
    Par amminou dans le forum Documents
    Réponses: 1
    Dernier message: 24/09/2009, 11h39
  4. Réponses: 1
    Dernier message: 15/09/2009, 17h37
  5. image comme arrière-plan dans une fenetre?
    Par afrikha dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 08/10/2005, 20h22

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