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 :

Creation de Component contenant d'autre component


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Par défaut Creation de Component contenant d'autre component
    Bonjour,

    je cherche a cree un component de type TPanel contenant de base une barre d'outil et d'autres components
    mon probleme est d'acceder en designe à la barre d'outil notament en edition a son menu ajouter bouton et par la suite au bouton lui meme

    voilà mon code de depart:

    .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
    class PACKAGE TPan_Viewer : public TPanel
    {
    private:
        TToolBar *ToolBar1;
        TButton* Bout1;
     
    protected:
    public:
        void __fastcall OnClickButton(TObject *Sender);
        __fastcall TPan_Viewer(TComponent* Owner);
    __published:
        __property TButton* Button={read=Bout1,write=Bout1};
        __property TToolBar *ToolBar={read=ToolBar1,write=ToolBar1};
     
    //    __property TCadViewer* CadViewer={read=CadViewer1,write=CadViewer1};
    //    __property TViewerStrato* ViewerStrato={read=ViewerStrato1,write=ViewerStrato1};
    };
    avec dans le constructeur
    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
    __fastcall TPan_Viewer::TPan_Viewer(TComponent* Owner)
        : TPanel(Owner)
    {
    //pour que le composant accepte des controles
    ControlStyle = ControlStyle << csAcceptsControls ;
     
    Bout1= new TButton(this);
    //LaForm->InsertComponent(Bout1);
    Bout1->Parent=this;
    Bout1->SetSubComponent(true);
    Bout1->OnClick = OnClickButton;
    Bout1->Name="TButton1";
    Bout1->Top=2;
    Bout1->Height=25;
     
    ToolBar1= new TToolBar(this);
    ToolBar1->Parent=this;
    ToolBar1->Name="TToolBar1";
    //permet d'acceder aux evenements depuis l'inspecteur d'objet
    ToolBar1->SetSubComponent(true);
    ToolBar1->Align=alRight;
    }
    et pour l'enregistrement du component
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace Panel_viewer
    {
        void __fastcall PACKAGE Register()
        {
            TComponentClass classes[1] = {__classid(TPan_Viewer)};
            RegisterComponents("CIRTES", classes, 0);
        }
    }
    ma premiere solution est de changer le constructeur de la tool bar en lui passant le owner (donc la fiche sur laquelle on pose le component) en parametre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ToolBar1= new TToolBar(Owner);
    celà fonctionne bien tout est accessible soit directement par selection en conception ou par l'inspectueur d'objet en tant que sous objet de mon panel
    seulement si je n'ai pas renommer la toolbar avec un autre nom (une fois le composant posé) j'ai un plantage à l'execution

    -> Comment eviter celà?

    une deuxieme solution est de creer une classe de type TComponentedit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class PACKAGE TPan_ViewerEditor : public TComponentEditor
    {
        virtual void __fastcall ExecuteVerb(int Index);
        virtual AnsiString __fastcall GetVerb(int Index);
        virtual int __fastcall GetVerbCount(void);
    };
    de rajouter dans le register

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RegisterComponentEditor(__classid(TPan_Viewer),
                                                      __classid(TPan_ViewerEditor));
    et de redefinir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int __fastcall TPan_ViewerEditor::GetVerbCount(void)
    {
    //avec quelque chose comme:
    //return TToolBarEdit::GetVerbCount();
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TPan_ViewerEditor::ExecuteVerb(int Index)
    {
    //avec quelque chose comme:
    //return TToolBarEdit::ExecuteVerb(Index);
    }
    pour returner les fonctions d'edition de la toolbar

    je ne connais pas la classe derivant de TComponentEdit associé a TToolBar et je ne sais pas comment faire pour y acceder voir meme si c'est possible?

    de plus celà me permettrait d'ajouter un bouton à la toolbar par l'intermediaire de l'inspecteur d'objet mais apres Comment Faire pour acceder au bouton?

    Si quelqu'un a une idée?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Par défaut Precision
    Bonjour,
    en ce qui concerne la deuxieme solution envisagée
    je me suis base sur le code trouver surhttp://chgi.developpez.com/compo/

    ou il est preciser qu'il faut sortir le TComponentEditor dans un autre fichier
    ce que j'ai fait avec designedi.bpi en require,
    seulement à la liaison du projet dans lequel j'ai pose mon composant j'ai un probleme de liaison
    unresolved external
    pour tous ce qui concerne le componentEditor

    je travail avec codegear2007 sous xp
    que manque -t-il pour pouvoir lier?

    PS: desolé pour l'oubli des balises dans le precedant mail, merci au modérateur pour la correction

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Par défaut Troisieme solution?
    j'ai peut etre trouve une astuce:

    celà consiste à ajouter une frame , ici fichier unit3.cpp dans les fichiers du component
    et à rajouter dans le cpp principal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "Unit3.h";
    #pragma link "Unit3.obj"
    //---------------------------------------------------------------------------
    USEFORM("Essai\Sources\Unit3.cpp", Frame2); /* TFrame: File Type */
    //---------------------------------------------------------------------------
    de maniere a ce que lorsque je pose mon composant dans une fenetre du projet je puisse avoir acces à toute les frames contenues dans le composant

    celà à fonctionne une fois dans une appli test mais je n'arrive plus a le reproduire pour avec composant final

    une idée?

  4. #4
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Citation Envoyé par cirtes Voir le message
    j'ai peut etre trouve une astuce:

    celà consiste à ajouter une frame , ici fichier unit3.cpp dans les fichiers du component
    et à rajouter dans le cpp principal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "Unit3.h";
    #pragma link "Unit3.obj"
    //---------------------------------------------------------------------------
    USEFORM("Essai\Sources\Unit3.cpp", Frame2); /* TFrame: File Type */
    //---------------------------------------------------------------------------
    de maniere a ce que lorsque je pose mon composant dans une fenetre du projet je puisse avoir acces à toute les frames contenues dans le composant

    celà à fonctionne une fois dans une appli test mais je n'arrive plus a le reproduire pour avec composant final

    une idée?
    Salut,
    sur ce code tu as une erreur, dans le chemin du fichier, tes \ doivent être doublé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    USEFORM("Essai\\Sources\\Unit3.cpp", Frame2); /* TFrame: File Type */

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Par défaut
    Merci,

    mais ca ne remarche toujours pas

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Par défaut
    Finalement il faut juste inclure le code suivant dans le .h du fichier ou l'on declare le composant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "Unit3.h";
    //---------------------------------------------------------------------------
    USEFORM("Essai\\Sources\\Unit3.cpp", Frame2); /* TFrame: File Type */
    //---------------------------------------------------------------------------
    class PACKAGE TPan_Viewer : public TPanel
    {
    ....
    };
    et de rajouter dans le cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #pragma link "Unit3.obj"
    cela permet d'avoir acces à des frames definies dans le composant juste apres avoir poser le composant.
    j'ai juste a faire heriter mon composant d'autre chose que de TPanel
    pour que ce soit propre



    il reste un souci tous les objets poses dans la frame sont accessibles avec l'inspecteur d'objet et on peut les selectionner voir les deplacer et redimensionner à la souris mais pour la toolbar je n'ai pas de menu contextuel me permettant d'ajouter un bouton

    je vais finir par y arriver
    mais si quelqu'un a une idee je suis preneur

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Par défaut rectificatif
    Bonjour,

    En ce qui concerne la derniere solution,
    celà ne fonctionne que parce que le projet courant (selectionné dans l'editeur) est le package dans lequel je concois mon component

    et la fiche dans lequel je le pose est dans un autre projet mais non "actif"
    si je le selectionne en tant que projet courant je n'ai pas acces à la frame !

    le but étant de diffuser un package sans les sources celà ne convient donc pas.

    je vais donc me repencher sur la solution du componenteditor.
    mais je ne sais toujours pas comment redéfinir les fonctions getverb et edit verb pour réutiliser celle de la toolbar

    je cherche toujours de l'aide la dessus...

  8. #8
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Tu as essayer d'utiliser la proprièté Parent, elle est disponible pour la classe TControl ~ TWinControl

Discussions similaires

  1. [1.x] component appel autre component
    Par nathieb dans le forum Symfony
    Réponses: 2
    Dernier message: 30/03/2009, 02h34
  2. Jointure sur un champ contenant un autre champ
    Par ALEXM dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 26/09/2007, 12h58
  3. select contenant un autre select
    Par lazzeroni dans le forum Oracle
    Réponses: 3
    Dernier message: 08/08/2006, 15h43
  4. Entité contenant d'autres entités
    Par SesechXP dans le forum SQLite
    Réponses: 3
    Dernier message: 05/05/2006, 14h15

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