Ppaux Composants
Ppaux Composants
Ppaux Composants
Globalement on distingue :
- Les classes et composants de haut niveau qui représentent l'application et ses
différentes fenêtres.
- Les composants qui permettent de créer une interface évoluée ( panneau, labels,
cadres, blocs notes, menus, etc. ).
- Les composants chargés de réaliser des entrées et des sorties ( zone de saisie et
d'affichage ) ou offrant des possibilités de choix à l'utilisateur ( case à cocher, liste,
etc.).
- Les composants permettant d'accéder au système.
Une application C++ Builder est composée d'un nombre variable de fenêtres dont une
est la fenêtre principale. Chaque fenêtre est, du point de vue de la programmation, une classe
particulière dérivée de la classe TForm.
Mais il existe aussi une classe spéciale, appelé TApplication, "caché" qui permet de
référencer directement l'application dans son ensemble. Il n'est pas nécessaire de manipuler
directement le composant, non visuel, instancié à ce type dans tous les cas mais il est bon de
savoir qu'il existe, sachant qu'il a une importance capitale, et que l'on peut, par son
intermédiaire, réaliser des traitements puissants.
Page X.1
Les principaux composants
TApplication
TScreen TForm1
TForm2
TForm1
TPanel1 Contrôle
TPanel
TPanel Contrôle
Contrôle
Contrôle
Contrôle
Contrôle
Contrôle
L'objet Application est l'objet "parent" de tous les composants. Il est en particulier
parent de tous les objets de type TForm et d'un objet spécifique, appelé TScreen, dont on
explicitera le rôle.
Chaque objet TForm est parent de tous les composants qu'il contient. Certains de ces
composants ( comme le composant TPanel ) peuvent contenir eux même des composants dont
ils sont les parents.
10.111 / Description :
Une fiche est constituée à partir du composant TForm. Ce composant peut contenir
d'autres composants. Il est au centre des applications C++ Builder : on conçoit une
application en plaçant des composants sur une ou plusieurs fiches.
Les fiches peuvent être utilisées en tant que fenêtres ou en tant que boîtes de dialogue.
Page X.2
Les principaux composants
Par défaut, la propriété Visible est initialisée à False pour toute autre
fiche que celle de la fenêtre principale.
Page X.3
Les principaux composants
Méthode Action
Close ( void ) Ferme la fiche.
La méthode Close appelle d'abord la méthode CloseQuery
pour déterminer si la fiche peut être fermée. Si CloseQuery
renvoie False, l'opération de fermeture est interrompue.
CloseQuery ( void ) La méthode CloseQuery est appelée pendant le processus de
fermeture déclenché par la méthode Close d'une fiche afin de
savoir si cette dernière peut être effectivement fermée.
CloseQuery exécute le code rattaché à l'événement
OnCloseQuery.
Print Imprime une image de la fiche
Show ( void ) Rend visible une fiche en mettant sa propriété Visible à True
et en la faisant fonctionner en mode amodal.
ShowModal ( void ) Rend visible une fiche en mettant sa propriété Visible à True
et en la faisant fonctionner en mode modal.
Événement Déclenchement
OnActivate Se produit lorsque la fiche devient active.
OnClick Se produit lorsque l'utilisateur clique sur le composant.
OnClose Se produit lors de la fermeture d'une fiche
OnCloseQuery Se produit lors d'une action fermant la fiche ( lorsque la méthode
Close est appelée ou lorsque l'utilisateur choisit Fermeture dans
le menu système de la fiche).
Il est possible d'utiliser un gestionnaire d'événement
OnCloseQuery afin de demander à l'utilisateur une confirmation
de la fermeture.
OnCreate Permet de créer une fonction associée servant à initialiser la fiche
( valeurs initiales des propriétés et exécution de traitements
spécifiques ).
OnExit Se produit lorsque la focalisation passe à une autre feuille.
Une fiche ne peut être fermée que si la variable globale OnClose, de type booléen, est
positionnée à True. Il est donc possible de créer un gestionnaire d'événement afin
d'initialiser cette variable.
Quelle que soit la manière dont la fenêtre sera fermée ( par un bouton approprié, par le
menu système ou par un raccourci clavier ) le gestionnaire d'événement associé à
OnCloseQuery est exécuté. Il est alors possible d'y inclure certains contrôles
préalables à la fermeture en bloquant celle-ci le cas échéant.
Il est intéressant d'utiliser les possibilités offertes par les différents événements
amenant à la création et à l'affichage de la feuille. Certains sont systématiquement appelés
lors de la procédure de création. Il s'agit, dans l'ordre, des événements :
Page X.4
Les principaux composants
Une fiche est créée simplement, en phase de conception, par utilisation du menu
'Fichier/ Nouvelle fiche '.
Page X.5
Les principaux composants
#include "Unit1.h"
#include "Unit2.h"
Inclusion du fichier en-tête
//-------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFMere *FMere;
//-------------------------------------------------------
__fastcall TFMere::TFMere(TComponent* Owner)
: TForm(Owner)
{
A l'exécution on peut basculer d'une fenêtre à l'autre en cliquant sur les boutons
correspondant.
Page X.6
Les principaux composants
Cependant ce mode de création de fiche, qui est le mode par défaut, n'est pas
satisfaisant. En effet il implique que toutes les fiches constituant l'application soient
créées au démarrage, par l'objet Application. Elles ne sont affichées qu'à la demande. Si
l'application est composée de quelques dizaines de feuilles les ressources mémoires et
systèmes nécessaires risquent d'être insuffisantes.
Par ailleurs certaines fiches peuvent avoir besoin de certaines valeurs d'initialisation qui
ne seront valides que par action de l'utilisateur dans d'autres fiches ( ce sera souvent le
cas dans les applications gérant des données ). L'application risque alors de "planter"
au démarrage.
Il est donc préférable, et de loin, de réaliser une création dynamique des feuilles : les
zones mémoires nécessaires aux différentes fiches ne sont alors réservées qu'en cas de
besoin.
Pour pouvoir réaliser cette création dynamique il faut explicitement créer la feuille dans
le gestionnaire d'événement chargé de l'afficher. Il faudra aussi prendre soin de libérer
la mémoire lorsque la fenêtre est fermée.
Pour que cette méthode d'allocation dynamique soit réellement prise en compte, il faut
que l'option "auto-création" des fiches soit annulée dans le projet. Il faut pour cela se
rendre dans le menu ' Projet / Options', pour faire passer les différentes fiches
secondaires dans la catégorie " fiches disponibles ".
Page X.7
Les principaux composants
Il est possible que Windows ne soit pas en mesure d'afficher la fenêtre ( lors de
l'exécution de la méthode ShowModal ( ou Show ) car il ne dispose plus de
suffisamment de ressources.
Page X.8
Les principaux composants
Il faut donc protéger l'appel à cette méthode en gérant l'exception qui est susceptible
d'être déclenchée ( et qui se traduit par un message système à l'écran bien peu
esthétique).
Un chapitre est consacré ultérieurement à la gestion des exceptions. Néanmoins il est
intéressant de voir quel est le code complet et sécurisé de l'appel d'une fiche :
try
{
FFille = new TFFille ( this );
FFille->ShowModal ( ) ;
}
catch ( ... )
{
ShowMessage ( "Ouverture impossible" ) ;
}
delete FFille ;
}
/* En fait il y a deux sources d'exception possible :
- L'appel à new qui ne peut allouer la mémoire
nécessaire ;
- L'appel à ShowModal qui ne peut disposer des
ressources systèmes nécessaires pour réaliser
l'affichage.
Il faut donc être plus précis dans sa gestion des
exceptions */
C'est ce composant qui est invoqué dans le fichier projet '.cpp' et qui permet
de lancer l'application par l'instruction :
Application->Run ( ) ;
Page X.9
Les principaux composants
De même ses propriétés et méthodes ne sont pas très connues ( il faut dire que la
documentation à son sujet est très réduite et qu'il faut presque un hasard pour savoir qu'il
existe). Néanmoins certaines de ses caractéristiques sont très intéressantes et, pour tout dire,
incontournables.
Page X.10
Les principaux composants
Screen->Cursor = crHourGlass ;
while ( i++ < 100000000 )
;
Screen->Cursor = crDefault ;
}
/* Le curseur prend la forme d'un sablier lorsque l'on
clique sur un bouton puis reprend son aspect habituel
*/
Page X.11
Les principaux composants
Un composant de type TPanel peut servir à créer des "cadres" dans lesquels d'autres
contrôles peuvent ensuite être placés. Il peut aussi être utilisé comme base pour créer une
palette d'outils, une barre d'icônes ou une barre d'état.
Le contrôle TPanel doit être placé sur la fiche avant les contrôles qu'il
contiendra. Cela étant réalisé :
- Si le cadre est déplacé, tous les composants qu'il contient sont déplacés en
même temps.
- Il est possible ensuite d'aligner ces différents contrôles par rapport au cadre
TPanel en utilisant la palette d'alignement.
Outre le fait que le composant sert de container aux composants qu'il contient,
il y a "propagation" de certaines de ses propriétés :
- Lorsque l'on déplace ce composant, tous les composants inclus sont
déplacés.
- La palette d'alignement agit sur les composants inclus par rapport aux
dimensions du container.
- Les modifications des propriétés Visible et Enabled s'appliquent d'un seul
coup au container et à tous les composants inclus.
- Les propriétés Color, Font, CTL3D sont elles aussi propagées.
La palette d'alignement :
Lorsque plusieurs composants sont placés sur une feuille, ou à l'intérieur d'un
composant TPanel, il est possible de les aligner rapidement grâce à la palette
d'alignement ( on peut aussi les positionner un par un mais c'est beaucoup plus
fastidieux ).
Pour ce faire, il faut d'abord sélectionner les composants que l'on souhaite aligner.
Pour cela ils doivent être sélectionnés à la souris un par un en maintenant la touche
'Shift' enfoncée.
Page X.12
Les principaux composants
Pour construire une barre d'outils ou une palette d'outils, il suffit d'ajouter
des turbo-boutons ( TSpeedButton ) au cadre du haut ainsi que tout
autre contrôle utile.
Page X.13
Les principaux composants
TBevel est surtout utilisé pour créer des lignes de séparations et des cadres sur
l'interface. Les différents possibilités de configurations sont accessibles à l'aide des propriétés
Shape et Style.
Exemple :
Page X.14
Les principaux composants
C++ Builder propose deux méthodes pour constituer des blocs notes à onglets :
Il existe aussi des menus flottants qui peuvent apparaître à des emplacements
divers de la fenêtre et, souvent, être déplacés.
Page X.15
Les principaux composants
feuille de conception, ils n'apparaîtront pas à l'exécution : les menus seront alors attachés à la
barre de titre.
Une des premières choses à faire est de donner un nom au menu ( propriété
Name ).
Le fait d'utiliser la touche ' flèche droite ' valide l'entrée et prépare une
nouvelle rubrique dans le menu principal.
De même la touche ' flèche bas ' valide l'entrée et prépare une nouvelle
rubrique dans le menu déroulant associé.
Si l'on entre le caractère ' - ' en tant que 'Caption', une barre de séparation est
générée directement dans le menu concerné.
Les rubriques qui ouvriront une boîte de dialogue doivent être terminées par
trois points ' ...' .
Page X.16
Les principaux composants
On constate que chaque élément du menu créé par le concepteur de menu est un objet
particulier, de type TMenuItem qu'il est possible de manipuler individuellement.
Principales propriétés :
Page X.17
Les principaux composants
Les différents éléments TMenuItem d'un menu ne réagissent qu'à un seul type
d'événement : l'événement OnClick qui correspond à un click sur le bouton gauche
de la souris.
Pour chaque élément il n'y a donc qu'à créer un gestionnaire d'événement associé
pour réaliser les fonctionnalités souhaitées.
Option->Checked = ! Option->Checked ;
/* Cette ligne insérée dans le gestionnaire d'événement
permet d'afficher ou de supprimer la 'coche' à chaque clic
sur la rubrique Option */
Un menu "Pop-Up" s'affiche lorsque l'on appuie avec le bouton droit de la souris sur
un composant ou sur le fond de la fenêtre.
Il faut pour cela que le menu ait été assigné au composant ou à la fiche en initialisant
la propriété PopupMenu du composant concerné avec le nom du menu surgissant.
Page X.18
Les principaux composants
Par défaut ( propriété AutoPopup = True ) le menu s'affiche lorsque l'on clique avec
le bouton droit de la souris. Mais l'on peut aussi l'activer en invoquant la méthode PopUp ( )
qui en plus permet de spécifier l'endroit où le menu va s'afficher.
C++ Builder propose trois types de composants différents pour créer des boutons : les
classes TButton, TBitBtn et TSpeedButton. Chacun, outre des caractéristiques communes,
propose des spécificités.
Sous une apparente similitude il faut noter une grosse différence entre les TButtons et
les TBitBtns, d'une part, et les TSpeedButtons, d'autre part : les premiers sont des
composants dérivés de la classe TWinControl ( ils peuvent donc acquérir le focus et sont
gérés par un handle ) alors que les TSpeedButtons dérivent de TGraphicControl ( pas de
focus possible, pas de handle ).
Page X.19
Les principaux composants
- D'un type prédéfini par C++ Builder, ce qui permet d'afficher des images
standards : les types prédéfinis dépendent de la valeur de la propriété Kind :
- Dans le cas où la propriété Kind = bkCustom ( c'est à dire que l'on utilise un
bouton qui n'est pas prédéfini, et qui n'a donc pas de comportement par défaut )
il faut charger - grâce aux '...' qui apparaissent dans la propriété Glyph -
l'image désirée. L'invocation de cette propriété entraîne le lancement de l'éditeur
d'image.
bkAbort
bkRetry
Si, par exemple, une fenêtre a été créée - en mode modal - avec deux boutons,
'OK' et 'Annuler', il faut initialiser la propriété ModalResult à mrOK pour le bouton
'OK' et à mrCancel pour le bouton 'Annuler'.
Lorsque l'utilisateur choisit l'un ou l'autre de ces boutons, l'état modal de la boîte de
dialogue s'achève car la valeur de ModalResult est supérieure à mrNone et la
fenêtre disparaît. En utilisant ModalResult, il n'est pas nécessaire d'écrire un
gestionnaire d'événement uniquement pour fermer la boîte de dialogue.
Grâce à ce composant, C++ Builder permet de réaliser facilement des barres d'icônes.
Dans un premier temps elles peuvent être fixes mais il est possible d'imaginer des barres
configurables et flottantes.
Page X.21
Les principaux composants
Il existe d'autres composants aux possibilités plus étendues mais plus complexes à
manipuler.
Principales propriétés :
Une zone de saisie peut avoir le focus mais ne peut être activée par une touche
spécifique. Pour cela il faut la lier avec un composant TLabel.
Page X.22
Les principaux composants
Chaque ligne du composant est gérée ( via la propriété Lines ) comme un objet
particulier ayant ses propres propriétés et méthodes.
Page X.23
Les principaux composants
La propriété principale de ces deux composants est la propriété Items, c'est à dire
l'ensemble des éléments, de type Strings, composant les "lignes" de la liste.
Items [ i ] permet d'accéder au ième –1 élément de la liste.
C'est grâce à cette propriété que l'on peut gérer la liste ( méthodes Add( ), Delete,( )
Insert( ), etc.).
On utilise cette possibilité lorsque l'on souhaite proposer à l'utilisateur une liste
finie de choix.
Page X.24
Les principaux composants
¤ On ajoute ou on supprime des entrées dans les listes en utilisant les méthodes
Add( ) ou Delete( ) de la propriété Items.
ListBox->Items->Add ( Edit1->Text ) ;
/*Ajout du contenu de la zone d'édition Edit1 dans la
liste */
ListBox->Items->Delete ( ListBox->ItemIndex ) ;
// Suppression de la ligne qui est sélectionnée
¤ On peut utiliser la méthode IndexOf de l'objet Items. Cette fonction renvoie l'indice
de l'item correspondant à la chaîne passée en paramètre si celle-ci existe déjà dans la
liste et -1 dans le cas contraire.
If ( ListBox->Items->IndexOf ( Edit->Text ) = -1 )
ListBox->Items->Add ( Edit->Text )
else
MessageDlg ( "L'élément existe déjà !!!", mtWarning,
TMsgDlgButtons() << mbCancel,0 ) ;
C'est la propriété Checked ( ou la propriété State ) qui indique si la case est cochée
ou non : lorsque l'utilisateur coche ou décoche une case à cocher, la valeur de la
propriété Checked change et l'événement OnClick se produit.
Il est possible de désactiver une case à cocher en mettant la propriété Enabled à False.
Page X.25
Les principaux composants
Comme les cases à cocher, les boutons radios ( classe TRadioButton ) permettent de
présenter un ensemble d'options. Mais cette fois-ci, les options s'excluent mutuellement
( ce qui veut dire qu'un seul bouton radio peut être validé en même temps ).
A la conception, les boutons radio sont ajoutés à la boîte via la propriété Items qui
appelle l'éditeur de chaînes de caractères ( le même que celui utilisé dans TMemo,
TListBox ou TComboBox ) : chaque chaîne de la propriété Items provoque l'affichage
d'un bouton radio dans la boîte groupe, avec la chaîne entrée comme intitulé du bouton
correspondant.
On peut ajouter ou supprimer dynamiquement des boutons radios en utilisant les
possibilités offertes par la propriété Items.
Les boîtes de messages fonctionnent toutes en mode modal. Elles sont très pratiques
pour afficher diverses informations, avertissements et messages d'erreur ou pour demander à
l'utilisateur la conduite à tenir face à une alternative.
Page X.26
Les principaux composants
Pour accéder à une boîte de message il suffit d'invoquer des fonctions particulières qui
réalisent la totalité des opérations d'affichage.
Son défaut majeur c'est qu'elle affiche le nom du programme dans sa barre
de titre au lieu d'un titre plus "informatif".
Page X.27
Les principaux composants
Outre les valeurs individuelles de l'ensemble, il existe aussi trois ensembles constants
prédéfinis correspondant aux combinaisons les plus courantes :
Exemple d'utilisation :
Page X.28
Les principaux composants
Cette fonction permet d'entrer une chaîne de caractères. Son prototype est le suivant :
Exemple :
Page X.29
Les principaux composants
Même si Value remplace Adefault le rôle des trois paramètres est identique à celui
qu'ils ont dans la fonction InputBox ( ).
Par contre, lorsque l'utilisateur entre une chaîne dans la zone de saisie puis choisit 'OK',
le paramètre Value prend la nouvelle valeur ( d'où le passage de paramètre par
variable).
La fonction InputQuery renvoie True si l'utilisateur a choisi 'OK' et False si
l'utilisateur a choisi 'Annuler' ou a appuyé sur la touche Echap.
Les différentes boîtes sont accessibles via des composants regroupés dans l'onglet
''Dialogues' de la palette de composants. Il s'agit de :
Page X.30
Les principaux composants
If ( OpenDialog->Execute ( ) )
< actions ...>
On peut configurer cette boîte de dialogue dès la conception, pour qu'elle affiche
certains renseignements, grâce aux propriétés suivantes :
- DefaultExt permet d'indiquer l'extension qui sera attribuée par défaut aux fichiers
si celle-ci n'est pas explicitée.
- Filename contient le nom du fichier qui apparaît dans la zone de saisie après
sélection.
Page X.31
Les principaux composants
C'est la valeur de la propriété FileName qui doit être utilisée dans le reste
du programme pour réaliser les opérations d'ouverture du fichier.
Par exemple on peut vouloir indiquer dans un composant de type TPanel, utilisé en tant
que barre d'état l'action réalisée par un bouton.
Page X.32
Les principaux composants
Même si l'utilisation des timers s'avère pratique, il ne faut pas en abuser car un
timer consomme beaucoup de ressources. En règle générale il ne faut pas
avoir plus de trois ou quatre timers dans une application.
10.92 : Jauges
Les jauges, comme les barres d'icônes et les barres d'état sont à la mode. C++ Builder
ne pouvait pas ne pas proposer des composants permettant de réaliser certaines initialisations
de variables par l'utilisation de ce type de gadget.
Deux composants de C++ Builder peuvent être utilisés : un ne réalise que des
affichages d'informations alors que l'autre est manipulable par l'utilisateur et permet réellement
la modification de valeurs.
Principales propriétés :
Min
Position Position courante du curseur
Par rapport à la jauge précédente celle-ci n'est pas interactive ( lecture seule ) mais elle
permet d'afficher des valeurs en pourcentage et est surtout utilisée pour afficher la
progression d'une action ( chargement d'un fichier par exemple ).
Elle n'est pas documentée dans l'aide mais son fonctionnement est facile à
comprendre.
Comme dans le cas précédent on dispose des propriétés Max et Min pour déterminer les
valeurs maximale et minimale possibles. Par contre, c'est la propriété Progress qui
permet de connaître la valeur courante ( cette valeur est affichée, en pourcentage au
milieu de la jauge ).
Page X.33
Les principaux composants
Page X.34