10 - Boîte de dialogue dans un composant :
Introduction :
Nous allons voir comment intégrer une boîte de dialogue (TForm) à un composant,
à l'aide d'un exemple.
Ce composant sera un descendant de TShape et lui sera semblable en tout point,
si ce n'est que l'on pourra changer sa couleur à l'exécution par l'appel d'une boîte
de dialogue prévue à cet effet. Boîte de dialogue qui sera elle même intégrée au composant
et que l'on pourra appeler par un click droit sur ce même composant. On aurait aussi
pu faire un composant non visuel et appeler la boîte de dialogue par une méthode
comme "execute".
Création de la boîte de dialogue :
Rien de bien compliqué, la procédure est semblable à celle de n'importe quelle
autre fiche, comme vous avez l'habitude de le faire dans vos applications.
Fermer toute application, puis ouvrir une nouvelle Fiche.
J'ai bien dit Fiche et non pas Application. On va changer immédiatement
sa propriété Name en "DlgColor1" et BorderStyle en bsDialog.
Nous allons y déposer comme la copie d'écran ci-dessus un TShape (Shape1),
3 ScrollBars (ScrollBar1, ScrollBar2, ScrollBar2) avec leur propriété Position à 255,
un bouton avec sa propriété Caption à "Ok", Default à true et ModalResult
à mrOk, puis un second bouton avec sa propriété Caption à "Annuler",
Cancel à true et ModalResult à mrCancel.
Nous allons maintenant traiter l'événement OnChange des ScrollBars. Pour
simplifier le code nous créons une méthode unique pour les 3 ScrollBars
que nous nommerons ScrollBarChange. (Donc dans l'éditeur de propriétés l'événement
OnChange de chaque ScrollBar doit référencer cette unique méthode.)
Fichier "DlgColor.cpp" :
#include <vcl.h>
#pragma hdrstop
#include "DlgColor.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TDlgColor1 *DlgColor1;
//---------------------------------------------------------------------------
__fastcall TDlgColor1::TDlgColor1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TDlgColor1::ScrollBarChange(TObject *Sender)
{
Shape1->Brush->Color = (TColor)RGB(ScrollBar1->Position,
ScrollBar2->Position, ScrollBar3->Position);
}
Comme on peut le voir dans le code ci-dessus la couleur du Shape (Shape1) de contrôle
change dés que l'une des ScrollBars change de position.
Le fichier entête "DlgColor.h" n'a rien de particulier. Nous n'avons plus qu'à
sauver notre fiche sous le nom de "DlgColor.cpp" et dans
le dossier où ce trouvera le futur composant.
Vous devez donc y trouver comme fichiers : "DlgColor.cpp", "DlgColor.h" et
"DlgColor.dfm".
Création du composant :
Abordons maintenant le composant proprement dit.
Vous créez le composant selon la procédure habituelle, vous lui donnez comme
ancêtre la classe TShape et vous le nommez "TShapeColor".
Vous avez maintenant le code minimum du composant. Nous allons
y redéfinir la méthode MouseUp afin d'appeler notre boîte de dialogue précédemment
créée suite à un click droit sur le composant.
Fichier "ShapeColor.h"
#ifndef ShapeColorH
#define ShapeColorH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TShapeColor : public TShape
{
private:
DYNAMIC void __fastcall MouseUp(TMouseButton Button,
Classes::TShiftState Shift, int X, int Y);
protected:
public:
__fastcall TShapeColor(TComponent* Owner);
__published:
};
//---------------------------------------------------------------------------
#endif
Il nous faut donc inclure le fichier entête de la boîte de dialogue "DlgColor.h",
mais il faut aussi indiquer au lieur de lier le fichier "DlgColor.obj"
après la compilation par la directive : #pragma link "DlgColor.obj".
Dans la méthode MouseUp nous créons la boîte de dialogue. Nous initialisons
la couleur de son TShape (DlgColor1->Shape1) avec celle de notre composant.
Nous initialisons les positions de ses ScrollBars avec les composantes de
la couleur de notre composant. Nous la rendons visible.
A sa fermeture nous initialisons la couleur de notre composant avec celle
de son TShape (DlgColor1->Shape1) si elle renvoie mrOk, c'est à dire si elle
est fermée avec le bouton "Ok" ou par la touche "Entrée".
Puis nous détruisons la boîte de dialogue.
Fichier "ShapeColor.cpp"
#include <vcl.h>
#pragma hdrstop
#include "ShapeColor.h"
#include "DlgColor.h" // Fichier entête de la boîte de dialogue
#pragma link "DlgColor.obj" // Fichier obj de la boîte de dialogue
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck est utilisé pour vérifier que les composants créés n'ont
// aucune fonction virtuelle pure.
//
static inline void ValidCtrCheck(TShapeColor *)
{
new TShapeColor(NULL);
}
//---------------------------------------------------------------------------
__fastcall TShapeColor::TShapeColor(TComponent* Owner)
: TShape(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TShapeColor::MouseUp(TMouseButton Button,
Classes::TShiftState Shift, int X, int Y)
{
if(Button == mbRight)
{
DlgColor1 = new TDlgColor1(NULL);
DlgColor1->Shape1->Brush->Color = Brush->Color;
DlgColor1->ScrollBar1->Position = GetRValue(Brush->Color);
DlgColor1->ScrollBar2->Position = GetGValue(Brush->Color);
DlgColor1->ScrollBar3->Position = GetBValue(Brush->Color);
if (DlgColor1->ShowModal() == mrOk)
Brush->Color = DlgColor1->Shape1->Brush->Color;
delete DlgColor1;
}
}
//---------------------------------------------------------------------------
namespace Shapecolor
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TShapeColor)};
RegisterComponents("MesCompo", classes, 0);
}
}
Vous l'ajoutez à un paquet, il faudra aussi ajouter le fichier "DlgColor.cpp"
à ce même paquet puis vous compilez le paquet comme pour les précédents composants.
Voilà comme vous avez pu le voir, la liaison d'une boîte de dialogue à un composant
n'est pas très compliquée. Cela peut être très utile pour donner la possibilité
à l'utilisateur de changer les propriétés de votre composant à l'exécution.
Bon dialogue...
Et à bientôt pour la suite,
CGi
Avec la contribution de Demco pour la relecture.
Télécharger les sources.(BCB6)
|