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 :

Création d'un paquet et composant dérivé TImage + création dynamique


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut Création d'un paquet et composant dérivé TImage + création dynamique
    Bonjour,

    depuis deux jours je lutte pour créer un composant que je puisse ensuite donner à quelqu'un.
    J'ai essayé l'aide de Borland, puis celle du forum mais malgré tout cela ne marche pas.
    Mon topic risque d'être un peu long (je détaille beaucoup).

    Voilà ce que je veux faire :
    Sur mon ordinateur est branché un produit qui envoie sa position actuelle à mon ordinateur (sur la liaison CAN (j'ai un truc pour), série ou autre). Mon ordinateur reçoit donc régulièrement X = xxx et Y = yyy; Pour schématiser, disons que mon produit est une table carrée sur laquelle se situe une bille. La position de cette bille par rapport à la table carrée est répérée puis envoyée à mon ordinateur.
    Nous sommes plusieurs à avoir le même système, mais il se trouve parfois dans un autre local.

    Je veux donc créer un truc VISUEL, un composant en forme d'image carrée (la table) sur lequel je dessine un rond (la bille), qui reçoit les coordonnées X,Y puis redessine tout seul la bille à la position actuelle.
    Ensuite, je voudrais donner ce composant à mes collègues (qui sont aussi développeurs (mais stagaires )), et ils auraient simplement à le glisser sur leur fiche de la même manière que l'on glisse un bouton, une image ou n'importe quel autre composant visuel.

    Je précise que je suis un newbie dans la programmation en C++ et aussi avec Builder (PS j'ai C++ Builder 6).

    Ce que j'ai fais pour le moment (pour vérifier le concept) :
    J'ai crée un projet tout simple, sur lequel j'ai mis un TImage (disons TImage * SystemeVirtuel), ensuite, cycliquement je fais l'acquisition de la position puis je fais bêtement (pour le moment ça ira) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SystemeVirtuel->Canvas->Ellipse(..mes coordonnées ...)
    Vu comme ça ça fonctionne.

    Je me suis donc fié aux rubriques d'aide de borland "Présentation de la structure d'un paquet", "Installation de paquets de composants", "Creation d'un paquet", "Création d'un nouveau composant" ....

    Je fais donc Fichier>Nouveau>Autre>Paquet. J'ai donc l'éditeur de paquet qui s'ouvre. Dedans y'a les dossiers 'Contains' et 'Requires'. Ces dossiers ne sont pas vides, ils contienent déjà Package1.cpp et .res ainsi que rtl.bpi.
    Ensuite, >Ajouter>Nouveau composant>Type Ancêtre = TImage
    Nom de Classe = TVirtualRemote
    Page de palette = Standard
    Nom d'unité = VirtualRemote.cpp
    Chemin .. le chemin Builder par défaut
    Mes nouveaux fichiers s'ajoutent bien dans Contains et Requires (respectivement VirtualRemote.cpp et vcl.bpi (mis automatiquement je suppose parce que j'ai inclus un type ancêtre TImage.

    Je voudrais savoir qu'est-ce qu'il fait là le fichier Package1.cpp et Package1.res ?
    Quelles options Editeur de paquet>options>seulement en conception ou execution ou les deux je dois activer sachant que ce n'est pas un composant qui s'exécute, mais qui se pose sur une fiche ?

    Lorsque je compile, le paquet, aucun problème, ça fonctionne.
    Je voudrais savoir, pourquoi les fichiers .bpl, .bpi, .res, .bpk, .cpp et .h sont autant éparpillés dans tant de dossiers différents ? N'y-a-t'il pas une solution plus propore où no peut 'exporter' un composant dans un dossier tout simple, et que tous les fichiers s'y mettent automatiquement ? ça éviterait de tous les rechercher manuellement et de les copier en local chez un collègue.

    Ensuite, je crée un nouveau projet tout vide avec une seule fiche, puis Fichier>ouvrir> et je cherche mon Package1.bpk (d'ailleurs, je peux changer ce nom ?)
    Et je clique Installer dans l'éditeur de paquets, et je vois bien mon nouveau composant dans ma palette Standard.
    Je le pose sur la fiche, je compile ... et là il me demande de lier un exécutable (Menu exécuter>paramètres). Je suppose que ce n'est pas la bonne chose à faire et que cela est dû à mon mauvais choix d'options dans l'éditeur de paquets ?

    Ensuite, mon nouveau composant étant un simple TImage, je veux lui ajouter quelques méthodes et propriétés. Admettons que j'édite donc mon VirtualRemote.cpp et que j'ajoute des lignes pour tracer une ellipse dans le constructeur de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    __fastcall TVirtualTarget::TVirtualTarget(TComponent* Owner)
            : TImage(Owner)
    {
            // Construction du PopupMenu
            this->Canvas->Pen->Color = clBlack;
            this->Canvas->Brush->Color = cl3DDkShadow;
            this->Canvas->Ellipse(0,0,this->Width,this->Height);
    }
    (Bon ici VirtualRemote c'est Virtual Target.
    Je recompile et là avec l'éditeur de paquets.
    Question : Est-ce que le composant dans la palette se met automatiquement à jour ? Ou est-ce que je dois le désinstaller puis le réinstaller ?
    Question que j'avais oubliée précédemment :
    Puisque j'ai ajouté un nouveau composant, est ce que je suis obligé de rajouter VirtualTarget.h dans mon dossier de mon nouveau projet ? Est-ce que ça ne devrais pas le faire automatiquement, lorsqu'il voit que je pose mon composant sur la fiche ? (le #include VirtualRemote.h se met automatiquement)

    A partir de là, je ne sais plus comment faire :
    Je voudrais pouvoir modifier la couleur de l'ellipse. Je voudrais donc que lorsque l'utilisateur clique droit sur l'image, un popupmenu s'ouvre. Et ensuite dans la liste de ce popup menu il y aurait plusieurs items (couleur ellipse, couleur du trait de l'ellipse, ...).
    Chacun de ces items appelerait donc une nouvelle fonction appropriée.
    Pour se faire, j'ai pensé à deux choses :

    1 - Créer un popup menu dynamiquement comme cela :
    dans le VirtualRemote.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class PACKAGE TVirtualTarget : public TImage
    {
    private:        // Déclarations de l'utilisateur
    protected:
    public:         // Déclarations de l'utilisateur
            __fastcall TVirtualTarget(TComponent* Owner);
            int x,y;
    __published:
            TPopupMenu * VirtualTargetDynamicPopupMenu1;
    };
    Puis, dans le VirtualRemote.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
    __fastcall TVirtualTarget::TVirtualTarget(TComponent* Owner)
            : TImage(Owner)
    {
            // Construction du PopupMenu
            VirtualTargetDynamicPopupMenu1 = new TPopupMenu(this);
            this->PopupMenu = VirtualTargetDynamicPopupMenu1;
     
            this->Canvas->Pen->Color = clBlack;
     
            this->Canvas->Brush->Color = cl3DDkShadow;
     
            this->Canvas->Ellipse(0,0,this->Width,this->Height);
     
    }
    Cette unité se compile sans erreur.
    Maintenant, lorsque j'ajoute le comoposant sur ma fiche, l'ellipse se trace tout de suite, et dans l'inspecteur d'évenements il y a, dans le champ PopupMenu :
    'VirtualTarget1->' , pourquoi je n'ai pas VirtualTargetDynamicPopupMenu1 ?

    bien évidemment, à la comilation, un clic droit ne fait rien du tout.
    Je n'ai visiblement pas tout saisit à la création dynamique d'objets (j'ai fait la même chose que sur une aide sur forum)

    2 - Comment faire pour que lorsque je pose mon composant sur une fiche, il dépose en même temps mon TImage modifié, ainsi qu'un PopupMenu et autres choses comme une ColorDialog ? Est-ce que ça serait la solution ?

    Voilà, je vous remercie beaucoup de m'avoir au moins lu jusqu'au bout

    Je résume :
    1 - Je veux un composant TImage modifié.
    2 - Je veux que ce TImage modifié puisse ouvrir un popupmenu sur clic droit pour effectuer des actions simples comme changer la couleur d'un trait.
    3 - Je veux pouvoir donner ce composant à mes collègues facilement
    4 - Je veux pouvoir (au besoin) créer des objets dynamiquement.

    Encore merci de votre aide.

  2. #2
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,

    Effectivement, ca commence a dater et toujours pas de réponses ... désolé je ne suis pas forcement le plus qualifié pour ce qui est des créations de composants.
    En revanche, je remarque un truc qui m'interpelle, qui a eu le mérite de faire sursauter un des paisibles boyaux de ma tête, l'onde de choc se propageant - par miracle - jusqu'à mes doigts, ceux ci parvenant a poster cette réponse (sous forme de question)...:
    Es tu sur a 100 % de la validité de ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    __published:
            TPopupMenu * VirtualTargetDynamicPopupMenu1;
    Dans la section 'published', apparaissent les propriétés qui ont été prévue pour être modifié directement via l'inspecteur d'objets -> du coup, je ne suis pas sur que ce que tu as déclaré soit juste et/ou serve vraiment a quelque chose. Va observer dans les dossiers 'Include' et 'Source' la tête de ces déclarations pour les objets de borland ...

    A mon sens, il devrait 'suffire' de déclarer en private le TPopupMenu a créer, ainsi que les fonctions qui serviront pour les réponses aux choix des utilisateurs.
    J'ai fait un petit bout d'essai:
    .H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class TMImage : public TImage
    {
    typedef TImage inherited;
    private:
    		void __fastcall OnClickItem(TObject *Sender);
            TPopupMenu *Apop;
    public:
    __fastcall virtual TMImage(Classes::TComponent* AOwner);
     
    };
    .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
     
    __fastcall TMImage::TMImage(Classes::TComponent* AOwner) : TImage(Owner)
    {
    	Apop = new TPopupMenu(this);
    	PopupMenu = Apop;
    	//
        TMenuItem *pItem;
    	pItem = new TMenuItem(Apop);
    	pItem->Caption = "Coucou";
    	pItem->OnClick = OnClickItem;
    	Apop->Items->Add(pItem);
    //etc ...
    }
    //----------------------------------------------------------------------------
    void __fastcall TMImage::OnClickItem(TObject *Sender)
    {
    	ShowMessage("Je boirais bien une bière moi ...");
    }
    Certes, je n'ai pas fait un composant dans un package et cie, et la dérivée de TImage est ici créée dynamiquement a la création de la fiche qui la contient.

    Tu peut, au besoin, crée d'autre objets dynamiquement sur le 'modèle' du TPopupMenu plus haut.
    On peut imaginer dériver d'un TPopupMenu, en déclarant une nouvelle classe en amont de la déclaration de classe de ta 'TVirtual ...etc', et donc dans ce cas, tu peut travailler directement sur le PopupMenu, etc ...
    Si tu as besoin de capter d'autres messages, et donc de rajouter un gestionnaire de message en plus de ceux existant par défaut (on peut imaginer un 'OnKeyDown' par exemple, au hasard), regardes du côté de 'BEGIN MESSAGE MAP' et cie .

    En espérant t'aider,
    @+


  3. #3
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Salut, merci beaucoup pour tes réponses que je vais méditer scrupuleusement.
    Je repasserai par là pour mettre en résolu lorsque ce le sera, c'est-à-dire quand je saurai ce que veux dire le mot clé virtual et que je serai plus à l'aise avec l'héritage.
    Merci.

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

Discussions similaires

  1. [D2010] Création d'un composant dérivé d'une combobox
    Par Hardarac dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/10/2010, 11h40
  2. Création de composants dérivés type ToolStrip
    Par brsoft.org dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/09/2007, 20h06
  3. Création d'un composant dérivé d'un TextBox
    Par EFCAugure dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/08/2007, 08h57
  4. Création d'un composant dérivé
    Par leycho dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/12/2005, 17h22

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