- Une supposition : Vous réalisez une application MDI. Dans ce type d'application toutes les fiches enfants vont réaliser le même travail mais elles ne seront pas toutes dans le même état. Si dans une fiche enfant un bloc de texte est séléctionné certaines options du menu et certains boutons de la barre d'outil seront actifs alors que dans une autre fiche il n'en sera rien. Bien sur vous voudriez que les barres d'outils des fiches enfants s'affichent dans la fiche principale lorsqu'elles sont actives. Pour les menus il existe une possibilité de fusion entre celui de la fiche parent et celui de la fiche enfant active, mais rien n'est prévu pour les barres d'outils. En utilisant correctement la propriété Parent des composants de la VCL Delphi le problème est vite résolu.
- La propriété Parent est une propriété publique que possèdent touts les composants visuels de Delphi. Comme cette propriété est publique elle n'est accessible qu'à l'exécution. ( Elle n'est pas présente dans l'inspecteur d'objet ). La propriété Parent désigne le controle qui possède l'affichage du composant. A ne pas confondre avec la propriété Owner ( Lecture seulement ) qui elle désigne le propriétaire du composant. Voir la page Création de composant à l'exécution.
- Lorsqu'on pose un composant, Parent est initialisée et désigne ensuite le controle sur lequel on a posé le composant.
Exemple : Si on pose un button dans un panel la propriété Parent du Bouton désignera le panel ou le bouton a été posé.
C'est ce panel qui possèdera l'affichage du bouton.Cela explique pourquoi, une fois posé on ne peut plus faire glisser le bouton en dehors du panel.
- Pourtant il est tout à fait possible, pendant l'exécution, de changer
la valeur de Parent. Ainsi un bouton qui aurait été posé
dans une fiche N°1 peut très bien être affiché dans une
fiche N°2. L'avantage de cette méthode est que c'est toujours la fiche
N°1 qui est propriétaire du bouton. Donc les évènements
du bouton se rapporteront toujours à la fiche N°1. En d'autres termes
le bouton sera affiché sur la fiche N°2 mais ces évènements
seront déclenchés dans la fiche N°1.
- Nous allons voir cela avec un petit exemple. Le source ne sera pas donné en entier sur cette page mais il peut être téléchargé.
Il s'agit d'une petite application MDI. Inspirez vous de ce qui suit pour créer votre application. Ou alors n'hésitez pas à télécharger le source.
N'oubliez pas de déclarer la fiche principale comme
FsMDIForm et la fiche enfant comme FsMDIChild ( dans FormStyle ).
Ensuite faites Projet/Option et passez la fiche enfant de la rubrique Autos Créer fiche à la rubrique Fiches disponibles.
Créez l'évènement OnClick du bouton "Créer une fiche" et placez à l'interieur le code suivant : TFormSC1.Create(Self);
"FormSC1" étant le nom donné à la fiche enfant.
Dans la fiche enfant les boutons sont des Speedbuttons
Chaque bouton affichera son nom dans le Label de sa fiche. ( Voir le source d'exemple pour les gestionnaires d'évènement des boutons ). La propriété Visible du panel doit être à False. La partie la plus intéressante se situe dans les gestionnaires OnActivate et OnDeActivate de la fiche enfant.
Dans OnActivate on place le code suivant :
...
Panel1.Parent:=Form1;
Panel1.Left:=3;
Panel1.Top:=3;
Panel1.Visible:=True;
...
Cela a pour effet, à chaque fois qu'une fiche enfant devient active, de demander à Form1 d'afficher le Panel en haut et à gauche de sa zone client (Position 3,3). et de le rendre visible.
Maintenant il faut que la fiche enfant récupère le Panel lorsqu'elle se désactive. Donc dans OnDeActivate on place le code suivant :
...
Panel1.Parent:=Self;
Panel1.Visible:=False;
...
Ce code a pour effet de rendre l'affichage du Panel à la charge de la fiche enfant et de le rendre invisible. Ce n'est pas plus compliqué.
- Conclusion : Avec cette petite astuce on peut fusionner des barres d'outils comme on peut le faire avec les menus. Bien sur on peut enlever les bordures du panel. Et en choisissant avec soin sa position dans la fiche enfant ( A coté d'autres SpeedButtons par exemple ) on ne fera pas la difference entre les boutons de la fiche parent et ceux qui viennent des fiches enfants. La seule restriction de ce système est qu'il ne faut pas mettre dans le Panel de composants qui prennent le focus. Pas de problème avec les SpeedButtons ou les Labels mais on ne pourra pas mettre de BitButtons ou de TEdit par exemple.
Téléchargez le source d'exemple et imprimez le. Avec le listing sous les yeux vous comprendrez beaucoup plus vite le principe de création de barres d'outils dynamiques.
- Bonne programmation.
- Début de la page