11 - Composant conteneur :
Introduction :
Nous allons voir à l'aide d'un exemple que l'on qualifiera de plutôt simple,
comment concevoir un composant ayant la faculté de pouvoir contenir d'autres composants.
Pour agrémenter cet exemple nous allons construire une GroupeBox aux angles arrondis.
Création du composant :
Ce composant doit donc être un descendant de TWinControl.
Dans l'exemple nous le ferons descendre de TCustomControl descendant direct de
TWinControl car TCustomControl possède un Canvas.
Dans son fichier entête "Rndbox.h" nous déclarons la méthode Paint à redéfinir
et les propriétés que l'on veut rendre visible.
Fichier "Rndbox.h"
#ifndef RndBoxH
#define RndBoxH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TRndBox : public TCustomControl
{
private:
protected:
void __fastcall Paint();
public:
__fastcall TRndBox(TComponent* Owner);
__published:
__property Align;
__property Anchors;
};
//---------------------------------------------------------------------------
#endif
Pour donner la faculté de pouvoir contenir d'autres composants à notre composant
nous avons juste à ajouter l'attribut csAcceptsControls à sa propriété ControlStyle.
Ceci étant fait dans le constructeur.
Dans la méthode Paint il y a juste à dessiner le rectangle à angles arrondis.
Fichier "Rndbox.cpp"
#include <vcl.h>
#pragma hdrstop
#include "RndBox.h"
#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(TRndBox *)
{
new TRndBox(NULL);
}
//---------------------------------------------------------------------------
__fastcall TRndBox::TRndBox(TComponent* Owner) : TCustomControl(Owner)
{
Width = 200;
Height = 200;
ControlStyle = ControlStyle << csAcceptsControls ;
}
//---------------------------------------------------------------------------
void __fastcall TRndBox::Paint()
{
Canvas->Brush->Style = bsClear;
Canvas->RoundRect(1,10,Width-1,Height-1,20,20);
}
//---------------------------------------------------------------------------
namespace Rndbox
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TRndBox)};
RegisterComponents("MesCompo", classes, 0);
}
}
Voilà qui était encore très simple. Je vous propose en exercice de lui ajouter
une propriété Caption.
A bientôt pour la suite,
CGi
Télécharger les sources.
|