Académique Documents
Professionnel Documents
Culture Documents
Builder
Builder
ISIMA 1988-1999
1.1
UN ENVIRONNEMENT RAD
1.1.1
PHILOSOPHIE
1.1.2
LIMITATIONS
1.2
C++ BUILDER VIS VIS DE LA CONCURRENCE
1.2.1
C++ BUILDER VS DELPHI O LES FRRES ENNEMIS !
1.2.2
DIFFRENCES PAR RAPPORT BORLAND C++
1.2.3
C++ BUILDER CONTRE VB
1.3
POUR CONCLURE
7
7
7
8
8
8
9
9
10
10
11
11
12
12
13
14
15
3. ETUDE DE LA VCL
17
3.1
3.2
3.3
3.3.1
3.3.2
3.4
3.4.1
3.4.2
3.4.3
3.4.4
3.4.5
3.5
3.5.1
3.5.2
3.5.3
3.5.4
3.6
3.6.1
3.6.2
3.6.3
3.6.4
17
17
18
18
19
19
20
22
23
23
24
25
27
28
29
31
31
31
32
35
ORGANISATION DE LA VCL
LES COMPOSANTS
LES CONTRLES
LES CONTRLES FENTRS
LES CONTRLES GRAPHIQUES
LES BOTES DE DIALOGUE STANDARD DE WINDOWS
LES BOTES DE DIALOGUE DE MANIPULATION DE FICHIERS
LA BOTE DE SLECTION DE COULEURS
LA BOTE DE SLECTION DE FONTE
LES BOTES DE RECHERCHE ET RECHERCHE / REMPLACEMENT
EXERCICE SUR LES BOTES DE DIALOGUE COMMUNES ( )
LES BOTES COMBO
EXERCICE RSOLU N1 ( )
)
EXERCICE RSOLU N2 (
)
EXERCICE RSOLU N3 (
)
EXERCICE N4 (
LES MENUS
MISE EN PLACE DUN MENU PRINCIPAL
LDITEUR DE MENUS
LUTILISATION DES MENUS
UN EXEMPLE DE MODIFICATION PAR PROGRAMMATION : LA LISTE DES DERNIERS FICHIERS
OUVERTS 35
3.6.5
LES MENUS SURGISSANTS
3.7
LES BOTES DROULANTES
3.7.1
GNRALITS
37
37
37
3.7.2
QUE PEUT ON METTRE DANS UNE TSCROLLBOX ?
3.7.3
EXERCICE RSOLU : AFFICHAGE DUN DESSIN AVEC FACTEUR DE ZOOM (
3.8
LES ASCENSEURS SIMPLES
3.8.1
GNRALITS
3.8.2
EXERCICE (
)
3.9
LES BARRES DOUTILS DE C++ BUILDER
3.9.1
INSERTION DE CONTRLES STANDARD DANS UNE BARRE DOUTILS
3.9.2
LES BOUTONS GADGETS
38
38
40
40
41
42
42
42
44
4.1
4.1.1
4.1.2
4.2
4.3
4.3.1
4.3.2
4.4
4.4.1
4.4.2
4.4.3
4.4.4
44
44
45
47
50
51
53
53
54
56
56
58
61
5.1
5.2
5.3
5.3.1
5.3.2
5.3.3
5.3.4
5.4
61
61
63
63
63
64
64
64
66
6.1
MISE EN PLACE
6.1.1
EDITION DE LA LISTE DES CONTRLES DISPONIBLES
6.1.2
RECENSEMENT DANS LA BASE DE REGISTRES DUN NOUVEAU COMPOSANT
6.1.3
CRATION DUNE UNIT
6.2
UTILISATION DUN CONTRLE ACTIVEX
6.3
DPLOIEMENT DUN PROGRAMME UTILISANT UN CONTRLE ACTIVEX
66
66
67
68
69
70
71
7.1
GNRALITS
7.2
CRATION DUN NOUVEAU COMPOSANT
7.2.1
LEXPERT COMPOSANT
7.2.2
DE QUEL COMPOSANT DRIVER ?
7.3
EXERCICE RSOLU : CRATION DU COMPOSANT TLISTBOXCOOL
71
71
72
74
76
7.3.1
7.3.2
7.3.3
7.3.4
7.4
7.4.1
7.4.2
7.4.3
7.4.4
7.4.5
7.5
7.6
7.6.1
7.6.2
7.6.3
7.6.4
7.7
7.7.1
7.7.2
7.7.3
7.7.4
7.7.5
7.8
7.8.1
7.8.2
7.9
76
77
83
83
83
84
84
86
93
96
98
101
101
101
103
105
105
105
106
107
107
108
108
109
109
110
8. EN GUISE DE CONCLUSION
112
Programmes
Programme 3.1 Ajout dune ligne saisie dans une bote combo..................................................................................27
Programme 3.2 Affichage de styles de traits dans une bote combo............................................................................29
Programme 3.3 Lvnement OnMeasureItem de calcul de hauteur dun lment de bote combo .............................30
Programme 3.4 trac dun trait dpaisseur variable dans une bote combo ..............................................................31
Programme 3.5 Dclarations relatives la mise en place de la liste des derniers fichiers ouverts .............................36
Programme 3.6 Code dimplmentation du remplissage de la liste ............................................................................37
Programme 7.1 Programme daffichage des index et des lments slectionns dune bote de liste ..........................77
Programme 7.2 Vers une utilisation plus simple des botes de listes...........................................................................77
Programme 7.3 Dclaration de la code TListBoxCool ...............................................................................................80
Programme 7.4 Implmentation de la mthode daccs getIndices ......................................................................81
Programme 7.5 Utilisation de la proprit Indices ................................................................................................82
Programme 7.6 Mise en place dattributs de stockage des proprits ........................................................................85
Programme 7.7 Dclaration de mthodes daccs et des proprits ...........................................................................85
Programme 7.8 dclaration simplifie de la classe Set ............................................................................................88
Programme 7.9 Constructeur du composant Calculette..............................................................................................91
Programme 7.10 Publication des proprits caches .................................................................................................91
Programme 7.11 code dimplmentation des mthodes daccs en criture aux proprits financires ..................92
Programme 7.12 Prototype des vnements de type Notification................................................................................94
Programme 7.13 Prototypes des vnements associs au clavier ...............................................................................95
Programme 7.14 implmentation dun gestionnaire dvnement interne...................................................................96
Programme 7.15 Utilisation de la bote de dialogue de saisie du taux de lEuro........................................................98
Programme 7.16 Code du constructeur....................................................................................................................100
Programme 7.17 Code de Paint ...............................................................................................................................101
Programme 7.18 Dclaration et publication dvnements utilisateur .....................................................................102
Programme 7.19 Code associ aux vnements externes du composant de saisie de date.........................................103
Programme 7.20 Code gnrique de prise en compte dun gestionnaire utilisateur..................................................104
Programme 7.21 Prise encompte des vnments spcifiques ..................................................................................104
Programme 7.22 Mise en place du composant .........................................................................................................107
Programme 7.23 Cration des proprits du nouveau composant ............................................................................108
Programme 7.24 la mthode Execute ...................................................................................................................108
Tableaux
Tableau 2.1 Quelques prfixes de nommage pour les composants VCL ......................................................................13
Tableau 3.1 Codes de retour des boutons modaux......................................................................................................20
Tableau 3.2 Quelques proprits du contrle TTrackBar .......................................................................................39
Tableau 3.3 Proprits fondamentales des ascenceurs (TScrollBar).....................................................................41
Tableau 4.1 Correspondance entre oprations dalgbre relationnel et oprations C++ Builder...............................53
Tableau 7.1 Les mthodes de la classe Set ...............................................................................................................89
1.1.2 Limitations
Tout dabord, il faut savoir que la technologie RAD ne sapplique quau squelette
ou linterface dune application. Bien entendu, toute la partie spcifique votre
projet reste votre charge.
Du point de vue portabilit, le code C++ Builder nest pas compatible C++ ANSI.
Ceci est du la gestion de la bibliothque des composants visuels et en particulier de
leurs proprits. Pour lheure, il suffit de savoir quune proprit dun objet est
assimilable un attribut auquel on accde par affectation directe dans le code
utilisateur. Toutefois, cet accs apparemment direct masque lutilisation de mthodes
daccs en lecture et / ou criture. Ce systme de proprit a t mis au point par
Introduction C++ Builder
Microsoft dans le cadre dOLE puis dmocratis par le langage Visual Basic. Bien
intgr dans le langage Pascal Orient Objet, support, rappelons-le, de Delphi, il a
fallu tendre le C++ pour ly intgrer, notamment en ajoutant le mot clef non ANSI
__property. De fait, tout le code C++ Builder qui fait appel la VCL est non
portable. En revanche, toute partie du code de lapplication non directement lie
linterface peut trs bien tre crit en C++ ANSI. Plus que jamais, il convient
dadopter la dcomposition Interface / Donnes / Mthodes pour lcriture dune
application C++ Builder.
Palette doutils
Inspecteur dobjets
Palette de composants
active
Fentre dinterface en
cours de composition
10
11
Une fois cette opration ralise, il reste raliser lapplication en crant les
objets dinterface et en leur associant des gestionnaires dvnements.
Objet en cours de
modification
Proprits et leurs
valeurs
Le type du composant
Sa fonction
Lusage veut que la fonction soit dans le corps du nom alors que le type est
indiqu par un prfixe. La table suivante donne ( titre purement indicatif) quelques
uns des prfixes utiliss dans ce manuel.
12
b:
bouton daction
lb :
label
br :
bouton radio
gb :
bote de groupe
cc :
case cocher
edit :
bote ddition
pl :
panel
me :
mmo
Nom de la
mthode
associe cet
vnement
Objet TImage
slectionn
13
14
15
La taille de lhistorique
Illimit
Nombre de lignes spcifiable par lutilisateur
) Le rcepteur du message
) Les paramtres (WPARAM et LPARAM)
Attention, si ce comportement peut se rvler trs pratique, il peut crer des
traces normes. En effet, on imagine rarement le volume considrable de
messages traits par les applications Windows.
16
3. Etude de la VCL
3.1 Organisation de la VCL
La VCL (Visual Component Library) livre par Inprise avec C++ Builder ou
Delphi est un ensemble de classes orientes vers le dveloppement rapide
dapplication. Toutes les classes prsentes partagent un anctre commun : la classe
TObject. Elles possdent galement une caractristique particulire : elles ne
peuvent pas possder dinstances statiques : seules les instances dynamiques cres
avec new sont acceptes. Ceci est ncessaire pour assurer la compatibilit avec Delphi
qui ne reconnat que les instances dynamiques. Toutes les classes de la VCL sont
implmentes en Pascal Objet. En fait, la librairie dexcution de C++ Builder est celle
de Delphi, ce qui implique un certain nombre de gymnastiques pour assurer une
dition de liens correcte.
En effet, la classe TComponent, linstar de toutes les autres classes de la VCL est
implmente en langage Pascal Objet, lequel saccommode assez mal de la notion de classe virtuelle
pure.
1
17
18
La plupart des lments actifs dans une interface sont des contrles fentrs.
En particulier, les fiches sont des contrles fentrs.
19
Ouverture
de fichier
Sauvegarde
de fichier
Ouverture
spcialise
dans les
fichiers d'images
Sauvegarde
spcialise
dans les
fichiers d'images
Slection
de couleur
Impression
Slection
de police
Configuration
de l'impression
Recherche
de texte
Recherche/
Remplacement
mrCancel
mrNo
mrRetry
mrIgnore
mrYes
mrAbort
20
Extension par
dfaut des
fichiers
rechercher
Rpertoire
initial
l'ouverture
Icne de la
bote sur
une fiche
Filtre
d'ouverture
Titre de la bote
de dialogue
Bien que lon puisse trs bien la saisir ainsi, il vaut mieux se reposer sur la
bote spciale qui apparat lorsque lon clique sur
Nom et
description
du filtre
Extensions
associes
21
Couleur initiale
puis slection de
l'utilisateur
Icne de la
bote sur
une fiche
Dfinitions des
couleurs
utilisateur
22
Nom de la police
Icne de la bote de
slection de police
23
En effet, elles restent ouvertes tant que lutilisateur appuie sur le bouton
Suivant . En outre elles nont pas de bouton Ok , le seul moyen permettant de les
fermer consiste utiliser le bouton Annuler .
En outre, elles neffectuent pas directement la recherche ! Elles ne permettent
que de saisir le texte rechercher (ou le texte de remplacement) et de slectionner des
options. Le corps de la recherche reste la charge du programmeur.
Les options de ces botes de dialogue sont aises comprendre, elles
conditionnent laffichage des diverses possibilits et le rsultat de la slection de
lutilisateur.
Le rsultat de la bote comprend, entre autres : la recherche de mots complets
(frWholeWord), la prise en compte de la casse (frMatchCase), le sens et la porte de
la recherche (frDown, frHideUpDown, etc.) .
Par dfaut, les botes saffichent avec ltendue totale de leurs possibilits.
Toutefois, lutilisateur peut les limiter en activant des options dont le nom comprend
Hide ou Disable, par exemple frDisableMatchCase dsactive la case permettant
relative la casse des mots recherchs.
Comme la recherche elle mme, la prise en compte des options de recherche est
entirement la charge du programmeur. On ne rptera jamais assez que ces botes
ne sont que des outils de saisie des options !
La bote de recherche simple fournit un vnement nomm OnFind notifiant au
programmeur lappui sur la touche Suivant de la bote. La bote de remplacement
lui ajoute un vnement nomm OnReplace.
Un exemple dutilisation consiste utiliser ces vnements en conjonction avec
la mthode FindText dun composant TRichEdit.
24
Rien dans cet exercice nest compliqu ! il y a juste beaucoup de code crire
Pour aller plus loin dans lexercice (
) :
Composant TRichEdit
sur lequel appliquer les
modifications
25
26
Programme 3.1 Ajout dune ligne saisie dans une bote combo
Commentaires :
27
Enonc
On dsire crer une bote combo permettant de slectionner un style de trait
pour un dessin. En outre, chaque trait est dessin au milieu de son lment, lequel est
de taille fixe. On vrifiera pralablement dans laide que 6 styles sont disponibles : ils
correspondent des constantes numriques schelonnant de 0 5 (suivre
TPen
Proprit Style)
Solution partielle
Pour rsoudre cet exercice il convient de se rendre compte que la bote combo
doit contenir autant dlments que lon doit en tracer. Cela peut paratre une
vidence mais il faut tout de mme y penser. Aussi, lors de la phase de conception de
linterface, vous noublierez pas de poser 6 lments dans la proprit Items de votre
bote combo (par exemple, les nombres de 0 5).
Ensuite, il suffit de rpondre lvnement OnDrawItem comme le montre le
code suivant, non sans avoir au pralable fix le style de la bote combo
csOwnerDrawFixed !
void __fastcall TFComboTraits::cbStyleDrawItem(TWinControl *Control,
int Index, TRect &Rect, TOwnerDrawState State)
{
// Rcupration d'un pointeur sur la bote combo
TComboBox *cb=dynamic_cast<TComboBox *>(Control);
// On convertit en TPenStyle l'index pass en argument
TPenStyle leStyle=static_cast<TPenStyle>(Index);
// Rcupration d'un pointeur sur le canevas de dessin de la combo
TCanvas
*cv=cb->Canvas;
// Hauteur du trac
int
vert=(Rect.Top+Rect.Bottom) >> 1;
// Remplissage de toute la zone de trac avec un carr blanc
cv->Brush->Style=bsSolid;
cv->Brush->Color=clWhite;
cv->FillRect(Rect);
// Affichage du motif de dessin
cv->Pen->Color=clBlack;
cv->Pen->Style=leStyle;
cv->MoveTo(Rect.Left,vert);
28
cv->LineTo(Rect.Right,vert);
}
Hors, en bon programmeur objet, vous savez trs bien quil est trs
dangereux deffectuer des conversions de promotion (aussi appeles
downcast). Utiliser loprateur C++ dynamic_cast permet de scuriser
lopration.
int Index : numro de llment dessiner. Dans notre cas, nous nous
dpchons de le convertir en TPenStyle (lutilisation de static_cast vous
montre un second oprateur de conversion du C++) afin de lutiliser pour
positionner loption Style de loutil Pen du canevas de la bote combo.
TRect &Rect : zone rectangulaire o doit seffectuer laffichage. Celui-ci est
support par le canevas (contexte daffichage) de la bote combo, lequel est
fourni par la proprit Canvas de TComboBox. La zone rectangulaire est
caractris par les quatre coordonnes Top, Bottom, Left et Right qui se
passent de commentaire.
Le dernier paramtre indique si lon est vraiment sur quil faille redessiner.
Et contrairement au proverbe, dans le doute : redessine !
Vous noterez que lon a pris soin deffacer la zone de travail en la recouvrant
dun rectangle blanc (grce la mthode FillRect). Ceci permet de sassurer que lon
dmarre bien sur une surface vierge. En effet, lorsque vous faites dfiler la liste, les
diffrents lments doivent safficher au mme endroit ce qui occasionnerait des
collisions nfastes
Solution complte :
La solution se trouve dans lunit UComboTraits du rpertoire Combos du
Power Bear Pack
Enonc
On dsire crer une bote combo permettant de slectionner lpaisseur du trait
pour un dessin. Il est galement stipul que la hauteur de chaque lment doit tre de
Introduction C++ Builder
29
5 fois lpaisseur du trait qui est dessin au milieu de son lment. Les paisseurs
tudies devront voluer de 0 10 compris. Que peut-on dire de lpaisseur 0 ?
Solution partielle :
Cet exercice se rsout facilement ds lors que lon a compris le prcdent. Il
suffit en effet de rajouter un gestionnaire lvnement OnMeasureItem afin de
calculer la hauteur de chaque lment, puis un gestionnaire OnDrawItem (trs peu
diffrent du prcdent) pour dessiner llment.
Notez au passage que lon utilise le fait que la coordonne verticale dun trait
est celle de son axe central.
Dans un soucis de gnricit, nous traons des traits dont lpaisseur
correspond la valeur entire du texte situ dans chaque lment de la bote combo.
void __fastcall TFComboTraits::cbEpaisseurMeasureItem(TWinControl *Control,
int Index, int &Height)
{
// Conversion du pointeur vers TComboBox*
TComboBox *cb=dynamic_cast<TComboBox *>(Control);
// Calcul de la hauteur : 5 fois la valeur de l'lment
Height=5*(cb->Items->Strings[Index].ToInt());
}
30
Programme 3.4 trac dun trait dpaisseur variable dans une bote combo
Solution complte :
La solution se trouve dans lunit UComboTraits du rpertoire Combos du
Power Bear Pack
3.5.4 Exercice n4 (
31
Raccourci clavier
associ au menu
Emplacement du prochain
lment vertical
Comme pour les boutons ou les labels de tout poil, il est possible dutiliser le
caractre & pour signaler la lettre active dun lment de menu. Si llment
en question fait partie de la barre horizontale du menu principal, la
combinaison Alt-lettre-active permettra daccder directement au
menu.
Lorsque vous saisissez le Caption dun lment, le concepteur le valide et
en ajoute automatiquement un nouveau du mme type. Il ne faut pas
sinquiter de la prsence des ces lments fantmes prsents en mode
conception : ils napparatront pas lors de lexcution.
Lorsque lon dsire ajouter un sparateur dans un menu vertical ,il suffit
de taper le caractre tiret dans son Caption.
Griser un menu sobtient en basculant sa proprit Enabled false.
32
Les modles de menus sont trs efficaces car ils reprennent des menus
canoniques et trs complets. Il vous suffira alors dajouter les fonctionnalits qui vous
manquent et de supprimer (ou rendre invisibles) celles que vous ne souhaitez par voir
apparatre. La figure suivante montre la liste des modles de menus disponibles par
dfaut :
33
Comme vous pouvez le constater, cette liste contient mme un menu MDI
complet prt lemploi ! La figure suivante montre un menu daide directement
obtenu aprs insertion du modle Aide.
34
Lorsque la liste nest pas vide, elle apparat en bas du menu fichier, juste
avant llment Quitter, divise du reste des lments par des sparateurs
Si la liste est vide, elle est totalement invisible
Llment le plus ancien est remplac par le nouveau lorsque la liste est
pleine
Quatre emplacements
vides et un sparateur
sont rservs
Figure 3.14 Rservation des emplacements de menu pour la liste des derniers
fichiers ouverts
2. Dans un second temps, nous basculons la proprit Visible des 4
emplacements et dun des sparateurs false. Attention ! si vous ne
spcifiez pas de Caption pour un lment, par dfaut son nom restera en
Introduction C++ Builder
35
blanc, effet dont nous ne voulons pas. Aussi, soit vous donnez un Caption
qui sera de toute faon remplac par la bonne valeur au moment de
laffichage, soit vous fournissez un nom au composant.
3. Afin de pouvoir accder facilement aux quatre emplacements, nous ajoutons
dans les dclarations prives de la classe Fiche :
36
nbFichiers%=NB_FICHIERS;
}
3.7.1 Gnralits
Les botes droulantes TScrollBox (sur la palette Supplment) permettent de
faire dfiler des composants laide dascenseurs. Pour bien comprendre leur
fonctionnement, il nous faut dfinir un peu de vocabulaire laide de la figure
suivante :
Width
Etendue
Virtuelle
VertScrollBar->Range
Height
Partie visible
HorzScrollBar->Range
37
Lexemple que nous allons traiter utilise un TImage plac dans une
TScrollBox pour afficher un dessin de taille variable en fonction dun certain facteur
de zoom. Afin de ne pas compliquer inutilement lexercice, nous afficherons une suite
de 25 cercles concentriques.
Le facteur de zoom (variant entre 1 et 20) est indiqu par un composant
TTrackBar lequel modlise un curseur plac le long dune rgle. Les proprits les
plus intressantes sont :
38
Position
Valeur du curseur
Min
Max
Frequency
Composant
TScrollBox
Composant
TMemo de trace
Composant TTrackBar
responsable des changements
de facteur de zoom
39
Afficher le dessin
) :
Centrez limage dans la TScrollBox si elle est plus petite que la taille
statique de la TScrollBox,
Ajoutez un composant zone ddition affichant en permanence le facteur de
zoom et permettant de le saisir. On effectuera tous les contrles derreur
ncessaires (valeurs en dehors de [Min, Max], saisie de valeur non
numrique, etc.)
Essayez datteindre les limites dallocation de C++ Builder et fixez la valeur
suprieure du zoom en consquence.
Max
Position
Kind
SmallChange
LargeChange
40
3.8.2 Exercice (
Enonc :
Reprendre lexercice prcdent mais en ralisant laffichage dans un TImage
fixe et en faisant dfiler limage avec des ascenseurs simples.
Solution partielle :
Il est relativement simple dadapter le code de lexercice prcdent celui-ci.
Aussi, je vous conseille de dupliquer tout le code du prcdent projet dans un nouveau
rpertoire et de modifier lapplication existante.
Premire chose : supprimer la TScrollBox et ajouter :
Un composant TImage que lon aura pris soin de poser sur un TPanel
Deux composants TScrollBar, un horizontal et un vertical situs de part et
dautre du TImage
Linterface obtenue est montre par la figure suivante :
TScrollBar
TImage
TScrollBar
41
Ces deux dernires classes tant plus spcifiquement lies aux barres de
contrles ou autres palettes flottantes.
42
43
La cration dun alias se fait trs simplement avec un outil nomm soit
Administrateur BDE
Dans le cas qui nous intresse, nous crons un alias pour lensemble de fichiers
au format Paradox situs dans le rpertoire c:\f2\Builder\donnees, alias que
nous nommerons TPF2ZZ2.
44
Annuler les
modifs
Revenir en
arrire
mode
Prendre en
compte les modifs
Onglets de
slection du
mode
Liste des alias
ou Configuration
Information sur
le systme (par
exemple nb de
bases ouvrables
simultanment)
45
Slection du rpertoire de
donnes
Vrifiez la prsence de
vos fichiers ici !
46
-)
Oeuvre.db regroupe les donnes relative des ouvrages de Sciencefiction. Pour chaque livre, nous avons les champs suivants : lindex dans la
base (Clef primaire), le titre, une rfrence un auteur (clef trangre) et
une rfrence un diteur (clef trangre).
auteur.db contient les donnes dcrivant les auteurs, savoir un
index (clef primaire) et le nom
editeur.db a la mme structure quauteurs mais dcrit, comme son
nom lindique, les diteurs douvrages de science fiction (collections de
poche)
Dans un second temps, nous utiliserons une quatrime base nomme
assoc.db qui permettra dassocier plusieurs auteurs une mme
uvre.
47
Alias de base de
donnes, une
liste droulante
donne accs
tous les alias
disponibles
48
49
Bien que ce ne soit pas requis, il est prfrable de placer les TDataSource (ou
sources de donnes) dans le module de donnes. Personnellement, je recommande de
les placer la droite du composant TDataSet sur lequel ils travaillent.
Il est possible davoir plusieurs sources de donnes pour le mme ensemble de
donnes. On dispose ainsi de plusieurs visualisations sur un mme document. Le
placement des objets sur le module de donnes nayant pas dincidence sur le code
produit, il vous appartient de la structurer de la manire la plus cohrente possible.
La proprit la plus importante des composants TDataSource est DataSet. En
effet celle-ci indique sur quel ensemble travaille la source de donnes. Vous pouvez
spcifier dans cette proprit tout composant hritant de TDataSet, cest dire (pour
ce qui concerne les composants de base) TTable et TQuery.
Source de donnes connecte la table des oeuvres
Son nom semble indiquer qu'elle est destine une
prsentation tabulaire des donnes
La proprit
DataSet indique
l'ensemble de
donnes raccord
la source
50
Source de donnes
faisant le lien avec une
table ou une requte
Ensemble des sources
de donnes
disponibles. Notez le
prfixe du module de
donnes d'origine !
Donnes sous
forme tabulaire
51
Le meilleur moyen de crer des colonnes statiques consiste double cliquer sur
la grille pour faire apparatre la liste des colonnes statiques (initialement vide).
Ensuite, on gagnera activer Tous les champs pour ajouter la listes des colonnes
statiques lensemble de champs actuellement prsents dans la Table. Les diffrents
boutons
Les diffrents boutons de la fentre des colonnes statiques permettent de
changer lordre des colonnes, de supprimer celles que lon veut exclure de laffichage,
ou bien dajouter de nouvelles colonnes si lon a touch la structure de la table (ou de
la requte) ou si lon a prcdemment supprim une colonne par inadvertance (ou
nervosit ).
Une fois la liste des colonnes statiques cre, il est possible de manipuler
chaque colonne dans linspecteur dobjets comme le montre la figure suivante.
Liste des colonnes statiques
Alignement des donnes
dans la colonne
Champ de donnes
affich dans la colonne
A choisir parmir les
champs actuellement
disponibles
Proprits du titre
Diverses oprations ralisables sur la liste des
colonnes statiques.
En particulier, "Tous les champs" tablit la liste
des colonnes dynamiques en colonnes
statiques
52
Dernier tuple
Tuple prcdent
Supprimer le
tuple courant
Aller au
premier tuple
Rafrachir les
donnes
Ajouter un tuple
Tuple suivant
Jonction
Slection
Projection
53
Les champs de donnes sont les champs endognes de la table, cette option
ne prsente que peu dintrt car vous pouvez faire la mme chose avec le
menu Ajouter champs
Les champs calculs permettent deffectuer des oprations arithmtiques ou
lexicographiques sur les diffrents champs. Par exemple, vous pourrez
effectuer une addition entre deux champs numriques ou une concatnation
de deux champs chanes de caractres.
Les champs de rfrence permettent deffectuer une jonction cest--dire une
mise en correspondance des valeurs de deux champs dans deux tables
diffrentes avec extraction dun rsultat.
54
Nom du champ
nouvellement cr
Slection du type
de donnes du
champ cr
Le nom du champ que vous dsirez ajouter. C++ Builder gre pour vous le
nom du composant TField gnr pour reprsenter votre nouveau champ.
Le type de donnes du champ et ventuellement sa taille. Dans le cas
dun champ calcul tout type et autoris. Dans le cas dun champ de donnes
ou dans le cas dun champ rfrence en provenance dun autre ensemble de
donnes, il faut faire attention nutiliser que des types compatibles avec
les donnes sources, par exemple, des donnes numriques entre elles.
Champ de type
rfrence, i.e. jonction
55
Choix du champ clef : Cest un champ existant dans la table actuelle et qui
doit tre une clef trangre, dans notre cas AUTEUR. Cest lun des deux
champs sur lesquels la jonction va tre opre.
Choix de lensemble de donnes : cest lensemble de donnes sur lequel va
tre effectue la jonction, ici auteurs .
Clef de rfrence : cest le deuxime champ de jonction. Il est prfrable que
ce soit la clef primaire ou, au minimum, un champ sur lequel est dfini un
index secondaire dans lensemble de donnes de jonction, ici NUMERO.
Champ rsultat : cest le rsultat de la jonction, un champ de lensemble
de donnes cible (projection), ici NOM.
4.4.2 Le filtrage
Le filtrage est une opration qui permet de restreindre les tuples dune table
ceux qui respectent une certaine condition nomme Filtre. Pour activer un filtre, il
faut spcifier dans la proprit Filter une chane de caractres spcifiant les critres
de filtrage et positionner la proprit Filtered true. Ces proprits tant
modifiables tout instant, cette opration pourra seffectuer trs facilement et sous le
contrle dlments dinterface.
Seuls les champs endognes dun ensemble de donnes peuvent tre filtrs.
Vous pouvez alors dcider dafficher dans un premier TDBGrid lensemble des
produits complexes, puis, dans un second, la liste des pices le composant. Il sagit
56
typiquement dune liaison matre / esclave. La table produits finis (le matre)
conditionnant laccs aux donnes de composition (lesclave).
Pour en revenir nous bouquins de science fiction, considrons dsormais que
chaque uvre puisse maintenant avoir plusieurs auteurs. Il nest plus alors question
dutiliser un simple champ permettant de rfrence lauteur : il nous faut utiliser une
nouvelle relation que nous appellerons assoc pour Association uvre / Auteurs et
qui associe sur une mme ligne une rfrence duvre une rfrence dauteur. Il
suffira dajouter autant de lignes pour un mme uvre quelle compte dauteurs.
Procdons la mise en place de la relation Matre / Esclave permettant
dafficher, pour une uvre slectionne dans un premier TDBGrid lensemble de ses
auteurs. Typiquement, le matre sera la table uvres , alors que lesclave sera
assoc .
Une fois les donnes cres, voici la marche suivre :
57
La proprit
MasterSource
pointe sur une
DataSource
associe la
table Matre
58
Il est interdit de rajouter un nouvel diteur : celui-ci devra tre choisi parmi
ceux dj prsents dans la base editeur . Nous utiliserons pour cela une
TDBLookupComboBox.
Le composant TDBEdit est fort simple, il suffit de le connecter sur le bon champ
via une source de donnes (en loccurrence, la source de donnes est DSOeuvres et le
Introduction C++ Builder
59
champ TITRE). En revanche la TDBLookupListBox est plus difficile utiliser car elle
utilise deux ensembles de donnes diffrents mais devant appartenir la mme base
de donnes, la figure suivant rsume ses principales proprits :
60
Table Nouveau
61
62
valeur dun champ dans une table B doit correspondre une valeur
existante de la clef primaire dune autre table A.
5.3.1 Le nom
La premire donne saisir concerne le nom du champ. Les conventions de
nommage dpendent du type de table que vous avez choisi. En rgle gnrale, et
mme si certains systmes le permettent, il vaut mieux ne pas utiliser despaces dans
le nom dun champ.
5.3.2 Le type
La figure suivante montre les diffrents types de donnes disponibles pour les
tables de type Paradox 7. Cette liste sobtient en tapant espace dans la case
rserve au type des donnes.
63
5.3.3 La taille
Certaines donnes, telle que les chanes de caractres et les donnes
numriques en virgule fixe ncessitent une taille. Elle se prsente soit sous la forme
dun entier, soit dune paire dentiers (taille et prcision pour les rels en virgule fixe)
64
Boutons dajout ou de
suppression de champs
dans lindex
Champs dj prsents
dans lindex
Boutons permettant de
modifier lordre des
champs dans lindex
65
Composant
slectionn
Liste de classes
associes au composant
slectionn
Palette dinstallation du
composant
Rpertoire de cration
des units associes aux
contrles ActiveX
Chemin de recherche
des units associes aux
contrles ActiveX dj
rfrencs
66
Dans ce cas, le composant est prs tre utilis et vous pouvez vous rendre
sereinement la section 2 !
Si le composant que vous dsirez utiliser napparat pas dans la liste, cela
signifie tout simplement quil nest pas rfrenc dans la base de registre ; opration
que nous allons maintenant expliciter.
67
simplifi. Le numro de version complet peut tre obtenu grce lutilitaire Ole2View
disponible sur le site ouaib de qui vous savez.
C++ Builder propose toujours un nom de classe finissant par Proxy. En effet,
en terminologie OLE, on appelle classe Proxy, toute classe reprsentant un objet
Automate OLE ou ActiveX et masquant lutilisation des diverses interfaces. Utiliser le
nom par dfaut prsentes les avantages de la clart et de lauto-documentation ;
toutefois, rien ne vous empche de le changer.
La prochaine tape consiste ajouter votre systme une unit (i.e. une
combinaison dun fichier .h et du fichier .cpp associ) qui permettront dutiliser
facilement votre composant dans une application.
68
69
Mois slectionn
Anne courante
Date courante
70
7.1 Gnralits
Les composants sont des instances de classes drivant plus ou moins
directement de TComponent. Si leur forme la plus habituelle est celle des composants
que lon dpose dune palette vers une fiche, ils englobent plus gnralement la notion
de brique logicielle rutilisable. Bien que non dclare virtuelle pure2 la classe
TComponent nest pas destine tre instancie. Compulsons sa documentation ;nous
y apprenons que la plupart des mthodes sont protgs, cest dire inaccessibles
lutilisateur, cest une technique courante en Pascal Orient Objet : dfinir le cadre de
travail laide de mthodes virtuelles protges, lesquelles seront dclares publiques
dans les classes drives.
Autre aspect particulirement intressant : la prsence des mthodes AddRef,
Release et QueryInterface ce qui dnote limplmentation de linterface OLE
IUnknown. Ainsi, lorsque lon transformera un composant VCL en composant ActiveX,
la gestion dIUnknown sera directement prise en compte au niveau de TComponent.
De la mme manire, TComponent implmente linterface principale dautomation
IDispatch (mthodes GetIDsOfNames, GetTypeInfo, GetTypeInfoCount et
Invoke). Nous aurons loccasion de revenir plus en dtails sur ces mcanismes
spcifiques OLE dans un prochain chapitre.
Pour finir, notons que les composants de Delphi et de C++ Builder sont
compatibles : autrement dit, il est tout fait possible dutiliser dans C++ Builder un
composant cr avec Delphi et rciproquement.
En effet, la classe TComponent, linstar de toutes les autres classes de la VCL est
implmente en langage Pascal Objet, lequel saccommode assez mal de la notion de classe virtuelle
pure.
2
71
Palette dinstallation
72
Type Anctre : spcifie de quelle classe drive votre composant, cest le propos
de la prochaine section
Nom de classe : saisissez le nom que vous souhaitez donner votre classe de
composant.
Page de palette : nom de la palette dans laquelle vous souhaitez inclure votre
composant. Il est possible de crer de nouvelles palettes avec dautres
fonctionnalits de C++ Builder. Pour des raisons videntes (embrouille des
utilisateurs, manque de cohrence des composants prsents, etc.) je
dconseille de rajouter un composant personnalis dans une palette
standard de C++ Builder
Nom de fichier unit : typiquement le nom des fichiers .h et .cpp gnrs
reprend celui de la classe ce qui me parat tre une bonne ide. Plus
intressant, il vous est possible de choisir le rpertoire dans lequel vous
souhaitez installer ces fichiers. Par dfaut, il sagit dun des rpertoires
appartenant larborescence interne de C++ Builder. Je vous conseille de
les positionner ailleurs afin dviter leur destruction lors dune
dsinstallation manu militari de C++ Builder. Auquel cas, il convient de
vrifier que votre nouveau rpertoire est bien inclus dans le chemin de
recherche spcifi dans la bote de saisie suivante.
Finalement, seul le bouton Installer pose problme, son invocation amne la
fentre suivante :
73
oui
Driver du
composant
spcialiser ou de
sa forme abstraite
oui
non
Composant visuel ?
non
oui
Destin recevoir la
focalisation ?
Driver de
TWinControl
non
Driver de
TComponent
Driver de
TGraphicControl
74
Les classes contenant Custom sont lquivalent des classes de base virtuelles
pures dans le sens o elles ne sont pas destines tre directement instancies mais
laissent ce soin leurs classes drives qui implmentent les comportement quelles
dcrivent dans leur interface.
La plupart des fonctionnalits (proprits ou mthodes) dune classe Custom
sont protges. Il vous appartient alors de rendre publiques (ou publies) uniquement
celles que vous souhaitez rendre visibles lutilisateur ce qui vous fournit un excellent
contrle sur lutilisation de la classe.
7.2.2.2 Crer un composant non visuel
Rsolvons en premier lieu le cas des composants non visuels, cest dire ceux
dont le placement sur une fiche nentrane que laffichage dune icne. Ils peuvent
avoir plusieurs rles. Citons notamment :
La rservation de ressources Windows : cest en particulier le cas, des
botes de dialogue communes de Windows qui apparatront sur leur forme
normale lors de leur invocation par le programme
Les composants nayant aucune reprsentation graphique. Dans cette
catgorie se retrouvent, par exemple, les composants permettant de lier
votre application des lments de bases de donnes ou des sockets de
rseau.
Reposez vous alors la question, suis-je bien certain que mon composant na
aucun lien avec lun de ceux existants ? si la rponse est oui , alors il vous faut
driver directement de TComponent, dans tous les autres cas essayez de trouver dans
larborescence de la VCL un anctre convenable qui permette de vous simplifier la
tche.
Rappelons galement que si votre composant non visuel est destin tre
dpos sur une fiche, il faudra fournir une icne de reprsentation.
7.2.2.3 Crer un composant visuel
Les composants visuels sont ceux dont la reprsentation sur une fiche reflte
exactement laspect lexcution. Bien quils drivent toujours de TControl, on peut
les discriminer en deux grandes catgories laide dun critre simple : le composant
doit il tre capable de recevoir la focalisation Windows ?
Si, oui, cest un composant actif et le plus simple consiste les driver de
TCustomControl et, travers ce dernier de TWinControl.
A loppos, si votre composant nest pas destin recevoir la focalisation, il vaut
mieux driver de TGraphicControl. Le principal intrt est de ne pas consommer
trop de ressources. En effet, loppos des TCustomControl, les TGraphicControl
ne drivent pas de TWinControl et donc ne disposent pas dun handle de fentre, ce
qui permet de prserver ce type de ressources. Par exemple, un TButton drive de
TWinControl alors quun TToolButton drive de TGraphicControl.
75
76
lbc->Items->Strings[indiceSelected]);
indiceSelected++;
}
Figure 7.4 Affichage des index et des lments slectionns dune bote de
liste par le Programme 7.8
Le but est dajouter une proprit nomme Indices qui permette daccder
directement aux indices des lments slectionns comme dans lexemple de code
suivant :
meCool->Lines->Clear();
for (int compteur=0;compteur < lbc->SelCount;compteur++)
{
meCool->Lines->Add(IntToStr(lbc->Indices[compteur])+" "+
lbc->Items->Strings[lbc->Indices[compteur]]);
}
Programme 7.2 Vers une utilisation plus simple des botes de listes
me
77
78
79
80
consiste crer une proprit indexe : lindexation est gre par la mthode daccs
getIndices qui prend lindex en paramtre.
Ce comportement est bien accord lesprit des proprits qui peuvent tre
modifies tout instant par un message Windows.
Le code dimplmentation de la mthode getIndices est alors :
int __fastcall TListBoxCool::getIndices(int index)
{
// vrification de l'adquation aux bornes
if (index >=0 && index < SelCount)
{
int indiceSelected=0;
// parcours de la liste des lments slectionns
// jusqu'au moment ou l'on arrive au index_ime
for (int compteur=0;compteur<=index;compteur++)
{
while (!Selected[indiceSelected])
indiceSelected++;
indiceSelected++;
}
return indiceSelected-1;
}
else
return -1;
}
81
82
Un label indiquant dans quelle bote saisir / afficher une somme en Francs
Un label indiquant dans quelle bote saisir / afficher une somme en Euros
Un label indiquant le taux de conversion Francs / Euros
Une bote de saisie affichant une somme en Francs et o lutilisateur peut
saisir un montant qui sera converti en Euros
Une bote de saisie affichant une somme en Euros et o lutilisateur peut
saisir un montant qui sera converti en Francs
Un bouton qui permettra, dans un second temps, dinvoquer une bote de
dialogue permettant de saisir un nouveau taux pour lEuro.
Une fois dpos sur une fiche, le rsultat final ressemble la Figure 7.11
Voici le droulement du projet :
Introduction C++ Builder
83
5. Crer le composant
6. Crer des proprits
7. Grer laspect visuel du composant
8. Grer les vnements internes
9. Associer une icne au composant
10. Ajouter la bote de saisie du taux de change
Les diffrents
widgets inclus
dans le composant
Proprits
spcifiques
au nouveau
composant
Fond du composant
sur lequel sont greffs
les widgets
Euros
84
Par convention, les noms des attributs de stockage des proprits commencent
tous par la lettre F suivie du nom de la proprit, nous obtenons donc :
private:
double FTaux;
// Attribut de stockage du taux de change
double FFrancs; // Attribut de stockage de la somme en Francs
double FEuros; // Attribut (redondant) de stockage de la somme en Euros
__published:
__property
void SetTaux
(double value);
void SetFrancs (double value);
void SetEuros (double value);
double Taux
= {read
write
default
stored
__property double Francs = {read
write
default
stored
__property double Euros = {read
write
default
= FTaux,
= SetTaux,
= 6,
= true};
= FFrancs,
= SetFrancs,
= 0,
= true};
= FEuros,
= SetEuros,
=0};
85
86
TGroupBox, TButton etc. Dans le cas des TEdit, cest la proprit Text qui
est modifie !
87
Maintenant que nous connaissons la liste des options, intressons nous au type
Set qui permet de les manipuler dans la proprit ControlStyle.
7.4.3.2 Complment sur lutilisation des classes Set
Les classes de type Set ont t ajouts au C++ afin de simuler le type set of
du Pascal utilis pour modliser un ensemble non ordonn de valeurs numriques
distinctes. De telles constructions sont trs pratiques pour modliser les ensembles
doptions, telles que, par exemple, lensemble des boutons prsents sur une bote de
dialogue de Windows.
Pour simplifier, la dclaration de la classe Set est trs similaire :
template<class T, unsigned char valMin, unsigned char valMax>
class Set;
Set(const Set&)
Affectation brutale
Ce spcificateur traduit le mcanisme dappel rapide : les paramtres ne sont pas empils
mais placs dans des registres. Ceci permet de gagner un temps considrable lorsque de nombreux
appels sont ncessaires.
3
88
Les entres / sorties sur les ensembles sont assez spciales dans le sens o elles
travaillent sur un mapping de la prsence de chaque valeur entre minVal et maxVal
vers [0, 1]. Pour clarifier, si la valeur i est prsente dans lensemble, cela sera signal
par un 1 lemplacement i-minVal dans la suite de 0 et 1 construite par
loprateur <<. Rciproquement loprateur >> construit en ensemble partir dune
suite de 0 et de 1 en ajoutant la valeur correspondant chaque fois quil trouve un 1.
Le code du constructeur du composant Calculette (Programme 7.9) contient
linstruction suivante :
(((ControlStyle >> csAcceptsControls)
>> csSetCaption)
<< csFramed)
<< csOpaque;
Nous y apprenons donc que, par rapport au style standard, notre composant :
Rappelons que par dfaut, il accepte les vnements de la souris (y compris les
doubles clics), et du clavier.
Introduction C++ Builder
89
csAcceptsControls)
csSetCaption)
csFramed)
csOpaque;
Style visuel du
composant en cours de
cration
Height=200;
Width=230;
labelFrancs = new TLabel(this);
labelFrancs->Top=10;
labelFrancs->Left=10;
labelFrancs->Caption="Les Francs :";
labelFrancs->Parent=this;
Affichage des la
proprit Francs
90
boutonSaisieTaux->Parent=this;
}
Align ;
Ctl3D ;
DragCursor ;
DragMode ;
Enabled ;
ParentCtl3D ;
ParentShowHint ;
PopupMenu ;
ShowHint ;
Visible ;
91
-) :
92
que
dans la
mthode
SetFrancs,
vous ayez
Euros= ;
93
Nous y apprenons que les vnements sont des proprits ( accs direct de
surcrot). On sen doutait un peu car il est possible dassocier un gestionnaire un
vnement lors de la conception.
Poursuivons notre investigation par la lecture de laide associe au type
TNotifyEvent.
typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);
Il suffit de retenir que dans notre cas, la mthode doit avoir le prototype spcifi
par le type TNotifyEvent lexception du __closure, soit :
void __fastcall NomMethode(TObject *Sender);
94
-) de la touche
95
catch (...)
{
// En cas dchec : affichage dun message derreur
ShowMessage("Saisie invalide");
}
}
96
Chaque unit dcrivant une fiche dfinit une variable externe qui est
habituellement cre au lancement de lapplication. Lorsque lon utilise une
fiche uniquement dans le cadre dun composant, cette instance nest pas
cre automatiquement. Aussi, vous devrez le faire vous mme, comme dans
le fragment de code suivant o vous noterez que nous passons au
constructeur de la fiche la variable Application comme composant pre.
Cette variable est dfinie par toute application VCL.
97
if (FMemoTrace)
FMemoTrace->Lines->Add("Conversion impossible du taux");
}
}
}
// Rcupre les erreurs inhrentes la cration et lexcution
// de la bote de dialogue
catch (...)
{
if (FMemoTrace)
FMemoTrace->Lines->Add("Erreur lors de la saisie du taux");
}
delete FSaisieTaux;
}
Track Bar de
slection du jour
Label indiquant le nb
de jours du mois
courant
98
99
editDate->Parent=this;
editDate->Left=16;
editDate->Top=160;
// On construit normalement la bote combo
// Il faut nanmoins se garder de toucher la proprit Items
comboMois=new TComboBox(this);
comboMois->Parent=this;
comboMois->Left=16;
comboMois->Top=48;
comboMois->Style=csDropDownList;
comboMois->OnChange=OnChangeMois;
tbJour=new TTrackBar(this);
tbJour->Parent=this;
tbJour->Left=16;
tbJour->Top=88;
tbJour->Width=650;
tbJour->Min=1;
tbJour->Max=31;
tbJour->OnChange=OnChangeJour;
labelPremier=new TLabel(this);
labelPremier->Parent=this;
labelPremier->Left=16;
labelPremier->Top=136;
labelPremier->Caption="1";
labelDernier=new TLabel(this);
labelDernier->Parent=this;
labelDernier->Left=650;
labelDernier->Top=136;
}
{
// Remplissage de la bote combo
comboMois->Items->Add("Janvier");
comboMois->Items->Add("Fvrier");
comboMois->Items->Add("Mars");
comboMois->Items->Add("Avril");
comboMois->Items->Add("Mai");
comboMois->Items->Add("Juin");
comboMois->Items->Add("Juillet");
comboMois->Items->Add("Aout");
comboMois->Items->Add("Septembre");
comboMois->Items->Add("Octobre");
comboMois->Items->Add("Novembre");
comboMois->Items->Add("Dcembre");
// Rcupration de la date courante par un appel systme Windows
SYSTEMTIME toutDeSuite;
GetLocalTime(&toutDeSuite);
// Modification des proprits du composant en consquence
100
Annee=toutDeSuite.wYear;
Mois=toutDeSuite.wMonth;
Jour=toutDeSuite.wDay;
}
ReconstructionDate(); // Mise jour de la bote ddition
}
La premire chose savoir est quun vnement est avant tout une proprit de
type closure. Comme nous lavons vu un peu plus haut, ce type est associ des
pointeurs de mthodes dans un objet fiche.
Il existe deux grands types dvnements externes :
Ceux qui sont dj prvus par C++ Builder mais qui sont masqus, il suffira
de les rendre accessibles par le mcanisme de publication des proprits
protected que nous avons dj utilis afin de rendre visibles les proprits
standard des contrles.
Les vnements que vous souhaiterez ajouter vous mme.
101
Afin de rendre les choses simples, ces deux derniers vnements seront de type
notification : cest dire avec un seul paramtre correspondant lmetteur du
message. On se rfrera au chapitre pour de plus amples renseignements sur les
notifications.
Il faut galement penser donner des noms loquents aux vnements. En
effet, ils doivent clairement indiquer dans quelles circonstances ils seront invoqus.
En outre, la tradition veut que leur nom commence systmatiquement par On. Suivant
ces recommandations, nous appellerons nos vnements OnAvantChangementDate et
OnApresChangementDate.
Leur dclaration obit au code suivant :
class PACKAGE TBrunoDate : public TCustomControl
{
...
// Attributs de stockage des proprits associes aux vnements spcifiques
TNotifyEvent FAvantChangementDate;
TNotifyEvent FApresChangementDate;
...
__published:
// Publication de OnClick auparavant en protected
__property OnClick;
// Publication des deux vnements spcifiques
__property TNotifyEvent OnAvantChangementDate= read = FAvantChangementDate,
write = FAvantChangementDate};
__property TNotifyEvent OnApresChangementDate={read = FApresChangementDate,
write = FApresChangementDate};
...
};
102
Evenements et gestionnaires
associs
Composant de
saisie de date
103
Pour ce qui est des vnements spcifiques, il vous appartient de les activer au
bon moment en appliquant la lettre une rgle dor :
Aucune hypothse ne doit tre faite sur le contenu du gestionnaire fourni par
votre utilisateur.
En particulier, votre code doit fonctionner que lutilisateur fournisse ou non un
gestionnaire pour votre vnement. Aussi, le gestionnaire utilisateur se rajoute au
code par dfaut et ne doit jamais le remplacer. Lappel un gestionnaire utilisateur
doit ressembler :
if (Propriete)
Propriete(arguments)
104
7.7.1 Motivation
Dans cette section, nous allons montrer comment encapsuler une bote de
dialogue dans un composant. Pour cela, nous allons nous appuyer sur lexemple dune
bote de saisie gnrique.
En effet, la plupart des botes de dialogue orientes saisie obissent la
structure suivante :
Titre de la bote
Texte explicatif sur les
donnes taper
Composant bote de
saisie destin la
saisie proprement dite
Boutons standard de
fermeture de la fentre
105
Sil est possible de raliser toutes ces oprations relativement facilement, vous
voyez quelles impliquent tout de mme dutiliser des proprits de composants de la
bote ce qui impose de connatre la structure du dialogue.
En crant des proprits dun composant englobant cette bote, vous nauriez
qu connatre ceux-ci. Nous allons donc crer 3 proprits de type texte pour notre
dialogue :
Vous noterez que nous avons respect les conventions habituelles de la VCL sur
les noms des proprits de texte. La figure suivante rcapitule cet tat de fait.
Caption
Label
Text
106
Il est trs important de noter que la bote de dialogue sous jacente nest pas
active lors de la conception sur fiche. Le lien avec les proprits du composant nest
ralis que lors de lactivation de la mthode Execute.
7.7.3 Ralisation
La premire opration consiste crer la fiche gnrique comme nimporte
quelle fiche. Veillez toutefois lajouter au projet dans lequel vous allez crer votre
composant. Dans notre cas, nous lajoutons au paquet des exemples et nous nommons
lunit USaisieGenerale.
Comme dordinaire, il convient de crer le composant que nous allons ajouter
la palette et au paquet des exemples pour raison de simplicit. Bien que vous ayez
dsormais lhabitude de cette opration, reprenons ensemble le modus operandi.
Drivez de TComponent
Choisissez la palette exemples
Le nom de classe utilis dans lexemple est TComposantSaisie
107
108
Windows utilises (on peut revoir la section 7.2.2 pour une plus ample discussion ce
sujet).
La principale proccupation du concepteur de composant graphique rside dans
laspect visuel de ce dernier. En effet, contrairement aux composants fentrs dont
ltat est sauvegard par le systme, les composants graphiques ne peuvent compter
que sur leur mthode virtuelle Paint (automatiquement appele par lvnement
Windows ON_PAINT) ainsi que sur un ventuel gestionnaire dvnement OnPaint
fourni par lutilisateur pour mettre jour leur aspect visuel aprs, par exemple, un
redimensionnement de leur zone client ou leur retour au premier plan.
5
7
1.0
2.0
1.0
4.0
5.0
0 1
1 2
2 3
3 4
4 0
4 2
3 1
Nombre d'arcs
2.0
4.0
6.0
4.0
2.0
Un sommet : coordonnes x et y
109
Le nom du fichier qui contient le graphe : cest une chane ANSI en lecture
et criture (Fichier).
Enveloppe convexe
(fictive) du graphe
Marge
110
111
8. En guise de conclusion
Jespre que ce poly (qui ne donne, rappelons-le, quun bref aperu des
nombreuses possibilits offertes par C++ Builder) vous donnera envie dexploiter
fond ce logiciel que, personnellement, japprcie beaucoup bien que regrettant
certaines des fonctionnalits offertes par son anctre Borland C++. Il ne fait aucun
doute quau bout de 6 mois de travail intensif sur cet outil, cest vous qui viendrez me
donner des cours !
Tout retour est videmment le bienvenu et je vous encourage me lenvoyer par
mel : bruno.garcia@lemel.fr ou bruno.garcia@francemel.com .
En outre, jaimerais ddicacer ce travail la promo 1999 de F2 de lISIMA qui a
du se coltiner Borland C++ / OWL en 2me anne puis C++ Builder en 3me anne. Leur
comptence et leur curiosit ma oblig me remettre en cause en permanence et fait
du cours de C++ Builder un dfi permanent (et responsable de nombreuses veilles
tardives). Finalement, leur gentillesse et leur humour a rendu ce cours
particulirement agrable quelques pisodes resteront dfinitivement gravs dans
ma mmoire. Aussi, pour toutes ces raisons, merci, merci Florence, Ashwin, Cedrick,
Chness, Cyril, Didou, Ecom, Elkine, Fonzy, Fred, Fufu, Goontar, Izno, JD, Jrme,
Jesz, Kal, Laurent, Oumph, Rmi, Roubech, Serge, Totov et Ubik.
112