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