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
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 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}; };
et pour l'enregistrement du component
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; }
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
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); } }
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part ToolBar1= new TToolBar(Owner);
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
de rajouter dans le register
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); };
et de redefinir
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 RegisterComponentEditor(__classid(TPan_Viewer), __classid(TPan_ViewerEditor));
et
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(); }
pour returner les fonctions d'edition de la toolbar
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); }
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?
Partager