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.