Vous êtes sur la page 1sur 343

Les réponses à vos questions sur BCB

Date de publication : 01/01/2004

Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C
++ Builder de developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations
qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est
humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une
erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous
vous souhaitons une bonne lecture.
L'équipe C++ Builder de Developpez.

Commentez cette FAQ :


Ont contribué à cette FAQ :

MFDev - Tenguryu - dvsoft - bakaneko - Fbartolo -


NoisetteProd - Corfoudiou - firejocker - Alain Malval -
Altau - doudouallemand - pottiez - Interruption13h - ksly
- cryptonyx - henderson - MiGoN - Kaji - Dure_Limite -
Freeze - virtuA - blondelle - Geronimo - Alacazam - Greybird
- Ricky81 - Clément Cunin - TABZ - Smortex - Nono40 -
Psl - Superstivix - Bidou - Laurent Dardenne - Al-Yazdi -
Atlantis - Gysmo - Pierre Castelain - CGi - Neo41 - Bloon
- Delphiprog - JEG - Fred_smashg - Neilos - Sjrd - Bibmari
- Giovanny Temgoua - Netah25 - Sunchaser - Gilles Louïse
- Pascal Jankowski - Bandit Boy - dj_benz - rbag - Pedro -
LadyWasky - ero-sennin - yarp - sat83 - bebeours - Crayon -
Les réponses à vos questions sur BCB

1. Informations générales (3) .........................................................................................................................................................5


2. Généralités (13) ......................................................................................................................................................................... 7
2.1. Le logiciel C++ Builder (6) ............................................................................................................................................. 8
2.2. Apprentissage de C++ Builder (5) ................................................................................................................................. 10
2.3. Comparaison avec d'autres langages/IDE (2) .................................................................................................................13
3. Concepts (3) .............................................................................................................................................................................14
4. Langage (46) ............................................................................................................................................................................15
4.1. Types de données (23) ................................................................................................................................................... 19
4.1.1. Nombres (8) ........................................................................................................................................................... 21
4.1.2. Chaînes de caractères (14) .....................................................................................................................................26
4.2. Assembleur (4) ................................................................................................................................................................33
4.3. Compilation et édition de liens (11) .............................................................................................................................. 35
4.3.1. Comment résoudre l'erreur... (5) ........................................................................................................................... 46
5. Utilisation de C++ Builder (24) .............................................................................................................................................. 48
5.1. Concepteur de fiches (7) ................................................................................................................................................ 51
5.2. Palette de composants (2) ...............................................................................................................................................53
5.3. Outils et fonctions (6) .....................................................................................................................................................54
5.4. Divers (5) ........................................................................................................................................................................ 56
6. Gestion des fichiers (31) ......................................................................................................................................................... 58
6.1. Répertoires (15) .............................................................................................................................................................. 59
6.2. Fichiers (15) ....................................................................................................................................................................69
7. Gestion du temps (14) ............................................................................................................................................................. 76
7.1. Opérations sur les dates/heures (5) ................................................................................................................................ 79
7.2. Dates particulières (4) .....................................................................................................................................................82
8. Interface (135) ......................................................................................................................................................................... 84
8.1. Gestion de l'exécution (7) ...............................................................................................................................................85
8.2. Applications GUI (19) ....................................................................................................................................................89
8.2.1. Aide (4) ..................................................................................................................................................................91
8.2.2. Interface (11) ..........................................................................................................................................................93
8.3. Applications console (5) .................................................................................................................................................99
8.4. Composants (94) ........................................................................................................................................................... 101
8.4.1. Généralités et installation (10) ............................................................................................................................ 102
8.4.2. Les boutons (4) .................................................................................................................................................... 105
8.4.3. Les listes (8) ........................................................................................................................................................ 106
8.4.4. Les grilles (11) .....................................................................................................................................................112
8.4.5. Les zones d'édition (8) ........................................................................................................................................ 121
8.4.6. Les images et le graphisme (17) ......................................................................................................................... 124
8.4.6.1. TChart (12) ................................................................................................................................................. 127
8.4.7. Le composant TCppWebBrowser (17) ................................................................................................................131
8.4.8. Le composant TStringList (3) ............................................................................................................................. 142
8.4.9. Création dynamique / Recherche de composants à l'exécution (5) ..................................................................... 144
8.4.10. Divers (11) ......................................................................................................................................................... 148
8.5. API Windows (7) ..........................................................................................................................................................153
8.6. Ressources (3) ...............................................................................................................................................................159
9. Système (75) .......................................................................................................................................................................... 163
9.1. Fichiers .INI (12) .......................................................................................................................................................... 164
9.2. Base de Registre (12) ................................................................................................................................................... 170
9.3. Lecteurs (7) ................................................................................................................................................................... 178
9.4. Moniteurs (8) ................................................................................................................................................................ 183
9.5. Clavier et souris (7) ......................................................................................................................................................187
9.6. Mémoire (7) .................................................................................................................................................................. 191
9.7. Son (4) .......................................................................................................................................................................... 194
9.8. DLL (1) .........................................................................................................................................................................196
9.9. Port série / RS 232 et port parallèle (3) ....................................................................................................................... 197

-3-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

9.10. Divers (12) .................................................................................................................................................................. 198


10. Bases de données (16) .........................................................................................................................................................205
10.1. BDE (6) .......................................................................................................................................................................206
10.2. SQL (1) ....................................................................................................................................................................... 209
10.3. ADO (3) ...................................................................................................................................................................... 210
10.4. INTERBASE (1) .........................................................................................................................................................212
10.5. ACCESS (3) ................................................................................................................................................................213
11. MS Office (266) .................................................................................................................................................................. 215
11.1. Généralités (7) .............................................................................................................................................................216
11.2. Excel (129) ..................................................................................................................................................................219
11.2.1. Gestion de l'application (36) ............................................................................................................................. 220
11.2.1.1. Paramétrage de l'application (13) ............................................................................................................. 221
11.2.1.2. Recours aux fonctionnalités (8) ................................................................................................................226
11.2.1.3. Fonctionnalités d'impression (12) .............................................................................................................230
11.2.2. Gestion des classeurs (14) ................................................................................................................................. 233
11.2.3. Gestion des feuilles (20) ....................................................................................................................................238
11.2.4. Gestion des cellules (54) ................................................................................................................................... 245
11.2.4.1. Manipulation des cellules (13) ................................................................................................................. 247
11.2.4.2. Mise en forme des cellules (26) ............................................................................................................... 251
11.2.4.2.1. Contenu des cellules (11) ................................................................................................................ 253
11.2.4.2.2. Taille des cellules (4) ...................................................................................................................... 258
11.2.4.2.3. Manipulation de bordures (6) .......................................................................................................... 259
11.2.4.3. Plages de sélection (11) ............................................................................................................................262
11.2.5. Gestion des macro Excel (3) ............................................................................................................................. 266
11.3. Word (113) ..................................................................................................................................................................268
11.3.1. Gestion de l'application (13) ............................................................................................................................. 269
11.3.2. Modifier la police de caractère (7) ....................................................................................................................273
11.3.3. Modifier la mise en page du document (7) .......................................................................................................275
11.3.4. Gestion du document (12) ................................................................................................................................. 277
11.3.5. Insertion de texte venant de composants (7) .....................................................................................................281
11.3.6. Modification du texte (22) .................................................................................................................................284
11.3.7. Gestion des tableaux (40) .................................................................................................................................. 290
11.3.8. Gestion des macros (5) ......................................................................................................................................302
11.4. Outlook (5) ..................................................................................................................................................................305
11.4.1. Gestion de l'application (5) ............................................................................................................................... 306
11.5. PowerPoint (11) .......................................................................................................................................................... 309
11.5.1. Gestion de l'application (11) ............................................................................................................................. 310
11.6. Access (1) ................................................................................................................................................................... 313
11.6.1. Gestion des macros (1) ......................................................................................................................................314
12. OpenOffice (34) ...................................................................................................................................................................315
12.1. Gestion des documents (3) ......................................................................................................................................... 318
12.2. Gestion des feuilles (28) .............................................................................................................................................320
13. Windows Image Acquisition (WIA) (10) ........................................................................................................................... 336

-4-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Informations générales


Comment bien utiliser cette FAQ ?
Auteurs : Clément Cunin , Greybird ,
Le but :
Cette F.A.Q. a été conçue pour être la plus simple possible d'utilisation. Elle tente d'apporter des réponses simples et
complètes aux questions auxquelles sont confrontés tous les débutants (et les autres).
L'organisation :
Les questions sont organisées par thème, les thèmes pouvant eux-même contenir des sous-thèmes.
Les réponses :
Les réponses contiennent des explications et des codes sources. Certaines sont complétées de fichiers à télécharger
contenant un programme de démonstration. Ces programmes sont volontairement très simples afin qu'il soit aisé de
localiser le code intéressant. Les réponses peuvent également être complétées de liens vers d'autres réponses ou vers
un autre site en rapport.
La recherche :
Un moteur de recherche sur les pages de la F.A.Q. est maintenant disponible, utilisez le bouton [ Rechercher ] situé
en haut de page.
Nouveautés et mises à jour :
Lors de l'ajout ou de la modification d'une question/réponse, un indicateur est placé à coté du titre de la question.
Cet indicateur reste visible pour une durée de 15 jours afin de vous permettre de voir rapidement les modifications
apportées.

Nous espérons que cette F.A.Q. pourra répondre à vos questions.


N'hésitez pas à contacter pottiez pour vos commentaires/remarques/critiques.

lien : Comment participer à cette FAQ ?

Comment participer à cette FAQ ?


Auteurs : Greybird ,
Cette F.A.Q. est ouverte à toute collaboration. Si vous souhaitez intégrer une collaboration personnelle, ou si vous
désirez des renseignements au sujet de l'organisation de la F.A.Q, contactez pottiez, responsable de cette FAQ.

Plusieurs compétences sont actuellement recherchées pour améliorer cette F.A.Q. :


• Rédacteur : Bien évidemment, toute nouvelle question/réponse est la bienvenue.
• Correcteur : Malgré nos efforts des fautes d'orthographe ou de grammaire peuvent subsister. Merci de contacter
le responsable de cette FAQ si vous en débusquez une... Idem pour les liens erronés.

Remerciements
Auteurs : pottiez ,
Remerciements à tous ceux qui ont contribués de près ou de loin à l'élaboration de cette F.A.Q.
Remerciements particuliers à Géronimo, créateur de cette FAQ, et à Alacazam. A eux deux, ils ont fourni la grande
base de cette FAQ.
Remerciements également à Greybird et à Ricky81 pour avoir fait vivre cette FAQ durant plusieurs années.
Remerciements à tous les correcteurs qui ont reporté des erreurs de quelque nature que ce soit, ou même soumis des
améliorations, et notamment :
• Erwy
• Louis-Guillaume Morant
• Anomaly

-5-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

• Piotrek
• Bestiol
• Yogui
• LineLe
• Dut
• N1bus
• Auteur
• Baptiste Wicht
• Claude LELOUP

Enfin, un grand merci à Clément Cunin, auteur originel du cadre de cette F.A.Q. et auteur de la F.A.Q. Java.

-6-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Généralités

-7-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Généralités > Le logiciel C++ Builder


Qu'est-ce que Borland C++ Builder ?
Auteurs : Geronimo , Greybird ,
C++Builder est un IDE, un environnement de développement intégré. Il regroupe tout un ensemble d'outils permettant
d'effectuer un maximum de tâches de développement au sein du même environnement de travail.

C++ Builder est de plus un environnement de développement visuel C++ RAD (Rapid Application Development). Il
permet de construire rapidement des applications en utilisant des composants et simplifie au maximum l'écriture du
code et la réalisation de l'interface. On peut ainsi très rapidement se consacrer à la partie "métier" du code (le code
réellement utile de l'application).
C++Builder permet également le développement rapide d'applications base de données, ainsi que des applications-
serveurs web.
C++ Builder permet le développement multi-plateformes (Windows et Linux) au moyen d'une librairie spéciale, la CLX.
Si l'on ne se soucie que de Windows, la VCL, utilisée par défaut, est également disponible.
La documentation en-ligne est en français.

Vous pouvez aussi consulter le site de Borland.

lien : Site officiel de Borland


lien : C, C++, C++ Builder, quelle est la différence ?

C, C++, C++ Builder, quelle est la différence ?


Auteurs : Geronimo , Greybird ,
Le C et le C++ sont deux langages de programmation proches par leur syntaxe. Le C++ a été construit sur la base du
C. La différence majeure est que le C++ est un langage orienté objet.
C++Builder est un IDE (Environnement de Développement) : il fournit une interface graphique au développement C+
+. Pour se servir de C++Builder, il faut connaître le C++ (ou tout au moins ses bases). Vous trouverez tout un ensemble
de ressources sur la page des cours C/C++.

lien : Les cours C/C++ de developpez.com

Quelle version de C++ Builder choisir ?


Auteurs : Geronimo , Greybird ,
Trois versions sont disponibles :
• La version Personnelle permet de développer des applications personnelles de qualité. Elle comporte beaucoup
moins de fonctionnalités que les versions supérieures mais est vendue à un prix très abordable. Cependant, vous
ne disposerez pas des droits nécessaires à la commercialisation de vos applications.
• La version Professionnelle comporte beaucoup plus de fonctions. Elle permet la commercialisation des
applications. Le prix est beaucoup plus élevé que pour la version standard. A noter qu'une version Enseignants/
Etudiants est disponible pour un dixième du prix normal environ. Cette dernière version est cependant
extrèmement restreinte au niveau des droits d'utilisation et de distribution.
• La version Entreprise est destinée comme son nom l'indique aux entreprises. Dans cet objectif, elle inclut de
nombreux outils performants pour le développement ainsi que de nombreux services pour base de données. La
version d'évaluation est basée sur cette version.

-8-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Les prix ne sont pas mentionnés ici car ils peuvent changer ; pour plus d'informations, consultez le site de Borland.

lien : Site officiel de Borland


lien : Quelle est la différence entre les versions Professionnelle et Professionnelle Etudiants/Enseignants ?

Quelle est la différence entre les versions Professionnelle et Professionnelle Etudiants/Enseignants ?


Auteurs : Geronimo , Greybird ,
Borland propose une version Professionnelle Etudiant/Enseignants de son produit C++Builder. Cette version est
exactement la même que la version Professionnelle, ormis l'absence de documentation manuscrite, ce qui n'est pas un
gros désavantage, la documentation "en ligne" étant une source d'informations sans égal.
Cette version Etudiants est proposée à un prix très avantageux par rapport à la version professionnelle (environ un
dixième du prix)

Cependant, il est important de noter que, possesseur d'une version destinée aux étudiants et enseignants, vous ne pouvez
absolument pas distribuer vos applications, et vous ne pouvez utiliser les applications produites que dans un contexte
pédagogique (apprentissage ou enseignement).

Peut-on faire cohabiter C++ Builder 5 et C++ Builder 6 ?


Auteurs : Geronimo ,
Il est tout à fait possible de faire cohabiter Borland C++Builder 5 et Borland C++Builder 6 sur un même ordinateur.
Cependant, deux précautions s'imposent :
• Installer ces deux versions dans deux répertoires différents
• Installer d'abord C++Builder 5 et ensuite C++Builder 6

Quels outils peuvent-être utilisés avec C++ Builder ?


Auteurs : Geronimo ,
Le lien ci-dessous vous présente un certain nombre d'outils utiles avec C++ Builder.

lien : Les outils utiles pour le développement avec C++ Builder

-9-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Généralités > Apprentissage de C++ Builder


Quelles sont les bases à avoir pout se servir de C++ Builder ?
Auteurs : Geronimo ,
La réponse est : tout dépend de ce que vous voulez en faire !
Si vous désirez réaliser de petites applications simples (convertisseur euro/franc, éditeur de textes basique), il n'est pas
nécessaire d'avoir de grandes connaissances en C++. Cependant, dès que vous souhaiterez faire des applications de plus
grande envergure, vous devrez en savoir plus sur les pointeurs, l'héritage, l'encapsulation...

Certaines personnes affirment que pour faire de petits programmes, les bases du C++ ne sont même pas nécessaires.
Ce n'est cependant certainement pas à conseiller. Même pour réaliser un petit programme, il faut avoir un minimum
de rigueur !

lien : C, C++, C++ Builder, quelle est la différence ?

Comment apprendre à se servir de C++ Builder ?


Auteurs : Geronimo ,
Vous pouvez :
• Faire les tutoriels de l'aide : menu Aide/Aide C++Builder et dans le Sommaire de l'aide, cliquer sur Prise en main :
Tutoriels

Regarder les cours

Regarder les Conseils & Exemples
• Parcourir également l'index de la section C/C++ sur le site www.developpez.com. Vous y trouverez des articles
intéressants.

lien : La section C/C++ de developpez.com


lien : Les cours C/C++
lien : Conseils & Exemples pour C++ Builder
lien : Comment apprendre à se servir de C++ Builder ?
lien : Connaissez-vous un tutoriel pour débuter avec C++ Builder ?

Connaissez-vous un tutoriel pour débuter avec C++ Builder ?


Auteurs : Geronimo ,
Le lien ci-dessous vous permettra de découvrir les bases de C++ Builder

lien : Le débutant face à C++Builder

Comment rechercher de l'aide dans C++ Builder ?


Auteurs : Greybird ,
Ce sujet a pour but d'indiquer quelques techniques efficaces pour obtenir de l'aide dans C++ Builder, avant d'interroger
le forum et internet en général...
• A l'intérieur de l'IDE C++ Builder

Il existe des mécanismes d'aide automatiques, tout comme des mécanismes d'aide manuels au sein de l'IDE :

- 10 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

• Aide automatique

Via le menu Outils | Options de l'éditeur..., onglet Audit de Code, vous pouvez configurer les fonctionnalités d'aide
automatique.
Les fonctionnalités suivantes sont disponibles :
• Achèvement du code : Cette fonctionnalité permet de vous proposer, lorsque vous écrivez un . ou un -> après le
nom d'un type connu, de vous proposer la liste des méthodes et propriétés disponibles.
• Paramètres du code : Cette fonctionnalité permet de vous proposer, lorsque vous êtes en train d'écrire les
paramètres d'appel à une méthode ou fonction, la liste des paramètres attendus.
• Evaluation d'expression dans conseil : Cette fonctionnalité permet d'évaluer les valeurs des expressions que vous
survolez avec la souris lorsque le compilateur est sur un point d'arrêt. Il s'agit donc plus d'une fonctionnalité de
déboguage
• Audit de symbole dans conseil : Cette fonctionnalité permet de vous indiquer, lorsque vous survolez un type, des
informations sur sa déclaration

Notez que la dernière fonctionnalité peut ralentir fortemment l'IDE. Auquel cas, vous pouvez choisir de la désactiver
(voir le lien en fin de question). De même, vous pouvez choisir de désactiver les deux premières fonctionnalités, pour
les utiliser en manuel, comme expliqué ci-dessous.
Aide manuelle
• Les fonctionnalités automatiques d'achèvement du code et de paramètres du code sont accessibles manuellement,
via la combinaison de touches Ctrl + Espace.
• Lorsque le curseur texte est sur un mot-clé, ou qu'un mot-clé est sélectionné, l'appui sur la touche F1 lance l'aide
sur l'article correspondant, si il est disponible.
• Dans l'Inspecteur de propriétés, l'appui sur la touche F1 lance l'aide sur le composant et la propriété actuellement
sélectionnés.

En dehors de l'IDE C++ Builder


Il existe notamment deux moyens d'obtenir de l'aide en dehors de l'IDE :
• Les fichiers d'aide : dans le Menu Démarrer, dans le répertoire où se trouvent les raccourcis pour C++ Builder,
vous trouverez un dossier Aide, qui contient des liens vers les fichiers d'aide installés avec C++ Builder.
• Les exemples de code : dans le répertoire d'installation de C++ Builder, vous trouverez un répertoire Examples,
qui contient tout un ensemble de projets de démonstration.

lien : Pourquoi C++ Builder se fige-t-il lorsque l'on passe la souris sur le code ?

Comment rechercher de l'aide sur les API Windows ?


Auteurs : Pierre Castelain , Nono40 ,
Il existe deux sources principales d'information sur les fonctions de l'API Windows :
La première est le fichier d'aide Win32 fourni avec toutes les versions de C++ Builder. Celui-ci est accessible directement
depuis le menu Aide de C++ Builder dans certaines versions. Il est toujours accessible depuis le menu Démarrer dans
la rubrique Aide de C++ Builder. Cependant ce fichier correspond à une version ancienne de l'aide de Microsoft et
n'inclut que les systèmes Windows 95, Windows NT4 et Win32s.
La deuxième source d'information, beaucoup plus complète, est le site Microsoft Developer's Network ou MSDN. Vous
trouverez sur ce site toutes les documentations de toutes les API Windows. Ce site est accessible via le lien donné plus bas.
Si vous cherchez de l'aide sur une fonction ou un message d'une API Windows, vous pouvez vous diriger directement
vers la page de recherche.
Il est aussi possible de télécharger le SDK entier de Microsoft à l'adresse donnée ci-dessous.

lien : MSDN
lien : Page de recherche MSDN

- 11 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

lien : Page de téléchargement du Platform SDK

- 12 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Généralités > Comparaison avec d'autres langages/IDE


Que dois-je choisir entre C++ Builder et Delphi ?
Auteurs : Geronimo ,
Tout d'abord, il faut dire qu'il y a beaucoup d'avantages en faveur de Delphi : temps de compilation plus courts,
simplicité du langage, communauté très active sur Internet...
Cependant, le C++ est un langage connu dans le monde de l'entreprise comme un langage très sûr ; de plus, c'est un
langage très répandu : si beaucoup de personnes programment avec Borland Delphi, il y a énormément de monde qui
programme en C++ (pas forcémment avec Borland C++Builder), surtout sous Linux (écrit en C++)...
De plus, le nombre de développeurs C++ augmente très fortement chaque année. Contrairement à ce qu'on peut voir
parfois, le C++ n'est pas un langage en train de disparaître au profit de Java. Le choix d'un langage dépend de beaucoup
de facteurs et de préférences personnelles. Si vous aimez les langages très structurés, très typés, le C++ est un langage
que vous apprécierez.

Delphi et C++ Builder sont très proches, et vous pouvez passer de l'un à l'autre avec une certain aisance. Vous devez
donc décider en fonction de votre préférence de langage.

Que dois-je choisir entre C++ Builder et Visual C++ ?


Auteurs : Geronimo , Greybird ,
C++ Builder et Visual C++ ne sont pas précisemment équivalents. C++ Builder est un environnement RAD, tandis que
Visual C++ ne l'est pas.
La documentation de Visual C++ n'est, de plus, pas disponible en français, ce qui peut poser problème si vous ne
maitrisez pas parfaitement la langue de Shakespeare.

Pour plus d'informations, vous pouvez consulter le comparatif donné en lien ci-dessous.

lien : Comparatif C++ Builder / Visual C++


lien : Qu'est-ce que Borland C++ Builder ?

- 13 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Concepts


Qu'est ce qu'un évènement ?
Auteurs : Geronimo ,
Un évènement se produit lorsqu'une action est effectuée, que ce soit par l'utilisateur, ou par un composant. Avec C
++Builder, on peut écrire des gestionnaires d'évènements, qui sont des méthodes appellées lorsqu'un évènement est
déclenché.

Qu'est ce qu'une application "Service" ?


Auteurs : Geronimo ,
Une application service est une application qui tourne en arrière-plan et qui ne nécessite en général pas beaucoup
d'interaction avec l'utilisateur. Un service reçoit des demandes provenant de clients (requêtes) et renvoie des
informations en fonction de ces requêtes. Par exemple, un serveur FTP est un service. Il reçoit des requêtes de clients
(uploads, downloads, listage des fichiers) et traite ces demandes.

Qu'est ce qu'un HANDLE ?


Auteurs : Atlantis ,
Un Handle est un nombre entier généré par Windows permettant d'identifier de manière unique chaque objet créé
par le système d'exploitation. Le Handle est attribué automatiquement par Windows et vous ne pouvez pas le définir
vous même.
Les Handles sont souvent utilisés par les fonctions de l'API de Windows.
Suivant les fonctions de l'API la déclaration d'un Handle n'est pas toujours la même :

// pour une fenêtre


HWND Handle;
// pour un contexte de périphérique
HDC Handle;
// pour un bitmap
HBITMAP Handle;
// pour une icône
HICON Handle;
// et si vous ne savez pas quel type utiliser :
THandle Handle;

Pour tous les contrôles fenêtrés ( descendants de TWinControl ) la propriété Handle du composant donne le Handle
de fenêtre Windows sous-jacent au composant.

- 14 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Langage


Faut-il apprendre le C avant le C++ ?
Auteurs : Geronimo ,
C'est une question beaucoup débattue. Voici ce que dit Bjarne Stroustrup, le créateur du C++, dans son livre Le Langage
C++ :

"La connaissance du C n'est pas un préalable à l'apprentissage du C++. La programmation en C encourage de


nombreuses techniques et astuces qui deviennent inutiles en C++, du fait des caractéristiques du langage.
[...]
Mieux vous connaîtrez le langage C, plus il vous semblera difficile d'éviter de faire du C++ dans un style emprunté au
C ; si vous tombez dans le piège, vous perdrez au passage les avantages que le C++ aurait pu vous apporter."

lien : Acheter le livre de Bjarne Stroustrup

A quoi sert l'opérateur "?:" ? Comment s'en servir ?


Auteurs : Geronimo ,
L'opérateur ? : retourne une valeur en fonction d'une condition. Il se présente selon la structure suivante :
condition?expression1: expression2 où expression1 est retourné si condition est vraie et expression2 si condition s'avère
être fausse. Cette syntaxe concise est très pratique, et permet d'éviter des blocs conditionnels if lourds :

int c;
//...
if (a < b)
c += a;
else
c += b;

Ce code peut être remplacé par le suivant :

int c;
c += a < b ? a : b;

On voit qu'on évite des lignes de code inutiles et que la lisibilité n'en est pas amoindrie, à condition toutefois de réserver
cette syntaxe aux tests simples. Il peut en effet devenir fastidieux de lire un code construit uniquement autour de cet
opérateur (surtout si plusieurs de ceux-ci sont imbriqués). A utiliser à bon escient donc...

Qu'est ce que NULL ?


Auteurs : Geronimo , Greybird ,
NULL est une rémanence du C. NULL est une macro (souvent #define NULL (void*)0 ou #define NULL 0) utilisée pour
le pointeur 0 (pointeur qui ne fait référence à aucun objet).
Les macros ne permettent pas un contrôle de type efficace, bien au contraire. Bjarne Stroustrup, créateur du C++,
qualifie NULL d'horrible. Utilisez donc 0 en C++ plutôt que NULL. Si vous souhaitez utiliser NULL, il est conseillé
de le définir par :

const int NULL = 0;

- 15 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

A noter que dans C++ Builder, NULL est défini ainsi :

#define NULL 0

La seule différence avec la solution préconisée est que la macro peut-être redéfinie dans le code. Cela générera
néanmoins un avertissement. Vous pouvez donc utiliser NULL dans C++ Builder sans arrière-pensées.

lien : Acheter le livre de Bjarne Stroustrup

Quelle est la différence entre delete et delete[]


Auteurs : Geronimo ,
Si jamais vous avez alloué un tableau de pointeurs avec new[], utilisez alors delete[] pour libérer la mémoire utilisée par
ce tableau. L'utilisation du simple delete ne libérerait pas la mémoire correctement. Dans cet exemple, nous supposons
que nous disposons d'une classe TEtoile. On cherche a créer un tableau de X étoiles.

class TForm1 : public TForm


{
//...
public:
TEtoile **Etoiles;
void ConstruitEtoiles(const int nbetoiles);
void LibereEtoiles();
//...
};

// Fonction à appeler pour construire nbetoiles TEtoile


void ConstruitEtoiles(const int nbetoiles)
{
Etoiles=new Etoile*[nbetoiles];
for (int i=0; i < nbetoiles; i++)
Etoiles[i]=new Etoile;
}

// Fonction à appeler pour supprimer toutes les étoiles


void LibereEtoiles()
{
for (int i=0; i < nbetoiles; i++)
delete Etoiles[i];
delete[] Etoiles;
}

Cet exemple permet de créer un tableau de nbetoiles pointeurs sur des TEtoile. L'instruction Etoiles = new
Etoile*[nbetoiles]; permet de construire le tableau de pointeurs. Il faut ensuite allouer la mémoire nécessaire à chaque
TEtoile, ce que fait la boucle for. La méthode LibereEtoiles fait la démarche inverse : elle libère tous les TEtoile, puis
la mémoire utilisée par le tableau à l'aide de delete[].

Pourquoi la syntaxe TYPE ptr** = new TYPE*[taille*sizeof(TYPE)] est-elle erronée ?


Auteurs : Geronimo ,
L'opérateur new du C++ est beaucoup plus performant que l'instruction malloc du C. Lorsque vous utilisez cette
syntaxe :

- 16 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

TYPE ptr** = new TYPE*[taille*sizeof(TYPE)]; // <-- FAUX

Par exemple,

// Pour constuire dynamiquement un tableau de 100 entiers


int ptr** = new int*[100*sizeof(int)]; // <-- FAUX

vous construisez non pas un tableau de 100 "lignes", mais un tableau de 100 lignes multipliées par la taille d'un entier.
En fait, l'opérateur new connaît la taille des éléments du tableau grâce au type du constructeur :

TYPE ptr** = new TYPE*[taille]; // <-- CORRECT

Ici, c'est le TYPE suivant le new qui détermine la taille des éléments du tableau. La taille détermine le nombre d'éléments
du tableau.
Bien sûr, n'oubliez pas de faire un delete[] pour libérer le tableau ensuite.

lien : Quelle est la différence entre delete et delete[]

Que signifie __fastcall ?


Auteurs : Geronimo ,
Si le nom d'une méthode est précédé de __fastcall, cela signifie que les trois premiers paramètres de la méthode seront
placés dans des registres du processeurs (eax, edx et ecx), si leur taille le permet. Cela permet d'accélérer le traitement
de certaines méthodes. Evitez de l'utiliser pour des méthodes récursives car les registres devraient être vidés à chaque
nouvel appel de la méthode, et donc cette directive perdrait de son intérêt. Selon l'aide, "toutes les méthodes membres
d'une classe fiche doivent utiliser la convention __fastcall."

Quel est l'équivalent du Assigned(OnEvent) de Delphi avec C++Builder ?


Auteurs : Geronimo ,
Avec Delphi, pour tester si un gestionnaire d'évènements est assigné, on peut utiliser la syntaxe suivante :

If (Assigned(OnEvent)) Then
OnEvent(Self);

Avec C++Builder, la syntaxe équivalente est la suivante :

if (Objet->OnEvent != NULL)
Objet->OnEvent();

Comment résoudre l'erreur Windows : "violation d'accès à l'adresse XXXXXXXX"


Auteurs : Geronimo ,
Qui n'a jamais rencontré cette erreur ? Elle signifie que vous tentez d'accéder à de la mémoire sur laquelle vous n'avez
pas de droits.
Le cas classique est la libération de mémoire déjà libérée.

- 17 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

TForm1 *Form = new TForm1(this);


delete Form;
delete Form;

Pour éviter cette erreur, assignez NULL à vos pointeurs dès leur déclaration, et après chaque delete. Ainsi, il n'y aura
aucun risque, car delete NULL ne fait rien.
Cette erreur peut aussi arriver si un new échoue. Là encore, l'affectation de NULL résout le problème.

TForm1 *Form = NULL;


Form = new TForm1(this);
// Si l'allocation avec new échoue, il n'y aura aucun problème
delete Form;

Enfin, cette erreur peut arriver si vous essayez d'accéder à une zone mémoire non allouée. Le cas typique est celui de
la déclaration du pointeur sans new :

TEdit *Edit;
Edit->Parent = this; // Erreur : aucun appel à l'opérateur new n'a été fait !

On voit ici que l'attribution de NULL aux pointeurs permet de limiter les risques, mais cela ne doit pas être une solution
à vos problèmes : il faut chercher pourquoi le pointeur est déréférencé plusieurs fois et l'éviter le plus possible, il faut
chercher pourquoi la création d'un objet échoue, et enfin, il faut veiller à bien allouer la mémoire nécessaire avant
d'utiliser un objet.

- 18 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Langage > Types de données


Quand et comment utiliser les énumérations ?
Auteurs : Geronimo ,
Si vous écrivez une méthode qui compare une valeur avec différentes constantes, évitez de comparer directement avec
des constantes littérales, mais utilisez des énumérations.

void GestionErreur(int error)


{
switch(error)
{
case 0: cerr << "Erreur de syntaxe\n";
break;
case 1: cerr << "Erreur : tentative de division par zéro\n";
break;
case 2: cerr << "Erreur fatale. Le programme se termine.\n";
exit(1);
break;
default:cerr << "Erreur inconnue."
break;
}
}

Dans cet exemple, la variable entière error est directement comparée à des constantes : 0, 1, 2... Définissez plutôt des
constantes à l'aide d'une énumération, ce qui permet de bien visualiser à quoi correspondent ces constantes, et d'être
sûr de ne pas intervertir les traitements dépendant de celles-ci :

enum Erreur {SYNTAX_ERROR, DIVISION_0_ERROR, FATAL_ERROR};


//...
void GestionErreur(Erreur error)
{
switch(error)
{
case SYNTAX_ERROR: cerr << "Erreur de syntaxe\n";
break;

case DIVISION_0_ERROR:cerr << "Erreur : tentative de division par zéro\n";


break;

case FATAL_ERROR: cerr << "Erreur fatale. Le programme se termine.\n";


exit(1);
break;

default: cerr << "Erreur inconnue."


break;
}
}

En voyant ce code, vous n'avez pas besoin de vous demander à quelle erreur correspond telle constante puisque vous
n'avez pas à connaître les valeurs des constantes (théoriquement, on a SYNTAX_ERROR = 0, DIVISION_0_ERROR =
1 et FATAL_ERROR = 2). Si vous souhaitiez définir les valeurs des constantes, initialisez-les dans l'énumération :

enum Erreur {SYNTAX_ERROR = 11 ,


DIVISION_0_ERROR = 12,
FATAL_ERROR = 13};

La méthode de gestion des erreurs étant écrite, pour l'appeller, il suffit de passer l'une des constantes en argument :

- 19 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

//...
int a, b;
cout << "Entrez deux nombres :\n";
cin >> a >> b;

if (b)// Le diviseur n'est pas nul


cout << double(a)/double(b);
else // Le diviseur est nul
GestionErreur(DIVISION_0_ERROR);
//...

- 20 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Langage > Types de données > Nombres


Comment convertir un entier (int) en chaîne (AnsiString) ?
Auteurs : Geronimo ,
Pour convertir un entier en chaîne, utilisons la fonction IntToStr. Cette fonction convertit un entier en un AnsiString.

AnsiString Chaine;
int i = 10;
Chaine = IntToStr(i); // Chaine = "10"

Comment changer le caractère décimal par défaut ?


Auteurs : Nono40 ,
En fonction des ordinateurs et de la configuration des options régionales, le caractère décimal par défaut n'est pas
toujours le même. Si votre application est sensible à ce caractère, il est conseillé de le fixer à l'initialisation de
l'application. Par exemple dans le constructeur de la fiche principale :

__fastcall TForm1::TForm1(TComponent* Owner)


: TForm(Owner)
{
DecimalSeparator = ".";
}

Ainsi le caractère sera toujours le même. Il faut aussi penser à gérer la saisie de ce caractère dans les TEdit ou autres
zones de saisie devant contenir des nombres réels :

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)


{
if (Key == '.' || Key == ',')
{
Key = DecimalSeparator;
}
}

Comment utiliser des grands nombres ?


Auteurs : Geronimo ,
En C++, les types standards ne peuvent pas représenter de très grands nombres. Cela dépend bien sûr de
l'implémentation. Par exemple, avec C++Builder, un entier peut être utilisé pour un nombre de 20 chiffres grand
maximum (au moyen du type __int64. Consultant l'aide, on pourrait souhaiter utiliser le type double qui permet
d'utiliser des nombres de 5.0 x 10^-324 à 1.7 x 10^308. Mais les calculs se font alors de manière approchée, ce qui n'est
pas du tout souhaitable.
La solution est d'utiliser des librairies qui se chargent de représenter de très grands entiers. Il y en a plusieurs dont
GMP, ou la librairie NTL . La librairie NTL s'est compilée sans aucun problème sous Windows avec C++Builder, ce
qui n'a pas été le cas de la première. De plus, cette librairie dispose de multiples fonctions très utiles en cryptographie.
Vous pouvez également créer votre propre librairie. Le principe est donc de créer un type de grands entiers, soit une
classe, cette classe contenant toutes les opérations ; donc vous devrez définir les opérateurs de base tels +, -, /, *, % sans
oublier quelques fonctions très utiles telles la fonction puissance, la fonction factorielle... Pour représenter l'entier dans
cette classe, vous devrez utiliser un tableau.

- 21 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Pour plus d'informations, consultez les liens ci-dessous.

lien : GMP
lien : NTL
lien : MIRACL
lien : MPFR
lien : HaypoCalc

Comment obtenir un entier à partir d'un réel ?


Auteurs : Nono40 , Ricky81 ,
Pour extraire un nombre entier à partir d'un réel, vous pouvez faire appel à l'une des fonctions classiques C/C++ ou
alors aux suivantes (nécessite d'inclure Math.hpp) :

int Ceil(long double X);

Ceil arrondit à l'entier supérieur :


Ceil(1.2) donne 2
Ceil(1.9) donne 2
Ceil(-1.5) donne -1

int Floor(long double X);

Floor arrondit à l'entier inférieur :


Floor(1.2) donne 1
Floor(1.9) donne 1
Floor(-1.5) donne -2

double RoundTo(const double Avalue, signed char ADigit);

RoundTo(f, 0) arrondit à l'entier le plus proche. Dans le cas où la valeur est juste entre deux entiers, c'est l'entier pair
qui est choisi.
RoundTo(1.2, 0) donne 1
RoundTo(1.9, 0) donne 2
RoundTo(1.5, 0) donne 2
RoundTo(2.5, 0) donne 2
RoundTo(2.500001, 0) donne 3
RoundTo(-1.4, 0) donne -1
RoundTo(-1.5, 0) donne -2

double SimpleRoundTo(double Avalue, signed char ADigit);

SimpleRoundTo(f, 0) arrondit à l'entier le plus proche. Dans le cas où la valeur est juste entre deux entiers, c'est l'entier
supérieur qui est choisi.
SimpleRoundTo(1.2, 0) donne 1
SimpleRoundTo(1.9, 0) donne 2
SimpleRoundTo(1.5, 0) donne 2

- 22 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

SimpleRoundTo(2.5, 0) donne 3
SimpleRoundTo(-1.4, 0) donne -1
SimpleRoundTo(-1.5, 0) donne -1

Pour imiter la fonction Trunc() en Pascal, on pourra faire un simple cast vers un entier :

int i = (int) 2.9; // i vaut 2

lien : Comment arrondir un réel ?


lien : Comment formater l'affichage d'un réel ?

Comment formater l'affichage d'un réel ?


Auteurs : Ricky81 , Nono40 ,
Pour transformer un réel en chaîne sans formatage particulier il suffit d'utiliser la fonction FloatToStr() :

AnsiString FloatToStr(long double Value);

Mais dans la plupart des cas, il est utile de formater le nombre de décimales. Pour ce faire il y a différentes fonctions
proposées par C++ Builder : FloatToStrF(), FormatFloat() ou Format().

Par exemple pour afficher une valeur avec deux chiffres après la virgule :

float f = 12345.6789;
ShowMessage(FloatToStrF(f, ffFixed, 8, 2));
ShowMessage(FormatFloat("0.00", f));
ShowMessage(Format("%8.2f", ARRAYOFCONST((f))));

N'hésitez pas à consulter l'aide pour une utilisation avancée de ces fonctions.

lien : Comment arrondir un réel ?


lien : Comment obtenir un entier à partir d'un réel ?

Comment arrondir un réel ?


Auteurs : Ricky81 ,
Pour arrondir un réel, vous pouvez utiliser les fonctions SimpleRoundTo() et RoundTo() de l'unité Math (nécessite
d'inclure Math.hpp). La différence se situe au niveau de l'arrondi pour les valeurs se situant à distance égale de 2
nombres : dans ce cas SimpleRoundTo() arrondit vers la valeur supérieure alors que RoundTo() vers la valeur finissant
par un chiffre pair.

Exemple :

ShowMessage(SimpleRoundTo(3.1415, -2)); // affiche 3.14


ShowMessage(RoundTo(3.1415, -2)); // affiche 3.14

ShowMessage(SimpleRoundTo(250, 2)); // affiche 300

- 23 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

ShowMessage(RoundTo(250, 2)); // affiche 200

Comment obtenir la valeur décimale d'un entier à partir d'une représentation hexadécimale ?
Auteurs : Ricky81 , Bloon ,
La fonction suivante propose un tel traitement en utilisant tout simplement la fonction StrToInt :

int __fastcall HexToInt(AnsiString Value)


{
if (Value.AnsiPos("$") == 0)
{
// on ajoute $ en tête de chaîne
Value = "$" + Value;
}

return StrToInt(Value);
}

Exemples d'utilisation :

ShowMessage(HexToInt("12")); // affiche 18
ShowMessage(HexToInt("F1")); // affiche 241
ShowMessage(HexToInt("$FF")); // affiche 255

Comment afficher un nombre / hexadecimal en "chaîne de bits"


Auteurs : henderson , cryptonyx ,
Une première méthode :

//---------------------------------------------------------------------------
// IntToBinStr
// Number : entier ou hexadecimal non signé
// Digits : nombre de quartets affichés
//---------------------------------------------------------------------------
AnsiString IntToBinStr(unsigned int Number, int Digits)
{
int i;
AnsiString KeyString;
char *BitSTring[] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};

if(Digits > 4 || Digits < 1)


return ""; // par exemple

for(i = Digits; i > 0 ; i--)


KeyString += BitSTring[(Number >> (4 * (i - 1))) & 0x0F];

return KeyString;
}

Une seconde méthode :

AnsiString IntToBitStr(UINT I, int nBits)

- 24 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

{
AnsiString N="";
if(nBits > 32) nBits = 32;
for(int j = 0; j < nBits; j++)
{
N = "0" + N; //remplissage par le début de la chaîne
N[1] = (char)(N[1] + (I & 1)); // on évite un if
I = I / 2; // prêt pour le bit suivant
}
return N;
}

Exemples de résultats :
• 19 -> 0001011
• 0x13 -> 0001011

- 25 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Langage > Types de données > Chaînes de caractères


Comment insérer des guillemets dans une chaîne ?
Auteurs : Geronimo ,
Il faut utiliser le caractère d'échappement \ qui permet de signaler au compilateur que le caractère suivant est un
caractère spécial :

AnsiString chaine = "Hello \"world\""; // La chaîne contient Hello "world"

Comment faire pour convertir une chaîne en majuscules ?


Auteurs : Geronimo ,
Pour convertir une chaîne AnsiString en majuscules, utilisez la méthode UpperCase.

AnsiString Chaine;
Chaine = "coucou";
Chaine = Chaine.UpperCase(); // = "COUCOU"
ShowMessage(Chaine);

Comment faire pour convertir une chaîne en minuscules ?


Auteurs : Geronimo ,
Afin de convertir une chaîne AnsiString en minuscules, utilisez la méthode LowerCase.

AnsiString Chaine;
Chaine = "COUCOU";
Chaine = Chaine.LowerCase(); // = "coucou"
ShowMessage(chaîne);

Comment convertir une chaîne AnsiString en une chaîne C, tableau de caractères à zéro terminal ?
Auteurs : Geronimo , Greybird ,
Certaines fonctions requièrent l'usage des chaînes C standards (tableaux de caractères à zéro terminal).
La classe AnsiString fournit un grand nombre de méthodes dont la méthode c_str qui permet de convertir une AnsiString
en une chaîne C (C string).

AnsiString Src;
AnsiString Dest;
//...
// Ce code va générer une erreur
CopyFile(Src, Dst, true);

Le code ci-dessus va générer une erreur "Impossible de convertir AnsiString en const char *" car la fonction CopyFile
demande pour arguments des chaînes C. Pour résoudre ce problème, il convient d'utiliser la méthode c_str :

- 26 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

AnsiString Src;
AnsiString Dest;
//...
// Ce code ne génerera aucune erreur
CopyFile(Src.c_str(), Dst.c_str(), true);

Attention ! La méthode c_str retourne un pointeur sur une chaîne C, qui n'est valable que pour l'instruction suivant
l'appel à c_str. En d'autres termes, vous ne pouvez pas faire ceci :

AnsiString Src = "Source.txt";


AnsiString Dest = "Destination.txt";
char * pSrc = Src.c_str();
char * pDest = Dest.c_str();
// instructions
CopyFile(pSrc,pDest,true);

En effet, au moment où CopyFile est exécutée, pSrc et pDest pointent sur un emplacement mémoire dont le contenu
est indéfini. Il se peut très bien que la mémoire ait été écrasée entre les instructions c_str et l'appel à CopyFile. Ce ne
sera pas toujours le cas, et le programme peut très bien fonctionner parfaitement pendant très longtemps, et planter
de façon aléatoire...
Pour résoudre ce problème, il faut utiliser la fonction strcpy :

AnsiString Src = "Source.txt";


AnsiString Dest = "Destination.txt";
char * pSrc = new char[Src.Length()+1]; // +1 pour le 0 terminal
char * pDest = new char[Dest.Length()+1];
strcpy(pSrc,Src.c_str());
strcpy(pDest,Dest.c_str());
// instructions
CopyFile(pSrc,pDest,true);
delete[] pSrc;
delete[] pDest;

Comment transformer une chaîne DOS en chaîne Windows ?


Auteurs : Nono40 , Ricky81 , Delphiprog ,
Windows fournit une fonction permettant de convertir une chaîne contenant des caractères DOS en chaîne contenant
leur équivalent en caractères Windows.

AnsiString __fastcall DosStrToWinStr(const AnsiString StrDos)


{
AnsiString Res;
Res.SetLength(StrDos.Length());
OemToCharBuff(StrDos.c_str(), Res.c_str(), StrDos.Length());
return Res;
}

Pour utiliser les caractères étendus, il faut adapter la fonction aux chaînes WideString :

WideString __fastcall DosStrToWinStr(const AnsiString StrDos)


{
WideString Res;
Res.SetLength(StrDos.Length());
OemToCharBuffW(StrDos.c_str(), Res.c_bstr(), StrDos.Length());

- 27 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

return Res;
}

Prenons l'exemple du caractère DOS 129 "ü" qui correspond donc à la valeur 0x9a :

char a = 0x9a;
ShowMessage(a); // n'affiche pas "ü"
// les deux sorties suivantes affichent bien "ü"
ShowMessage(DosStrToWinStr(a));
ShowMessage(DosStrToWideWinStr(a));

lien : MSDN

Comment convertir une chaîne (AnsiString) en entier (int) ?


Auteurs : Geronimo , Greybird ,
La fonction StrToInt permet de convertir une chaîne en un entier. Il faut cependant faire attention, car la chaîne peut
ne pas être convertible en entier : "Hello" ne pourra pas être convertie en entier. Une exception est déclenchée quand
ce cas de figure se produit. Il faut donc rattraper cette exception pour la gérer.
Dans cet exemple, nous convertissons une valeur entrée par l'utilisateur dans une zone d'édition. Placez sur votre fiche
un TEdit et un TButton. Voici le code de l'évènement OnClick du bouton :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
int i;
try
{
i = StrToInt(Edit1->Text);
}
catch(EConvertError &Exception)
{
ShowMessage("Veuillez entrer un entier relatif correct");
}
// Utilisation de i...
}

Si jamais le contenu de la zone d'édition n'est pas convertible en entier, un message prévient l'utilisateur qu'il doit
rentrer un entier correct.

A noter qu'il existe une fonction ne générant pas d'exception, mais retournant une valeur par défaut si la conversion
n'est pas possible : IntToStrDef. Cette fonction peut-être utile pour certains cas de figure.

Comment charger le contenu d'un fichier texte ?


Auteurs : Geronimo ,
Pour cela, on peut facilement utiliser la méthode de chargement LoadFromFile proposée par TStringList :

TStringList *Liste = new TStringList;


Liste->LoadFromFile("fichier.txt");
// traitements
delete Liste;

- 28 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Le fichier est chargé en mémoire dans l'objet de type TStringList et est accessible dans son intégralité via la propriété
Text mais également ligne par ligne via la propriété Strings.
Les modifications après lecture ne se font qu'en mémoire, elles ne sont pas automatiquement répercutées sur le fichier.

Comment obtenir la représentation hexadécimale d'une AnsiString ?


Auteurs : Greybird ,
La fonction suivante permettra, à partir d'une AnsiString, d'obtenir sa représentation hexadécimale, dans une
AnsiString.

AnsiString ASCII2HEX(AnsiString ASCII)


{
AnsiString HEX = "";
try
{
int nbchar = ASCII.Length();
for (int i = 1 ; i <= nbchar ; i++)
{
unsigned char c = ASCII[i];
HEX = HEX + IntToHex(c,2);
}
}
catch (EConvertError &e)
{
HEX = "";
}
return HEX;
}

Vous pourrez ensuite l'utiliser de la façon suivante :

AnsiString HEX = ASCII2HEX("www.developpez.com");

HEX contiendra alors "7777772E646576656C6F7070657A2E636F6D".

lien : Comment obtenir une AnsiString à partir de sa représentation hexadécimale ?

Comment obtenir une AnsiString à partir de sa représentation hexadécimale ?


Auteurs : Greybird ,
La fonction suivante permettra, à partir d'une AnsiString contenant la représentation hexadécimale d'une chaîne
ASCII, d'obtenir cette dernière.
La chaîne ne devra contenir que des caractères valides en hexadécimal (0-9, A-F, a-f).

AnsiString HEX2ASCII(AnsiString HEX)


{
int nbchar = HEX.Length() / 2;
AnsiString ASCII = AnsiString::StringOfChar(' ',nbchar);
AnsiString ASCII = AnsiString::StringOfChar(' ',HEX.Length() / 2);
try
{
for (int i = 1 ; i <= nbchar ; i++)
{

- 29 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

AnsiString sHex = HEX.SubString(2*i-1,2);


unsigned char c = StrToInt("0x" + sHex);
ASCII[i] = c;
}
}
catch (EConvertError &e)
{
ASCII= "";
}
return ASCII;
}

Vous pourrez ensuite l'utiliser de la façon suivante :

AnsiString ASCII = HEX2ASCII("7777772E646576656C6F7070657A2E636F6D");

ASCII contiendra alors "www.developpez.com".

lien : Comment obtenir la représentation hexadécimale d'une AnsiString ?

Comment connaître la longueur d'une chaîne de caractères ?


Auteurs : Ricky81 ,
Vous pouvez utiliser la méthode Length qui renvoie le nombre de caractères qui composent une chaîne de type
AnsiString.

Exemple :

AnsiString Value = "Developpez.com";


int longueur = Value.Length(); // longueur vaut 14

lien : Comment accéder à un caractère d'une chaîne en connaissant sa position ?

Comment accéder à un caractère d'une chaîne en connaissant sa position ?


Auteurs : Smortex ,
On peut accéder à chaque caractère d'une chaîne en indiquant entre crochets l'index du caractère que l'on souhaite
récupérer.

Attention :
• le premier caractère possède l'index 1 et non pas 0 !
• il ne faut pas dépasser la longueur de la chaîne sous peine de violation d'accès

Exemple :

AnsiString Value = "Developpez.com";

- 30 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

char c = Value[1]; // c vaut 'D'

lien : Comment connaître la longueur d'une chaîne de caractères ?

Comment déterminer la position d'une occurrence à l'intérieur d'une chaîne ?


Auteurs : Ricky81 ,
Les méthodes Pos et AnsiPos (cette dernière supporte les chaînes de caractères multi-octets) permettent de déterminer la
position d'une occurrence à l'intérieur d'une chaîne de caractères. Elles retournent la position de la première occurrence
si une sous-chaîne est trouvée et 0 sinon.
Il est ensuite facile d'utiliser le résultat pour traiter la sous-chaîne.

Exemple :

AnsiString Value = "Developpez.com";


int i = Value.AnsiPos("."); // i vaut 11

lien : Comment remplacer une occurrence dans une chaîne par une autre valeur ?

Comment remplacer une occurrence dans une chaîne par une autre valeur ?
Auteurs : Ricky81 , Nono40 ,
L'unité StrUtils disponible à partir de la version 6 de C++ Builder propose les fonctions AnsiReplaceStr et
AnsiReplaceText. Pour les utiliser, il vous suffit de faire l'inclusion suivante :

#include <StrUtils.hpp>

La fonction AnsiReplaceStr remplace donc toutes les occurrences d'une sous-chaîne dans une chaîne en tenant compte
de la casse. AnsiReplaceText fait exactement la même chose mais est insensible à la casse.

AnsiString __fastcall AnsiReplaceStr(const AnsiString AText,


const AnsiString AFromText,
const AnsiString AToText);

AnsiString __fastcall AnsiReplaceText(const AnsiString AText,


const AnsiString AFromText,
const AnsiString AToText);

Exemple :

- 31 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

ShowMessage(AnsiReplaceText("Developpez.com", "com", "net"); // affiche "Developpez.net"

lien : Comment déterminer la position d'une occurrence à l'intérieur d'une chaîne ?

Comment faire un switch avec des AnsiString ?


Auteurs : Greybird , Sjrd ,
L'utilisation d'un switch nécessite un type ordinal. Il est donc impossible de faire un switch avec des AnsiString. L'astuce
consiste à utiliser la fonction AnsiIndexStr de l'unité StrUtils. Cette fonction prend trois paramètres :
• la chaîne recherchée
• un pointeur sur le tableau contenant les chaînes représentant les possibilités du switch
• la taille de ce tableau

Le résultat est l'index de la chaîne dans le tableau si elle est trouvée, et -1 dans le cas contraire.

#include <StrUtils.hpp>
...
AnsiString Str = "Chaine3";
AnsiString Values[] = {"Chaine1", "Chaine2", "Chaine3"};
int tabSize = sizeof(Values) / sizeof(AnsiString);
switch(AnsiIndexStr(Str, &Values[0], tabSize))
{
case 0: // "Chaine1"
{
break;
}
case 1: // "Chaine2"
{
break;
}
case 2: // "Chaine3"
{
break;
}
case -1: // une autre chaîne
{
break;
}
}

Si votre version de C++ Builder ne propose pas cette fonction, vous pouvez l'implémenter ainsi :

int AnsiIndexStr(const AnsiString aText, const AnsiString * aTab, const int tabSize)
{
if (aTab == NULL)
{
return -1;
}
for (int i = 0 ; i < tabSize ; i++)
{
if (aTab[i] == aText)
{
return i;
}
}
return -1;
}

- 32 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Langage > Assembleur


Est-il intéressant pour les performances d'écrire des parties de programme en assembleur ?
Auteurs : Geronimo ,
Ecrire des parties de programme en assembleur peut permettre d'optimiser les performances de votre programme, mais
ce n'est pas obligatoirement le cas. Tout d'abord, sachez que la compilation se termine par une phase d'optimisation ;
c'est-à-dire que le compilateur va essayer de transformer au mieux les instructions pour les rendres plus rapides. Pour
cela, il utilise du code assembleur adéquat. Donc quand vous écrivez des parties de programme en assembleur, il faut
être vraiment sûr que votre code sera plus performant que celui créé par le compilateur. Il faut alors que vous maitrisiez
(très) bien l'assembleur. Ainsi, surtout si vous êtes débutant, il n'est pas nécessaire d'essayer de remplacer du code C
++ par de l'assembleur, pensant optimiser votre programme.

Comment écrire des parties d'un programme en assembleur ?


Auteurs : Geronimo ,
Pour des raisons d'optimisation, il peut être intéressant d'écrire des parties d'un programme en assembleur. Cependant,
cela peut être très couteux en temps de développement, pour une optimisation pas forcémment remarquable. Il suffit
de placer son code assembleur à l'intérieur d'un bloc commençant par le mot-clé asm :

asm
{
mov eax, 10; // Place 10 dans eax (eax = 10)
add eax, 10; // Ajoute 10 dans eax (eax = 20)
}

Vous devez également placer la directive #pragma inline au début du fichier contenant de l'assembleur. Ceci indique
à C++Builder qu'il y aura de l'assembleur dans votre source.

lien : L'assembleur avec C++Builder


lien : Le Cavalier Hamiltonien

Pourquoi obtiens-je le message "Redémarrage de la compilation en utilisant l'assembleur" ?


Auteurs : Geronimo ,
La réponse est simple : vous avez oublié de placer la directive

#pragma inline

- 33 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

en tête de l'unité où vous avez placé de l'assembleur. Le compilateur redémarre donc la compilation en activant la
compilation de l'assembleur quand il en rencontre. Lorsque vous placez cette directive, le compilateur est prévenu dès
le début de la présence d'assembleur dans le code et active alors l'assembleur avant de compiler.

Quelle est la différence entre asm, _asm et __asm ?


Auteurs : Geronimo ,
Aucune, les trois mots-clés asm, _asm et __asm permettent d'introduire un bloc d'assembleur dans votre code.

- 34 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Langage > Compilation et édition de liens


Comment créer un exécutable indépendant ?
Auteurs : Geronimo , Neilos ,
Dans C++Builder6
Il suffit pour cela de décocher deux cases. Cliquez sur le menu Projet puis Options.
Dans l'onglet Lieur, décochez : Utiliser la RTL dynamique
Dans l'onglet Paquets, décochez : Construire avec les paquets d'exécution

- 35 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Dans C++Builder2006

- 36 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Comment réduire la taille d'un exécutable ?


Auteurs : Geronimo ,
La taille d'un exécutable dépend de nombreux facteurs. Voici cependant quelques solutions pour réduire la taille d'un
programme :
• Si votre programme contient des images, convertissez-les en jpeg optimisées et compressées le plus possible (à
vous de voir le rapport qualité/taille).
• Vous pouvez réduire la taille de votre programme en n'incorporant pas les librairies. Pour cela, dans Projet |
Options, cochez la case Utiliser la RTL dynamique de l'onglet Lieur et cochez la case Construire avec les paquets
d'exécution de l'onglet Paquets. Attention, votre programme ne fonctionnera plus sur d'autres ordinateurs qui
n'auront pas les paquets requis. Il faudra donc les déployer avec votre application.

- 37 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

• Enfin, vous pouvez essayer d'utiliser les optimisations du compilateur : Projet | Modifier le fichier d'options. Dans
le tag CFLAGS, remplacez le code -Od par -O1.

Par expérience, c'est surtout la première méthode qui se révêle la plus payante. La troisième n'ayant pas d'effet, la
seconde obligeant à déployer les librairies séparemment, ce qui augmente plutôt la taille du fichier distribué.

Quels fichiers peut-on déployer avec une application créée dans C++Builder ?
Auteurs : Geronimo ,
Un fichier a été installé avec Borland C++ Builder dans le répertoire d'installation qui se nomme "deploy.txt". Consultez
ce fichier pour savoir quels fichiers vous pouvez déployer avec quelle version.

Comment résoudre les erreurs de type "paquets d'importation manquant" ?


Auteurs : Ricky81 ,
Il peut arriver, notamment à la compilation, que C++ Builder indique qu'il lui manque certains paquets. Ce
comportement est tout à fait légitime si le code a été créé avec une version plus récente de C++ Builder.
Il peut également arriver que des bibliothèques que vous n'avez pas soient recensées, auquel cas il faudra vérifier si
elles sont réellement utilisées par le projet et le cas échéant les ajouter.

Un bon moyen de rendre le projet compatible avec votre environnement est de suivre une procédure similaire à la
suivante :

• Après avoir extrait le projet en question, supprimez tout ce qui ne concerne que le projet : fichiers *.bpr, *.res,
nomduprojet.cpp. Bref ne conservez que les fichiers relatifs aux unités ou autres éléments composants votre projet.
• Recréez une application sous C++ Builder
• Supprimez la fiche créée automatiquement, en utilisant Projet | Retirer du projet
• Ajoutez la ou les fiches, unités, ... au projet
• Si nécessaire, faites les éventuelles adaptations spécifiquement liées à votre projet

Vous avez ainsi recréé l'application en bénéficiant de la configuration du projet par défaut de C++ Builder.
Si ce projet par défaut est configuré pour recenser les différentes bibliothèques que vous avez, vous ne devriez pas avoir
de mal à tester l'application. Dans le cas contraire il vous faudra ajouter à la main dans les propriétés du projet les
bibliothèques nécessaires voire installer les bibliothèques manquantes.

Attention : vérifiez bien que votre version de C++ Builder (Personnelle, Professionnelle, Entreprise) dispose des
bibliothèques nécessaires au fonctionnement de l'application.

Comment faire pour masquer quelques messages d'avertissement lors de la compilation ?


Auteurs : Dure_Limite ,
Il est parfois utile de masquer un avertissement généré à la compilation.

Exemple
this->Color = 0x00EBD6D6;

- 38 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

génère ce message à la compilation :

[C++ Avertissement] Unit1.cpp(19): W8018 Affectation de int en TColor

Remarque
• Ne pas transtyper en (TColor) pour justement générer ce message.
• Dans : Projet | Options | Compilateur | Avertissement, cocher : Tous

Sélectionner la ligne de message, et appuyer sur F1 pour obtenir de l'aide.


L'aide donne une explication du message et comment l'empêcher de monter.

...
(Option de ligne de commande supprimant cet avertissement : -w-eas)
...

Il nous reste plus qu'à rajouter ces 2 lignes, pour que l'avertissement ne monte plus.

#pragma option push -w-eas


this->Color = 0x00EBD6D6;
#pragma option pop // -w-eas

La dernière ligne ré-autorise le compilateur à générer cet avertissement.

Comment effectuer une compilation en ligne de commande avec le compilateur de C++Builder ?


Auteurs : pottiez , bebeours ,
C++Builder comprend BCC32.EXE, le compilateur en ligne de commande Borland C++.

Syntaxe du compilateur en ligne de commande


La syntaxe pour BCC32 est :
BCC32 [option [option...]] fichier [fichier...]
Où :
Les éléments entre parenthèses sont facultatifs.
option se réfère aux options de la ligne de commande.
filename se réfère aux fichiers de code source que vous voulez compiler.
Pour avoir la liste des options couramment utilisées par le compilateur, tapez BCC32 au niveau de la ligne de commande
(sans option ou non de fichier), puis appuyez sur Entrée. Les options disponibles par défaut sont alors affichées.
Le nom du compilateur en ligne de commande, les options et les noms de fichiers doivent être séparés par au moins un
espace. Chaque option doit être précédée d'un trait d'union hyphen (-) ou d'une barre oblique (/). Par exemple :
BCC32 -Ic:\code\hfiles
Les options et noms de fichiers saisis sur la ligne de commande remplacent ceux initialisés dans les fichiers de
configuration.
Vous pouvez utiliser BCC32 pour envoyer les fichiers .OBJ à ILINK32 ou les fichiers .ASM à TASM32 (si TASM32
est installé sur votre machine).

Paramètres par défaut


BCC32.EXE possède des options par défaut. Pour invalider ces options ou les remplacer dans un fichier de
configuration, faites suivre les options du signe moins (-).

- 39 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Les fichiers avec l'extension .CPP sont compilés comme des fichiers C++. Les fichiers ayant une extension .C, sans
extension, ou différente de .CPP, .OBJ, .LIB, ou .ASM sont compilés comme des fichiers C.
Les compilateurs essayent de lier avec un fichier de définition de module ayant le même nom que l'exécutable.

Le tableau suivant est la liste alphabétique des options du compilateur C++Builder :

Option Description

@<nomfichier> Lit les options du compilateur dans le fichier de réponse nomfichier


+<nomfichier> Utilise le fichier secondaire de configuration du compilateur nomfichier
-3 Génère les instructions compatibles avec le mode protégé du 80386 (Défaut)
-4 Génère les instructions compatibles avec le mode protégé du 80386/80486

-5 Génère les instructions Pentium


-6 Génère les instructions Pentium Pro
-A Utilise les mots clés et les extensions ANSI
-AK Utilise les mots clés et les extensions Kernighan et Ritchie
-AT Utilise les mots clés et les extensions Borland C++ (également -A-)
-AU Utilise les mots clés et les extensions UNIX V
-a Alignement de données par défaut (-a8 )*; -a- utilise l'alignement sur un octet (-a1)

-an Aligne les données sur les frontières n , où 1=octet, 2=mot (2 octets), 4=mot*double (4 octets), 8=mot quadruple (8
octets), 16=paragraphe (16 octets) (Défaut : -a8 )
-B Compile en .ASM (-S), puis appelle l'assembleur pour générer un .OBJ
-b Les enums ont toujours la taille des entiers (Défaut : -b les enums ont la taille d'un entier)
-b- les enums ont la taille d'un octet si possible
-C Active les commentaires imbriqués (Défaut : -C- désactive les commentaires imbriqués)

-CP Active les pages de code (pour le MBCS)


-c Compilation en .OBJ, pas de liaison
-D<nom> Définit "nom" par la chaîne nulle
-D<nom=chaîne> Définit "nom" par la chaîne "chaîne"
-d Fusionne les chaînes dupliquées
-d- Ne fusionne pas les chaînes dupliquées (Défaut)
-E<nomfichier> Spécifie l'assembleur
-e<nomfichier> Spécifie le nom du fichier exécutable

-f Emule la virgule flottante


-f- Pas de virgule flottante
-ff Virgule flottante rapide
-fp Corrige l'erreur FDIV du Pentium
-gb Arrête la compilation par lot après le premier fichier ayant généré des avertissements (désactivé par défaut)
-gn Avertissements : arrêt après n messages (Défaut : 255)
-G, -G- Optimise pour la taille/vitesse ; utilisez à la place ? O1 et ? O2

-H Génère et utilise les en-têtes précompilés


-H- Ne génère pas et n'utilise pas les en-têtes précompilés (Défaut)
-H=<nomfichier> Définit le nom de fichier des en-têtes précompilés.
-H"xxx" Arrête les précompilations après le fichier xxx
-Hc Cache les en-têtes précompilés (s'utilise avec -H ou -H"xxx"
-He Types externes supportés pour les fichiers en-tête précompilés (Défaut)

-Hh=xxx Arrête les précompilations après le fichier xxx

- 40 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

-Hs Met en mémoire cache "intelligente" les fichiers en-tête précompilés (Défaut)
-Hu Utilise les en-têtes précompilés, mais ne les génère pas
-I<chemin> Définit le chemin d'accès aux répertoires des fichiers inclus
-in Définit n comme taille significative des identificateurs (Défaut : 250)
-Ja Développe tous les membres modèle y compris les membres inutilisés

-jb Arrête la compilation par lot après le premier fichier ayant généré des erreurs (désactivé par défaut)
-Jgd Génère des définitions pour toutes les instances de modèles et fusionne les chaînes dupliquées (Défaut)
-Jgx Génère des références externes pour toutes les instances de modèles
-jn Erreurs*: arrêt après n messages (Défaut : 25)
-K Type caractère non signé par défaut (Défaut : -K- = type caractère signé par défaut)

-k Active le cadre de pile standard (Défaut)


-L<chemin> Définit le chemin d'accès aux fichiers bibliothèque
-lx Transmet l'option x au lieur
-l-x Désactive l'option x du lieur
-M Crée un fichier map
-n<chemin> Définit chemin comme répertoire de sortie
-O Optimise les branchements
-O1 Génère le code le plus compact possible

-O2 Génère le code le plus rapide possible


-Oc Elimine les expressions dupliquées dans les blocs de base et les fonctions
-Od Désactive toutes les optimisations
-Oi Développe les fonctions intrinsèques communes
-OS Ordonnancement d'instructions pour le Pentium
-O-S Désactive l'ordonnancement d'instructions
-Og Optimise pour la vitesse ; utilisez à la place ?O2

-Os Optimise pour la vitesse ; utilisez à la place ?O2


-Ot Optimise pour la taille ; utilisez à la place ?O1
-Ov Permet les variables d'induction de boucles et la réduction de puissance
-Ox Optimise pour la vitesse ; utilisez à la place ?O2
-o<nomfichier> Compile nomfichier en .OBJ
-P Effectue une compilation C++ quelle que soit l'extension du fichier source

-P- Effectue une compilation C++ selon l'extension du fichier source


-P<ext> Effectue une compilation C++ avec ext comme extension par défaut
-p Utilise la convention d'appel du Pascal
-p- Utilise la convention d'appel du C
-pc Utilise la convention d'appel du C (Défaut : -pc, -p-)
-pm Fonctions sans convention d'appel explicite pour utiliser __msfastcall

-pr Utilise la convention d'appel fastcall pour transmettre les paramètres aux registres
-ps Utilise la convention d'appel stdcall
-Q Informations d'erreur du compilateur étendues (désactivé par défaut)
-q Supprime la bannière d'identification du compilateur (désactivé par défaut)
-R Inclut les informations du browser dans les fichiers .OBJ générés
-RT Active les informations d'identification des types à l'exécution (Défaut)

-r Utilise les variables registre automatiques (Défaut)


-r- Désactive l'utilisation des variables registre
-rd Utilise les variables registre uniquement quand le mot clé register est employé

- 41 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

-S Compilation en .ASM
-T- Supprime toutes les options précédentes de l'assembleur
-Tx Transmet l'option x à l'assembleur
-tW La cible est une application Windows (identique à -W)

-tWC La cible est une application console (identique à -WC)


-tWD Génère un exécutable .DLL (identique à -WD)
-tWM Génère un fichier exécutable 32 bits multithread (identique à -WM)
-tWR La cible utilise la RTL dynamique (identique à -WR)
-tWV La cible utilise la VCL
-U<nom> Annule toute définition précédente de nom
-u Génère des caractères de soulignement (Défaut)

-V Utilise les tables virtuelles intelligentes de C++ (Défaut)


-V0 Tables virtuelles C++ externes
-V1 Tables virtuelles C++ publiques
-VC Compatibilité aux conventions d'appel
-Vd Portée des variables de boucle for
-Ve Classes de base vides de taille nulle
-VM Compatibilité Microsoft Visual C++
-VI- Utilise l'ancien algorithme de recherche Borland pour localiser les fichiers en-tête (recherche d'abord dans le
répertoire de travail en cours)

-Vl Utilise l'ancien style des structures Borland C++ (pour la compatibilité avec les versions précédentes de BCC32.EXE)
-VF Compatibilité MFC
-Vmd Utilise la plus petite représentation possible des pointeurs sur membres
-Vmm Gère l'héritage multiple pour les pointeurs sur membres
-Vmp Pointeurs sur membres de précision déclarée d'honneur
-Vms Gère l'héritage simple pour les pointeurs sur membres

-Vmv Ne place aucune restriction sur ce que peuvent pointer les pointeurs sur membres (Défaut)
-Vx Fonctions membre de classe vide de taille nulle
-v Active le débogage du source
-vG Toutes les options Codeguard activées
-vGc Accès au pointeur en ligne (Codeguard)
-vGd Accès aux données globales et de la pile (Codeguard)

-vGt pointeur this sur une entrée de fonction membre (Codeguard)


-vi Contrôle le développement des fonctions en ligne
-W La cible est une application Windows (identique à -tW)
-WC La cible est une application console (identique à -tWC)
-WD Génère un exécutable .DLL (identique à -tWD)
-WM Génère une cible 32 bits multithread (identique à -tWM)

-WR La cible utilise la RTL dynamique (identique à -tWR)


-WU Génère une application Unicode
-w Active l'affichage des avertissements
-w! Renvoie un code de retour différent de zéro lorsqu'il existe des avertissements
-wxxx Active le message d'avertissement xxx
-w-xxx Désactive le message d'avertissement xxx
-wmsg Messages définis par l'utilisateur

- 42 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

-X Désactive les informations d'auto-dépendance du compilateur (Défaut : -X- active les informations d'auto-
dépendance du compilateur)
-x Active la gestion d'exception (Défaut)
-xd Autorise le nettoyage des destructeurs (Défaut)
-xdg Utilise le compteur de destructeurs global (pour la compatibilité avec les versions précédentes de BCC32.EXE)
-xf Active les prologues rapides des exceptions
-xp Active les informations sur l'emplacement de l'exception

-xs Active les épilogues lents des exceptions


-xv Fait cacher par le compilateur des variables de gestion d'exceptions spéciales afin que les variables de même nom
soient utilisables.
-y Génère les numéros de ligne pour le débogage

Options des messages (liste alphabétique)

Option Numéro (Alias) Message d'avertissement

-w-ali -w-8086 Utilisation incorrecte de #pragma alias ?nomAlias? = ?nomSubstitution? (Défaut)


-wamb -w8000 Les opérateurs ambigus requièrent des parenthèses (désactivé par défaut)
-wamp -w8001 & superflus avec fonction (désactivé par défaut)
-w-asc -w-8002 Relancer la compilation avec l'assembleur (Défaut)
-wasm -w8003 Instruction assembleur inconnue (désactivé par défaut)
-w-aus -w-8004 La valeur affectée à 'identificateur' n'est jamais utilisée (Défaut)

-wbbf -w8005 Les champs bit doivent être des entiers signés ou non signés (désactivé par défaut)
-w-bei -w-8006 Initialisation de 'identificateur' avec 'identificateur' (Défaut)
-w-big -w-8007 La valeur hexadécimale contient plus de trois chiffres (Défaut)
-w-ccc -w-8008 La condition est toujours vraie OU toujours fausse (Défaut)
-wcln -w8009 La constante est longue (désactivé par défaut)

-w-cod -w-8093 Utilisation incorrecte de #pragma codeseg (Défaut)


-w-com -w-8010 Caractère de continuation \ trouvé dans un commentaire // (Défaut)
-w-cpt -w-8011 Comparaison de pointeur non portable (Défaut)
-w-csu -w-8012 Comparaison de valeurs signées et non signées (Défaut)
-wdef -w8013 Utilisation possible de 'identificateur' avant sa définition (désactivé par défaut)
-w-dig -w-8014 Déclaration ignorée (Défaut)

-w-dpu -w-8015 Déclarez 'type' avant de l'utiliser dans un prototype (Défaut)


-w-dsz -w-8016 Taille de tableau pour ''delete'' ignorée (Défaut)
-w-dup -w-8017 La redéfinition de 'macro' n'est pas identique (Défaut)
-w-eas -w-8018 Affectation de 'type' à 'enum' (Défaut)
-w-eff -w-8019 Le code n'a pas d'effet (Défaut)
-w-ext -w-8020 'identificateur' est déclaré à la fois comme external et static (Défaut)

-w-hch -w-8021 Gestionnaire pour 'type1' caché par gestionnaire précédent pour 'type2' (Défaut)
-w-hid -w-8022 'fonction1' cache la fonction virtuelle 'fonction2' (Défaut)
-w-ias -w-8023 La variable tableau ''identificateur'' est near (Défaut)
-w-ibc -w-8024 La classe de base 'classe1' est aussi la classe de base de 'classe2' (Défaut)
-w-ifr -w-8085 Fonction 'fonction' redéfinie comme non-en ligne (Défaut)

-w-ill -w-8025 Pragma mal formulé (Défaut)


-w-inl -w-8026 Les fonctions ne sont pas développées en ligne (Défaut)
-w-inl -w-8027 Les fonctions contenant des mots réservés ne sont pas développées en ligne (Défaut)

- 43 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

-w-lin -w-8028 Temporaire utilisé pour initialiser 'identificateur' (Défaut)


-w-lvc -w-8029 Temporaire utilisé pour le paramètre 'param' (Défaut)
-w-lvc -w-8030 Temporaire utilisé pour le paramètre 'param' dans l'appel à 'fonction' (Défaut)

-w-lvc -w-8031 Temporaire utilisé pour le paramètre nombre (Défaut)


-w-lvc -w-8032 Temporaire utilisé pour le paramètre nombre dans l'appel à 'fonction' (Défaut)
-w-mcs -w-8096 Utilisation incorrecte de #pragma code_seg (Défaut)
-w-mes -w-8095 Utilisation incorrecte de #pragma message (Défaut)
-w-mpc -w-8033 La conversion en 'type' va échouer pour les membres de la base virtuelle 'base' (Défaut)

-w-mpd -w-8034 Précision maximum utilisée pour le type pointeur membre 'type' (Défaut)
-w-msg -w-8035 Avertissements définis par l'utilisateur (Défaut)
-wnak -w8036 Non-ANSI utilisé : 'motclé' (désactivé par défaut) (Remarque : l'utilisation de cette option est nécessaire
pour se conformer à la norme ANSI)
-w-ncf -w-8037 Fonction non const 'fonction' appelée pour un objet const (Défaut)

-w-nci -w-8038 Le membre constante 'identificateur' n'est pas initialisé (Défaut)


-w-ncl -w-8039 Liste d'initialiseur de constructeur ignorée (Défaut)
-w-nfd -w-8040 Corps de fonction ignoré (Défaut)
-w-ngu -w-8041 Valeur non signée rendue négative (Défaut)
-w-nin -w-8042 Initialiseur pour l'objet 'identificateur' ignoré (Défaut)
-w-nma -w-8043 Définition de macro ignorée (Défaut)

-w-nmu -w-8044 Directive #undef ignorée (Défaut)


-wnod -w8045 Pas de déclaration pour la fonction 'fonction' (désactivé par défaut)
-w-nop -w-8046 Option pragma pop sans option correspondante push (Défaut)
-w-npp -w-8083 'Pragma pack pop' sans 'pack push' correspondant (Défaut)
-w-nsf -w-8047 Déclaration de la fonction statique 'fonction(...)' ignorée (Défaut)
-w-nst -w-8048 Utilisez un nom qualifié pour accéder au type membre 'type' (Défaut)

-w-ntd -w-8049 Utilisez '> >' pour les modèles imbriqués au lieu de '>>' (Défaut)
-w-nto -w-8050 Aucun fichier de types OBJ présent. Désactivation de l'option types externes. (Défaut)
-w-nvf -w-8051 Fonction non volatile 'fonction' appelée pour un objet volatil (Défaut)
-w-obi -w-8052 Initialisation de base sans nom de classe est maintenant obsolète (Défaut)
-w-obs -w-8053 'identificateur' obsolète (Défaut)

-w-ofp -w-8054 Le style de définition de fonction est maintenant obsolète (Défaut)


-w-onr -w-8097 Toutes les options ne peuvent être restaurées pour l'instant (Défaut)
-w-osh -w-8055 Débordement possible dans une opération shift (Défaut)
-w-ovf -w-8056 Débordement arithmétique d'entiers (Défaut)
-w-par -w-8057 Paramètre 'paramètre' jamais utilisé (Défaut)
-w-pch -w-8058 Impossible de créer un en-tête précompilé : 'en-tête' (Défaut)

-w-pck -w-8059 La taille de la structure a changé (Défaut)


-w-pcm -w-8094 Utilisation incorrecte de #pragma comment (Défaut)
-w-pia -w-8060 Affectation incorrecte possible (Défaut)
-wpin -w8061 L'initialisation est partiellement entre accolades (désactivé par défaut)
-w-pow -w-8062 Options et avertissements précédents non restaurés (Défaut)
-w-prc -w-8084 Proposition d'utiliser des parenthèses pour clarifier les priorités (Défaut)

-w-pre -w-8063 Opérateur de préfixe surchargé 'opérateur' utilisé comme un opérateur de suffixe (Défaut)
-w-pro -w-8064 Appel à la fonction 'fonction' sans prototype (Défaut)
-w-pro -w-8065 Appel à la fonction 'fonction' sans prototype (Défaut)

- 44 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

-w-rch -w-8066 Code inatteignable (Défaut)


-w-ret -w-8067 Instructions de renvoi avec et sans valeur utilisées (Défaut)
-w-rng -w-8068 Constante hors limites dans la comparaison (Défaut)

-w-rpt -w-8069 Conversion de pointeur non portable (Défaut)


-w-rvl -w-8070 La fonction doit renvoyer une valeur (Défaut)
-wsig -w8071 La conversion peut perdre des chiffres significatifs (désactivé par défaut)
-w-spa -w-8072 Arithmétique de pointeur suspecte (Défaut)
-w-stl -w-8087 'opérateur==' doit être visible publiquement pour être contenu par un nom 'nom' (désactivé par défaut)

-w-stl -w-8089 'opérateur<' doit être visible publiquement pour être contenu par un nom 'nom' (désactivé par défaut)
-w-stl -w-8090 'opérateur<' doit être visible publiquement pour être utilisé par un nom 'nom' (désactivé par défaut)
-w-stl -w-8091 L'argument 'type' 'argument' passé à 'fonction' est un itérateur de 'type'. Itérateur de 'type' requis
(désactivé par défaut)
-w-stl -w-8092 L'argument 'type' 'argument' passé à 'fonction' n'est pas un itérateur. Itérateur de 'type' requis
(désactivé par défaut)

-wstu -w8073 Structure 'structure' non définie (désactivé par défaut)


-wstv -w8074 Structure passée par valeur (désactivé par défaut)
-w-sus -w-8075 Conversion de pointeur suspecte (Défaut)
-w-tai -w-8076 L'instance de modèle 'instance' est déjà instanciée (Défaut)
-w-tes -w-8077 Spécialiser explicitement le membre d'une classe explicitement spécialisée est insensé (Défaut)
-w-thr -w-8078 L'expression Throw viole la spécification d'exception (Défaut)

-wucp -w8079 Mélange de pointeurs de plusieurs types 'char' (désactivé par défaut)
-wuse -w8080 'identificateur' est déclaré mais jamais utilisé (désactivé par défaut)
-w-voi -w-8081 Les fonctions void ne doivent pas renvoyer de valeur (Défaut)
-w-zdi -w-8082 Division par zéro (Défaut)

- 45 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Langage > Compilation et édition de liens > Comment résoudre l'erreur...
[Lieur Erreur] Unresolved external 'UneFonction()' referenced from XXX.OBJ ?
Auteurs : CGi , Neo41 ,
Cette erreur se produit quand vous appelez une fonction dont vous avez bien inclus le fichier entête la déclarant, mais
dont le lieur ne trouve pas son implémentation.
Une cause possible est que cette fonction provient soit d'une librairie (.lib) ou d'un fichier source (.cpp) et que vous
avez omis de l'ajouter au projet.
Dans ce cas, la solution est d'ajouter la librairie ou le fichier source au projet (via le menu Projet | Ajouter au projet...)

Il peut également arriver que l'erreur se produise même si le .lib est bien ajouté au projet. En ce cas, il s'agit
probablement d'une librairie que vous avez développée, et dans laquelle vous venez d'apporter des modifications.
Une solution peut alors être de supprimer tous les fichiers temporaires (.obj, .tds, .~, les .lib et .bpl s'ils existent), et de
reconstruire la librairie (la recompilation ne suffit pas).

[Lieur Erreur] Unresolved external '__fastcall


TForm1::UnGestionnaireDEvenement(...)' referenced from XXX.OBJ ?
Auteurs : CGi ,
Une cause possible de cette erreur est que vous avez effacé complètement la définition de la méthode de l'évènement
(Button1Click par exemple), créée automatiquement par l'EDI, alors que sa déclaration est toujours dans le header (.h)
Dans ce cas, la solution est d'effacer la déclaration de la méthode en question.
A l'avenir, si vous voulez supprimer une méthode liée à un évènement, supprimez seulement le contenu de la définition,
l'EDI fera les suppressions nécessaires à la prochaine compilation.

[Lieur Erreur fatale] Fatal: Could not open XXX.exe (program still running?) ?
Auteurs : CGi , pottiez ,
La cause probable de cette erreur est que le programme que vous essayez de compiler, construire ou exécuter est déjà
en cours d'exécution.
La solution est simple : fermer l'instance du programme en cours d'exécution.

A partir de Windows Vista cette erreur peut apparaître si vous n'executez pas C++Builder en
tant qu'Administrateur.

[Lieur Erreur] Unresolved external '__fastcall TXXX::MaMethode(...)' referenced from XXX.OBJ ?


Auteurs : CGi ,
Une cause possible est que vous avez ajouté une méthode personnelle à une fiche(TForm) ou à une autre classe.
Vous l'avez donc déclarée dans l'entête de la classe (prenons TForm1 par exemple)

private: // Déclarations de l'utilisateur


void __fastcall MaMethode();

Le problème est que dans la définition de la méthode vous avez omis son appartenance à la classe (TForm1:: dans notre
example)

- 46 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

void __fastcall MaMethode()


{
ShowMessage("Execution de MaMethode");
}

Elle est donc définie comme une fonction indépendante et non comme une fonction membre. Cette erreur est assez
fréquente, mais comme le code est valide on n'obtient qu'une erreur de l'éditeur de lien.
Dans ce cas, la solution est de rajouter le nom de la classe devant la méthode (TForm1:: dans notre exemple).

void __fastcall TForm1::MaMethode()


{
ShowMessage("Execution de MaMethode");
}

[Lieur Erreur fatale] Fatal : Unable to open file 'XXX.LIB' ou 'XXX.BPI' ?


Auteurs : Neo41 ,
Cette erreur provient du fait que C++ Builder référence systématiquement dans le fichier projet tous les paquets dont
il dispose, même s'ils ne sont pas nécessaires à ce projet. Cela peut poser des problèmes lors de la désinstallation de
paquets, ou de la récupération de projets provenant d'une source externe.
Pour résoudre ce problème, deux solutions sont possibles (même procédure à suivre pour les deux types de fichiers) :
La première (N.B. : avant d'essayer cette solution il est conseillé de faire une copie du fichier projet.bpr)
• Fermer le projet concerné
• Ouvrir le fichier projet.bpr avec un éditeur de texte
• Supprimer toutes les occurrences de 'XXX.LIB'
• Sauvegarder le fichier
• Réouvrir le projet

La deuxième:
• Ouvrir le projet concerné
• Faire un click doit sur le nom du projet et ensuite choisir "Modifier la source des options" pour afficher le fichier
xml
• Chercher toutes les occurrences de 'XXX.LIB' et les supprimer
• Sauvegarder le projet SANS LE FERMER
• Retirer un fichier de la liste des fichiers du projet (peu importe lequel)
• Sauvegarder le projet et fermer C++ Builder
• Réouvrir le projet
• Rajouter le fichier retiré auparavant
• Compiler

- 47 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Utilisation de C++ Builder


Quelles sont toutes ces instructions dans les nouveaux projets de C++Builder ?
Auteurs : Geronimo ,
Lorsqu'une nouvelle application est créée, C++Builder pourvoit au code de base. Ainsi, vous pouvez exécuter votre
programme sans rien avoir à rajouter. Voici ce qui est affichée dans la zone d'édition lors de la création d'une nouvelle
application :

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{

}
//---------------------------------------------------------------------------

Les lignes de commentaires permettent de clarifier le code en séparant les méthodes. On trouve tout d'abord les
instructions de préprocesseur. L'instruction

#include <vcl.h>

inclut tous les en-têtes de fonction de la bibliothèque de composants visuels. La directive

#pragma hdrstop

permet de définir ce qui sera placé dans les en-têtes précompilés. Tous les fichiers en-tête (#include) placés au-dessus
de cette directive seront placés dans les entêtes précompilées. Les en-têtes précompilées permettent d'accélérer la
compilation, au détriment de la place sur le disque dur. Veillez à ce que dans toutes les unités, ce soient les mêmes
fichiers qui soient placés au-dessus de cette directive.

#include "Unit1.h"

Cette instruction préprocesseur inclut le fichier d'en-tête Unit1.h qui contient la définition de la classe TForm1.

#pragma package(smart_init)

Cette instruction garantit l'initialisation correcte des paquets joints au programme, dans le bon ordre des dépendances.

#pragma resource "*.dfm"

- 48 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Les fichiers.dfm contiennent la fiche conceptualisée graphiquement. Tout ce que vous placez sur votre fiche, composants,
etc... est stocké dans ce fichier ainsi que les propriétés de chaque composant (hauteur, largeur, position,...) Cette directive
signale que le fichier en cours (Unit1.cpp) est le fichier unité d'une fiche : c'est le fichier lié à la fiche. Vient ensuite la
déclaration de Form1.

TForm1 *Form1

Form1 est un pointeur sur un objet de type TForm1. Form1 représente votre fiche. Lorsque vous faites Form1->Edit1-
>Text, c'est à ce Form1 que vous faites référence.

__fastcall TForm1::TForm1(TComponent* Owner)


: TForm(Owner)
{

Enfin, ceci est le constructeur de la fiche. C'est pour cela qu'elle a le même nom que la classe de la fiche : TForm1.
Comme chaque méthode de la fiche, son appartenance à celle-ci est marquée par le TForm1::. La méthode suivante :

void TForm1::CompterMots()
{

est la méthode CompterMots qui appartient à la classe TForm1. Le constructeur a pour argument TComponent* Owner.
Enfin, le code :

: TForm(Owner)

Sachez que la classe TForm1 dérive d'une classe parente TForm. Dans la VCL, il existe une classe fiche TForm qui
contient tout ce qui est nécessaire à une fiche par défaut (bordure, couleur, barre de titre...). Lorsque dans le concepteur,
vous modifiez votre fiche, vous créez en fait une nouvelle classe qui a toutes les propriétés de la classe TForm mais qui
en a de nouvelles : tous les composants que vous rajoutez. Ainsi, le code ci-dessus signifie qu'on appelle le constructeur
de la classe parente de TForm1, qui est TForm avec comme argument l'argument passé en au constructeur de la classe
TForm1.

- 49 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Pour la directive __fastcall, voyez le lien ci-dessous.

lien : Que signifie __fastcall ?

Peut-on créer des programmes 16 bits (dos/windows 3.1) avec C++Builder ?


Auteurs : Geronimo ,
Non. C++Builder est un programme exclusivement 32 bits. Même les programmes dits "console" que vous pouvez créer
sont des programmes Win32. Vous devez donc vous orienter vers Turbo C++ disponible sur le site de Borland.

lien : Site officiel de Borland

Comment appliquer la POO (Programmation Orientée Objet) à la programmation avec C++Builder ?


Auteurs : Geronimo ,
La POO (Programmation Orientée Objet) est la base du C++. Tout le système des classes en fait intégralement partie.
Le C++ permet de créer des programmes très sûrs et sécurisés où les erreurs de programmation sont beaucoup moins
fréquentes que dans les autres langages, surtout parce que l'on n'a accès qu'à ce qui peut être utile, mais pour cela, il
faut respecter les principes de la POO.

lien : Quelques réflexes à avoir pour utiliser au mieux C++ Builder en respectant au maximum la POO
(Programmation Orientée Objet)

Comment créer un programme d'installation pour mon application ?


Auteurs : Geronimo ,
Une application fait immédiatemment meilleur effet lorsqu'un programme d'installation est disponible. Il y a différents
programmes d'installation disponibles, nous citerons en particulier
• InstallShield, version allégée, disponible avec Borland C++Builder, édition professionnelle.

InnoSetup, très complet, disponible à l'adresse http://www.jrsoftware.org

GhostInstaller disponible à l'adresse http://www.ginstall.com, vous pouvez en voir le test à l'adresse http://
geronimo.developpez.com/Outils.

NSIS, l'installeur de winAMP, un produit Open-Source disponible à l'adresse http://nsis.sourceforge.net/

A noter qu'il est préférable de ne pas utiliser de tels programmes si ce n'est pas vraiment nécessaire : si votre programme
est composé d'un seul exécutable, un programme d'installation ne sert à rien, une compression Zip suffit. N'ajoutez pas
inutilement des clés dans le registre si ce n'est pas vraiment nécessaire.

lien : Les programmes d'installation automatiques de vos applications Borland C++Builder

- 50 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Utilisation de C++ Builder > Concepteur de fiches


Comment afficher la fiche correspondant à l'unité en cours d'édition ?
Auteurs : Geronimo ,
Appuyez tout simplement sur la touche [F12]

Comment aligner proprement des composants ?


Auteurs : Geronimo ,
Cliquez sur le menu Voir | Palette d'alignement. Sélectionnez ensuite sur votre fiche les composants que vous souhaitez
aligner avec précision ([MAJ] + clic pour en sélectionner plusieurs) et cliquez sur le bouton de la palette d'alignement

- 51 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

correspondant. Aidez-vous des conseils (s'ils ne s'affichent pas, cliquez avec le bouton droit sur la palette et cochez
Afficher les conseils).

Comment sélectionner plusieurs composants ?


Auteurs : Geronimo ,
Maintenez la touche [Maj] enfoncée pendant que vous cliquez sur les composants. Vous pouvez aussi tracer un rectangle
avec la souris et tous les composants situés dans cette zone seront sélectionnés. Pour tracer cette zone dans un composant
pouvant en contenir d'autres, comme les TPanel, maintenez la touche [Ctrl] enfoncée.

Comment déplacer des composants au pixel près ?


Auteurs : Geronimo ,
Pour déplacer un (ou des) composants au pixel près, sélectionnez le(s) composant(s), maintenez la touche [Ctrl] enfoncée
et utilisez les flèches de direction. Vous pouvez aussi changer la valeur des propriétés Top et Left de ces composants.

Comment redimensionner des composants au pixel près ?


Auteurs : Geronimo ,
Pour redimensionner un composant au pixel près, sélectionnez ce composant et, tout en maintenant la touche [Maj]
enfoncée, utilisez les flèches de direction. Vous pouvez également modifier les propriétés Width et Height de ces
composants directement dans l'inspecteur d'objets.

Comment ajouter facilement plusieurs composants du même type ?


Auteurs : Geronimo ,
Lorsque vous cliquez sur le type de composant dans la palette, maintenez la touche [Maj] enfoncée. Un liseré bleu
entourera le composant sélectionné. Vous pourrez alors cliquer à plusieurs reprises dans la fiche pour ajouter plusieurs
composants.

Comment faire pour récupérer mes fenêtres lorsqu'elles disparaissent ?


Auteurs : Geronimo ,
Qui ne s'est jamais énervé à rappeller une dizaine de fois le concepteur de menus pour rajouter des éléments... Pour
récupérer plus rapidement la fenêtre, utilisez le raccourci [Alt]+[0] (pas le zéro du pavé numérique), ce qui affichera
une boîte de dialogue listant toutes les fenêtres ouvertes. Il est également possible d'installer GExperts (voir les liens ci-
dessous) qui rajoute un menu Fenêtres dans l'IDE.

lien : GExperts
lien : Test GExperts

- 52 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Utilisation de C++ Builder > Palette de composants


Comment afficher en premier les pages de la palette de composant les plus utiles ?
Auteurs : Geronimo ,
Cliquez avec le bouton droit sur la palette, puis sélectionnez la page que vous voulez ramener en premier. Cliquez
ensuite autant de fois qu'il le faut sur Vers le haut. Vous pouvez faire pareil au niveau des composants.

Comment trouver rapidement un composant et le placer sur la fiche ?


Auteurs : Geronimo ,
Utilisez la fenêtre Liste des composants à laquelle vous pouvez rapidement accéder par Voir/Liste de composants. Tapez
dans la zone d'édition le nom du composant. Ensuite, double-cliquez sur un composant pour l'ajouter. La fenêtre ne se
ferme pas ce qui vous permet d'ajouter des composants "à la chaîne".

- 53 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Utilisation de C++ Builder > Outils et fonctions


Pourquoi C++ Builder se fige-t-il lorsque l'on passe la souris sur le code ?
Auteurs : Geronimo , Dure_Limite ,
Cela est dû à l'audit de code dans le conseil. Plus clairement, lorsque vous passez la souris au-dessus d'un symbôle,
C++Builder va chercher à trouver des informations sur le symbole ; pour cela, il compile en arrière-plan les unités.
Le problème est que, pour de gros projets, cela peut prendre beaucoup de temps. Cette fonction n'étant pas très utile,
vous pouvez la désactiver dans le menu Outils | Options de l'éditeur/Audit de code où vous décochez la case Audit de
symbôle dans le conseil.
Vous pourrez continuer à demander la complétion lorsque vous le désirerez en faisant [Ctrl]+[Espace]

Avec la version personnal de Builder 6, cette option n'est pas directement accessible dans l'EDI (elle n'existe pas).
Il faut passer par la base de registre pour modifier cette option.

Il faut positionner à false Declaration Information dans la clé HKEY_CURRENT_USER\Software\Borland\C+


+Builder\6.0\Code Insight.

lien : Comment rechercher de l'aide dans C++ Builder ?

A quoi sert la case "Voir la fenêtre CPU" dans les messages d'erreur ?
Auteurs : Geronimo ,
Le CPU est le processeur de votre ordinateur. La fenêtre CPU permet de contrôler les instructions passées au processeur
ainsi que le contenu des registres du processeur ("petites mémoires" à accès très rapide placées sur le processeur).
Lorsqu'il y a une erreur, en cochant cette case, vous faites apparaitre la fenêtre CPU. Mais cette fenêtre n'est pas
seulement accessible en cas d'erreur : vous pouvez la faire apparaitre lorsque vous le souhaitez : placez un bouton sur
votre fiche. Dans l'évènement OnClick de ce bouton, placez le code assembleur suivant :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
asm
{
mov eax, 0xFF;
nop;
}
}

L'instruction (mov eax, 0xFF) place le code 0xFF (= 255) dans le registre eax. La deuxième instruction ne fait aucune
opération. Ce petit programme n'a donc pas d'intérêt si ce n'est celui de vous montrer une utilisation simple de la
fenêtre CPU.
Placez maintenant un point d'arrêt sur l'instruction nop (allez sur cette ligne et appuyez sur [F5]).
Exécutez le programme ([F9]). Cliquez sur le bouton Button1. Le programme s'arrête et l'éditeur de source met en
évidence la ligne où nous avions placé le point d'arrêt (nop). Un point d'arrêt arrête l'application avant qu'elle exécute
l'instruction. Donc l'instruction nop n'a pas été exécutée. Dans le registre eax, nous devrions donc avoir la valeur 0xFF.
Nous allons le contrôler avec la fenêtre CPU. Utilisez pour cela un clic avec le bouton droit, Déboguer | Voir le CPU.
Regardez l'avant-dernière colonne, tout en haut. En face de EAX, vous devriez voir 000000FF. Donc notre registre
contient bien cette valeur.

- 54 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

L'utilisation de la fenêtre CPU décrite ici n'a pas beaucoup d'intérêt en soi, mais elle permet de comprendre une utilité
de cette fenêtre.

Comment empêcher C++Builder de supprimer les méthodes-gestionnaires d'évènements vides ?


Auteurs : Geronimo ,
C++Builder supprime les gestionnaires d'évènements vides pour éviter que des méthodes parasites créées par mégarde
polluent votre projet : il suffit que vous double-cliquiez sur un composant pour créer un évènement ! Si vous souhaitez
les garder, il suffit de placer un commentaire au-dedans :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
//
}

Le commentaire vide // empêche C++Builder de retirer la méthode. En effet, celui-ci ne retire que les méthodes sans
contenu.

A quoi sert l'explorateur de classes ?


Auteurs : Geronimo ,
Consultez le lien ci-dessous pour découvrir ses usages

lien : L'explorateur de classes

Comment indenter et désindenter automatiquement du code ?


Auteurs : Geronimo ,
Sélectionnez simplement les lignes souhaitées et tapez [Ctrl]+[Maj]+[I] pour indenter et [Ctrl]+[Maj]+[U] pour
désindenter.

Comment désactiver la récupération systématique des exceptions par C++ Builder ?


Auteurs : Geronimo ,
Il peut parfois être utile d'ignorer les exceptions dans C++Builder. En effet, celui-ci signale même les exceptions
"rattrapées" par le bloc try/catch. Pour cela, il suffit d'aller dans Outils | Options du débogueur, puis dans l'onglet
Exceptions du langage. Décochez ensuite les cases Arrêter sur exceptions Delphi et Arrêter sur exceptions C++.

- 55 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Utilisation de C++ Builder > Divers


Comment accélérer le démarrage de Borland C++Builder ?
Auteurs : Geronimo ,
Lorsque vous êtes dans C++Builder, faites Fichier | Fermer tout. Ensuite, cliquez sur Projet | Options, allez dans l'onglet
Paquets. Dans cet onglet, décochez tous les paquets qui ne vous servent pas, cela accélerera le démarrage de BCB qui
n'aura pas à les charger à chaque fois.

Pourquoi C++Builder est-il si instable ?


Auteurs : Geronimo ,
C'est un fait connu, C++Builder affiche souvent des messages d'erreur de violation d'accès. Ces messages peuvent
apparaître à tout moment, particulièrement lorsque vous créez un nouveau projet, compilez,... En général, ces message
ne plantent pas C++Builder et il suffit de valider sur OK pour continuer à développer normalement. Si ces messages
persistent, redémarrez C++Builder, voire l'ordinateur. Il est cependant extrèmement rare que cela entraîne des pertes
d'informations.

Y a-t-il des "easter eggs" dans C++ Builder ?


Auteurs : Greybird ,
C++ Builder renferme un certain nombre d'"easter eggs", littéralement "oeufs de Pâques", à savoir des
"fonctionnalités" cachées. En voici deux :
• Appuyer sur [Ctrl]+[Shift] pendant le chargement de C++ Builder. Le splash screen sera ainsi modifié.
• Dans la boîte de dialogue Aide | A propos..., garder la touche [Alt] enfoncée, et tapez GUNGLA.

Qui a dit que c'était inutile, donc indispensable ?

Comment créer une variable d'environnement pour C++ Builder ?


Auteurs : Ricky81 ,
La création d'une variable d'environnement peut vous faciliter l'écriture de chemins d'inclusion et par là-même la
diffusion de vos librairies ou applications.

Pour créer une variable d'environnement utilisateur au sein de C++ Builder, allez dans Outils | Options
d'environnement, puis sélectionnez l'onglet Variables d'environnement, cliquez sur le bouton Nouvelle et renseignez
les 2 champs.

Supposons que nous ayons créé la variable jAPI avec la valeur E:\Program Files\Borland\CBuilder6\composants\jAPI
pour définir le répertoire accueillant la librairie jAPI. Il suffit dès lors dans les projets faisant appel à cette librairie de
rajouter comme chemin d'inclusion la valeur $(jAPI).

Comment afficher le numéro de ligne du source ?


Auteurs : Altau ,
C'est en fait très simple : il suffit d'utiliser la variable globale __LINE__ (2 caractères soulignés avant et après).

- 56 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Exemple
Label1->Caption = __LINE__;

- 57 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Gestion des fichiers


Pourquoi C++ Builder n'arrive-t-il pas à accéder à un chemin existant ?
Auteurs : Greybird ,
La spécification des chemins doit se faire en doublant les antislash. Ainsi, le code suivant ne fonctionnera pas :

FileOpen("C:\log.txt",fmOpenWrite);

En revanche, celui-ci fonctionnera

FileOpen("C:\\log.txt",fmOpenWrite);

- 58 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Gestion des fichiers > Répertoires


Comment obtenir le répertoire de Windows ?
Auteurs : Greybird ,
Suivant les installations, le répertoire de Windows peut se trouver à différents chemins. Il est donc impératif, lorsqu'on
doit y faire référence, de le demander au système. Pour cela, on utilise l'API Win32 GetWindowsDirectory. Cette API
prend comme premier argument un buffer de caractères, et comme second sa taille en caractères.
La fonction retourne :
• 0 en cas d'erreur
• la taille de la chaîne retournée (sans le caractère de terminaison) en cas de succès
• la taille du buffer à allouer si le buffer est trop petit pour contenir la chaîne. Il est recommandé que le premier
appel se fasse avec une longueur de buffer de MAX_PATH, constante Windows.

AnsiString RepertoireWindows()
{
AnsiString result = "";
UINT buflength;
char *repertoire = new char[MAX_PATH];
buflength = GetWindowsDirectory(repertoire,MAX_PATH);
if (buflength == 0)
{
delete[] repertoire;
return result;
}
else if (buflength > MAX_PATH)
{
delete[] repertoire;
repertoire = new char[buflength];
GetWindowsDirectory(repertoire,buflength);
}
result = repertoire;
delete[] repertoire;
return result;
}

Une autre solution, qui utilise les variables d'environnement :

AnsiString RepertoireWindows()
{
getenv("WINDIR");
}

Comment obtenir le répertoire système de Windows ?


Auteurs : Greybird ,
Suivant les installations, le répertoire de Windows peut se trouver à différents chemins. Il est donc impératif, lorsqu'on
doit y faire référence, de le demander au système. Pour cela, on utilise l'API Win32 GetSystemDirectory. Cette API prend
comme premier argument un buffer de caractères, et comme second sa taille en caractères.
La fonction retourne :
• 0 en cas d'erreur
• la taille de la chaîne retournée (sans le caractère de terminaison) en cas de succès
• la taille du buffer à allouer si le buffer est trop petit pour contenir la chaîne. Il est recommandé que le premier
appel se fasse avec une longueur de buffer de MAX_PATH, constante Windows.

AnsiString RepertoireSystemeWindows()

- 59 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

{
AnsiString result = "";
UINT buflength;
char *repertoire = new char[MAX_PATH];
buflength = GetSystemDirectory(repertoire,MAX_PATH);
if (buflength == 0)
{
delete[] repertoire;
return result;
}
else if (buflength > MAX_PATH)
{
delete[] repertoire;
repertoire = new char[buflength];
GetSystemDirectory(repertoire,buflength);
}
result = repertoire;
delete[] repertoire;
return result;
}

Comment obtenir le répertoire temporaire de Windows ?


Auteurs : Greybird ,
Suivant les installations, le répertoire de Windows peut se trouver à différents chemins. Il est donc impératif, lorsqu'on
doit y faire référence, de le demander au système. Pour cela, on utilise l'API Win32 GetTempPath. Cette API prend
comme second argument un buffer de caractères, et comme premier sa taille en caractères.
La fonction retourne :
• 0 en cas d'erreur
• la taille de la chaîne retournée (sans le caractère de terminaison) en cas de succès
• la taille du buffer à allouer si le buffer est trop petit pour contenir la chaîne. Il est recommandé que le premier
appel se fasse avec une longueur de buffer de MAX_PATH, constante Windows.

AnsiString RepertoireTemporaire()
{
AnsiString result = "";
UINT buflength;
char *repertoire = new char[MAX_PATH];
buflength = GetTempPath(MAX_PATH, repertoire);
if (buflength == 0)
{
delete[] repertoire;
return result;
}
else if (buflength > MAX_PATH)
{
delete[] repertoire;
repertoire = new char[buflength];
GetTempPath(buflength, repertoire);
}
result = repertoire;
delete[] repertoire;
return result;

- 60 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Comment obtenir le répertoire dans lequel est situé le programme exécutable ?


Auteurs : Geronimo ,
On a souvent besoin d'accéder à un fichier situé dans le répertoire de l'exécutable. Mais ce répertoire peut changer
selon les ordinateurs... Il peut paraître plus simple d'omettre le chemin lorsqu'on fait référence à un fichier se trouvant
dans le répertoire de l'application :

ChargerConfiguration("options.ini");

Dans ce cas, le fichier est cherché dans le répertoire courant de l'application. Mais ce répertoire peut être changé
(regardez les raccourcis Windows et leur propriété Démarrer en). Il est donc nécessaire de trouver le répertoire de
l'application, ce qui se fait à l'aide de la fonction ExtractFilePath de la manière suivante :

AnsiString RepertoireApplication = ExtractFilePath(Application->ExeName);

Notez que Application->ExeName contient le nom de fichier exécutable de l'application. La fonction ExtractFilePath en
extrait le chemin. Donc pour notre petit exemple, nous utiliserions :

ChargerConfiguration(ExtractFilePath(Application->ExeName)+"options.ini");

Comment ouvrir la boîte de dialogue demandant à l'utilisateur la sélection d'un répertoire ?


Auteurs : Geronimo , Dure_Limite , Kaji ,
On voit souvent cette petite boîte de dialogue très pratique dans les programmes d'installation, lorsqu'il s'agit de choisir
le répertoire où sera déployé le logiciel. Cette petite boîte de dialogue peut-être affichée par le code suivant :

#include <FileCtrl.hpp>
// ...
AnsiString Directory;
if (SelectDirectory("Sélectionnez le répertoire de copie", "c:\\", Directory))
{
ShowMessage("Vous avez choisi : "+Directory);
}
else
{
ShowMessage("Vous avez annulé");
}

La fonction SelectDirectory, définie dans FileCtrl.hpp, prend pour premier argument la légende de la fenêtre. Le second
argument est le répertoire par défaut. Enfin, le troisième argument est la chaîne AnsiString dans laquelle sera stocké
le répertoire. La fonction SelectDirectory retourne true si l'utilisateur valide avec OK. Sinon, elle retourne false.

Une autre solution consiste à utiliser "BrowseForFolder" de l'API Windows, comme suit pour une fenêtre centrée :

//---------------------------------------------------------------------------
#define NO_WIN32_LEAN_AND_MEAN // à mettre avant '#include <vcl.h>'

- 61 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

#include <vcl.h>
#pragma hdrstop
#include <shlobj.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
// Fonction Globale
//---------------------------------------------------------------------------
int __stdcall BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{ // Permet de centrer la boite à l'ecran
TRect rect;
GetWindowRect(hwnd, &rect);

MoveWindow(
hwnd,
( Screen->Width - rect.Width() ) /2, // centré en x
( Screen->Height - rect.Height() ) /2,
rect.Width(),
rect.Height(),
true
);
return 1;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
String __fastcall TForm1::SelectDossier( String Titre )
{
char Path[MAX_PATH];
char BufferDisplayName[MAX_PATH];

PItemIDList IDRoot;
SHGetSpecialFolderLocation(Handle, CSIDL_NETWORK, &IDRoot);

TBrowseInfo BrowseInfo;
ZeroMemory(&BrowseInfo, sizeof(TBrowseInfo));
BrowseInfo.hwndOwner = Handle;
BrowseInfo.pszDisplayName = BufferDisplayName;
BrowseInfo.lpszTitle = Titre.c_str();
BrowseInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS |
BIF_RETURNFSANCESTORS;
BrowseInfo.lpfn = BrowseCallbackProc;

PItemIDList PList = SHBrowseForFolder(&BrowseInfo);

if (PList){
SHGetPathFromIDList(PList, Path);
return (String)Path;
}
else return "";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String PathSelect = SelectDossier( "Veuillez-sélectionner le dossier source :" );
}

- 62 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

//---------------------------------------------------------------------------

Comment créer un répertoire ?


Auteurs : Geronimo ,
Utilisez pour cela fonction CreateDirectory.

if (CreateDirectory(Repertoire.c_str(), 0))
{
// Le répertoire a été créé
}
else
{
// Le répertoire n'a pas été créé
}

Comment créer un chemin complet en une seule fois


Auteurs : Geronimo ,
La fonction CreateDirectory n'est pas capable de créer plusieurs répertoires à la fois. Si vous voulez créer le répertoire
c:\temp\mon_application, il faut que le répertoire temp existe déjà. Utilisez ForceDirectories, définie dans l'unité FileCtrl
ou SysUtils pour créer le chemin en une seule fois :

#include <FileCtrl.hpp>
//...
if (ForceDirectories(Chemin)
{
// Le chemin a été créé
}
else
{
// Le chemin n'a pas été créé
}

Comment savoir si un répertoire existe ?


Auteurs : Geronimo ,
Faites appel à la fonction DirectoryExists définie dans l'unité FileCtrl.

#include <FileCtrl.hpp>
if (DirectoryExists(Repertoire))
{
//...

- 63 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Comment déplacer un répertoire ?


Auteurs : Neo41 ,
Vous pouvez utiliser la fonction MoveFile qui est également valable pour les fichiers.

BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName);

Exemple:

AnsiString OldPath = "C:\\Test\\", NewPath = "C:\\Temp\\Test\\";


if(MoveFile(OldPath.c_str(), NewPath.c_str()) == true)
{
//Réperoire déplacé avec succès
}
else
{
//Problème
}

lien : Comment déplacer un fichier ?

Comment renommer un répertoire ?


Auteurs : Neo41 ,
Vous pouvez utiliser la fonction RenameFile qui est également valable pour les fichiers.

bool __fastcall RenameFile(const AnsiString OldName, const AnsiString NewName);

Exemple:

AnsiString OldName = "C:\\Ancien\\", NewName = "C:\\Nouveau\\";


if(RenameFile(OldName, NewName) == true)
{
//Réperoire renommé avec succès
}
else
{
//Problème
}

lien : Comment renommer un fichier ?

Comment supprimer un répertoire ?


Auteurs : Neo41 ,
Pour réaliser la suppression d'un répertoire, plusieurs approches sont possibles selon que le répertoire est vide ou pas.

- 64 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

• Utiliser RemoveDir et RemoveDirectory

Ces fonctions sont valides uniquement pour un répertoire vide

bool __fastcall RemoveDir(const AnsiString Dir);


BOOL RemoveDirectory(LPCTSTR lpPathName);

Exemple:

AnsiString MyPath = "C:\\Temp\\";


RemoveDir(MyPath);

• Utiliser l'API SHFILEOPSTRUCT

Pour l'utiliser il ne faut pas oublier #include "ShellApi.h"

#include "ShellApi.h"
--------------------------------------------------------------------
SHFILEOPSTRUCT stFileOp;
ZeroMemory(&stFileOp, sizeof(stFileOp));
stFileOp.wFunc = FO_DELETE;
stFileOp.fFlags = FOF_SILENT | FOF_NOCONFIRMATION;
stFileOp.hwnd = Application->Handle;
stFileOp.pFrom = "C:\\Temp\0";

SHFileOperation(&stFileOp);

• Ecrire une fonction récursive

Le but de cette fonction est de parcourir de façon récursive tous les fichiers et les sous réperoires du répertoire à
supprimer. La fonction pourrait ressembler à ceci:

void __fastcall DeleteRecursif(AnsiString pmRep)


{
TSearchRec SearchRec;
int Attributes = 0;
AnsiString bcRep = "",
bcRepTemp = "",
bcFile = "";

Attributes |= faAnyFile;
bcRep = pmRep;
if(bcRep[bcRep.Length()] != '\\')
{
bcRep+= "\\";
}
bcRepTemp = bcRep;
bcRep+= "*.*";
if(FindFirst(bcRep, Attributes, SearchRec) == 0)
{
do
{
bcFile = SearchRec.Name;
if(bcFile != "." && bcFile != "..")
{
bcFile = bcRepTemp + SearchRec.Name;
if(SearchRec.Attr != faDirectory)

- 65 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

{
DeleteFile(bcFile);
}
else
{
DeleteRecursif(bcFile);
}
}
}
while (FindNext(SearchRec) == 0);
FindClose(SearchRec);
}
RemoveDir(pmRep);
}

Et pour supprimer un répertoire il suffit d'appeler cette fonction:

DeleteRecursif("C:\\Temp\\");

Comment obtenir la date de création d'un répertoire ?


Auteurs : Sunchaser , Gilles Louïse ,
Il est impossible d'utiliser la fonction FileAge sur un répertoire, la valeur de retour étant alors -1, soit fichier inexistant.

L'astuce consiste à passer par les méthodes de recherche de fichiers, et de récupérer les données retournées par cette
recherche, comme le montre le code suivant :

TSearchRec SR;
String NomRepertoire = "C:\\jeux";
TDateTime DT;

if (!FindFirst(NomRepertoire, faDirectory, SR))


{
// on convertit le marqueur horaire système du répertoire en une date classique
DT = FileDateToDateTime(SR.Time);
ShowMessage(DT);
}
else
{
ShowMessage("répertoire inexistant");
}

Le deuxième paramètre de la fonction FindFirst permet de spécifier le type de fichier recherché (ici répertoire). Si celui-
ci est trouvé, les informations le concernant sont renvoyées dans la variable SR.

Comment trouver les répertoires spéciaux de Windows ?


Auteurs : Sunchaser , Atlantis , Bandit Boy ,
Pour obtenir le chemin d'accès à ces répertoires, il faudra utiliser deux fonctions des API Windows :

• SHGetSpecialFolderLocation
• SHGetPathFromIDList

Pour ce faire et dans le cas d'une inclusion d'en tête de la VCL, il faut respecter l'ordre de déclaration suivant :

- 66 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

#define NO_WIN32_LEAN_AND_MEAN
#include <vcl.h>

On peut donc créer une fonction utilisant ces deux API.

Dans le .h
private:// Déclarations de l'utilisateur
String __fastcall CheminSpecialFolder(int TypeFolder);

Dans le .cpp
String __fastcall TForm::CheminSpecialFolder(int TypeFolder)
{
String Result = "";
//
char sPath[MAX_PATH];
_ITEMIDLIST *AIdList;
//
try
{
SHGetSpecialFolderLocation(Application->Handle, TypeFolder, &AIdList);
SHGetPathFromIDList(AIdList, sPath);
Result = sPath;
}
catch(...)
{
//gérer les erreurs relevées...
}
//
return Result;
}

Cette fonction peut être appelée simplement par :

void __fastcall TForm::ButtonClick(TObject *Sender)


{
ShowMessage(CheminSpecialFolder(CSIDL_COMMON_DESKTOPDIRECTORY));
}

Les valeurs représentant les différents types de dossiers sont disponibles dans l'aide SDK Windows.

Pour récupérer le répertoire temporaire de l'OS, vous pouvez vous en sortir avec les lignes suivantes :

AnsiString TempPath;
GetTempPath(200,TempPath.c_str());

Comment obtenir le nom court d'un dossier ?


Auteurs : Dure_Limite ,
Pour obtenir le nom court d'un fichier, on utilise la fonction GetShortPathName.

String __fastcall TForm1::Path_LongToCourt( String Path_Long )


{

- 67 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

char PathCourt[MAX_PATH];
GetShortPathName(Path_Long.c_str(), PathCourt, MAX_PATH);
return (String)PathCourt;
}

Exemple : le path court de C:\\Program Files\\Borland\\CBuilder6\\Projects donnera C:\\Progra~1\\Borland\\CBuild~1\


\Projects.

Comment obtenir la taille, dates et attributs d'un dossier ?


Auteurs : Dure_Limite ,
La procédure est similaire à celle mentionnée pour les fichiers.

lien : Comment obtenir la taille, dates et attributs d'un fichier ?

- 68 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Gestion des fichiers > Fichiers


Comme obtenir le répertoire d'un fichier ?
Auteurs : Geronimo ,
Pour obtenir le répertoire dans lequel est situé un fichier, utilisez la fonction ExtractFilePath. L'exemple suivant trouve
le répertoire dans lequel est situé un fichier sélectionné dans une boîte de dialogue d'ouverture. Placez donc une
OpenDialog sur votre fiche.

AnsiString Directory;
if (OpenDialog1->Execute())
{
Directory = ExtractFilePath(FileName);
//... utilisation du répertoire
}

Comment obtenir l'extension d'un fichier ?


Auteurs : Geronimo ,
Pour obtenir l'extension d'un fichier, il faut faire appel à la fonction ExtractFileExt.

AnsiString ExtensionApplication = ExtractFileExt(Application->ExeName); // = ".EXE"

Attention, l'extension peut être rendue en majuscules. Pour la convertir en minuscules, utilisez la méthode LowerCase.

AnsiString ExtensionApplication = ExtractFileExt(Application->ExeName).LowerCase(); // = ".exe"

Comment obtenir la taille d'un fichier ?


Auteurs : Geronimo ,
Pour obtenir la taille d'un fichier, nous faisons appel à la fonction FileSeek. Le code suivant montre comment on récupère
cette taille dans une chaîne et comment on la formate pour qu'elle soit facilement lisible par l'utilisateur :

// ouverture du fichier en lecture


int FichierHandle = FileOpen(Fichier, fmOpenRead);
// FileSeek se déplace à 0 octets de la fin du fichier (2 représente la fin du fichier).
// on formate la chaîne (# représente un chiffre)
Label1->Caption = FormatFloat("### ### ### Ko", FileSeek(FichierHandle, 0, 2));
// on germe le fichier
FileClose(FichierHandle);

Comment obtenir la date de modification d'un fichier ?


Auteurs : Geronimo ,
Pour obtenir la date de modification d'un fichier, il faut utiliser la fonction FileAge :

- 69 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

AnsiString FileName;
//...
FileName =...
//...
int Date = FileAge(FileName);

La fonction FileAge retourne un entier. Pour obtenir un objet DateTime, utilisez la fonction FileDateToDateTime. A
partir de cet objet DateTime, vous pouvez obtenir une chaîne contenant les dates et heures de modification :

AnsiString DateTimeStr = DateTimeToStr(FileDateToDateTime(FileAge(FileName)));

Comment changer l'extension d'un fichier ?


Auteurs : Geronimo ,
Pour changer l'extension d'un fichier, il existe une fonction ChangeFileExt, déclarée dans l'unité SysUtils.

#include <SysUtils.hpp>
//...
// Change l'extension.txt en.dat
ChangeFileExt("fichier.txt", ".dat");

Comment copier un fichier ?


Auteurs : Geronimo ,
Utilisez la fonction CopyFile. Le code ci-dessous permet à l'utilisateur de choisir un fichier source et de choisir sous quel
nouveau nom il souhaite le copier.
Placez sur votre fiche un OpenDialog et un SaveDialog :

if (OpenDialog1->Execute())
{
if (SaveDialog1->Execute())
{
if (!CopyFile(OpenDialog1->FileName.c_str(), SaveDialog1->FileName.c_str(), true))
{
ShowMessage("Impossible de copier");
}
}
}

Cette fonction copie le fichier si l'utilisateur valide les boîtes de dialogue. La fonction prend pour argument deux chaînes
à zéro-terminal (source et destination) et un booléen qui indique si la fonction doit écraser un fichier déjà existant :
true, la fonction n'écrase pas, false, la fonction écrase le fichier. La fonction retourne 0 si elle échoue d'où notre test
pour afficher un dialogue si la copie n'a pas eu lieu.

Comment déplacer un fichier ?


Auteurs : Geronimo ,
Pour déplacer un fichier, utilisez la fonction MoveFile. Voici le code permettant de déplacer un fichier, après demande
du fichier d'origine et destination grâce à un TOpenDialog et un TSaveDialog :

- 70 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

if (OpenDialog1->Execute())
{
if (SaveDialog1->Execute())
{
if (!MoveFile(OpenDialog1->FileName.c_str(), SaveDialog1->FileName.c_str()))
{
ShowMessage("Impossible de déplacer");
}
}
}

La fonction MoveFile échoue si le fichier destination existe déjà. Remarquez également que cette fonction prend pour
arguments des chaînes C à zéro terminal, d'où l'appel de la méthode c_str() qui fournit une chaîne à zéro terminal à
partir d'une chaîne AnsiString.

lien : Comment déplacer un répertoire ?


lien : Comment convertir une chaîne AnsiString en une chaîne C, tableau de caractères à zéro terminal ?

Comment savoir si un fichier existe ?


Auteurs : Geronimo ,
Utilisez la fonction FileExists.

if (FileExists("c:\\windows\\mon_programme.ini"))
{
//... utilisation de "mon_programme.ini"
}

Cette fonction retourne true si le fichier passé en argument existe.

Comment lister les fichiers d'un répertoire ?


Auteurs : Geronimo ,
Pour lister les fichiers d'un répertoire, nous allons faire appel aux fonctions FindFirst, FindNext et FindClose ainsi qu'à
la structure TSearchRec.

void TForm1::Search(AnsiString FilePath, TStringList * Extensions, TStrings * ListeFichiers)


{
TSearchRec Infos_fichier;
if (!FindFirst(FilePath+"*.*", faAnyFile, Infos_fichier))

do
{
for (int i = 0 ; i < Extensions->Count ; i++)
{
if (ExtractFileExt(Infos_fichier.Name).LowerCase() == Extensions->Strings[i].LowerCase())
{
ListeFichiers->Add(ExpandFileName(Infos_fichier.Name));
}
}
}
while(!FindNext(Infos_fichier));

FindClose(Infos_fichier);

- 71 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Voici donc notre méthode. Les paramètres qui doivent lui être passés sont respectivement FilePath, le répertoire dans
lequel il faut faire la recherche, Extensions, la liste des extensions à recenser et enfin, ListeFichiers, un objet de type
TStrings dans lequel on récupère la liste des fichiers.

La méthode crée une structure Infos_fichier qui permettra à la fonction FindFirst de stocker des informations sur les
fichiers trouvés. Regardez l'aide sur FindFirst pour avoir plus de précisions sur celle-ci. Sachez simplement qu'elle
attend en premier argument le répertoire de recherche, en second argument le type de fichiers à rechercher et enfin, la
structure dans laquelle elle va stocker ses données. Cette fonction retourne 0 si elle trouve un fichier. Dans ce cas, on
commence la boucle do...while. C'est la fonction FindNext qui prend le relais, FindFirst ne servant que pour la première
fois.

Ensuite, on parcourt la liste des extensions et on regarde si l'extension du fichier trouvé SRec.Name correspond à une
de la liste, dans ce cas, on l'ajoute.

Enfin, on libère la mémoire allouée dans la structure avec FindClose.

Cette méthode peut être utilisée de la manière suivante. Placez une ListBox sur votre fiche :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
TStringList *Extensions = new TStringList; // On construit la liste des extensions
Extensions->Add(".cpp");
Extensions->Add(".h");
// Appel à notre méthode, avec pour liste des fichiers, les items de la ListBox.
Search(ExtractFilePath(Application->ExeName), Extensions, ListBox1->Items);
delete Extensions;
}

Comment lister les fichiers d'un répertoire de manière récursive ?


Auteurs : pottiez ,
Pour lister les fichiers d'un répertoire et de ses sous-répertoires, nous allons faire appel aux fonctions FindFirst,
FindNext et FindClose ainsi qu'à la structure TSearchRec.

void Search(std::list<std::string>& listFile, std::string directory, std::string filtre)


{
TSearchRect file;
int retour ;
if(directory[directory.length()-1] != '\\')
directory += "\\";
directory += filtre;
retour = FindFirst(directory.c_str(),0,file);
while(retour == 0)
{
if((file.Attr & faDirectory) != 0)
{
Search(listFile,file.Name,filtre);
}else{
listFile.push_back(file.Name.c_str());
}
retour = FindNext(file);
}
FindClose(file);

- 72 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Voici donc notre méthode. Les paramètres qui doivent lui être passés sont respectivement listFile, dans lequel on
récupère la liste des fichiers, directory, le répertoire dans lequel il faut faire la recherche, filtre, filtre de l'extension de
fichier à trouver.

La méthode crée une structure Infos_fichier qui permettra à la fonction FindFirst de stocker des informations sur les
fichiers trouvés. Regardez l'aide sur FindFirst pour avoir plus de précisions sur celle-ci. Sachez simplement qu'elle
attend en premier argument le répertoire de recherche, en deuxième argument le type de fichiers à rechercher et enfin,
la structure dans laquelle elle va stocker ses données. Cette fonction retourne 0 si elle trouve un fichier. Dans ce cas, on
commence la boucle do...while. C'est la fonction FindNext qui prend le relais, FindFirst ne servant que pour la première
fois.

Pour chaque fichier trouvé, on regarde si c'est un répértoire ou un fichier, si c'est un fichier on l'ajoute à la liste, si c'est
un répertoire, on rappelle la méthode pour aller tester les fichiers de ce répertoire.

Enfin, on libère la mémoire allouée dans la structure avec FindClose.

Comment ouvrir plusieurs fichiers avec une OpenDialog ?


Auteurs : Geronimo ,
Sélectionnez la boîte de dialogue d'ouverture. Dans sa propriété Options, positionnez ofAllowMultiSelect à true. Ensuite,
là où vous souhaitez ouvrir les fichiers, placez le code suivant :

if (OpenDialog1->Execute())
{
for (int i=0; i<OpenDialog1->Files->Count; i++)
{
Ouvrir(OpenDialog1->Files->Strings[i]);
}
}

Le membre Files de OpenDialog1 contient la liste des fichiers sélectionnés. Il suffit donc de parcourir cette liste
et d'ouvrir chaque fichier. Nous faisons appel pour cela à une méthode Ouvrir, que vous pouvez écrire pour votre
programme.

Comment renommer un fichier ?


Auteurs : Neo41 ,
Vous pouvez utiliser la fonction RenameFile qui est également valable pour les répertoires.

bool __fastcall RenameFile(const AnsiString OldName, const AnsiString NewName);

Exemple:

AnsiString OldName = "C:\\Temp\\AncienFichier.txt", NewName = "C:\\Temp\\NouveauFichier.txt";


if(RenameFile(OldName, NewName) == true)
{

- 73 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

//Fichier renommé avec succès


}
else
{
//Problème
}

lien : Comment renommer un répertoire ?

Comment envoyer un fichier à la corbeille ?


Auteurs : Neo41 ,
Si vous voulez avoir la possibilité de récupérer un fichier après l'avoir supprimé, il ne faut pas utiliser la
fonction DeleteFile, cette dernière supprimant définitivement le fichier. Pour réaliser ceci pour vous pouvez utiliser
SHFileOperation (valable également pour les répertoires) avec le flag FOF_ALLOWUNDO.

Exemple:

SHFILEOPSTRUCT stFileOp;
ZeroMemory(&stFileOp, sizeof(stFileOp));
stFileOp.wFunc = FO_DELETE;
stFileOp.fFlags = FOF_ALLOWUNDO;
stFileOp.hwnd = Application->Handle;
stFileOp.pFrom = "C:\\Temp\\Fichier.txt\0";

SHFileOperation(&stFileOp);

Comment créer un fichier et ses répertoires?


Auteurs : Neo41 ,
Tout d'abord il faut forcer la création du chemin d'accès du fichier, et ensuite créer le fichier lui même. Les fonctions
à utiliser sont ForceDirectories, puis toute fonction permettant de créer le fichier, comme le montre le code suivant :

ForceDirectories("c:\\tmp1\\tmp2\\tmp3\\tmp4\\");
TFileStream * file = new TFileStream("c:\\tmp1\\tmp2\\tmp3\\tmp4\\test.txt",fmCreate);
file->Write("Test",4);
delete file;

lien : Comment créer un chemin complet en une seule fois

Comment obtenir la taille, dates et attributs d'un fichier ?


Auteurs : Dure_Limite ,
Pour obtenir quelques informations sur un fichier, on peut se servir de la structure WIN32_FILE_ATTRIBUTE_DATA
qui est renseignée par la fonction GetFileAttributesEx.

Cette structure est composée de :

• La taille du fichier (non significatif pour un dossier) ;


• Les attributs ;
• Les dates : de création, de dernier accès, et d'enregistrement.

- 74 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Exemple d'utilisation :

Renseignement de la structure
String PathNomExt = "C:\\WINDOWS\\SYSTEM32\\CALC.EXE";
WIN32_FILE_ATTRIBUTE_DATA InfoFichier;
ZeroMemory (&InfoFichier, sizeof(WIN32_FILE_ATTRIBUTE_DATA));

if ( !GetFileAttributesEx( PathNomExt.c_str(), GetFileExInfoStandard, &InfoFichier )) {


return; // Erreur
}

Il ne nous reste plus qu'à exploiter les valeurs de la structure qui nous intéressent.

Pour connaître la taille du fichier


DWORD Taille_PoidsFort = InfoFichier.nFileSizeHigh;
DWORD Taille_PoidsFaible = InfoFichier.nFileSizeLow;

Note : Si la taille du fichier est inférieure à 4Go, la variable "Taille_PoidsFort" est à 0.

Les attributs
bool Archive = InfoFichier.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE;
bool LectureSeule = InfoFichier.dwFileAttributes & FILE_ATTRIBUTE_READONLY;
bool Compresse = InfoFichier.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED;
bool Cache = InfoFichier.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN;

Note: La liste complète des attributs se trouve dans l'aide de WIN32_FILE_ATTRIBUTE_DATA.

Et les différentes dates


SYSTEMTIME St;
String Creation, DernierAcces, Enregistrement;

// Date de création du fichier :


FileTimeToSystemTime( &InfoFichier.ftCreationTime, &St);
Creation.sprintf("Création : %02d/%02d/%d à %02dh%02d:%02d",
St.wDay, St.wMonth, St.wYear, St.wHour, St.wMinute, St.wSecond
);

// Date du dernier accès :


FileTimeToSystemTime( &InfoFichier.ftLastAccessTime, &St);
DernierAcces.sprintf("Dernier accès : %02d/%02d/%d à %02dh%02d:%02d",
St.wDay, St.wMonth, St.wYear, St.wHour, St.wMinute, St.wSecond
);

// Date d'enregistrement :
FileTimeToSystemTime( &InfoFichier.ftLastWriteTime, &St);
Enregistrement.sprintf("Modifié : %02d/%02d/%d à %02dh%02d:%02d",
St.wDay, St.wMonth, St.wYear, St.wHour, St.wMinute, St.wSecond
);

- 75 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Gestion du temps


Comment initialiser une variable avec une date ou un temps ?
Auteurs : Psl , Ricky81 ,
Les deux principaux types de date sont TDate et TDateTime :
TDate représente une date sous la forme AAAA, MM et JJ
TDateTime représente la date et l'heure sous la forme AAAA, MM, JJ, HH, MM, SS, mSS.

Ces types disposent d'une propriété Val qui est un double définit comme suit : sa partie entière correspond au nombre
de jours écoulés depuis le 30/12/1899, sa partie décimale (nulle dans le cas d'un TDate) correspond au nombre d'heures
(ramené à 24) depuis minuit.

Pour bénéficier des fonctions et méthodes spécifiques à ces types, il vous faudra inclure DateUtils.hpp.

TDate date1, date2, date3;


TDateTime date4;

date1 = Yesterday(); // renvoie le jour précédent


date2 = Date(); // renvoie le jour actuel
date3 = Tomorrow(); // renvoie le jour suivant
date4 = Now(); // renvoie la date et heure courante

Pour une gestion du temps, vous pouvez utiliser le type TTime qui représente un temps sous la forme HH, MM, SS
et mSec.

TTime time = EncodeTime(15, 10, 54, 0);


// time vaut 15h10'54"

Comment encoder/décoder une date ou un temps ?


Auteurs : Psl , Ricky81 ,
Pour affecter une date à une variable de type TDate ou TDateTime, vous pouvez utiliser la fonction EncodeDate.

TDate date;
date = EncodeDate(annee, mois, jour); // les paramètres sont des entiers

Pour extraire des informations à partir d'une date, il suffit d'utiliser la fonction DecodeDate : le code suivant initialise
les variables annee, mois et jour.

WORD annee, mois, jour;


date = Date();
DecodeDate(date, annee, mois, jour);

Des fonctions similaires sont disponibles pour la gestion du temps :

TDateTime __fastcall EncodeTime(Word Hour, Word Min, Word Sec, Word MSec);
void __fastcall DecodeTime(const System::TDateTime DateTime, Word &Hour, Word &Min, Word &Sec,
Word &MSec);

- 76 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Enfin, à noter les fonctions EncodeDateTime et DecodeDateTime pour la gestion simultanée de la date et de l'heure.

Comment savoir si une date ou un temps est valide ?


Auteurs : Ricky81 ,
Pour savoir si une date est valide, utilisez la fonction IsValidDate.
Pour le cas d'un temps, utilisez la fonction IsValidTime.

bool bonneDate, bonneHeure;


bonneDate = IsValidDate(annee, mois, jour);
bonneHeure = IsValidTime(heure, minute, seconde, milliseconde);

Il s'agit ici de vérifier qu'à partir des différentes valeurs constituant la date/heure, on construit bien une date/heure
valide.

Comment changer la date/heure du PC ?


Auteurs : Nono40 , Ricky81 ,
Pour modifier l'heure et la date du PC il faut utiliser la fonction API SetSystemTime. Or cette fonction demande une
heure absolue. La fonction suivante permet de mettre à l'heure le PC en fonction des décalages horaires et de l'heure
d'été :

bool __fastcall miseHeure(TDateTime dateHeure)


{
TSystemTime *infos = new TSystemTime;
TTimeZoneInformation *zone = new TTimeZoneInformation;
int retour;

// recherche des informations sur les décalages locaux


retour = GetTimeZoneInformation(zone);
// passage à l'heure absolue
switch (retour)
{
case TIME_ZONE_ID_UNKNOWN :
dateHeure = dateHeure + (zone->Bias / (24.*60.));
case TIME_ZONE_ID_STANDARD :
dateHeure = dateHeure + ((zone->Bias + zone->StandardBias) / (24.*60.));
case TIME_ZONE_ID_DAYLIGHT :
dateHeure = dateHeure + ((zone->Bias + zone->DaylightBias) / (24.*60.));
}
// mise à l'heure du Pc (les droits sont nécessaires)
infos->wYear = YearOf(dateHeure);
infos->wMonth = MonthOf(dateHeure);
infos->wDayOfWeek = DayOfWeek(dateHeure);
infos->wDay = DayOf(dateHeure);
infos->wHour = HourOf(dateHeure);
infos->wMinute = MinuteOf(dateHeure);
infos->wSecond = SecondOf(dateHeure);
infos->wMilliseconds = MilliSecondOf(dateHeure);

return SetSystemTime(infos);
}

Sans oublier un :

- 77 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

#include <DateUtils.hpp>

Comment chronométrer avec une précision d'une milliseconde ?


Auteurs : doudouallemand ,
Vous pouvez utiliser pour cela la méthode GetTickCount, qui vous renvoie un entier, en millisecondes, correspondant
au temps écoulé depuis que l'ordinateur est allumé.

void TestGetTickCount()
{
int start, stop, lap;
//déclaration d'entier pour récupérer les valeurs renvoyees par GetTickCount()
start = GetTickCount();
//start contient alors la durée écoulé, en millisecondes, depuis que l'ordinateur est allumé
lap = GetTickCount() - start; //utilisation de la variable lap pour un temps intermédiaire
stop = GetTickCount() - start; //stop contient le temps écoulé depuis l'affectation de start
}

- 78 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Gestion du temps > Opérations sur les dates/heures


Comment additionner ou soustraire des jours à une date ?
Auteurs : Psl , Ricky81 ,
Pour ajouter ou soustraire un nombre de jours à une date, on peut utiliser plusieurs méthodes :

En utilisant directement la date :

TDateTime date1;
int nbJours;

date1 = EncodeDate(2002, 11, 1);


date1 = date1 + nbJours;

La variable nbJours peut bien évidemment être positive ou négative.

En utilisant des fonctions (n'oubliez pas d'inclure le fichier DateUtils.hpp) :

TDateTime date1;
int nbJours;

date1 = EncodeDate(2002, 11, 1);


date1 = IncDay(date1, nbJours);

Ici aussi, la variable nbJours peut être positive ou négative.


On peut également avoir recours aux fonctions IncWeek(), IncMonth(), et IncYear().

En utilisant le jour Julien (n'oubliez pas d'inclure le fichier DateUtils.hpp) :

TDateTime date1;
Word Annee, Mois, Jour, Heure, Minute, Seconde, milliSec;
double jourJul;

date1 = EncodeDateTime(annee, mois, jour, heure, minute, seconde, milliSec);


jourJul = DateTimeToJulianDate(date1) + nbJours;
date1 = JulianDateToDateTime(date1);

nbJours peut être positif ou négatif, mais il peut également être un réel pour permettre d'agir également sur l'heure.

Remarque : La variable jourJul est entière lorsque l'heure est à 12h00'00'.

Comment calculer le nombre de jours entre deux dates ?


Auteurs : Psl , Ricky81 ,
Pour calculer la différence entre deux dates, on peut utiliser plusieurs méthodes :

En utilisant directement les dates :

TDateTime date1, date2;


// initialisation avec EncodeDate par exemple

- 79 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

double diff = date2 - date1;

En utilisant des fonctions (n'oubliez pas d'inclure le fichier DateUtils.hpp) :

TDateTime date1, date2;


// initialisation avec EncodeDate par exemple

int nbJours = DaysBetween(date1, date2);

nbJours correspond au nombre entier de jours séparant les 2 dates.

En utilisant le jour Julien (n'oubliez pas d'inclure le fichier DateUtils.hpp) :

TDateTime date1, date2;


// initialisation avec EncodeDate par exemple

double diff = DateTimeToJulianDate(date2)-DateTimeToJulianDate(date1);

Dans les exemples 1 et 3, diff est bien plus précis qu'une différence de date puisqu'il intègre également l'heure. Ainsi,
sur l'exemple suivant, on obtiendra une valeur légèrement inférieure à 3 :

TDateTime date1, date2;

date1 = EncodeDateTime(2002, 1, 1, 1, 1, 1, 2);


date2 = EncodeDateTime(2002, 1, 4, 1, 1, 1, 1);
double diff = date2 - date1;

Comment calculer le numéro de jour dans l'année d'une date ?


Auteurs : Psl , Ricky81 ,
Le rang du jour de l'année est renvoyé par la fonction DayOfTheYear().
Pour l'utiliser, il vous faut inclure "DateUtils.hpp"

TDateTime date1;
int numeroJ;

date1 = Now();
numeroJ = DayOfTheYear(date1);

Comment calculer le numéro de semaine dans l'année d'une date ?


Auteurs : Psl , Ricky81 ,
Le numéro de la semaine dans l'année est renvoyé par la fonction WeekOfTheYear().
Pour l'utiliser, il vous faut inclure "DateUtils.hpp"

TDateTime date1;
int numeroS;

- 80 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

date1 = Now();
numeroS = WeekOfTheYear(date1);

Comment calculer le jour de la semaine pour une date ?


Auteurs : Psl , Ricky81 ,
Le numéro de la semaine est renvoyé par la fonction DayOfTheWeek().
Pour l'utiliser, il vous faut inclure "DateUtils.hpp"

TDateTime date1;
int jourSemaine;

date1 = Now();
jourSemaine = DayOfTheWeek(date1);

- 81 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Gestion du temps > Dates particulières


Comment calculer la date de Pâques ?
Auteurs : Psl , Ricky81 ,
Le dimanche de Pâques correspond au premier dimanche suivant la première pleine lune du printemps.
La fonction ci-dessous calcule le jour de Pâques pour les dates comprises entre 1583 et 4099.

TDateTime __fastcall Paques(int annee)


{
int Y,G,C,X,Z,D,E,N,P,J,M;

// Algorithme valable pour les dates comprises entre 1583 et 4099


Y = annee;
G = (Y % 19) + 1;
C = (int)(Y/100) + 1;
X = (int)(3 * C / 4) - 12;
Z = (int)((8 * C) + 5) / 25 - 5;
D = (int)((5 * Y) / 4) - X - 10;
E = ((11 * G)+ 20 + Z - X) % 30;

if (((E == 25) && (G > 11)) || (E == 24))


{
E++;
}

N = 44 - E;
if (N <= 21)
{
N += 30;
}
P = N + 7 - ((D + N) % 7);
if (P > 31)
{
J = P - 31;
}
else
{
J = P;
}
if (J == P)
{
M = 3;
}
else
{
M = 4;
}
return EncodeDate(annee, M, J);
}

Comment savoir si une année est bissextile ?


Auteurs : Psl , Ricky81 ,
Pour qu'une année soit bissextile, il suffit qu'elle soit un multiple de 4, sans être un multiple de 100 sauf si elle est
multiple de 400. Les années 1700, 1800 et 1900 ne sont pas bissextiles alors que 2000 est bissextile. On trouve également
la fonction IsInLeapYear(const TDateTime) qui renvoie un booléen.
Pour l'utiliser, il vous faut inclure "DateUtils.hpp"

- 82 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

TDate maDate;
maDate = EncodeDate(2004, 12, 35);
if (IsInLeapYear(maDate))
{
ShowMessage("C'est une année bissextile.");
}
else
{
ShowMessage("Ce n'est pas une année bissextile.");
}

Comment convertir une date julienne en date grégorienne ?


Auteurs : Psl , Ricky81 ,
Pour convertir une date au format Julien vers le format Grégorien, il suffit de faire appel à la fonction
JulianDateToDateTime().
Pour l'utiliser, il vous faut inclure "DateUtils.hpp"

double jourJulien; // à initialiser à une valeur


TDateTime date1;

date1 = JulianDateToDateTime(jourJulien);

Comment convertir une date grégorienne en date julienne ?


Auteurs : Psl , Ricky81 ,
Pour convertir une date au format Grégorien vers le format Julien, il suffit de faire appel à la fonction
DateTimeToJulianDate().
Pour l'utiliser, il vous faut inclure "DateUtils.hpp"

double jourJulien;
TDateTime date1;
Word annee, mois, jour, heure, minute, seconde;

date1 = EncodeDateTime(annee, mois, jour, heure, minute, seconde, 0);


jourJulien = DateTimeToJulianDate(date1);

Attention : Pour que le résultat de la fonction DateTimeToJulianDate() retourne une valeur juste, il faut que la date soit
strictement supérieure au 15/10/1582 00:00:00 (début du calendrier Grégorien). Avant cette date, il manque le décalage
de 10 jours entre les deux calendriers. Pour les dates strictement inférieures au 5 octobre 1582, il suffit de rajouter
10 au résultat de la fonction. On ne peut pas calculer les jours Juliens des dates du 5 au 14 octobre 1582 puisqu'elles
n'existent pas.

- 83 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface

- 84 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Gestion de l'exécution


Comment exécuter des commandes ?
Auteurs : Geronimo ,
Pour cela, utilisez la fonction system, déclarée dans stdlib.h, qui prend pour argument la commande à exécuter :

#include <stdlib.h>
//...
system("dir *.*");

Comment exécuter une commande et en récupérer le résultat ?


Auteurs : Geronimo ,
Pour récupérer le résultat de l'exécution d'une commande, il suffit d'utiliser la fonction system, définie dans stdlib.h,
pour lancer une commande, et de spécifier une redirection de sortie (celles-ci fonctionnent aussi bien sous DOS/Windows
que sous Linux) :

#include <stdlib.h>

// Version DOS/Windows :
system("dir *.* > results.txt");

// Version Linux :
/* L'option -l permet d'avoir les détails
des fichiers */
system("ls -l > results");

Le résultat de la commande se situe maintenant dans le fichier results.txt ou results.

Comment exécuter un programme externe ?


Auteurs : Geronimo ,
Utilisez la fonction ShellExecute.
Pour lancer Notepad, par exemple :

ShellExecute(NULL, // Handle de la fenêtre parent


"open", // Action à effectuer
"notepad.exe", // Fichier
"", // Paramètres
"", // Répertoire par défaut
SW_SHOWDEFAULT // Manière d'afficher
);

Attention, les chaînes passées en arguments de cette fonction sont des chaînes C standard. Pour passer des AnsiString
en arguments, utilisez la méthode c_str() :

// Affiche une boîte de dialogue "Ouvrir un fichier" et ouvre le fichier avec notepad.
if (OpenDialog1->Execute())
{

- 85 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

ShellExecute(NULL, // Handle de la fenêtre parent


"open", // Action à effectuer
"notepad.exe", // Fichier
OpenDialog1->FileName.c_str(), // Paramètres
ExtractFilePath(OpenDialog1->FileName).c_str(), // Répertoire par défaut
SW_SHOW // Manière d'afficher
);
}

Comment récupérer les arguments de la ligne de commande passés à mon exécutable ?


Auteurs : Geronimo ,
Cela peut être effectué grâce aux fonctions ParamCount() et ParamStr(), la seconde prenant en argument le numéro
de l'argument.
Dans l'exemple suivant, nous chargeons dans un TMemo le fichier placé en argument de la ligne de commande. Placez
le code suivant dans le constructeur de votre fiche :

if ( ParamCount() > 0 )
Memo1->Lines->LoadFromFile(ParamStr(1));

Comment générer une alerte à destination de l'utilisateur ?


Auteurs : Geronimo ,
Il est souvent utile d'avertir l'utilisateur par un message rapide, pour lui faire part d'une information ou pour lui signaler
une erreur. Il existe différentes méthodes. Les plus simples et les plus utiles sont ShowMessage et MessageDlg.
ShowMessage permet d'afficher un message tout simple dans une fenêtre. Elle prend pour argument une AnsiString
qui est le contenu du message.

ShowMessage("Tâche effectuée");

L'autre méthode, plus perfectionnée, est MessageDlg. Cette fonction permet de personnaliser un peu la boîte de
dialogue :

MessageDlg("La tâche a été effectuée correctement", mtInformation, TMsgDlgButtons() << mbOK, 0);

Cette fonction permet d'afficher un message (AnsiString passée en premier argument). Le second argument indique
le type de boîte de dialogue. mtInformation affiche une icône "information" dans la boîte de dialogue. Enfin, l'avant-
dernier argument permet de choisir quels boutons seront disponibles dans la boîte de dialogue. Le dernier argument
permet de lier la boîte de dialogue à une rubrique d'aide. Un des grands avantages de cette fonction est qu'elle permet
de savoir quel bouton a été enfoncé s'il y en avait plusieurs :

if (MessageDlg("Le document n'a pas été sauvegardé, voulez-vous le sauvegarder avant de quitter ?",
mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes)
Sauver();

- 86 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Dans ce code, la méthode Sauver est appellée si le bouton Oui est cliqué. Pour plus de détails sur le fonctionnement de
MessageDlg, consultez l'aide de C++Builder.

Comment faire pour qu'un traitement long ne fige pas l'application ?


Auteurs : Geronimo ,
Lors d'un traitement long, l'application ne traite plus les messages Windows de la queue de messages.
Le résultat est en général une aplication qui ne répond plus aux évenements utilisateurs, ou qui ne se redessine plus.
Dans ce cas, il faut faire un appel à la méthode ProcessMessages de la classe Application dans la boucle. L'exemple
présenté ci-dessous déclenche une tâche ininterrompue lors du clic sur un bouton. Nous dessinons un quadrillage par
rebonds successifs du pinceau sur les bords de la fenêtre. Déclarons tout d'abord une variable Stop en global :

//...
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool Stop; /* Placez la variable ici */
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//...
}

Maintenant, nous allons écrire le gestionnaire d'évènements OnClick du bouton de dessin.

void __fastcall TForm1::Button1Click(TObject *Sender)


{
static int x_inc = 1; // Incrémentation d'abscisse
static int y_inc = 1; // Incrémentation d'ordonnée
static int X = 10; // Position initiale (abscisse)
static int Y = 10; // Position initiale (ordonnée)

Stop = false; // La boucle est activée.


/* Le seul moyen d'arrêter la boucle est
de positionner la variable Stop à true */
while(!Stop)
{
Canvas->MoveTo(X, Y); // Placement du pinceau en (X, Y)
X += x_inc; // Incrémentation des positions
Y += y_inc;
// Change la couleur de la ligne aléatoirement
Canvas->Pen->Color = RGB(rand()%255, rand()%255, rand()%255);
Canvas->LineTo(X, Y); // Ligne jusqu'à la nouvelle position

/* Si la position du pinceau sort de la zone cliente


de la fenêtre, on inverse les incrémentations, ce qui donne
l'effet de "rebond" */
if (X > ClientWidth || X < 0) x_inc = -x_inc;
if (Y > ClientHeight || Y < 0) y_inc = -y_inc;

/* L'appel à cette méthode évite le blocage de l'application :


les messages et clics sur autres boutons sont traités */
Application->ProcessMessages();
}
}

- 87 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Maintenant, il nous faut pouvoir arrêter cette boucle dessin. Pour cela, nous avons vu qu'il suffit de placer la variable
Stop à true. Placez un autre bouton sur la fiche. Dans son gestionnaire d'évènements OnClick, placez le code suivant :

void __fastcall TForm1::Button2Click(TObject *Sender)


{
Stop = true;
}

Si un clic sur le bouton a lieu, il sera traité par l'appel à Application->ProcessMessages(). Enfin, il faut pouvoir quitter
le programme. Pour cela, utilisez l'évènement OnCloseQuery de la fiche et placez-y également le code Stop = true.

Comment faire une courte pause de quelques millisecondes ou secondes ?


Auteurs : Geronimo ,
Utilisez la fonction Sleep en lui passant en argument le nombre de millisecondes.

// Pause d'une seconde :


Sleep(1000);

Notez qu'en raison du fonctionnement interne de Windows, Sleep ne garantit qu'un minimum d'attente. En effet,
Windows n'est pas un système temps-réel.

- 88 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Applications GUI


Comment faire pour qu'une application ne soit pas listée dans la barre des tâches ?
Auteurs : Geronimo ,
La fonction SetWindowLong permet de changer les attributs d'une fenêtre. Utilisez donc cette fonction, en lui passant
le Handle de l'application :

SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);

Comment faire un programme dont la fenêtre reste cachée ?


Auteurs : Geronimo ,
La classe TApplication comporte une propriété, ShowMainForm, qui permet de ne pas afficher la fiche principale. Il
suffit de la positionner à true. Pour cela, éditez le fichier principal du projet et rajoutez la ligne suivante :

Application->ShowMainForm = false;

Vous devez obtenir la fonction WinMain suivante :

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)


{
try
{
Application->Initialize();
Application->ShowMainForm = false; // <-- ICI
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}

Comment modifier le titre de l'application de la barre des tâches ?


Auteurs : Geronimo ,
Le texte affiché dans la barre des tâches est la chaîne membre Title de la classe TApplication :

- 89 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Application->Title = "Nouveau titre !";

Comment accéder à des fonctions ou variables d'une fiche à partir d'une autre fiche ?
Auteurs : Geronimo ,
Pour accéder aux membres de Form2 à partir de Form1, il vous faut inclure le fichier Unit2.h dans Unit1.h, ce que vous
pouvez faire à l'aide de Fichier | Inclure l'en-tête d'unité et en double-cliquant sur Unit2.

- 90 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Applications GUI > Aide


Comment afficher des bulles d'aide (hint) ?
Auteurs : Geronimo ,
Un Hint est une petite bulle qui s'affiche lorsque l'utilisateur laisse le curseur pendant un certain temps au-dessus d'un
contrôle. Dans cette bulle, il est possible de donner plus d'informations sur le contrôle. Les informations placées dans
le Hint ne doivent pas être trop longues : il faut que l'utilisateur puisse les lire très rapidement.
Cependant, elles doivent apporter des précisions. Si vous avez un bouton Connecter dans un client FTP, évitez de placer
dans le hint Se connecter ; placez plutôt : Connexion au serveur FTP

Pour que les bulles d'aide apparaissent dans une fiche, positionnez la propriété ShowHint de celle-ci à true. Pour que
les hints apparaissent dans toute l'application, vous pouvez placer le code suivant dans le constructeur de votre fiche
principale :

Application->ShowHint = true;

Ne négligez pas les bulles d'aide, c'est la première niveau d'aide pour l'utilisateur et un bon fichier d'aide ne les remplace
pas. (quand vous cherchiez un composant dans la palette de C++ Builder, ne vous êtes-vous jamais aidé des bulles
d'aide ?)

Comment changer la couleur des bulles d'aide (hint)?


Auteurs : Geronimo ,
Utilisez le code suivant dans le constructeur de la fiche principale :

Application->HintColor = clBlue;

ou bien pour avoir des couleurs plus personnalisées, utilisez le code hexadécimal

Application->HintColor = 0x00CCD9E1; // Couleur sable

Pour le code hexadécimal, les trois premiers octets (de droite à gauche) représentent les couleur Rouge, Vert et Bleu.
Ainsi, 0x00FF0000 correspondra à un bleu intense, 0x0000FF00 à un vert intense et enfin 0x000000FF à un rouge
intense. L'octet de poids fort (les deux premiers 0 de gauche) concerne les palettes de couleurs (cf l'aide de C++ Builder
sur TColor).

Comment afficher les hints dans la barre de statut ?


Auteurs : Geronimo ,
Pour afficher un texte dans la barre de statut, il y a deux solutions. La première est extrêmement simple à mettre en
oeuvre mais ne donne pas autant de liberté que la seconde :
• Placez une barre de statut dans votre fiche. Positionnez sa propriété AutoHint à true. La barre de statut affichera
les hints de chaque composant ou menu lorsqu'ils seront sélectionnés. Cet affichage se fera soit dans le premier
Panel de la barre de statut, soit dans le SimplePanel, si cette option est activée.

- 91 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

• Si vous souhaitez afficher ce hint dans une autre partie de la barre de statut, il faut écrire le gestionnaire
d'évènements correspondant. Dans le fichier en-tête de votre fiche principale (Unit1.h), dans la classe TForm1,
déclarez la fonction suivante qui sera le gestionnaire d'évènements :

void __fastcall AfficherConseil(TObject *Sender);

Implémentez ensuite la fonction. Elle affichera dans le Panel de la barre de statut le hint en cours de l'application :

void __fastcall TForm1::AfficherConseil(TObject *Sender)


{
// Attention, vous devez avoir au moins deux Panels dans votre barre d'état
StatusBar1->Panels->Items[1]->Text = Application->Hint;
}

Vous pouvez bien sur remplacer ce code si vous souhaitez que le hint s'affiche autre part (mais la barre de statut
existe dans ce but). Enfin, dans le constructeur de votre fiche, nous attribuons cette fonction comme gestionnaire de
l'évènement OnHint de l'application :

__fastcall TForm1::TForm1(TComponent* Owner)


: TForm(Owner)
{
Application->OnHint = AfficherConseil;
}

Comment créer des fichiers d'aide avec Borland C++ Builder ?


Auteurs : Geronimo ,
Les liens ci-dessous vous permettront de découvrir certains des moyens de création d'aide.

lien : Télécharger HTML Help Worlshop


lien : Création fichier aide

- 92 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Applications GUI > Interface


Comment ajouter un élément au menu système ?
Auteurs : Geronimo ,
Le menu système est le menu accessible en cliquant sur l'icône en haut à gauche d'une fenêtre. Il est possible de modifier
ce menu . Pour lui ajouter un élément, deux phases sont nécessaires : tout d'abord, ajouter a proprement parler un
élément au menu système, ensuite lui attribuer un gestionnaire d'évènements.
Voici donc le code qui va créer un nouvel élément de menu :

// Obtention du Handle du menu système


HMENU HandleMenuSysteme = GetSystemMenu(Handle, FALSE);

// Insertion de l'élément dans le menu


AppendMenu(HandleMenuSysteme, MF_STRING, MON_ELEMENT_MENU, "Mon élément personnalisé");

Avec ce code, nous allons ajouter cet élément au menu. Pour cela, nous avons besoin du Handle du menu système (un
pointeur sur ce menu). Nous faisons donc appel à la fonction GetSystemMenu. Pour l'ajouter au menu, nous utilisons la
fonction AppendMenu, qui ajoute un élément à la fin d'un menu. En premier argument, nous lui passons le Handle du
menu système, en second, le type d'élément qui va être rajouté : une chaîne. Notez seulement que le troisième argument
est une constante, MON_ELEMENT_MENU, que vous définissez, par exemple dans votre classe fiche :

const int MON_ELEMENT_MENU = 1;

Remarquez que nous aurions pu utiliser également un #define MON_ELEMENT_MENU 1 mais que notre code à
l'avantage de s'intégrer totalement dans le C++.
A ce stade, si vous lancez le programme, vous pourrez constater qu'un nouvel élément apparait dans le menu système.
Il s'agit maintenant de savoir quand l'utilisateur clique sur cet élément et de gérer ce clic. Pour cela, nous allons créer
une fonction-gestionnaire d'évènements qui sera appelée lorsque le message WM_SYSCOMMAND sera déclenché par
Windows, c'est-à-dire quand l'utilisateur cliquera sur un élément du menu système. Il faut donc déclarer notre fonction
comme gestionnaire de messages WM_SYSCOMMAND, grâce au code suivant qu'il faut placer dans la classe TForm1,
dans la section public :

BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, WMCommandeMenuSysteme)
END_MESSAGE_MAP(TForm)

Grâce à ce code, la fonction WMCommandeMenuSysteme sera appelée lorsque l'utilisateur cliquera sur un élément
du menu système. Créons donc cette fonction, sans oublier de la déclarer dans le fichier en-tête, le code précédent ne
faisant pas office de déclaration :

void TForm1::WMCommandeMenuSysteme(TMessage & Msg)


{
if (Msg.WParam == MON_ELEMENT_MENU)
{
ShowMessage("On a cliqué sur notre élément de menu");
Msg.Result = true;
}
else
{
TForm::Dispatch(&Msg);
}
}

- 93 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Dans cette fonction, deux cas se présentent : soit le message provient de notre élément menu système et nous devons
le gérer, soit c'est un autre élément : dans ce cas, nous passons la main à la fonction Dispatch de la classe TForm afin
qu'elle le gère. Si nous oublions ce second cas, seul notre élément fonctionnera. La différenciation des deux cas se fait
grâce à notre constante MON_ELEMENT_MENU.

Comment changer l'icône de mon application ?


Auteurs : Geronimo ,
Pour changer l'icône de votre programme, utilisez Projet/Options.... Allez dans l'onglet Application et en cliquant sur le
bouton Charger icône..., vous pourrez charger une nouvelle icône qui doit être au format.ico. Si vous souhaitez dessiner
une nouvelle icône, utilisez l'éditeur d'images disponible dans le menu Outils de l'IDE.

Comment désactiver le bouton de fermeture d'une fenêtre ?


Auteurs : Neo41 ,
Le code suivant permet de désactiver le bouton Close d'une fenêtre, en retirant le menu correspondant du menu système.
L'appel à SetWindowPos permet de prendre en charge les modifications apportées à la fiche.

HMENU hmenu;
hmenu = GetSystemMenu(this->Handle, false);
if (hmenu != NULL)

RemoveMenu(hmenu, SC_CLOSE, NULL);


}
SetWindowPos(this->Handle, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |
SWP_DRAWFRAME);

Toutefois faites attention au fait que cette méthode n'empêche pas la fermeture de la fenêtre avec la combinaison
ALT+F4 ou l'option Fermer (clic droit sur l'icône de la fiche dans la barre de tâches). Pour empêcher la fermeture
d'une fenêtre, voyez le lien donné ci-dessous.

lien : Comment empêcher qu'une fiche soit fermée ?


lien : Comment ajouter un élément au menu système ?

Comment empêcher le déplacement d'un TForm ?


Auteurs : Neo41 ,
Le code suivant permet d'empêcher qu'une TForm soit déplacée avec la souris en cliquant sur la barre de titre, en
retirant la commande Déplacer du menu système de la fiche. L'appel à SetWindowPos permet de prendre en charge les
modifications apportées à ce menu.

HMENU hmenu;
hmenu = GetSystemMenu(this->Handle, false);
if (hmenu != NULL)
{
RemoveMenu(hmenu, SC_MOVE, NULL);
}

- 94 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

SetWindowPos(this->Handle, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |


SWP_DRAWFRAME);

lien : Comment ajouter un élément au menu système ?

Comment empêcher qu'une fiche soit fermée ?


Auteurs : Neo41 , JEG ,
Cette solution permet d'empêcher la fermeture d'une fiche via les moyens classiques (bouton Close dans la barre de
titre, option Fermer dans le menu système de la fenêtre). C'est ainsi à l'utilisateur d'implémenter son propre code et sa
propre gestion pour autoriser cette fermeture (par exemple, saisie d'un mot de passe avant de pouvoir fermer).
Lorsqu'une fenêtre est fermée, les évènements suivants sont appelés dans l'ordre:
• OnCloseQuery
• OnClose
• OnDestroy

L'évènement OnDestroy n'est appelé que lorsque la fenêtre est détruite réellement. En fait, appeler la méthode Close
sur une fiche ne la détruit pas mais la cache uniquement. Pour détruire la fenêtre il faut agir sur le paramètre Action
dans l'évènement OnClose.
Pour intercepter la demande de fermeture d'une fiche il faut implémenter l'évènement OnCloseQuery de la façon
suivante:

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)


{
// Série de vérifications pour savoir si la fermeture est autorisée
// Par exemple afficher une fiche demadant la saisie d'un mot de passe
...

// Le mot de passe est erroné, alors pas de fermeture


if (condition)
{
CanClose = false; // Empêcher la fermeture
}
}

Comment supprimer les boutons Maximize, Minimize et Close dans la barre de titre d'une fenêtre ?
Auteurs : Neo41 ,
Pour supprimer les boutons Maximize, Minimize ou Close d'une fenêtre, il faut agir sur la propriété BorderIcons de
la forme.
• Pour supprimer les trois boutons et le menu système, il faut mettre biSystemMenu à false
• Pour désactiver seulement le bouton Maximize, il faut mettre biMaximize à false
• Pour désactiver seulement le bouton Minimize, il faut mettre biMinimize à false

- 95 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Il n'est pas possible de supprimer le bouton Close indépendamment des autres. En revanche, il est possible de le
désactiver (lien ci-dessous).

lien : Comment désactiver le bouton de fermeture d'une fenêtre ?

Comment faire un splash screen pour une application ?


Auteurs : Geronimo ,
Un splash screen est un écran qui est affiché pendant le chargement d'un logiciel (l'image que vous voyez quand vous
démarrez C++Builder par exemple).
Pour en afficher un pendant le démarrage de votre programme, créez une nouvelle fiche (Fichier | Nouvelle fiche),
positionnez sa propriété BorderStyle à bsNone et FormStyle à fsStayOnTop. Nommez votre fiche Splash_dlg. Utilisez
les options (Projet | Options) pour ne pas créer la fiche automatiquement au démarrage. Ensuite, affichez la fonction
WinMain de votre projet (Fichier | Voir le source). Avant les instructions Application->CreateForm(/*...*/), placez le
code suivant :

Splash_dlg=new TSplash_dlg(NULL); // Crée la fiche dynamiquement


Splash_dlg->Show(); // Affiche la fiche
Splash_dlg->Repaint(); // Pour afficher son contenu

Après les instructions Application->CreateForm(/*...*/), placez le code suivant :

delete Splash_dlg; // Supprime la fiche et libère la mémoire utilisée

Ainsi, la fiche splash screen sera affichée pendant la création des autres fiches.
N.B. N'oubliez évidemment pas d'inclure le .h de votre Splash_Form dans le module principal de votre application.

Comment faire une application en plein écran ?


Auteurs : Geronimo ,
Utilisez le code suivant :

BorderStyle = bsNone;
Left = 0;
Top = 0;
Width = Screen->Width;
Height = Screen->Height;

BorderStyle = bsNone permet de faire disparaître la barre de titre. Les deux lignes suivantes sont aisément
compréhensibles, n'oubliez pas que nous sommes dans une classe fiche, donc que Left et Top sont les positions de la
fiche. Enfin, il suffit de faire coïncider la largeur et la hauteur de la fiche avec celle de l'écran, ce que font nos deux
dernières lignes. Bien sûr, ce code se place dans le constructeur de votre fiche, ou dans l'évènement OnCreate.

- 96 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Evitez tout de même de mettre une application qui n'en a pas besoin en plein écran !

Comment créer un lien mail dans une application ?


Auteurs : Geronimo ,
Utilisez la fonction ShellExecute de la manière suivante :

ShellExecute (Handle, "open", "mailto:adresse@provider.ex?


subject=Titre_du_message&body=Corps du message", 0, 0, SW_SHOWNORMAL);

Comment créer un lien web dans une application ?


Auteurs : Geronimo ,
Utilisez la fonction ShellExecute de la manière suivante :

ShellExecute (Handle, "open", "http://www.google.com", 0, 0, SW_SHOWNORMAL);

Comment appliquer une ouverture progressive lors de l'appel d'une fenêtre ?


Auteurs : blondelle , Nono40 ,
Pour animer l'apparition d'une fenêtre, il faut utiliser la méthode AnimateWindow :

int typeAnimate = 1;
TForm* Form2 = new TForm(NULL);
Form2->Show();
Form2->Hide();
// Animation de la fenêtre
AnimateWindow(Form2->Handle, 1000, typeAnimate);
Form2->Close();
delete Form2;

Voici la liste des codes d'animation :


• 0 => rien ;
• 1 => de Gauche à droite ;
• 2 => de droite à gauche ;
• 3 => de Gauche à droite ;
• 4 => de haut en bas ;
• 5 => du coin haut gauche ;
• 6 => du coin haut droit ;
• 7 => du coin haut gauche ;
• 8 => du bas vers le haut ;
• 9 => du coin bas gauche ;
• 10 => du coin bas droit ;
• 11 => du coin bas gauche ;
• 12 => du haut vers le bas ;
• 13 => du coin haut gauche ;
• 14 => du coin haut droit ;

- 97 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

• 15 => du coin haut gauche.

- 98 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Applications console


Qu'est ce qu'une application console ?
Auteurs : Greybird ,
Une application console est une application non graphique. L'interface utilisateur est réduite à une simple fenêtre texte.
Les entrées et sorties standards (cin, cout, cerr) sont associées à cette fenêtre.
Notez bien qu'une application console est une application 32bits. Ce n'est donc pas une application DOS qui elle serait
16bits. Une application console ne fonctionnera que sous Windows.

Les programmes dits "console" ont-ils un intérêt ?


Auteurs : Geronimo ,
Il est vrai que sous Windows, les programmes consoles commencent à disparaître et les interfaces graphiques à prendre
de plus en plus d'importance.
Néanmoins, il existe des cas où un programme console est bien plus utile qu'un programme graphique, plus lourd.
Par exemple, beaucoup de petits utilitaires sont fournis sous la forme d'un exécutable console par Microsoft. C'est
notamment le cas pour un utilitaire permettant de scanner les PCs d'un réseau local pour déterminer quels sont ceux
qui n'ont pas installé telle ou telle mise à jour de sécurité.
Il est donc à votre charge de déterminer quel est le mode le plus approprié au programme que vous désirez réaliser.

Comment créer une application console ?


Auteurs : Greybird ,
Il vous suffit pour cela d'aller dans le menu Fichier | Nouveau | Autre et de sélectionner l'Expert Console.

Comment récupérer des handles sur les entrées/sorties standard d'une application console ?
Auteurs : Greybird ,
Pour utiliser les API Windows dans une application console, il est parfois nécessaire de posséder un Handle sur une
des entrées/sorties standards de celle-ci.
Cela se réalise au moyen de l'API GetStdHandle. Cette fonction prend pour unique paramètre :
• STD_INPUT_HANDLE : handle de l'entrée standard (cin)
• STD_OUTPUT_HANDLE : handle de la sortie standard (cout)
• STD_ERROR_HANDLE : handle de la sortie d'erreurs standard (cerr)

Ainsi, le code suivant récupère un handle sur la sortie standard de l'application console :

HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut != INVALID_HANDLE_VALUE)
{
// Utilisation du handle.

- 99 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

lien : Qu'est ce qu'un HANDLE ?

Comment utiliser des couleurs dans une application console ?


Auteurs : Greybird , Smortex ,
Les applications console n'ont pas l'obligation d'être ternes ! Vous pouvez utiliser les couleurs dans une application
console !
Le code suivant vous donne un exemple :

#include <Windows.hpp>
#include <iostream>
using namespace std;

// ...

HANDLE hOut;
CONSOLE_SCREEN_BUFFER_INFO csbiAncien;

hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut != INVALID_HANDLE_VALUE)
{
// on sauvegarde l'état de la console
GetConsoleScreenBufferInfo(hOut,&csbiAncien);

// on met le texte en bleu


SetConsoleTextAttribute(hOut,FOREGROUND_BLUE);
cout << "Ceci est en bleu\n";

// on met le texte en bleu


SetConsoleTextAttribute(hOut,FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << "Ceci est en jaune\n";

// on restaure l'état initial


SetConsoleTextAttribute(hOut,csbiAncien.wAttributes);
}

lien : Comment récupérer des handles sur les entrées/sorties standard d'une application console ?

- 100 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants

- 101 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Généralités et installation


Qu'est-ce que la VCL ?
Auteurs : Geronimo ,
La VCL (Visual Components Library) est une bibliothèque de composants visuels de Borland. C'est une hiérarchie de
classes représentant des composants visuels qui permet de concevoir rapidement des applications. Les composants que
vous voyez dans la palette de C++Builder appartiennent à la VCL. La VCL a été écrite en Pascal Object.

lien : Qu'est ce que la CLX ?

Qu'est ce que la CLX ?


Auteurs : Ricky81 ,
CLX (prononcez "clicks") signifie Component Library for Cross-Platform development. Cette librairie est apparue
avec les versions 5 de C++ Builder/Delphi et la sortie de Kylix. Elle est en général décrite de deux manières différentes.

Le discours commercial a fait qu'aux yeux de l'utilisateur lambda et d'un certain nombre de développeurs, la CLX est
la soeur jumelle de la VCL et est donc un ensemble de composants utilisables aussi bien sous Windows avec C++ Builder
(ou Delphi) que sous Linux avec Kylix. Certains vont même jusqu'à comparer la CLX avec la VCL et donc en limiter
la portée au sous-ensemble "composants visuels" et allant donc associer CLX et Qt.

Techniquement parlant, la CLX n'est en fait rien d'autre que le framework complet proposé par Delphi et C++ Builder.
La CLX n'est donc pas à comparer à la VCL puisque la VCL est l'un des éléments de la CLX. Et l'équivalent de la VCL
côté compatibilité multi-plateforme se nomme la Visual CLX et repose sur Qt.
La VCL ou la Visual CLX ne représentent que 9 unités, les autres éléments constitutifs de la CLX sont NetCLX
(composants Internet tel que Indy), BaseCLX (par exemple l'unité DataUtils) et DataCLX (Composants d'accès aux
données client tel que dbExpress).

lien : Qu'est-ce que la VCL ?


lien : Rappels sur la CLX et évolutions

Puis-je me passer des librairies Borland ?


Auteurs : Geronimo ,
C'est tout à fait possible. Le lien ci-dessous vous fournira des informations.

lien : Tutorial d'initiation à la programmation avec l'API Windows

Qu'est ce que TObject ?


Auteurs : Ricky81 ,
Le type TObject est l'ancêtre de tous les objets.
La notion d'héritage est essentielle dans l'organisation de la VCL/CLX et le TObject permet de factoriser les
comportements communs. Il gère de plus les aspects création/destruction, l'introspection (cf. la notion de RTTI), et la
gestion des messages.

Dans la hiérarchie on retrouve également les types TPersistent et TComponent qui proposent successivement un
enrichissement en méthodes et comportements. Jusqu'à arriver à TControl qui est l'ancêtre de tous les contrôles visibles
par l'utilisateur à l'écran lors de l'exécution et avec lesquels il peut interagir.

- 102 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Lorsque vous construisez vous même un nouveau composant visuel par exemple à partir de TControl, vous pouvez
choisir parmi les propriétés, méthodes et évènements du type TControl celles que vous souhaitez publier.

lien : Qu'est-ce que la VCL ?


lien : Qu'est ce que la CLX ?

Puis-je utiliser des composants écrits pour Delphi dans C++Builder ?


Auteurs : Geronimo ,
Oui, bien sur. La plupart des composants Delphi peuvent être compilés et fonctionnent avec C++Builder. Alors ne vous
limitez pas aux composants "C++Builder" quand vous téléchargez des composants. Notez que la VCL a été écrite en
Pascal Object !

Comment résoudre le problème de compilation "impossible de trouver l'unité DsgnIntf.dcu" ?


Auteurs : Geronimo ,
Cette erreur peut apparaitre quand vous compilez des composants Delphi qui ont besoin de cette unité. Pour résoudre
ce problème, allez dans le menu Projet | Modifier le fichier d'options. Descendez un peu pour voir le tag PFLAGS qui
devrait être ainsi :

<PFLAGS value="-$YD -$W -$O- -v -JPHNE -M"/>

Rajoutez-lui l'option : -LUvclX0, avec X votre numéro de version de C++ Builder. ce qui doit donner ceci :

<PFLAGS value="-$YD -$W -$O- -v -JPHNE -M -LUvclX0"/>

Comment installer un nouveau composant ?


Auteurs : Ricky81 ,
Dans le menu Composant | Installer un composant ... vous avez la possibilité de rajouter le composant dans un paquet
existant ou dans un nouveau paquet.

Dans les 2 cas il vous faudra renseigner le champ intitulé Nom d'unité pour y faire figurer le nom du fichier source
correspondant au composant.
Après validation, vous devriez avoir une nouvelle fenêtre listant pour le paquet selectionné les fichiers de composants
référencés ainsi que les dépendances. A partir de cette fenêtre vous pouvez gérer des ajouts ou retraits de composants
mais aussi compiler le paquet et installer les nouveaux composants. Le fonctionnement est identique à celui d'un projet
puisque vous avez par ailleurs accès dans le menu Projet aux commandes Make et Construire.

- 103 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Remarque : Pour accéder directement à un package de composants, vous pouvez également tout simplement ouvrir le
fichier .bpk correspondant, comme vous ouvrez un .bpr, par le menu Fichier | Ouvrir un projet ou Fichier | Réouvrir.

Comment installer la RxLib ?


Auteurs : Ricky81 ,
Consultez le tutoriel dont le lien figure ci-dessous.

lien : Guide d'installation de la Rxlib sous Borland C++ Builder 6

Comment importer un ActiveX ?


Auteurs : Ricky81 ,
Dans le menu Composant | Importer un contrôle ActiveX ... vous avez la possibilité d'importer un ActiveX dans un
paquet existant ou dans un nouveau paquet.

Pour ce faire, soit votre ActiveX est déjà enregistré dans la base de registre et figure donc dans la liste, soit il ne l'est
pas et vous pouvez l'ajouter en passant par le bouton Ajouter....
Après avoir sélectionné l'ActiveX, vous pouvez choisir la palette dans laquelle vous souhaitez le rendre disponible, le
répertoire accueillant l'unité qui sera créée, puis il ne vous reste plus qu'à cliquer sur le bouton Installer...

Une nouvelle fenêtre apparaît vous demandant de renseigner un paquet existant ou un nouveau paquet dans lequel
installer le composant obtenu.
Une fois le paquet choisi, tout ce passe comme lors de l'installation classique d'un composant.

Comment installer des composants Delphi dans C++ Builder 2006 ?


Auteurs : Neilos , pottiez ,
Que faut-il faire pour que les composants Delphi soient compatibles avec ceux de C++ Builder2006 ?
Compatible a partir de BDS 2006.
Pour que les composants Delphi soient compatibles, il faut, lors de la compilation du composant sous Delphi,
sélectionner l'option "Générer les fichiers C++ Builder" qui se trouve dans les options du package, onglet lieur.

- 104 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Les boutons


Comment rendre un TSpeedButton enfonçable ?
Auteurs : Geronimo ,
Pour résoudre ce problème, il faut que la propriété GroupIndex de votre TSpeedButton ne soit pas nulle.

Comment permettre à un groupe de TSpeedButton de n'avoir aucun bouton enfoncé ?


Auteurs : Geronimo ,
Il y a une propriété qui oblige au moins un des TSpeedButton à être enfoncé. Cette propriété est AllowAllUp. Positionnez-
là à true pour que votre TSpeedButton puisse revenir à sa position initiale.

Comment empêcher le clic sur un bouton ?


Auteurs : Geronimo ,
Utilisez la propriété Enabled des boutons. Par exemple :

Button1->Enabled = false;

Le bouton sera alors grisé.

Comment changer la couleur du texte d'un TButton ?


Auteurs : Geronimo ,
Le composant TButton ne permet pas de changer la couleur de la police. Il suffit de le remplacer par un TBitBtn (palette
Supplément), qui est un bouton plus perfectionné car plus personnalisable. Vous pouvez également placer un bitmap
dedans avec la propriété Glyph.

- 105 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Les listes


Comment utiliser un composant TListBox ?
Auteurs : Geronimo ,
Le composant TListBox est simple d'utilisation et pourtant très pratique. Quelques fonctions suffisent à l'utiliser. Placez
un composant TListBox sur votre fiche. Pour lui ajouter un élément (ligne), il suffit d'utiliser le code suivant :

AnsiString Texte;
// Texte =...;
ListBox1->Items->Add(Texte);

En fait, la classe TListBox contient une instance de la classe TStringList qui représente les lignes : Items. Donc pour
ajouter des éléments, nous utilisons les méthodes de Items. Pour ajouter un élément, on utilise la méthode Add de cette
liste Items, ce qui donne ListBox1->Items->Add(Texte). Ensuite, l'utilisation la plus classique est de regarder quel élément
a été cliqué si l'utilisateur double-clique dans la liste. Voici donc la fonction-gestionnaire d'évènements OnDblClick :

void __fastcall TForm1::ListBox1Click(TObject *Sender)


{
if (ListBox1->ItemIndex != -1)
{
if (ListBox1->Items->Strings[ListBox1->ItemIndex].LowerCase() == "auteur")
{
// Recherche par auteur
}
}
}

Tout d'abord, nous vérifions qu'un élement est bien sélectionné, grâce à ItemIndex qui est positionné à -1 si aucun
élément n'est sélectionné, sinon, une erreur de violation d'accès serait déclenchée car l'élément d'indice -1 n'existe pas.
Ensuite, pour accéder à un élément, nous utilisons toujours le membre Items, avec son membre Strings qui est le tableau
contenant les chaînes.

Comment sélectionner un élément par défaut dans un TComboBox ?


Auteurs : Geronimo , Alacazam ,
Utilisez la méthode IndexOf de la liste Items des éléments de TComboBox. Mettons que la liste contienne :
Comment vas-tu, Wie geht's, How are you, Como estas ...
Pour sélectionner le second élément, Wie geht's, utilisez le code suivant :

ComboBox1->ItemIndex = ComboBox1->Items->IndexOf("Wie geht's");

IndexOf retourne l'indice d'un élément et ItemIndex contient l'indice de l'élément sélectionné.

- 106 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

N.B. Si votre ComboBox autorise la saisie (Style = csSimple ou csDropDown), l'affectation à sa propriété Text d'une
chaîne de la liste aura le même effet. La méthode exposée ci-dessus prend tout son intérêt dans le cas csDropDoxnList
et les deux cas csOwner... .

lien : Comment empêcher la saisie dans un composant TComboBox ?

Comment empêcher la saisie dans un composant TComboBox ?


Auteurs : Alacazam ,
Lorsque vous souhaitez seulement permettre le choix dans un composant TComboBox et non la saisie, modifiez sa
propriété Style.

ComboBox1->Style = csDropDownList;

N.B. La valeur initiale de ce composant ne pouvant plus être initialisée par sa propriété Text, utilisez alors la méthode
décrite dans le lien ci-dessous

lien : Comment sélectionner un élément par défaut dans un TComboBox ?

Comment définir, modifier la largeur de la liste déroulante d'un ComboBox ?


Auteurs : Sunchaser , Pascal Jankowski ,
Pour définir la largeur de la liste déroulante d'un TComboBox, il faut intercepter l'évènement OnEnter de ce composant,
et utiliser le message CB_SETDROPPEDWIDTH.
Le code suivant montre comment envoyer ce message au TComboBox:

void __fastcall TForm1::ComboBox1Enter(TObject *Sender)


{
ComboBox1->Perform(CB_SETDROPPEDWIDTH, 200, 0);
}

Dans C++ Builder, dans le Menu : Aide | SDK Windows, on peut retrouver la définition de
CB_SETDROPPEDWIDTH ainsi que les messages s'appliquant au TComboBox - tels que CB_GETDROPPEDWIDTH
ou CB_SHOWDROPDOWN par exemple - de manière à bien voir les paramètres attendus et les valeurs renvoyées.

lien : Comment fixer automatiquement la largeur de la liste déroulante d'un ComboBox en fonction de l'item le plus
grand ?

Comment fixer automatiquement la largeur de la liste


déroulante d'un ComboBox en fonction de l'item le plus grand ?
Auteurs : Sunchaser ,
Pour que la liste déroulante d'un TComboBox se redimensionne automatiquement en fonction de son plus grand
élément, il faut réaliser un certain nombre d'opérations sur ce composant.
En premier lieu, il faut fixer sa propriété Style à csOwnerDrawVariable. Puis il faut implémenter l'évènement
OnDrawItem de façon à réaliser le dessin des éléments de cette liste :

- 107 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index, TRect &Rect,


TOwnerDrawState State)
{
TCanvas *pC = ComboBox1->Canvas;
pC->FillRect(Rect);
pC->TextOutA(Rect.Left + 2, Rect.Top, ComboBox1->Items->Strings[Index]);
}

Enfin, il faut implémenter l'évènement OnEnter afin de calculer la longueur des éléments et de positionner la largeur
de la liste déroulante :

void __fastcall TForm1::ComboBox1Enter(TObject *Sender)


{
TCanvas *pC = ComboBox1->Canvas;
int Base = 0, Final;
for (int i = 0; i < ComboBox1->Items->Count; i ++)
{
if (pC->TextExtent(ComboBox1->Items->Strings[i]).cx > Base)
{
Base = pC->TextExtent(ComboBox1->Items->Strings[i]).cx;
}
}
Final = Base + 7;
ComboBox1->Perform(CB_SETDROPPEDWIDTH, Final, 0);
}

lien : Comment définir, modifier la largeur de la liste déroulante d'un ComboBox ?

Comment utiliser le composant TListView ?


Auteurs : Geronimo ,
Nous allons voir comment utiliser le composant ListView, composant tel celui qui affiche la liste de vos fichiers dans
l'explorateur Windows.
Placez sur votre fiche un composant TListView, deux TEdit et un TButton. Lorsqu'on cliquera sur le bouton, une
nouvelle ligne sera ajoutée au ListView, avec dans la première colonne, le contenu d'Edit1 et dans la seconde colonne,
le contenu d'Edit2. Placez tout d'abord la propriété ViewStyle du composant ListView1 à vsReport. Cliquez sur celui-ci
avec le bouton droit, puis sur Editeur de colonnes. Dans la boîte de dialogue qui s'affiche, cliquez deux fois sur Ajouter
un nouveau. Cela fait, notre TListView a deux colonnes.
Ecrivons maintenant le gestionnaire d'évènements OnClick du bouton Button1.

void __fastcall TForm1::Button1Click(TObject *Sender)


{
TListItem *Item = ListView1->Items->Add();
Item->Caption = Edit1->Text;
Item->SubItems->Add(Edit2->Text);
}

- 108 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

On déclare un pointeur sur un TListItem. Un TListItem représente un élément de TListView. La méthode Add crée ce
nouveau TListItem et l'ajoute à ListView1. Ensuite, on attribue le contenu de Edit1 à la propriété Caption du nouvel
élément. Ensuite, on ajoute le contenu de Edit2 aux sous-éléments de Item.

Comment changer les couleurs d'une TListBox ?


Auteurs : Greybird , CGi ,
Il est possible de personnaliser facilement les couleurs d'un composant TListBox. Il suffit de passer sa propriété Style à
lbOwnerDrawFixed, et d'implémenter le gestionnaire d'évènement OnDrawItem, qui sera chargé d'effectuer le dessin
sur le contrôle.
En voici un exemple :

// on récupère le TListBox qui a lancé l'évènement, et son TCanvas


TListBox * pListBox = ((TListBox *)Control);
TCanvas * pCanvas = pListBox->Canvas;

// on met les lignes paires en fond jaune


if ((Index % 2)==0)
{
pCanvas->Brush->Color = clYellow;
}

// on met les lignes sélectionnées en jaune sur fond rouge


if(State.Contains(odSelected))
{
pCanvas->Brush->Color = clRed;
pCanvas->Font->Color = clYellow;
}

// on dessine le fond de la cellule


pCanvas->FillRect(Rect);

// on dessine le texte de la cellule


AnsiString Data = pListBox->Items->Strings[Index];
Rect.left += 2;
pCanvas->TextOut(Rect.Left,Rect.Top,Data);

Vous remarquerez que les deux premières lignes vous permettent d'utiliser le même gestionnaire d'évènement pour
autant de TListBox que vous le souhaitez. Il vous suffit de positionner leur propriété Style, et de relier leur évènement
OnDrawItem à cette fonction.
Enfin, si vous désirez fixer la taille des lignes, qui par défaut sera différente de la taille classique d'un TListBox qui gère
son propre dessin, il vous faudra agir sur la propriété ItemHeight.

Comment n'avoir que des disques valides dans un DirectoryListBox ?


Auteurs : blondelle ,
Voici un code qui permet d'afficher dans un " DirectoryListBox " uniquement les disques valides, c'est une solution
parmi d'autres.

Fichier .cpp :
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"

- 109 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Fichier .cpp :
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int NoDrive0 = 0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DirectoryListBox1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Label1->Caption = DirectoryListBox1->Directory;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// on élimine de DriveComboBox les lecteurs sans disque
// on supprime les messages d'erreur sur les disques
UINT oldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
int a = DriveComboBox1->Items->Count; // nb de disques
// on commence par la fin sinon on a un problème
// le lecteur 1 devient 0 après une suppression
for(a; a >= 0;a--)
{
if (DiskSize(a) > -1)
{
if(NoDrive0 == 0)
{
DriveComboBox1->Items->Delete(a); // pas de disque on elimine
}
}
}
// on retablit les messages d'erreur sur les disques
SetErrorMode(oldErrorMode); // on restitue l'ancienne valeur
NoDrive0 = 1;
}
//---------------------------------------------------------------------------

Fichier .h :
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Dialogs.hpp>
#include <FileCtrl.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TDirectoryListBox *DirectoryListBox1;
TDriveComboBox *DriveComboBox1;
TLabel *Label1;
TButton *Button2;
void __fastcall DirectoryListBox1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations

- 110 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Fichier .h :
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

- 111 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Les grilles


Comment personnaliser un ensemble de cellules sans modifier toute la grille dans un TStringGrid ?
Auteurs : Alacazam ,
Surchargeons la méthode OnDrawCell : cette méthode est appelée pour chaque cellule devant être (re)dessinée.
Attention : Les attributs Col, Row, Rect et State concernent donc la cellule en train d'être dessinée, et non la cellule
courante (que vous sélectionnez par exemple avec votre souris).

TColor CLTitre = clBtnFace, CLFond = clYellow, CLSelection = clRed; // Vos couleurs personnalisées.
AnsiString s = StringGrid1->Cells[ACol][ARow]; // Texte de la cellule.
if (ACol < StringGrid1->FixedCols || ARow <
StringGrid1->FixedRows) { // Concerne les titres des lignes et des colonnes.
StringGrid1->Canvas->Brush->Color = CLTitre;
StringGrid1->Canvas->FillRect(Rect); // On dessine le fond de la cellule.
StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style <<
fsBold; // On met les titres en gras.
// On réaffiche le texte par dessus, car le FillRect l'a effacé.
StringGrid1->Canvas->TextRect(
Rect,
(Rect.Right + Rect.Left - StringGrid1->Canvas->TextWidth(s)) / 2,
(Rect.Top + Rect.Bottom - StringGrid1->Canvas->TextHeight(s)) / 2,
s);
// Le premier argument est le rectangle de rognage, les deux suivants permettent de centrer le texte dans la cel
}
else if (State.Contains(gdSelected)) { // Concerne la(les) cellule(s) sélectionnée(s).
StringGrid1->Canvas->Brush->Color = CLSelection;
StringGrid1->Canvas->FillRect(Rect);
StringGrid1->Canvas->Font->Color = clWhite; // Le texte est écrit en blanc.
StringGrid1->Canvas->TextRect(Rect, Rect.Left +1, Rect.Top + 1, s); // Ici texte justifié à gauche.
}
else {
StringGrid1->Canvas->Brush->Color = CLFond;
StringGrid1->Canvas->FillRect(Rect);
StringGrid1->Canvas->TextRect(Rect, Rect.Left +1, Rect.Top + 1, s);
}

N.B. Pour centrer un texte dans un rectangle, on égale les coordonnées du centre du rectangle et celles du centre du texte.

Comment écrire sur plusieurs lignes dans une cellule d'un TStringGrid?
Auteurs : Alacazam ,
Le but est donc tout simplement d'afficher le texte de votre cellule sur plusieurs lignes, s'il est trop long par exemple,
ou simplement pour améliorer la présentation de vos données.
Le principe :
- Utiliser un TMemo invisible de la largeur de la case, et le laisser découper votre texte (propriété WordWrap à true).
- Récupérer les n lignes du TMemo une par une, et les afficher dans des rectangles n fois plus petits (en hauteur).
N.B. Si vous ne maitrisez pas trop le OnDrawCell ou l'utilisation du TCanvas de la grille, je vous conseille de lire d'abord
Comment personnaliser un ensemble de cellules sans modifier toute la grille dans un TStringGrid ?.

#include <math.hpp>
// A placer dans l'évènement OnDrawCell de votre TStringGrid.
TMemo *Memo = new TMemo(this);
Memo->Visible = false;
Memo->Parent = this;
Memo->Lines->Text = StringGrid1->Cells[ACol][ARow];
Memo->Width = StringGrid1->ColWidths[ACol];

- 112 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

int Cell_Height = Rect.Bottom - Rect.Top, Ligne_Nbr = Memo->Lines->Count;

// Cette ligne permet d'éviter le chevauchement des lignes si le texte est vraiment trop long pour la case.
Ligne_Nbr = Min(Ligne_Nbr, (Rect.Bottom - Rect.Top) / StringGrid1->Canvas->TextHeight(" ") + 1);

for (int i = 0 ; i < Ligne_Nbr ; i++)


{
TRect R = Rect;
AnsiString Text_i = Memo->Lines->Strings[i];
R.Top = Rect.Top + i * Cell_Height / Ligne_Nbr;
R.Bottom = Rect.Top + (i + 1) * Cell_Height / Ligne_Nbr;
// Texte justifié "centré"
StringGrid1->Canvas->TextRect(
R,
(R.Right + R.Left - StringGrid1->Canvas->TextWidth(Text_i)) / 2,
(R.Top + R.Bottom - StringGrid1->Canvas->TextHeight(Text_i)) / 2,
Text_i);
}
delete Memo;

Signalons que si vous souhaitez forcer un retour à la ligne après un mot, vous n'avez qu'à le faire suivre de "\n", qui
sera traité correctement par le TMemo.

lien : Comment personnaliser un ensemble de cellules sans modifier toute la grille dans un TStringGrid ?

Comment gérer la roulette de la souris sur un TDBGrid ?


Auteurs : Nono40 ,
La roulette n'est pas gérée correctement par défaut dans le composant TDBGrid. Pour qu'elle soit prise en compte il
faut suivre la méthode suivante, elle est basée sur la dérivation de la méthode WindowProc de la grille afin de gérer le
message WM_MOUSEWHEEL.

Dans le header de la fiche, ajouter :

private: // Déclarations de l'utilisateur


TWndMethod OldWindowProc;
void __fastcall DBGridNewWindowProc(TMessage &Msg);

Puis, dans le corps du gestionnaire d'évènements OnCreate (dans le .cpp) :

OldWindowProc = DBGrid1->WindowProc;
DBGrid1->WindowProc = DBGridNewWindowProc;

Enfin, dans le .cpp :

void __fastcall TForm1::DBGridNewWindowProc(TMessage &Msg)


{
if (Msg.Msg == WM_MOUSEWHEEL)
{
if (DBGrid1->DataSource->DataSet->Active)
{
if (short(Msg.WParamHi) < 0)
{
DBGrid1->DataSource->DataSet->Next();
}
else

- 113 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

{
DBGrid1->DataSource->DataSet->Prior();
}
}
return;
}
OldWindowProc(Msg);
}

Remarque : Le code ci-dessus suppose que DBGrid1->DataSource et DBGrid1->DataSource->DataSet soient assignés.


Si on se trouve dans un contexte où l'on n'est pas sûr qu'ils le soient, il faut le vérifier.

Comment supprimer une ligne ou une colonne dans un TStringGrid ?


Auteurs : pottiez , blondelle , LadyWasky ,
Il suffit de rendre publiques les méthodes DeleteRow et DeleteColumn de la classe TCustomGrid dont hérite la classe
TStringGrid à travers le transtypage de cette dernière en une classe dérivée déclarée dans la même unité :

class TPublicStringGrid: public TCustomGrid


{
public:
using TCustomGrid::DeleteRow;
using TCustomGrid::DeleteColumn;
};
// supprime la ligne n°2 (donc la troisième ligne, la première étant la ligne n°0) :
((TPublicStringGrid*)StringGrid1)->DeleteRow(2);
// supprime la deuxième colonne colonne n°1), la première étant la colonne n°0) :
((TPublicStringGrid*)StringGrid1)->DeleteColumn(1);

Comment simuler une multiselection dans un TStringGrid ?


Auteurs : Sunchaser , MiGoN ,
Pour simuler la sélection multiple dans cet objet, il faudra intercepter des évènements clavier et ainsi il faut que la
propriété KeyPreview de la TForm contenant la grille soit à true.
Ensuite, il faut travailler sur les évènements suivants :

Pour le TStringGrid
• OnClick
• OnDrawCell
• OnKeyDown
• OnKeyUp
• OnMouseMove

Pour la TForm
• OnCreate
• OnClose

Dans le .h
Private:
TStringGrid *pGrille;
TStringList *pListeIndex;
bool MultiSelect;

- 114 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Dans le .cpp
void __fastcall TForm1::FormCreate(TObject *Sender)
{
MultiSelect = false;
// On met la valeur de cette variable à 'faux' afin que le comportement
// par défaut de la grille soit 'normal' et qu'il faille appuyer sur la touche
// 'ctrl' pour simuler la sélection multiple
}
//-----------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
// On libère la mémoire allouée à l'objet TStringList si il a été crée
if(pListeIndex != NULL)
delete pListeIndex;
}

Interception des évènements clavier


void __fastcall TForm1::StringGridKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
//Si la touche ctrl est enfoncée, on crée la liste pour stocker les index des lignes sélectionnées
if (Key == VK_CONTROL)
{
MultiSelect = true;
// on teste l'existance ou non d'un objet 'StringList', ainsi on ne redéclare
// pas inutilement des objets de ce type à chaque fois que la touche est pressée
if (pListeIndex == NULL)
{
pListeIndex = new TStringList();
// ainsi la liste est créée et elle sera persistante tant que le
// bouton 'ctrl' est enfoncé. Cette liste va stocker les index des
// lignes sélectionnées en cliquant dans la stringgrid
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGridKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
// Si la touche ctrl est relachée, on vide la liste supposée contenir les index des lignes selectionnées
if (Key == VK_CONTROL)
{
MultiSelect = false;
if (!pListeIndex == NULL)
{
pListeIndex->Clear();
// la liste est vidée mais non détruite : l'objet de type 'TStringList'
// sera libérée au moment du OnClose de la form
}
}
}

Dessin des éléments dans la grille


void __fastcall TForm1::StringGridDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
pGrille = (TStringGrid* )Sender;
if (!pListeIndex == NULL)
{
// Si l'index de la ligne dessinée correspond à une ligne sélectionnée, on
// retrouve la valeur de son index dans la TStringList
if (pListeIndex->IndexOf(ARow)!= - 1)
{

- 115 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Dessin des éléments dans la grille


//elle est déssinée avec une couleur de fond et une fonte spécifique
pGrille->Canvas->Brush->Color = clHighlight;
pGrille->Canvas->Font->Color = clWhite;
pGrille->Canvas->FillRect(Rect);
pGrille->Canvas->TextRect(Rect, Rect.Left+2, Rect.Top+2, pGrille->Cells[ACol][ARow]);
}
}
else
{
pGrille->Canvas->Brush->Color = clWindow;
pGrille->Canvas->Font->Color = clBlack;
}
}

NB : Cet évènement fonctionne quelle que soit la valeur de la propriété DefaultDraw de la grille.

Sélection d'une ligne


void __fastcall TForm1::StringGridClick(TObject *Sender)
{
pGrille = (TStringGrid* )Sender;
// on teste la valeur de 'MultiSelect' pour savoir si la touche 'ctrl' a été
// pressée
if (MultiSelect == true)
{
// on enregistre dans la TstringList l'index de la ligne selectionnée
pListeIndex->Add(pGrille->Row);
}
// on force la grille a se 'redessiner', afin de mettre a jour l'affichage
// en tenant compte des nouvelles valeurs ou des valeurs non stockées dans la TStringList
pGrille->Repaint();
}

void __fastcall TForm1::StringGridMouseMove(TObject *Sender,


TShiftState Shift, int X, int Y)
{
pGrille = (TStringGrid* )Sender;
pGrille->SetFocus();
}

NB : Sans cet évènement, cette astuce pour simuler la multiselection ne fonctionne pas dès le premier click.

Comment empêcher l'édition d'une cellule spécifique d'un TStringGrid ?


Auteurs : pottiez ,
Pour empêcher l'édition des cellules du TStringGrid, il faut jouer sur la propriété option de celui-ci. En effet, dans les
options du TStringGrid, on peut cocher l'option goEditing qui permet d'autoriser ou non l'édition du TStringGrid.
Il vous suffit alors de vérifier quelle est la cellule que l'utilisateur souhaite éditer, et autoriser ainsi cette édition ou non.
Cela se fait grâce à l'évènement OnSelectCell().
Cela donne ce code (ici pour vérouiller la cellule de coordonné 1;1) :

if((ACol == 1) && (ARow == 1)){


StringGrid1->Options >> goEditing; // ne pas rendre éditable
}else{
StringGrid1->Options << goEditing; // rendre éditable
}

- 116 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Si vous voulez vérouiller plusieurs cellules, je vous propose d'utiliser un vecteur et de vérifier chaque valeur du vecteur
grâce à un boucle

int vectCoordonnee[5][2] = {{1,1},{2,5},{3,1},{1,4},{1,2}} ;


int i ;
StringGrid1->Options << goEditing; // rendre éditable
for(i=0;i<5;i++){
if((ACol == vectCoordonnee[i][0]) && (ARow == vectCoordonnee[i][1])){
StringGrid1->Options >> goEditing; // ne pas rendre éditable
}
}

Comment déplacer une ligne ou une colonne dans un TStringGrid ?


Auteurs : blondelle , Pedro , LadyWasky ,
Il suffit de rendre publiques les méthodes MoveRow et MoveColumn de la classe TCustomGrid dont hérite la classe
TStringGrid à travers le transtypage de cette dernière en une classe dérivée déclarée dans la même unité :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
class TPublicStringGrid: public TCustomGrid
{
public:
using TCustomGrid::MoveRow;
using TCustomGrid::MoveColumn;
};
// Déplace la première ligne (Row=0) vers la seconde (Row=1)
((TPublicStringGrid*)StringGrid1)->MoveRow(0,1);
//Déplace la première colonne (Col=0) vers la seconde (Col=1)
((TPublicStringGrid*)StringGrid1)->MoveColumn(0,1);
}

Il est a noter que si les cellules vers lesquelles on déplace avec MoveRow ou MoveColumn ne sont pas vides, les valeurs
seront permutées avec celles que l'on veut déplacer.

Comment avoir des retours chariot dans une cellule d'un TStringGrid ?
Auteurs : blondelle , rbag ,
Pour cela, il faut activer l'option goAlwaysShowEditor et ajouter le code suivant dans l'événement OnKeyDown :

void __fastcall TForm1::StringGrid1KeyDown(TObject *Sender, WORD &Key,


TShiftState Shift)
{
if(Key == VK_RETURN)
{
StringGrid1->Cells[StringGrid1->Col][StringGrid1->Row] = StringGrid1->Cells[StringGrid1->Col]
[StringGrid1->Row] + sLineBreak;
}
}

et dans l'événement OnDrawCell :

- 117 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,


int ARow, TRect &Rect, TGridDrawState State)
{
// Sélection de la couleur de fond
if(State.Contains(gdFixed))
{
StringGrid1->Canvas->Brush->Color = clBtnFace;
}
else if(State.Contains(gdSelected))
{
StringGrid1->Canvas->Brush->Color = clNavy;
}
else
{
StringGrid1->Canvas->Brush->Color = clWhite;
}
// Dessin du fond
StringGrid1->Canvas->FillRect(Rect);
// Sélection de la couleur de texte
if(State.Contains(gdSelected))
{
SetTextColor(Canvas->Handle, clWhite);
}
else
{
SetTextColor(Canvas->Handle, clBlack);
}
// Dessin du texte en utilisant la fonction API
DrawText(StringGrid1->Canvas->Handle, (StringGrid1->Cells[ACol][ARow]).c_str(), -1, &Rect,
DT_NOPREFIX | DT_WORDBREAK );
}

Comment mettre une image en fond d'un TStringGrid ?


Auteurs : blondelle , Nono40 ,
Voici le code à appliquer pour mettre une image en fond des cellules blanches d'un TStringGrid. L'image est contenue
dans un Bitmap, mais elle peut aussi être contenue dans un TImage. Cette procédure gère le déplacement du fond de
l'image si l'utilisateur se sert des barres de défilement :

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,


int ARow, TRect &Rect, TGridDrawState State)
{
int i, j, X, Y;
TRect R;
if(State.Contains(gdFixed))
{
// Les cellules fixes sont toujours dessinées en gris
StringGrid1->Canvas->Brush->Color = clBtnFace;
StringGrid1->Canvas->Brush->Style = bsSolid;
StringGrid1->Canvas->FillRect(Rect);
}
else if(State.Contains(gdSelected))
{
// Les cellules sélectionnées sont en bleu
StringGrid1->Canvas->Brush->Color = clNavy;
StringGrid1->Canvas->Brush->Style = bsSolid;
StringGrid1->Canvas->FillRect(Rect);
}
else
{
// Recherche de la zone image à copier pour tenir compte des décalages
// de la grille en fonction des barres de défilement.

- 118 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

X = 0;
for(i = StringGrid1->FixedCols + 1; i <= ACol; i++) (X++, StringGrid1->ColWidths [i]);
{
Y = 0;
for(i = StringGrid1->FixedRows + 1; i <= ARow; i++) (Y++, StringGrid1->RowHeights[i]);
{
R.Left = X;
R.Right = X + Rect.Right - Rect.Left;
R.Top = Y;
R.Bottom = Y + Rect.Bottom - Rect.Top;
// Dessin d'une partie de l'image
Image1->Visible = false;
Image1->Picture->Bitmap->LoadFromFile("C:\\Documents and Settings\\toto\\Mes documents\
\Mes images\\Massiv10\\Massiv10\\Bitmaps\\Arrow\\arcarrow1.bmp");
// "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\Massiv10\\Massiv10\\Bitmaps\
\Arrow\\arcarrow1.bmp"
StringGrid1->Canvas->CopyRect(Rect, Image1->Picture->Bitmap->Canvas, R);
StringGrid1->Canvas->Brush->Style = bsClear;
}
}
}
// Sélection de la couleur de texte
if(State.Contains(gdSelected))
{
SetTextColor(StringGrid1->Canvas->Handle, clWhite);
}
else
{
SetTextColor(StringGrid1->Canvas->Handle, clBlack);
}
// Dessin du texte en utilisant la fonction API
DrawText(StringGrid1->Canvas->Handle, (StringGrid1->Cells[ACol][ARow]).c_str(), -1, &Rect,
DT_NOPREFIX );
}

MonBitMap est un objet de type TBitMap qui doit avoir été chargé avec l'image. L'image doit être suffisamment grande
pour couvrir le fond du TStringGrid.

Comment centrer le texte d'un TStringGrid ?


Auteurs : blondelle , Nono40 ,
Le code suivant permet de centrer le texte dans les cellules d'un TStringGrid. Le centrage est à la fois vertical et
horizontal. Le dessin est ici effectué avec l'API de Windows car la fonction TextOut du canevas des composants ne
permet pas directement le centrage.

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,


int ARow, TRect &Rect, TGridDrawState State)
{
// sélection de la couleur de fond
if(State.Contains(gdFixed))
{
StringGrid1->Canvas->Brush->Color = clBtnFace;
}
else if(State.Contains(gdSelected))
{
StringGrid1->Canvas->Brush->Color = clNavy;
}
else
{
StringGrid1->Canvas->Brush->Color = clWhite;
}

- 119 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

// Dessin du fond
StringGrid1->Canvas->FillRect(Rect);
// Sélection de la couleur de texte
if(State.Contains(gdSelected))
{
StringGrid1->Font->Color = clWhite;
}
else
{
StringGrid1->Font->Color = clBlack;
}
// Dessin du texte en utilisant la fonction API
DrawText(StringGrid1->Canvas->Handle, (StringGrid1->Cells[ACol][ARow]).c_str(), -1, &Rect,
DT_CENTER | DT_NOPREFIX | DT_VCENTER | DT_SINGLELINE );
}

Comment écrire le texte d'une cellule d'un TStringGrid sur plusieurs lignes ?
Auteurs : blondelle , Nono40 ,
Le code suivant permet d'écrire le texte d'une cellule d'un TStringGrid sur plusieurs lignes.

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,


int ARow, TRect &Rect, TGridDrawState State)
{
// sélection de la couleur de fond
if(State.Contains(gdFixed))
{
StringGrid1->Canvas->Brush->Color = clBtnFace;
}
else if(State.Contains(gdSelected))
{
StringGrid1->Canvas->Brush->Color = clNavy;
}
else
{
StringGrid1->Canvas->Brush->Color = clWhite;
}
// Dessin du fond
StringGrid1->Canvas->FillRect(Rect);
// Sélection de la couleur de texte
if(State.Contains(gdSelected))
{
SetTextColor(StringGrid1->Canvas->Handle, clWhite);
}
else
{
SetTextColor(StringGrid1->Canvas->Handle, clBlack);
}
// Dessin du texte en utilisant la fonction API
DrawText(StringGrid1->Canvas->Handle, (StringGrid1->Cells[ACol][ARow]).c_str(), -1, &Rect,
DT_CENTER | DT_NOPREFIX | DT_WORDBREAK);
}

- 120 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Les zones d'édition


Comment supprimer le son du TEdit quand on appuie sur la touche [Entrée] ?
Auteurs : Geronimo ,
Il suffit de placer le code suivant dans l'évènement OnKeyPress du TEdit :

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)


{
if (Key == VK_RETURN)
{
Key = 0;
}
}

Cela permet de savoir quand la touche [Entree] est appuyée (validation si nécessaire) et supprime le son en "faisant
croire" à Windows qu'aucune touche n'a été enfoncée (Key = 0)

Comment faire une zone d'édition n'acceptant que des entiers ?


Auteurs : Geronimo ,
Il faut obtenir les Flags de la zone d'édition choisie et lui rajouter le Flag ES_NUMBER. On utilise pour cela
respectivement les fonctions GetWindowLong et SetWindowLong.

__fastcall TForm1::TForm1(TComponent* Owner)


: TForm(Owner)
{
long StylesEdit = GetWindowLong(Edit1->Handle, GWL_STYLE);
SetWindowLong(Edit1->Handle, GWL_STYLE, StylesEdit | ES_NUMBER);
}

Attention, la protection n'est pas totale. En effet, il est toujours possible de coller des caractères non numériques dans
le TEdit...

Comment connaître et modifier la position du curseur dans un TRichEdit ?


Auteurs : Alacazam , Sunchaser ,
Le but est d'accéder à la position du curseur sous la forme (Ligne, Caractère), plus aisément utilisable que le simple
numéro de caractère donné par RichEdit1->SelStart. On utilise pour cela les messages Windows EM_* se rapportant
aux composants TRichEdit.
N.B. Perform a le même effet que SendMessage, il permet d'envoyer un message à un composant.
Pour connaître la position actuelle :

int numLigne = RichEdit1->Perform(EM_EXLINEFROMCHAR, 0, (LPARAM) (DWORD) RichEdit1->SelStart);


int numCaractere = (RichEdit1->SelStart - RichEdit1->Perform(EM_LINEINDEX, (LPARAM) (DWORD)
numLigne, 0));

Le message EM_EXLINEFROMCHAR permet de déterminer la ligne où se trouve le caractère dont le numéro est
passé en 3ème paramètre LPARAM.

- 121 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

De la même manière, grâce à EM_LINEINDEX, on détermine le numéro du 1er caractère de la ligne dont le numéro
est passé en second paramètre ; pour avoir le "déplacement horizontal", on n'a plus alors qu'à soustraire ce résultat
au numéro du caractère courant.
Pour modifier cette position :

int numLigne = 10, numCaractere = 15;


RichEdit1->SelStart = RichEdit1->Perform(EM_LINEINDEX, numLigne - 1, 0);
RichEdit1->SelStart += numCaractere;
RichEdit1->Perform(EM_SCROLLCARET, 0, 0);
RichEdit1->SetFocus();

Ici, le principe est exactement le même ; on se déplace au 1er caractère de la ligne numLigne (grâce à EM_LINEINDEX),
puis on avance de numCaractere positions sur cette même ligne.

Comment afficher chaque ligne d'un TRichEdit avec une couleur de texte différente ?
Auteurs : Alacazam ,
Dans cet exemple, les lignes font apparaître un dégradé de couleur allant du bleu au rose.
Comme vu ici ( Comment connaître et modifier la position du curseur dans un TRichEdit ?), on peut assez facilement
récupérer le numéro (absolu) du 1er caractère d'une ligne donnée, grâce à EM_LINEINDEX. Nous nous en servons
cette fois pour sélectionner une ligne dans sa totalité, avant de lui appliquer un attribut de couleur.

for (int i = 0 ; i < RichEdit1->Lines->Count ; i++) {


RichEdit1->SelStart = RichEdit1->Perform(EM_LINEINDEX, i, 0);
RichEdit1->SelLength = RichEdit1->Lines->Strings[i].Length();
RichEdit1->SelAttributes->Color = 0x00F56B00 + 10 * i;
}

Pour choisir facilement votre gamme de couleurs, regardez ici : Comment obtenir les composantes RGB d'une
couleur TColor ?

lien : Comment connaître et modifier la position du curseur dans un TRichEdit ?


lien : Comment obtenir les composantes RGB d'une couleur TColor ?

Comment faire de la mise en forme dans un TRichEdit ?


Auteurs : Alacazam ,
Le lien ci-dessous vous donnera les informations nécessaires.

lien : Astuces RichEdit

Comment enregistrer le texte d'un TRichEdit avec ou sans mise en forme ?


Auteurs : Alacazam ,
Pour enregistrer le contenu de votre TRichEdit :

RichEdit1->Lines->SaveToFile(Nom_fichier);

- 122 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Cet enregistrement se fera, par défaut, au format RTF (texte mis en forme).
Si vous souhaitez sauvegarder le contenu au format "texte simple", précédez votre enregistrement de :

RichEdit1->PlainText = true;

Comment inserer un image sur un fond en couleur dans un RichEdit ?


Auteurs : blondelle , pottiez ,
Le code permet de recréer le Canvas du RichEdit, afin de pouvoir dessiner un rectangle coloré, sur lequel on insère
une image :

void __fastcall TForm1::Button2Click(TObject *Sender)


{
Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
pBitmap->LoadFromFile("C:\\Documents and Settings\\blondelle\\Mes documents\\Mes images\
\AG00004_.bmp");
TControlCanvas *pCn;
pCn = new TControlCanvas();
pCn->Control = RichEdit1;
pCn->Brush->Color = clGreen;
pCn->Rectangle(0, 0, 488, 289);
pCn->Draw(50,50,pBitmap);
delete pCn;
delete pBitmap;
}

Comment aligner à droite le contenu d'un TControl (TEdit...) ?


Auteurs : blondelle , Gysmo ,
L'astuce est d'utiliser la propriété BiDiMode du TControl (ancêtre des composants visibles). Ce mode bidirectionnel
spécifie la direction de la lecture du texte. En localisant l'application on arrive à aligner le texte à droite. Dans
l'événement OnCreate :

SysLocale.MiddleEast = True;
MonEdit->BiDiMode = bdRightToLeft;

- 123 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Les images et le graphisme


Comment dessiner des lignes sur la fiche ?
Auteurs : Geronimo ,
Pour dessiner des lignes sur la fiche, il suffit de faire appel aux méthodes de l'objet Canvas : MoveTo et LineTo. Il faut
savoir que vous ne dessinez pas directement sur la fiche mais sur le Canvas de la fiche. C'est une surface spécialement
destinée au dessin qui contient toutes les méthodes et propriétés nécessaires au dessin.

Canvas->MoveTo(0, 0);
Canvas->LineTo(ClientWidth, ClientHeight);

Ce code dessinera une ligne en diagonale de la fiche.

Comment faire une capture d'écran ?


Auteurs : Geronimo ,
Il faut récupérer le DC (Device Context) de l'écran grâce à la fonction GetWindowsDC. Cette fonction prend pour
argument le Handle de la fenêtre dont on veut le DC. Ici, nous souhaitons celui de tout l'écran. Le Handle de l'écran
(Bureau) est 0.
D'où le code suivant :

HDC ScreenSrc = GetWindowDC(0);

La méthode BitBlt va copier le contenu de ce DC vers le Canvas de notre composant TBitmap (DC de notre image) :

BitBlt(bitmap->Canvas->Handle, // Destination
0, // Coin haut-gauche : abscisse
0, // Coin haut-gauche : ordonnée
Screen->Width, // Largeur de la zone destination
Screen->Height, // Hauteur de la zone destination
ScreenSrc, // Source
0, // Haut-gauche de la source : abscisse
0, // Haut-gauche de la source : ordonnée
SRCCOPY); // Méthode de copie

Enfin, pour libérer le DC de l'écran (bureau), utilisez la méthode ReleaseDC :

ReleaseDC(GetDesktopWindow(), ScreenSrc);

Si vous souhaitez directement enregistrer votre capture d'écran, voici un exemple de code :

Graphics::TBitmap *Bitmap = new Graphics::TBitmap;


Bitmap->Height = Screen->Height;
Bitmap->Width = Screen->Width;
HDC ScreenSrc = GetWindowDC(0);
BitBlt(Bitmap->Canvas->Handle, 0, 0, Screen->Width,
Screen->Height, ScreenSrc, 0, 0, SRCCOPY);
Bitmap->SaveToFile(ExtractFilePath(Application->ExeName)+"Bitmap.bmp");
ReleaseDC(GetDesktopWindow(), ScreenSrc);
delete Bitmap;

- 124 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

On crée ici directement un Bitmap et on lui affecte la copie d'écran, puis on utilise la méthode SaveToFile du Bitmap
pour sauvegarder l'image dans le répertoire courant.

Comment charger une image à partir du presse-papiers ?


Auteurs : Geronimo ,
Il peut être parfois utile de charger une image à partir du presse-papiers. Pour ce faire, il convient d'utiliser un objet
Clipboard. Le code suivant montre comment faire. Pour cela, placez un composant TImage sur une fiche ainsi qu'un
bouton. Voici le gestionnaire d'évènements OnClick de ce bouton :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
TClipboard *PressePapiers = Clipboard();
if (PressePapiers->HasFormat(CF_BITMAP))
{
try
{
Image1->Picture->Bitmap->LoadFromClipboardFormat(CF_BITMAP,
PressePapiers->GetAsHandle(CF_BITMAP), 0);
}
catch (...)
{
// Le contenu du presse-papier n'est pas un image valide
}
}
else
{
// Le contenu du presse-papier n'est pas une image;
}
}

Tout d'abord, on initialise un pointeur sur un objet Clipboard grâce à la méthode Clipboard(). Attention, il ne faut
pas créer d'objet Clipboard avec l'opérateur new car une seule instance du presse-papiers est autorisée. La méthode
Clipboard gère cela en créant un nouvel objet si il n'en existe pas. Sinon, elle renvoie un pointeur sur le Clipboard
déjà existant. La condition de la ligne suivante permet de vérifier que le contenu du presse-papiers est bien une image
Bitmap. Ensuite, nous essayons de charger l'image dans Image1 grâce à la méthode LoadFromClipboardFormat. Les
données du presse-papier sont récupérées par la méthode GetAsHandle.

Comment obtenir les composantes RGB d'une couleur TColor ?


Auteurs : Geronimo , Greybird , Ricky81 ,
Il existe trois macros nommées GetRValue, GetBValue et GetGValue qui donnent respectivement les composantes
rouges, bleues et vertes d'une couleur au format RGB, et donc en particulier pour un objet TColor. Voici un exemple
concret d'utilisation : nous passons la souris sur une image que l'utilisateur peut changer et les valeurs des différentes
composantes de la couleur située sous le pointeur est affichée dans un TLabel. Placez donc sur votre fiche un composant
TImage, TLabel, TButton et TOpenPictureDialog. Dans l'évènement OnClick du bouton, placez le code suivant :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
if (OpenPictureDialog1->Execute())
{
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}

- 125 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Ensuite, dans l'évènement OnMouseMove de l'image, placez le code suivant :

void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,


int X, int Y)
{
BYTE nRed = GetRValue(ColorToRGB(Image1->Canvas->Pixels[X][Y]));
BYTE nBlue = GetBValue(ColorToRGB(Image1->Canvas->Pixels[X][Y]));
BYTE nGreen = GetGValue(ColorToRGB(Image1->Canvas->Pixels[X][Y]));

Label1->Caption = "Rouge : " + IntToStr(nRed) + " Vert :" + IntToStr(nGreen) + " Bleu :" + IntToStr(nBlue);
}

Nous déclarons trois variables de type BYTE (unsigned char) qui contiendront les composantes de la couleur. La couleur
est celle du pixel situé sous la souris à la position (X, Y) d'où le code Image1->Canvas->Pixels[X][Y], Pixels étant un
tableau de TColor.
Enfin, nous écrivons la composition RGB de notre couleur dans Label1.

Remarque : On peut se passer de ColorToRGB mais uniquement pour les constantes correspondant à des couleurs fixes
(et non des couleurs système) qui sont au format 0x00bbggrr.

Comment obtenir rapidement le code hexadécimal d'une couleur ?


Auteurs : Alacazam ,
Lorsque vous souhaitez modifier un attribut couleur, à la création d'un composant, vous avez le choix entre une valeur
prédéfinie (clBlue, clRed, clBtnFace ...) ou une valeur de cette forme 0x00RRGGBB (valeur hexadécimale de 4 octets).
Pour choisir "visuellement" une couleur, et en obtenir le code hexadécimal :
• dans l'Inspecteur d'Objets, double-cliquez sur un attribut Color (de votre Form par exemple)
• faites ensuite "Définir les couleurs personnalisées"
• après avoir choisi votre couleur, cliquez "Ajouter aux couleurs personnalisées" et validez.

Vous obtenez finalement quelque chose de ce type 0x00BBGGRR (valeurs Blue, Green, Red, remarquez l'inversion).

- 126 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Les images et le graphisme > TChart
Qu'est ce qu'un TChart ?
Auteurs : Bandit Boy ,
Un TChart est un composant permettant de réaliser des graphiques pour représenter des chiffres. Il peut représenter
un repère orthonormé, un histogramme, un camembert, ou un diagramme de Gantt. Le repère orthonormé permet
d'afficher de plusieurs manières : points reliés, nuage de points, vecteurs, zones (par shape, ou rondes).
Chaque série de données est représenté dans une "Series".

Les fonctions décrites dans la FAQ peuvent être définies soit par logiciel lorsque l'application est en cours, soit à la
conception en double-cliquant sur le composant.

Comment ajouter une série à un TChart ?


Auteurs : Bandit Boy ,
Il faut dans un premier temps déclarer la série du type que l'on souhaite.

TFastLineSeries *Serie;
Serie = new TFastLineSeries(this);
Serie->ParentChart = Chart1;

Les différentes séries sont les suivantes


• TAreaSeries
• TBarSeries
• TCircledSeries
• TCustomBarSeries
• TCustomSeries
• TFastLineSeries
• THorizBarSeries
• TLineSeries
• TPieSeries
• TPointSeries
• TSeriesPointer

Comment ajouter un point à une série ?


Auteurs : Bandit Boy ,
Dans le cas d'une série représentée dans un repère XY, il suffit d'ajouter un point en utilisant la méthode AddXY.

Serie->AddXY(X, Y, "texte en X", clBlack);

- 127 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

X et Y sont de type double.

Comment créer un graphe en camembert?


Auteurs : Bandit Boy ,
Dans un premier temps, on déclare la série (ici sur un DBChart, idem TChart), puis on ajoute un "Pie". Les 360° sont
représentés par une valeur de 100 (ici 30+50+20). Dans le cas où la somme n'est pas égale à 100, la dernière part ne
fera pas la valeur indiquée, mais le complément.

TPieSeries *Series1;
Series1 = new TPieSeries(this);
Series1->ParentChart = DBChart1;
Series1->AddPie(30, "1 partie", clLime);
Series1->AddPie(50, "2 partie", clBlue);
Series1->AddPie(20, "3 partie", clYellow);

Comment ajouter une donnée à un diagramme de Gantt ?


Auteurs : Bandit Boy ,
Le diagramme de Gantt représente des zones sur différentes hauteurs, pour ajouter une donnée, il faut utiliser la
fonction AddGantt.

Series1->AddGantt(Depart, Fin, NumLigne, "Texte de la ligne");

Depart et Fin sont les coordonées en X de départ et de fin de la zone créée.


NumLigne représente la ligne sur laquelle elle se trouvera et "Texte de la Ligne" sera le texte associé.

Comment représenter un graphique en fonction du temps ?


Auteurs : Bandit Boy ,
Il faut dans un premier temps initialiser l'axe X en fonction du temps et lui donner un incrément.

Chart1->BottomAxis->ExactDateTime = true;
Chart1->BottomAxis->Increment = DateTimeStep[dtOneSecond];
Serie->AddXY(Now(), Y, DateTimeToStr(Now()), clBlack);

Ici, on affiche à l'heure du PC la valeur Y.

Comment sauvegarder un TChart ?


Auteurs : Bandit Boy ,
Il est possible de sauver un Chart sous la forme d'une image BMP par la méthode SaveToBitmapFile.

Chart1->SaveToBitmapFile("C:\\graph.bmp");

- 128 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Par exemple, ici on sauvegarde l'image graph.bmp sous la racine, qui sera l'image du graphe.

Comment changer le trait d'une série ?


Auteurs : Bandit Boy ,
On peut modifier le style (trait plein ou pointillé) du trait si ce dernier est d'épaisseur d'1 pixel. On peut également
modifier l'épaisseur du trait.

L'exemple suivant permet d'obtenir un trait pointillé.

Serie->LinePen->Width = 1;
Serie->LinePen->SmallDots = true;
Serie->LinePen->Style = psDot;

Comment changer la couleur d'une série ?


Auteurs : Bandit Boy ,
La couleur de la série peut être modifiée par la propriété SerieColor.

Serie->SeriesColor = clLime;

Comment autoriser/inhiber le déplacement ?


Auteurs : Bandit Boy ,
L'utilisateur peut se déplacer en faisant un "cliqué-glissé" avec le clic droit de sa souris.
Il est possible d'autoriser le déplacement sur tout le graphe, sur son axe horizontal, vertical, ou de l'inhiber totalement.
Il faut modifier la propriété AllowPannel.

Chart1->AllowPanning = pmNone; //interdit le déplacement

Autres valeurs possibles


• pmHorizontal autorise le déplacement horizontal seulement
• pmVertical autorise le déplacement verticalseulement
• pmBoth autorise le déplacement complet

Comment autoriser/inhiber le zoom ?


Auteurs : Bandit Boy ,
Il faut modifier le paramètre AllowZoom.

Chart1->AllowZoom = true; //autorise le zoom

- 129 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Le zoom se fait en dessinant une zone avec le clic gauche de la souris.

Comment mettre une échelle logarithmique sur le TChart ?


Auteurs : sat83 , pottiez ,
Pour modifier l'échelle du TChart il suffit d'accéder à la propriété Logarithmic des axes du TChart (BottomAxis,
LeftAxis, ...) :

Chart1->BottomAxis->Logarithmic = true;

- 130 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Le composant TCppWebBrowser


Quelles sont les solutions pour avoir un composant navigateur web ?
Auteurs : Geronimo ,
Deux possibilités se présentent :
• Allez dans l'onglet Internet de la palette de composants. Si vous avez un composant TCppWebBrowser, c'est celui-
ci.
• Sinon, faites Composants | Importer un contrôle ActiveX. Sélectionnez Microsoft Internet Controls dans la liste
et cliquez sur Installer. Choisissez Dans un nouveau paquet et tapez ici quelque chose comme par exemple
CppWebBrowser_bpk. Tapez une description (je vous conseille de la commencer par un underscore _ pour
repérer vos paquets de ceux installés par défaut, les _ étant placés au début des listes). Validez. Validez à nouveau à
la demande d'installation. Après un certain temps, C++Builder vous signale que le composant TCppWebBrowser
a été installé. Vous pouvez trouver le composant dans l'onglet ActiveX de la palette de composants. Si vous avez
des erreurs lors de l'installation du composant, il vous faudra modifier SHDocVw_OCX.h comme suit :

// Interface d'OCX par défaut TCOMIWebBrowser m_OCXIntf;

par

// Interface d'OCX par défaut


TCOMIWebBrowser m_OCXIntf;

et

// Interface d'OCX par défaut IWebBrowser2Disp m_OCXIntf;

par

// Interface d'OCX par défaut


IWebBrowser2Disp m_OCXIntf;

Pour l'utiliser :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
CppWebBrowser1->Navigate((WideString)"c:\\mes documents\\index.htm");
}

Comment passer une AnsiString à la méthode Navigate de TCppWebBrowser ?


Auteurs : Geronimo ,
Il est probable que vous obteniez l'erreur "Impossible de convertir AnsiString en wchar_t*" ou "Impossible de convertir
char* en wchar_t*". Vous pouvez convertir votre AnsiString vers un WideString utilisable par le composant en suivant
la syntaxe suivante :

WideString Url = fichierHTML;


CppWebBrowser1->Navigate(Url);

- 131 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

où fichierHTML est un AnsiString qui a été initialisé avec une adresse.

Comment afficher une page web construite dans l'application ?


Auteurs : Geronimo ,
Il faut utiliser la méthode Navigate d'un composant TCppWebBrowser avec le protocole about. Ce protocole permet de
passer le code HTML directement au lieu de passer l'adresse d'un fichier.

void TForm1::Button1Click(TObject *Sender)


{
WideString source = "about:" + Memo1->Lines->Text;
CppWebBrowser1->Navigate(source, 0, 0, 0, 0);
}

Dans cet exemple, nous affichons la page web dont le code HTML est tapé dans un TMemo.

Comment interdire aux popups de s'ouvrir ?


Auteurs : Atlantis ,
Lorsque vous intégrez dans votre application l'objet TCppWebBrowser pour naviguer sur Internet, il arrive souvent
d'avoir des fenêtres Popup qui s'ouvrent automatiquement. Pour annuler l'ouverture d'Internet Explorer dans ce cas
là, vous devez écrire une procédure pour l'évènement OnNewWindow2 de votre TCppWebBrowser pour affecter la
valeur TRUE à la variable Cancel.

void __fastcall TForm1::BrowserNewWindow2(TObject *Sender,


LPDISPATCH *ppDisp, VARIANT_BOOL *Cancel)
{
*Cancel = TRUE;
}

Comment contrôler l'affichage des barres de défilement ?


Auteurs : Atlantis , Greybird ,
Suivant la taille que vous donnerez à votre TCppWebBrowser, la navigation peut nécessiter des barres de défilement.
Si la façon dont elles apparaissent ne vous convient pas, vous pouvez contrôler comment elles sont affichées, au moyen
du code ci-dessous.

Variant vDocument = Browser->ControlInterface->Document;


if (((IDispatch *)vDocument) != NULL)
{
Variant vBody = vDocument.OlePropertyGet("Body");
Variant vStyle = vBody.OlePropertyGet("Style");

// Pour cacher les barres de défilement


vStyle.OlePropertySet("OverflowX","hidden");
vStyle.OlePropertySet("OverflowY","hidden");

// Pour ne montrer que les barres de défilements nécessaires


vStyle.OlePropertySet("OverflowX","auto");
vStyle.OlePropertySet("OverflowY","auto");

- 132 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

// Pour remettre la valeur par défaut


// Les deux barres de défilement sont visibles et éventuellement grisées si non nécessaires
vStyle.OlePropertySet("OverflowX","");
vStyle.OlePropertySet("OverflowY","");
}

Comment imprimer le document ?


Auteurs : Greybird ,
Pour imprimer le document, il suffit d'utiliser la méthode ExecWB.
Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle
navigateur Web, et de lui passer le paramètre OLECMDID_PROPERTIES.
Pour afficher la boîte de dialogue d'impression, le second paramètre de ExecWB devra être
OLECMDEXECOPT_PROMPTUSER. Dans le cas contraire, ce sera OLECMDEXECOPT_DONTPROMPTUSER.

Browser->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER);

Comment sélectionner le document et le copier dans le presse-papier ?


Auteurs : Greybird , Atlantis ,
Pour sélectionner le document et le copier dans le presse-papier, il suffit d'utiliser la méthode ExecWB.
Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle
navigateur Web, et de lui passer les paramètres suivants :
• OLECMDID_SELECTALL : sélectionne tout le document
• OLECMDID_COPY : copie la sélection dans le presse-papier
• OLECMDID_CLEARSELECTION : désélectionne tout

// Sélectionner tout
Browser->ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT);

// Copier la sélection dans le presse-papier


Browser->ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT);

// Désélectionner tout
Browser->ExecWB(OLECMDID_CLEARSELECTION, OLECMDEXECOPT_DODEFAULT);

Comment afficher la boite de dialogue de mise en page ?


Auteurs : Atlantis ,
Pour afficher la fenêtre que vous voyez ci-dessous, il suffit d'utiliser la méthode ExecWB.
Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle
navigateur Web, et de lui passer le paramètre OLECMDID_PAGESETUP.

Browser->ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT);

- 133 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Comment afficher la boite de dialogue de propriétés d'une page ?


Auteurs : Atlantis ,
Pour afficher la fenêtre que vous voyez ci-dessous, et qui est accessible sous IE notamment par le menu Propriétés du
menu contextuel, il suffit d'utiliser la méthode ExecWB.
Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle
navigateur Web, et de lui passer le paramètre OLECMDID_PROPERTIES.

Browser->ExecWB(OLECMDID_PROPERTIES, OLECMDEXECOPT_DODEFAULT);

- 134 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Comment afficher la boite de dialogue enregistrer sous ?


Auteurs : Atlantis ,
Pour afficher la fenêtre que vous voyez ci-dessous, et enregistrer la page que vous affichez sur votre disque dur, il suffit
d'utiliser la méthode ExecWB.
Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle
navigateur Web, et de lui passer le paramètre OLECMDID_SAVEAS.

Browser->ExecWB(OLECMDID_SAVEAS , OLECMDEXECOPT_DODEFAULT);

- 135 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Pour spécifier un nom de fichier par défaut, il faut quelque peu modifier le code :

Variant pIn;
pIn = "nom_page.html";
Browser->ExecWB(OLECMDID_SAVEAS , OLECMDEXECOPT_PROMPTUSER, pIn);

Comment lister les frames d'une page ?


Auteurs : Greybird ,
Il est possible d'obtenir la liste des frames (ou iframes) qui sont présentes dans la page web. La propriété Frames du
Document présente cette liste.
Chaque frame, par sa propriété Document, nous permet de récupérer l'URL de la frame.
Le code ci-dessous présente la liste des frames dans un TListBox.

- 136 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Variant vDocument = Browser->ControlInterface->Document;


if (((IDispatch *)vDocument) != NULL)
{
Variant vFrames = vDocument.OlePropertyGet("Frames");
Variant vFramesCount = vFrames.OlePropertyGet("Length");
for (int i = 0 ; i < vFramesCount ; i++)
{
Variant vFrame = vFrames.OleFunction("Item",i);
Variant vFrameDocument = vFrame.OlePropertyGet("Document");
if (((IDispatch *)vFrameDocument) != NULL)
{
ListBox1->Items->Add(vFrameDocument.OlePropertyGet("URL"));
}
}
}

Comment lister les liens d'une page ?


Auteurs : Greybird ,
Il est possible d'obtenir la liste des liens qui sont présents dans la page web. La propriété Links du document (représenté
par le Variant vDocument) donne l'accès à cette liste.
Le code ci-dessous présente la liste des liens dans un TListBox.

Variant vDocument = Browser->ControlInterface->Document;


if (((IDispatch *)vDocument) != NULL)
{
Variant vLinks = vDocument.OlePropertyGet("Links");
Variant vLinksCount = vLinks.OlePropertyGet("Length");
for (int i = 0 ; i < vLinksCount ; i++)
{
ListBox1->Items->Add(vLinks.OleFunction("Item",i));
}
}

Comment lister les images d'une page, ainsi que leurs propriétés ?
Auteurs : Greybird ,
Il est possible d'obtenir la liste des images qui sont présentes dans la page web. La propriété Images du document
(représenté par le Variant vDocument) donne l'accès à cette liste. Elle nous permet pour chaque image de récupérer
l'URL source, mais aussi d'autres propriétés telles que la taille ou le poids de l'image.
Le code ci-dessous présente la liste des images et de certaines de leurs propriétés dans un TListBox.

Variant vDocument = Browser->ControlInterface->Document;


if (((IDispatch *)vDocument) != NULL)
{
Variant vImages = vDocument.OlePropertyGet("Images");
Variant vImagesCount = vImages.OlePropertyGet("Length");
for (int i = 0 ; i < vImagesCount ; i++)
{
Variant vImage = vImages.OleFunction("Item",i);
Variant vImageURL = vImage.OlePropertyGet("Src");
Variant vImageWidth = vImage.OlePropertyGet("Width");
Variant vImageHeight = vImage.OlePropertyGet("Height");
Variant vImageWeight = vImage.OlePropertyGet("FileSize");
Variant vImageAlt = vImage.OlePropertyGet("Alt");

- 137 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

AnsiString aInfoImage = Format("%s : %d x %d Pixels; %d octets; %s",


ARRAYOFCONST((vImageURL,(int)vImageWidth,(int)vImageHeight,(int)vImageWeight,vImageAlt)));
ListBox1->Items->Add(aInfoImage);
}
}

Comment récupérer le corps d'une page web affichée ?


Auteurs : Greybird ,
Il est possible de récupérer le contenu du corps (body) d'un page web affichée dans un objet TCppWebBrowser, nommé
ici Browser, sous deux formes, HTML ou textuelle.
Le code suivant place ces chacune de ces formes dans des AnsiString.

AnsiString aContenuText = "";


AnsiString aContenuHTML = "";
Variant vDocument = Browser->ControlInterface->Document;
if (((IDispatch *)vDocument) != NULL)
{
Variant vBody = vDocument.OlePropertyGet("Body");
Variant vContenuText = vBody.OlePropertyGet("InnerText");
Variant vContenuHTML = vBody.OlePropertyGet("InnerHTML");
aContenuText = vContenuText;
aContenuHTML = vContenuHTML;
}

Comment récupérer le source HTML d'une page affichée dans un TCppWebBrowser ?


Auteurs : Greybird , Neilos ,
Pour récupérer le code source d'une page web, vous pouvez utiliser l'une des deux fonctions dont le code est donné
ci-après.
L'appel à ces fonction doit s'assurer que le document est bien complètement chargé. Pour cela, il est conseillé
de l'appeller dans la méthode OnDocumentComplete. Attention, consulter l'aide au signet OnNavigateComplete2,
OnDocumentComplete, exemple pour savoir comment gérer cet évènement dans le cas d'une page web multi-frames.
A noter qu'en cas d'erreur, ces fonctions renvoient une exception de type EOleSysError, qu'il vous faudra traiter, le
catch n'étant là que pour faire le ménage.
La première fonction utilise l'interface IHTMLDocument3, disponible uniquement à partir de Internet Explorer 5.

#include <mshtml.h>
...
AnsiString __fastcall GetSource (TCppWebBrowser * browser)
{
IHTMLDocument3 *html = NULL;
IHTMLElement *element = NULL;
BSTR string = L"";

try
{
if (browser->Document != NULL)
{
OleCheck(browser->Document->QueryInterface(IID_IHTMLDocument3,(LPVOID*)&html));
OleCheck(html->get_documentElement(&element));
OleCheck(element->get_outerHTML(&string));
}
}

- 138 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

catch (EOleSysError &eOSE)


{
if (element != NULL)
{
element->Release();
}
if (html != NULL)
{
html->Release();
}
throw eOSE;
}
return (AnsiString) string;
}

La seconde fonction fonctionne sur les versions antérieures, mais nécessite plus de travail, et utilise l'interface
IHTMLDocument2, ainsi qu'un flux de données.

#include <mshtml.h>
...
AnsiString __fastcall GetSource (TCppWebBrowser * browser)
{
AnsiString Source = "";
IHTMLDocument2 *html = NULL;
IPersistStreamInit *spPsi = NULL;
IStream *spStream = NULL;
try
{
if (browser->Document != NULL)
{
OleCheck(browser->Document->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&html));
IPersistStreamInit *spPsi = NULL;
OleCheck(html->QueryInterface(IID_IPersistStreamInit, (LPVOID*)&spPsi));
if (spPsi != NULL)
{
OleCheck(CreateStreamOnHGlobal(NULL, true, &spStream));
if(spStream != NULL)
{
__int64 nSize = 0;
STATSTG ss;
LARGE_INTEGER nMove;

nMove.QuadPart = 0;
OleCheck(spPsi->Save(spStream, true));
OleCheck(spStream->Seek(nMove, STREAM_SEEK_SET, (ULARGE_INTEGER*)&nSize));
OleCheck(spStream->Stat(&ss, STATFLAG_NONAME));

nSize = ss.cbSize.QuadPart;
Source.SetLength(nSize);
OleCheck(spStream->Read((void *)Source.data(), nSize, (ULONG*)&nSize));

spStream->Release();
spStream = NULL;
}
spPsi->Release();
spPsi = NULL;
}
html->Release();
html = NULL;
}
}
catch (EOleSysError &eOSE)
{
if (spStream != NULL)
{

- 139 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

spStream->Release();
}
if (spPsi != NULL)
{
spPsi->Release();
}
if (html != NULL)
{
html->Release();
}
throw eOSE;
}
return Source;
}

Comment remplir les champs d'un formulaire et le soumettre ?


Auteurs : Greybird ,
Il est possible de remplir les champs d'un formulaire et de soumettre ce dernier.

La propriété Forms du document (représenté par le Variant vDocument) donne accès à l'ensemble des formulaires de
la page.
Il est alors possible de récupérer l'ensemble du contenu de ce formulaire, via la propriété All du formulaire (représenté
par le Variant vForm).
On récupère alors les champs du formulaire, et on positionne leur propriété Value.
Il ne reste alors plus qu'à soumettre le formulaire en appellant sa méthode Submit.

A noter que la récupération du formulaire et des champs se fait au moyen de la propriété NamedItem qui permet de
rechercher des tags HTML par leur propriété name.

Le code suivant montre comment remplir les champs login et password d'un formulaire nommé connection, puis de
soumettre le formulaire.

Variant vDocument = brwInt->ControlInterface->Document;


if (((IDispatch *)vDocument) != NULL)
{
Variant vForms = vDocument.OlePropertyGet("Forms");
Variant vForm = vForms.OleFunction("NamedItem","connection");
Variant vContent = vForm.OlePropertyGet("All");
Variant vLoginField = vContent.OleFunction("NamedItem","login");
Variant vPassField = vContent.OleFunction("NamedItem","password");
vLoginField.OlePropertySet("Value","UnLogin");
vPassField.OlePropertySet("Value","UnMotDePasse");
vForm.OleProcedure("Submit");
}

Comment POSTer des données ?


Auteurs : Greybird ,
Il est possible de poster des données vers une page web avec le composant TCppWebBrowser, mais ce n'est absolument
pas trivial. Le code ci-dessous est une version corrigée d'un article sur le portail Borland Developper Network, dont
l'explication est hors du périmètre de cette question.

Dans le .h :

- 140 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

private:
void WebPostData(TCppWebBrowser *CppWebBrowser, String sURL, String sPostData);

Dans le .cpp :

void TForm1::WebPostData(TCppWebBrowser *CppWebBrowser, String sURL, String sPostData)


{
BSTR bstrHeaders = NULL;
TVariant vFlags = {0}, vTargetFrameName={0}, vPostData={0}, vHeaders={0};
LPSAFEARRAY psa;
LPCTSTR cszPostData = sPostData.c_str();
UINT cElems = lstrlen(cszPostData);
LPSTR pPostData;
LPVARIANT pvPostData;

bstrHeaders = SysAllocString(L"Content-Type: application/x-www-form-urlencoded\r\n");


if (!bstrHeaders)
{
Application->MessageBox("Could not allocate bstrHeaders", "Warning", MB_OK | MB_ICONWARNING);
return;
}

V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;

pvPostData = vPostData;

if(pvPostData)
{
VariantInit(pvPostData);

psa = SafeArrayCreateVector(VT_UI1, 0, cElems);


if(!psa)
{
return;
}

SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, cszPostData, cElems);
SafeArrayUnaccessData(psa);

V_VT(pvPostData) = VT_ARRAY | VT_UI1;


V_ARRAY(pvPostData) = psa;
}

CppWebBrowser->Navigate((TVariant)sURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);


}

Pour l'appeler :

WebPostData(CppWebBrowser1,"http://www.site.com/
page.html","pseudo=monpseudo&pass=monpass&submit=ok");

lien : Borland Developer Network : How to post data using TCppWebBrowser in C++Builder

- 141 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Le composant TStringList


A quoi sert le composant TStringList ?
Auteurs : Ricky81 , Fred_smashg ,
Un TStringList est un composant permettant de gérer une liste indexée de chaînes de caractères de type AnsiString.
Malgré son nom, c'est en fait un tableau qui se cache derrière, avec une réallocation dynamique pour augmenter sa
taille. Il n'y a donc en théorie aucune limite pour la taille d'un élément TStringList, en pratique les limitations viendront
évidemment de la mémoire côté système.

Ce composant facilite donc la gestion de listes de chaînes et est particulièrement utile lorsqu'il s'agit de manipuler des
fichiers textes.
Il dispose notamment des méthodes Add pour insérer une chaîne en fin de liste, Insert pour insérer un élément à une
position donnée (il y a donc une réorganisation/décalage d'index pour une partie des éléments déjà existant), Delete qui
supprime un élément à une position donnée (idem pour la réorganisation), et Clear qui retire tous les éléments.
L'accès aux chaînes se fait via la propriété Strings qui est un tableau de chaînes. Il est important d'avoir à l'esprit que
le premier élément sera référencé par un index valant 0 :

TStringList *Liste = new TStringList;


// remplissage
int Taille = Liste->Count; // on récupère la taille
// on récupère la dernière ligne (l'indexation commence à 0)
AnsiString Chaine = Liste->Strings[Taille-1];
delete Liste

Comment gérer des couples clé/valeur avec un TStringList ?


Auteurs : Ricky81 , TABZ ,
Le TStringList ne se limite pas au stockage bête et méchant d'une série de chaînes de caractères. Il permet par exemple
de gérer très facilement des couples clé/valeur là où on pourrait penser devoir utiliser une structure plus complexe voire
2 éléments de type TStringList avec synchronisation.

Nous pouvons par exemple très facilement gérer un couple pseudo/prénom comme suit :

TStringList* Liste = new TStringList;

Liste->Add("Ricky81=Eric");
Liste->Add("Greybird=Arnaud");

AnsiString Pseudo, Prenom;


Pseudo = Liste->Names[0];
Prenom = Liste->Values[Pseudo];

delete Liste;

- 142 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

La problématique de synchronisation des informations étant réglée, il est par exemple possible de trier les éléments
sans risque en appelant Liste->Sort();

Comment enregistrer des informations dans un fichier texte ?


Auteurs : Ricky81 ,
Si les informations ne sont pas déjà organisées dans des composants gérant le texte, l'utilisation du composant
TStringList parait requise. Après avoir ajouté les différentes informations sous forme de chaînes de caractères
AnsiString, il vous suffit d'appeler la méthode SaveToFile qui enregistrera les différentes "lignes" ordonnées composant
l'objet vers le fichier spécifié.

TStringList *Liste = new TStringList;


// remplissage
Liste->SaveToFile("fichier.txt");
delete Liste;

- 143 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Création dynamique / Recherche de composants à l'exécution
Que représente le TObject *Sender dans les méthodes de la VCL ?
Auteurs : Geronimo ,
Dans beaucoup de méthodes, on trouve comme argument TObject *Sender. Cet argument est utilisé pour savoir quel
est l'objet qui a appelé la méthode.
Voici un exemple simple pour clarifier : dans un nouveau projet, placez sur votre fiche deux boutons et double-cliquez
sur le premier (Button1). Vous obtenez alors le code suivant :

void __fastcall TForm1::Button1Click(TObject *Sender)


{

Sélectionnez maintenant votre deuxième bouton sur la fiche (Button2) et dans l'inspecteur d'objets, onglet évènements,
attribuez la méthode Button1Click pour OnClick.
Maintenant, la méthode Button1Click est appelée lorsque vous cliquez sur Button1 ou Button2. Sender permet ici de
savoir quel objet a appelé Button1Click.
Voyez cet exemple :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
if (dynamic_cast <TButton *>(Sender) == Button1)
{
ShowMessage("Button1");
}
else
{
ShowMessage("Button2");
}
}

Sender étant un pointeur sur TObject, il faut le convertir en un pointeur sur TButton pour pouvoir le traiter. Pour
cela, on utilise dynamic_cast.
Voici une version plus perfectionnée ci-dessous qui récupère le pointeur sur le bouton et qui agit ensuite sur les propriétés
du bouton :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
TButton *Button;
Button = dynamic_cast <TButton *> (Sender);
if (Button == Button1)
{
ShowMessage("Button1");
}
else
{
if (Button == Button2)
{
ShowMessage("Button2");
}
else
{
ShowMessage("Sender innatendu");
}
}
Button->Caption = "Appuyé";

- 144 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Nous modifions ici le texte affiché du bouton sur lequel on a appuyé et y plaçons "Appuyé".

Quelle est la différence entre un "Parent" et un "Owner" ?


Auteurs : Geronimo ,
Confusion facile. Cependant, Parent et Owner sont deux concepts différents. Le Parent est quelque chose de visuel :
le parent d'un composant est celui qui contient ce composant. Le parent d'un TEdit placé directement sur la fiche est
la fiche (Form1). Le Owner d'un composant est le composant qui a la charge de détruire celui-ci lors de sa propre
destruction. (Mais le Owner peut tout-à-fait être le Parent).
Quand vous créez dynamiquement un composant, vous devez passer le Owner en argument du constructeur. Vous devez
ensuite affecter le Parent du contrôle afin qu'il s'affiche.

TPanel *Panel;
// ...
TLabel *Label = new TLabel(Form1);
Label->Parent = Panel;

Cela signifie que quand Form1 sera détruite, Label le sera également. Donc dans ce cas, vous ne devez pas faire appel
à delete car il y aurait deux delete sur Label ce qui causera des problèmes. Si vous souhaitez garder la main, il suffit de
passer NULL en argument du constructeur. Dans ce cas, le contrôle n'ayant pas de Owner vous pouvez (et vous devrez)
le détruire quand vous le souhaitez avec delete.
La deuxième ligne indique que le Parent de Label est Panel. Ainsi, Label s'affichera dans Panel, et ses propriétés Top
et Left, par exemple, seront relative au Panel.

Comment créer dynamiquement un composant visuel ?


Auteurs : Ricky81 ,
Tous les composants de C++ Builder peuvent être créés au moment de l'exécution du programme. Pour instancier un
composant, il suffit d'appeler le constructeur de la classe correspondante par l'intermédiaire du mot clé new. Pour les
composants visuels, il faut absolument définir la propriété Parent sinon le composant n'apparaitra pas.

Le composant donné en paramètre du constructeur est le propriétaire du composant nouvellement créé.

TButton *MonBouton;
void __fastcall TForm1::Button1Click(Sender: TObject);
{
// La fenêtre est propriétaire du nouveau bouton
MonBouton := new TButton(this);
// mais c'est dans Panel1 qu'il doit s'afficher
MonBouton->Parent = Panel1;
// ensuite on définit les autres propriétés
MonBouton->Caption = "Bouton !";
MonBouton->Left = 10;

- 145 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

lien : Quelle est la différence entre un "Parent" et un "Owner" ?

Comment créer dynamiquement un nombre d'objets non connu à l'avance ?


Auteurs : Geronimo ,
Le problème est qu'il faut garder trace des pointeurs pour pouvoir les utiliser et libérer la mémoire à la fin. Pour cela,
il est possible d'utiliser la classe TList. La classe TList est une liste de pointeurs toute simple, avec un certain nombre
de fonctionnalités pour gérer cette liste.

Création d'une TList :

liste = new TList;

Après création d'un objet et initialisation de ses propriétés, ajout du pointeur dans la liste :

liste->Add((void *)monObjet);

Pour récupérer un pointeur contenu dans la liste et agir sur l'objet en question (ici nous avons pris un TLabel) :

TLabel *label;
label = (TLabel *)liste->Items[2]; // Accède au troisième élément de la liste
// utilisation classique possible de label

A lire également : l'article dont le lien figure ci-dessous.

lien : Créer dynamiquement une liste visuelle des images d'un répertoire

Comment associer un gestionnaire d'évènements à un composant créé dynamiquement ?


Auteurs : Ricky81 ,
Que le composant soit créé dynamiquement ou non, le lien entre un évènement et son implémentation se fait de la même
manière. Comme pour un attribut ou une propriété, il suffit d'affecter le nom de la méthode qui va prendre en charge
la gestion de l'évènement.
Bien entendu, lorsqu'on conçoit son application avec l'inspecteur d'objets, le fait de renseigner le nom des méthodes
à côté du nom de l'évènement (onglet évènements de l'inspecteur d'objets) va générer cette association dans le dfm (il
vous suffit de faire un clic droit sur la fiche puis Voir comme texte pour le constater).

Exemple :

void __fastcall TForm1::MonTraiteKeyPress(TObject *Sender, char &Key)


{
// traitement
}

TEdit *EditDynamique = new TEdit(this);


// diverses initialisations

- 146 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

EditDynamique->OnKeyPress = MonTraiteKeyPress;

- 147 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Composants > Divers


Comment donner le focus à un composant?
Auteurs : Geronimo ,
Il y a plusieurs solutions pour faire cela. Si vous savez à quel composant vous souhaitez donner le focus, utilisez la
méthode SetFocus du composant :

Edit1->SetFocus();

L'autre méthode permet de donner le focus à un contrôle dont vous ne connaissez pas le nom. Pour cela, utilisez la
fonction FocusControl membre de la fiche.

FocusControl(FindNextControl(ActiveControl, true, true, true));

Dans ce code, nous donnons le focus au contrôle renvoyé par la fonction FindNextControl. Cette fonction prend comme
référence le contrôle passé en premier argument, et le second argument permet de définir le sens de parcours par
rapport à l'ordre de tabulation (true pour le sens croissant, false pour le sens décroissant).
Regardez l'aide de C++Builder sur FindNextControl pour obtenir la description des arguments suivants.

Quelle est la différence entre un TTabControl et un TPageControl ?


Auteurs : Geronimo ,
Deux composants qui paraissent semblables sont disponibles dans la palette de l'IDE : le TTabControl et le
TPageControl. La différence réside dans le fait que lorsque vous cliquez sur les onglets d'un TTabControl, les
composants placés sur celui-ci ne changent pas : seul l'onglet actif change. Il faut gérer les modifications dans
l'évènement OnChange.
Pour un TPageControl, une page est liée à chaque onglet. Donc quand l'onglet change, tout le contenu du TPageControl
change. Celui que vous voyez le plus souvent, dans les boîtes de dialogue d'options par exemple (voir les options d'un
projet C++Builder) est le TPageControl.
Le TTabControl est utilisé dans les logiciels MDI (Multiple Documents Interface) qui utilisent les onglets pour changer
de documents : le contenu du TabControl n'a pas besoin de changer, cela doit rester une zone d'édition, mais dans
l'évènement OnChange, on change le contenu de ce fichier.

Comment faire pour avoir des barres d'outils qui peuvent devenir flottantes ?
Auteurs : Geronimo ,
Utilisez le composant TToolBar et changez ses propriétés DragKind et DragMode.

DragKind = dkDock;

- 148 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

DragMode = dmAutomatic;

Comment créer des curseurs personnalisés ?


Auteurs : Geronimo ,
En plus des curseurs par défaut disponibles avec C++Builder, il est possible de créer ses curseurs souris personnalisés.
Cela peut être fait rapidement en suivant le tutoriel de Gilles Louise dont le lien figure ci-dessous.

lien : la création de curseurs personnalisés.

Comment avoir une barre de progression continue ?


Auteurs : Geronimo ,
Par défaut, la barre de progression TProgressBar se divise en petites sections. Si vous souhaitez avoir une bande
continue, positionnez la propriété Smooth de cette barre de progression à true.

Comment afficher un TPopupMenu sur un noeud d'un TTreeView?


Auteurs : Neo41 , Neilos ,
Le composant TTreeView offre la possiblité de lui affecter un composant TPopupMenu en renseignant la propriété
PopupMenu. Cependant le menu associé sera valable pour tous les éléments et les noeuds du TreeView. Si vous voulez
affecter des menus différents selon le niveau de noeud sélectionné, alors vous devez en faire la gestion vous même.

Voici un exemple permettant d'afficher un menu sur le click droit de la souris mais uniquement pour les noeuds de
niveau 1. Pour le tester n'oubliez pas de laisser vide la propriété PopupMenu de votre TreeView.

Exemple:

void __fastcall TForm1::TreeView1MouseDown(TObject *Sender, TMouseButton Button, TShiftState


Shift, int X, int Y)
{
TTreeNode *tNode;

tNode = TreeView1->GetNodeAt(X, Y);


if(tNode == NULL)
{
return;
}

if(tNode->Level == 1 && Button == mbRight)


{
TreeView1->Selected = tNode;
PopupMenu1->Popup(X+this->Left+TreeView1->Left, Y+this->Top+TreeView1->Top+45);
}

- 149 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Comment mettre une ligne de TTreeView (TNode) en gras ?


Auteurs : dj_benz , pottiez ,
Pour modifier un noeud TNode, il faut utiliser la structure TTVItem :

TTVItem* tvi = new TTVItem();


tvi->hItem = node->ItemId;//node est le TNode à mettre en gras
tvi->mask = TVIF_STATE;
tvi->stateMask = TVIS_BOLD;
tvi->state = TVIS_BOLD;
TreeView_SetItem(node->Handle, tvi);

lien : TVITEM Structure

Comment parcourir tous les composants d'une fiche ?


Auteurs : Ricky81 ,
Pour parcourir l'ensemble des composants d'une fiche, vous pouvez utiliser la propriété Components.

void __fastcall TForm1::Button1Click(TObject *Sender)


{
for (int i=0 ; i < Form1->ComponentCount ; i++)
{
ShowMessage(Form1->Components[i]->Name);
}
}

Remarque : seuls les composants qui auront la fiche pour Owner seront concernés. Pour parcourir de façon récursive,
voici un exemple de code :

void __fastcall TForm1::ShowComponents(TComponent *Component)


{
for (int i=0 ; i<Component->ComponentCount ; i++)
{
ShowMessage(Component->Components[i]->Name);
ShowComponents(Component->Components[i]);
}
}

void __fastcall TForm1::Button1Click(TObject *Sender)


{
ShowComponents(Form1);
}

- 150 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Attention, si vous comptez supprimer des composants pendant le parcours, il faut impérativement effectuer la boucle
dans le sens descendant. Dans le cas contraire, vous serez victimes de la mise à jour de la propriété Components et des
composants seront omis dans le parcours.

lien : Quelle est la différence entre un "Parent" et un "Owner" ?

Comment trouver un composant en connaissant son nom ?


Auteurs : Ricky81 ,
Pour rechercher la référence d'un composant en ne connaissant que son nom et son propriétaire, il faut utiliser la
méthode FindComponent du propriétaire. Le résultat de cette méthode est toujours de type TComponent, il est donc
utile d'en transtyper le résultat en fonction du type de composant attendu.

void __fastcall TForm1::Button1Click(TObject *Sender)


{
TEdit *edit = dynamic_cast <TEdit*> (Form1->FindComponent("Edit1"));
if (edit != NULL)
{
edit->Text = "Texte modifié";
}
}

Cette méthode est très utile pour modifier les propriétés d'une série de composants dont les noms peuvent être calculés
en boucle. Par exemple pour effacer le contenu de Edit1 à Edit10 :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
TEdit *edit = NULL;
for(int i=1 ; i<=10 ; i++)
{
edit = dynamic_cast<TEdit *> (Form1->FindComponent("Edit"+IntToStr(i)));
if (edit != NULL)
{
edit->Text = "Texte modifié";
}
}
}

lien : Quelle est la différence entre un "Parent" et un "Owner" ?

Comment connaître le composant à l'origine d'un évènement ?


Auteurs : Ricky81 , Nono40 ,
Dans le cas ou plusieurs composants utilisent le même gestionnaire d'évènement il peut être nécessaire de connaître
quel composant est à l'origine de l'évènement. C'est le rôle du paramètre Sender contenu dans toutes les signatures des
méthodes associées à un évènement.

Par exemple, pour connaître le nom du bouton cliqué, même si Button1Click est également associé à Button2, Button3
etc...

void __fastcall TForm1::Button1Click(TObject *Sender)


{
TButton *Button = dynamic_cast <TButton *> (Sender);

- 151 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

if (Button != NULL)
{
Button->Caption = "Appuyé";
}
}

lien : Que représente le TObject *Sender dans les méthodes de la VCL ?

Comment réaliser une barre d'outils grâce au composant TToolBar ?


Auteurs : Tenguryu , dvsoft , pottiez ,
Pour réaliser facilement une barre d'outils, il vous faut insérer une série d'images dans un composant TImageList que
vous allez associer à votre composant TToolBar (propriété Images du composant).
Vous pouvez également charger un seul fichier image dans votre TImageList, il suffit pour cela que votre image dépasse
la taille standard d'un fichier icône, le composant vous demandera alors si il faut redimensionner l'image ou si il faut
le couper en plusieurs icônes.
Vous pouvez trouvez des icônes gratuites pour barres d'outils sur ce site : http://www.glyfx.com/free.html

- 152 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > API Windows


Comment récupérer le texte affiché dans la barre de titre d'une fenêtre quelconque ?
Auteurs : Pierre Castelain ,
Il peut parfois être utile de récupérer le texte affiché dans la barre de titre d'une fenêtre quelconque (en dehors de
notre application). C'est très facile à réaliser à l'aide des fonctions de l'API Windows. Dans l'exemple qui suit, nous
récupérons le Caption de la fenêtre active.

AnsiString __fastcall TForm1::GetACtiveWindowCaption()


{
HWND hwnd;
// On récupère le handle de la fenêtre située au premier plan
hwnd = GetForegroundWindow();
// on alloue un buffer de caractères destiné à recevoie le texte
char * caption = new char[255];
// on récupère le texte dans ce buffer, en laissant la place pour le zéro terminal
int length = GetWindowText(hwnd,caption,254);
// on place le zéro terminal
caption[length] = '\0';
// on retourne le contenu sous la forme d'une AnsiString
return AnsiString(caption);
}

lien : Qu'est ce qu'un HANDLE ?

Comment changer la couleur d'un TProgressBar ?


Auteurs : Nono40 ,
Le composant TProgressBar ne dispose pas de propriété Color. Par contre il existe un message Windows pour modifier
directement le contrôle : PBM_SETBARCOLOR. Il suffit d'envoyer ce message au contrôle barre de progression via
son Handle avec les paramètres adéquats pour positionner la couleur voulue.

SendMessage(ProgressBar1->Handle,PBM_SETBARCOLOR,0,clLime);

lien : Qu'est ce qu'un HANDLE ?

Comment donner un privilege à une application ?


Auteurs : Netah25 , Greybird ,
Si votre application doit disposer d'un privilège, pour certains actions (comme par exemple demander l'extinction du
poste de travail), vous pourrez utiliser la fonction ci-dessous. Notez qu'il est conseillé de toujours retirer un privilège
une fois l'action effectuée.

La fonction suivante donne ou retire (suivant la valeur du paramètre grant le privilège donné en paramètre name :

bool __fastcall SetPrivilege(AnsiString name, bool grant)


{
TOKEN_PRIVILEGES wTokenIn, wTokenOut;
DWORD wLength;
HANDLE wCurrentProcess, wToken;
_LUID wLuid;
bool ret;

- 153 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

wCurrentProcess = GetCurrentProcess();
OpenProcessToken(wCurrentProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &wToken);
LookupPrivilegeValue(NULL, name.c_str(), &wLuid);
wTokenIn.PrivilegeCount = 1;
wTokenIn.Privileges[0].Luid = wLuid;
wTokenIn.Privileges[0].Attributes = (grant?SE_PRIVILEGE_ENABLED:0);
ret = AdjustTokenPrivileges(wToken,
FALSE, &wTokenIn, sizeof(TOKEN_PRIVILEGES), &wTokenOut,&wLength))
CloseHandle(wToken);

return ret;
}

Par exemple, pour ajouter le paramètre SE_SHUTDOWN_NAME, effectuer une action, et retirer le privilège, en nous
basant sur les informations du MSDN listant les constantes d'autorisation (voir plus bas), nous allons utiliser :

SetPrivilege("SeShutdownPrivilege",true);
// actions
SetPrivilege("SeShutdownPrivilege",false);

lien : MSDN - Authorization constants

Comment trouver le Class Name d'une fenêtre ?


Auteurs : Greybird ,
On a parfois besoin de connaître le nom de classe d'une fenêtre. Ce nom s'obtient via la fonction GetClassName de l'API
Windows. Cette fonction a besoin d'un Handle vers la fenêtre dont on désire obtenir le nom.

En général, cette situation se produira lors du développement, afin d'obtenir les données nécessaire à la programmation
de l'interaction avec une fenêtre d'une autre application.

Le code (application console) ci-dessous montre comment réaliser un petit utilitaire permettant d'obtenir le nom de
classe de la fenêtre située au premier plan. Pour l'utiliser, il faut créer une application console (Fichier | Nouveau |
Autre, puis choisir Expert Console).

#include <windows.h>
#include <stdio.h>
#include <conio.h>
int main(int argc, char * argv[])
{
HWND hFore;
char* pszBuffer;
int iNbChar = 1;
int iNbCharReturned;

printf("Vous avez 5 secondes pour activer la fenetre dont vous voulez connaitre le class name\r
\n");
printf("Appuyez sur une touche pour declancher le compteur ...");
getch();
Sleep(5000);

hFore = GetForegroundWindow();

do
{
iNbChar = iNbChar * 2;
pszBuffer = new char[iNbChar];

- 154 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

iNbCharReturned = GetClassName(hFore,pszBuffer,iNbChar);
if (iNbCharReturned == 0)
{
printf("Impossible de recuperer le class name\r\n");
}
if (iNbCharReturned < (iNbChar - 1))
{
printf("\r\nLe class name de cette fenetre est :\r\n|%s|",pszBuffer);
printf("\r\nLes barres verticales (|) de gauche et droite n'en font pas partie\r\n\a");
}
delete[] pszBuffer;
}
while ((iNbCharReturned >= (iNbChar - 1)));

printf("Appuyez sur une touche pour fermer la fenetre...");


getch();

return 0;
}

lien : Qu'est ce qu'un HANDLE ?


lien : Comment obtenir le Handle d'une fenêtre non-crée par l'application ?
lien : MSDN : fonction GetClassName

Comment obtenir le Handle d'une fenêtre non-crée par l'application ?


Auteurs : Bibmari ,
Pour contrôler une fenêtre d'une application tierce, et lui envoyer des messages, il est nécessaire d'obtenir son Handle,
qui sera de type HWND. Celui-ci est différent du Handle de processus, que l'on peut obtenir au moyen de CreateProcess
ou ShellExecuteEx.

Ceci peut se réaliser au moyen de la fonction FindWindow de l'API Windows. Cette fonction prend en premier paramètre
le nom de la classe de fenêtre recherchée, et en second le titre de cette fenêtre. Il est possible de positionner l'un de ces
deux paramètres à NULL afin de ne pas utiliser le critère correspondant dans la recherche.
Etant donné que le titre de la fenêtre est beaucoup plus fluctuant que le nom de la classe de fenêtre, on cherchera
toujours à préférer la recherche par nom de classe.

Pour obtenir ce nom de classe, il est possible d'utiliser un code fourni dans la FAQ (lien ci-dessous).

Le code suivant montre comment mettre une instance de la calculatrice Windows au premier plan, et lui envoyer un
message indiquant l'appui sur la touche R (ce qui aura pour effet de déclencher la fonction inverse).

HWND h = FindWindow("SciCalc", NULL);


SetForegroundWindow(h);
PostMessage(h, WM_KEYDOWN, 'R', 0);
PostMessage(h, WM_KEYUP, 'R', 0);

lien : Qu'est ce qu'un HANDLE ?


lien : Comment trouver le Class Name d'une fenêtre ?

Comment obtenir les informations de version d'une application ?


Auteurs : Dure_Limite ,
Toutes les applications (fichier.exe) peuvent mémoriser des informations de version.

- 155 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Pour les visualiser dans l'Explorer, on clique droit sur le fichier, puis on fait propriété.

Dans l'EDI builder, pour inclure des informations de version, on utilise l'option :

• Projet | Options | Informations de version


• Cocher : Inclure les informations de version
• Puis renseigner les champs d'identification du produit.

Pour déterminer si un fichier possède des informations de version, on utilise la fonction GetFileVersionInfoSize.
Pour obtenir ces informations, on utilise en plus la fonction GetFileVersionInfo.

Exemple d'utilisation :
Lorsque l'on clique sur un bouton, on renseigne un Memo (Memo1) avec toutes les informations dont dispose
l'executable de l'application.

void __fastcall TForm1::Button1Click(TObject *Sender)


{
Memo1->Clear();

String PathNomExt = Application->ExeName;


DWORD Size = GetFileVersionInfoSize(PathNomExt.c_str(), &Size);
if (Size <= 0) {
Memo1->Lines->Add( "Pas d'information de version dans cette application." );
return;
}

BYTE *Buffer;
try{
Buffer = new unsigned char[Size];
LPVOID Str;
UINT Len;
String TypeInfo;
LPDWORD lpdwLangCp;
char szFileInfo[26];

GetFileVersionInfo(PathNomExt.c_str(), 0, Size, Buffer);

// Lecture de la table des langues et jeux de caractères


if (!VerQueryValue(Buffer, "\\VarFileInfo\\Translation",
(LPVOID *)&lpdwLangCp, &Len)) return; // erreur
wsprintf(szFileInfo, "\\StringFileInfo\\%04x%04x\
\", LOWORD(*lpdwLangCp), HIWORD(*lpdwLangCp));

// Nom de l'organisation
TypeInfo = szFileInfo + (AnsiString) "CompanyName";
if (VerQueryValue(Buffer, TypeInfo.c_str(), &Str, &Len))
Memo1->Lines->Add( "Nom de l'organisation :\t" +
(AnsiString) reinterpret_cast<char *>(Str) );
else Memo1->Lines->Add( "Nom de l'organisation :\tErreur de lecture" );

// Description
TypeInfo = szFileInfo + (AnsiString) "FileDescription";
if (VerQueryValue(Buffer, TypeInfo.c_str(), &Str, &Len))
Memo1->Lines->Add( "Description :\t" + (AnsiString) reinterpret_cast<char *>(Str) );
else Memo1->Lines->Add( "Description :\tErreur de lecture" );

// Version de fichier
TypeInfo = szFileInfo + (AnsiString) "FileVersion";
if (VerQueryValue(Buffer, TypeInfo.c_str(), &Str, &Len))
Memo1->Lines->Add( "Version de fichier :\t" +
(AnsiString) reinterpret_cast<char *>(Str) );
else Memo1->Lines->Add( "Version de fichier :\tErreur de lecture" );

- 156 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

// Nom interne
TypeInfo = szFileInfo + (AnsiString) "InternalName";
if (VerQueryValue(Buffer, TypeInfo.c_str(), &Str, &Len))
Memo1->Lines->Add( "Nom interne :\t" + (AnsiString) reinterpret_cast<char *>(Str) );
else Memo1->Lines->Add( "Nom interne :\tErreur de lecture" );

// Copyright
TypeInfo = szFileInfo + (AnsiString) "LegalCopyRight";
if (VerQueryValue(Buffer, TypeInfo.c_str(), &Str, &Len))
Memo1->Lines->Add( "Copyright :\t" + (AnsiString) reinterpret_cast<char *>(Str) );
else Memo1->Lines->Add( "Copyright :\tErreur de lecture" );

// Marques légales
TypeInfo = szFileInfo + (AnsiString) "LegalTrademarks";
if (VerQueryValue(Buffer, TypeInfo.c_str(), &Str, &Len))
Memo1->Lines->Add( "Marques légales :\t" + (AnsiString) reinterpret_cast<char *>(Str) );
else Memo1->Lines->Add( "Marques légales :\tErreur de lecture" );

// Nom d'origine du fichier


TypeInfo = szFileInfo + (AnsiString) "OriginalFileName";
if (VerQueryValue(Buffer, TypeInfo.c_str(), &Str, &Len))
Memo1->Lines->Add( "Nom d'origine du fichier :\t" +
(AnsiString) reinterpret_cast<char *>(Str) );
else Memo1->Lines->Add( "Nom d'origine du fichier :\tErreur de lecture" );

// Nom du produit
TypeInfo = szFileInfo + (AnsiString) "ProductName";
if (VerQueryValue(Buffer, TypeInfo.c_str(), &Str, &Len))
Memo1->Lines->Add( "Nom du produit :\t" + (AnsiString) reinterpret_cast<char *>(Str) );
else Memo1->Lines->Add( "Nom du produit :\tErreur de lecture" );

// Version du produit
TypeInfo = szFileInfo + (AnsiString) "ProductVersion";
if (VerQueryValue(Buffer, TypeInfo.c_str(), &Str, &Len))
Memo1->Lines->Add( "Version du produit :\t" +
(AnsiString) reinterpret_cast<char *>(Str) );
else Memo1->Lines->Add( "Version du produit :\tErreur de lecture" );

// Commentaire
TypeInfo = szFileInfo + (AnsiString) "Comments";
if (VerQueryValue(Buffer, TypeInfo.c_str(), &Str, &Len))
Memo1->Lines->Add( "Commentaire :\t" + (AnsiString) reinterpret_cast<char *>(Str) );
else Memo1->Lines->Add( "Commentaire :\tErreur de lecture" );

}
__finally{
delete Buffer;
Memo1->Lines->Add( "\t----------------------------" );
}
}

Comment forcer la fermeture d'un programme en exécution (fin de tâche) grâce à son intitulé ?
Auteurs : Bandit Boy , pottiez ,
Pour forcer la fermeture d'un programme, il suffit de connaître le Handle de sa fenêtre, en utilisant pour cela la fonction
FindWindow
qui prend en paramètre l'intitulé de la fenêtre (texte qui se trouve dans la barre de titre de la fenêtre). Ensuite la fonction
GetWindowThreadProcessId
récupère l'ID du processus grâce au Handle. TerminateProcess ferme le programme.
Pour l'exemple "Calculatrice" est le programme a terminer :

- 157 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

/* creation des variables */


HWND hWnd;
DWORD processId;
HANDLE hProcess;
/*CODE*/
do
{
hWnd = FindWindow(NULL,"Calculatrice");
if (hWnd)
{
GetWindowThreadProcessId(hWnd,&processId);
hProcess = OpenProcess(PROCESS_TERMINATE,false,processId);
if (hProcess)
{
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
}
}
}
while(hWnd);
}

- 158 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Interface > Ressources


Comment créer/modifier une ressource de l'exécutable ?
Auteurs : Bandit Boy ,
Les fichiers exécutables contiennent tous un fichier ressource, visible avec un explorateur de ressources (type
RESEXPLORER). Ce fichier contient les données utiles à l'exécutable, comme par exemple son icône.
Il est possible d'ajouter ou de modifier cette ressource pour inclure des fichiers que l'on ne souhaite pas "voir traîner",
par exemple contenant des mots de passe.

Dans un premier temps, l'exécutable étant en cours, nous n'avons pas les droits d'accès. Il est nécessaire de les obtenir
pour mettre à jour l'application. Pour cela, nous allons effectuer une copie de l'exécutable au même endroit que celui en
cours (donc transparent pour l'utilisateur). L'original en exécution sera au préalable déplacé dans le dossier temporaire,
puis supprimé.

AnsiString TempPath;
AnsiString NewPath;
AnsiString OriginalPath;

//move running application


GetTempPath(200,TempPath.c_str());
GetTempFileName(TempPath.c_str(), _T("TMP"),0,NewPath.c_str());
OriginalPath = Application->ExeName;

if(MoveFileEx(OriginalPath.c_str(),NewPath.c_str(),MOVEFILE_REPLACE_EXISTING) == FALSE)
ShowMessage("Moving file error");
if(CopyFile(NewPath.c_str(),OriginalPath.c_str(),FALSE) == FALSE)
ShowMessage("Copying file error");
if(MoveFileEx(NewPath.c_str(),NULL,MOVEFILE_DELAY_UNTIL_REBOOT) == FALSE)
ShowMessage("Moving file error");

Comme il n'est pas possible à l'exécutable de se supprimer lui-même, il sera supprimé au redémarrage du PC par la
fonction MoveFileEx en donnant le message MOVEFILE_DELAY_UNTIL_REBOOT.

Une fois les droits acquis, il n'y a plus qu'à charger le fichier à mettre en ressource puis de mettre à jour.

DWORD dwFileSize, dwBytesRead,dwBytesWritten;


LPBYTE lpBuffer;

//récupération du fichier à ajouter en ressource


HANDLE hFile = CreateFile(Chemin_Fichier_Text.c_str(),
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(INVALID_HANDLE_VALUE != hFile)
{
//chargement du fichier dans un buffer pour le transmettre
dwFileSize = GetFileSize(hFile, NULL);
lpBuffer = new BYTE[dwFileSize];
if(ReadFile(hFile,
lpBuffer,
dwFileSize,
&dwBytesRead,
NULL) != FALSE)
{
//récupération du Handle de la ressource

- 159 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

HANDLE hResource = BeginUpdateResource(OriginalPath.c_str(), FALSE);


if(NULL != hResource)
{
//mise à jour
if(UpdateResource(hResource,
RT_RCDATA,
"RESOURCEADDED",
MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),
(LPVOID) lpBuffer,
dwFileSize) != FALSE)
{
if(EndUpdateResource(hResource, FALSE) != FALSE)
ShowMessage("Update succed! Please restart application");
else
ShowMessage("Error "+IntToStr(GetLastError()));
}
}
}
delete [] lpBuffer;
CloseHandle(hFile);
}

Le fichier mis à jour se trouvant sur la copie, il faut donc relancer l'application pour voir l'effet de cette mise à jour. Ici
le fichier ajouté (ou modifié s'il existe déjà sous le même nom RESOURCEADDED) est de type RCDATA.

lien : Comment lire un fichier de ressources ?


lien : API Windows permettant la mise à jour de la ressource
lien : Site donnant la méthode pour la récupération des droits d'accès

Comment lire un fichier de ressources ?


Auteurs : Interruption13h ,
Il suffit d'utiliser les classes TResourceStreamet TStringList comme suit :

AnsiString Chemin_Fichier_Text=ExtractFilePath(Application->ExeName)+"\\file.txt";
TResourceStream *MRes=new TResourceStream((int)HInstance, "RESOURCE", RT_RCDATA);
MRes->SaveToFile(Chemin_Fichier_Text);
TStringList *File= new TStringList;
File->LoadFromFile(Chemin_Fichier_Text);
DeleteFile(Chemin_Fichier_Text);

Ici on écrit dans un fichier temporaire le contenu de la resource "RESOURCE", puis on le charge dans un TStringList
pour utilisation.

lien : Comment créer/modifier une ressource de l'exécutable ?

Comment enregistrer un fichier en ressource, quelle que soit son extension ?


Auteurs : Bandit Boy , pottiez ,
L'idée développée est d'enregistrer un fichier (bmp, gif, csv ...) en ressource, quel que soit son type.
Il se peut que durant une application, on souhaite sauver des fichiers, des configurations ou tout autres fichiers qui ne
puissent pas être pré-chargés durant la création de l'application.
Dans l'exemple suivant, on sauvegarde le fichier en ressource, l'important est de passer par le type TStream, pour le
sauver en RC_DATA.
Pour l'enregistrer:

- 160 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

TMemoryStream *image = new TMemoryStream();


Image1->Picture->Graphic->SaveToStream(image);
image->Position = 0;

//procédure de sauvegarde
AnsiString TempPath,NewPath,OriginalPath;

GetTempPath(200,TempPath.c_str());
GetTempFileName(TempPath.c_str(), "TMP",0,NewPath.c_str());
OriginalPath = Application->ExeName;

if(MoveFileEx(OriginalPath.c_str(),NewPath.c_str(),MOVEFILE_REPLACE_EXISTING) == FALSE)
Application->MessageBox("Impossible de déplacer l'exe","Erreur",MB_OK+MB_ICONWARNING);
if(CopyFile(NewPath.c_str(),OriginalPath.c_str(),FALSE) == FALSE)
Application->MessageBox("Impossible de copier l'exe","Erreur",MB_OK+MB_ICONWARNING);
if(MoveFileEx(NewPath.c_str(),NULL,MOVEFILE_DELAY_UNTIL_REBOOT) == FALSE)
Application->MessageBox("Impossiblede déplacer la copie","Erreur",MB_OK+MB_ICONWARNING);

DWORD dwFileSize, dwBytesRead,dwBytesWritten;


LPBYTE lpBuffer;

HANDLE hResource = BeginUpdateResource(OriginalPath.c_str(), FALSE);


if(NULL != hResource)
{
if(UpdateResource(hResource,RT_RCDATA,"IMAGEBMP",MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),
(LPVOID)image->Memory, (DWORD)image->Size) != FALSE)
{
if(EndUpdateResource(hResource, FALSE) == FALSE)
ShowMessage("Error "+IntToStr(GetLastError()));
}
else
ShowMessage("Error "+IntToStr(GetLastError()));
}
delete image;

Pour le recharger, il suffit de lire le fichier en tant que TRessourceStream, de le convertir en TSream pour obtenir le
format de sauvegarde, puis de sauver le fichier en tant que son propre type (".txt" pour les fichier texte, ".csv" pour
les csv ...)
Pour le recharger :

hnd = FindResource( NULL, "IMAGEBMP", RT_RCDATA);


if(hnd != NULL)
{
//chargement de la ressource
TResourceStream *Res=new TResourceStream((int)HInstance,"IMAGEBMP",RT_RCDATA);
TMemoryStream *image = new TMemoryStream();
//conversion de la ressource en TMemoryStream pour retrouver le même format enregistré
Res->SaveToStream(image);
image->Position = 0;
//sauvegarde de l'image dans un fichier pour la recharger plus facilement
image->SaveToFile("image1.bmp");
//supression de l'image et des variables
Image1->Picture->Bitmap->LoadFromFile("image1.bmp");
DeleteFile("image1.bmp");
delete Res;
delete image;
}

Par exemple dans une application multilangue, on peut sauver dans un fichier ini, txt ou autre les configurations (choix
de la langue, fichiers chargés, modifications apportées par l'utilisateur...) puis le sauver en Ressource pour que l'exe
soit portable.
L'avantage de cette manipulation est que TOUT est dans UN fichier : l'application elle-même.

- 161 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

L'inconvénient est que le code est un peu lourd à placer, et qu'il faut que l'application soit modifiable (non en lecture
seule) pour être modifiée.

- 162 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système


Comment détecter le nombre de processeurs installés sur la machine ?
Auteurs : Freeze ,
Il suffit de lire la variable d'environnement NUMBER_OF_PROCESSORS :

ShowMessage(StrUpper(getenv("NUMBER_OF_PROCESSORS")).ToIntDef(0));

Comment obtenir les informations sur le processeur de la machine ?


Auteurs : Freeze ,
Il suffit de lire la variable d'environnement PROCESSOR_IDENTIFIER :

ShowMessage(StrUpper(getenv("PROCESSOR_IDENTIFIER")));

- 163 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système > Fichiers .INI


Comment créer/ouvrir un fichier .ini ?
Auteurs : Laurent Dardenne , Ricky81 ,
L'accès aux fichiers .ini se fait grâce au type TIniFile dont l'utilisation nécessite d'inclure IniFiles.hpp.

#include <IniFiles.hpp>

Le nom et l'adresse du fichier en question sont à passer comme paramètres au constructeur.


Celui-ci le crée ou l'ouvre s'il existe déjà.

TIniFile *fichier = new TIniFile("C:\\monfichierini.ini");

Un fichier .ini est un fichier ASCII structuré de la manière suivante : il contient un ou plusieurs noms de sections notés
entre crochets, et chaque section contient des couples clé/valeur.

[Section]
NomDeClé=Valeur

[Section2]
NomDeClé1=Valeur
NomDeClé2=Valeur
...

Attention, il n'y a aucun contrôle sur la structure d'un fichier .ini, il est possible d'ouvrir un fichier texte quelconque.
Dans ce cas, les extractions de clés et/ou valeurs donnent lieu à des résultats aléatoires. L'écriture, par contre, reste
possible.

Note : Sous Windows Me/98/95 le système met en cache une version du fichier Win.ini afin d'augmenter les
performances. Vous pourrez donc être amené à appeler la méhode UpdateFile pour nettoyer les lectures et les écritures
du tampon depuis et vers le fichier .ini sur disque. UpdateFile est utile sous Windows Me/98/95, mais n'a aucun effet
sous Windows NT car NT ne met pas de lectures et d'écritures de fichier INI dans un tampon.

lien : Comment créer la structure d'un fichier .ini ?

Comment créer la structure d'un fichier .ini ?


Auteurs : Ricky81 ,
On utilise après la création ou l'ouverture du fichier .ini les différentes méthodes WriteXXXX.
Il existe une méthode par type de donnée supporté dans un fichier .ini, qui sont au nombre de 8 :
• WriteString pour les valeurs de type AnsiString
• WriteBool pour les valeurs de type bool
• WriteInteger pour les valeurs de type int
• WriteFloat pour les valeurs de type float
• WriteDateTime pour les valeurs de type TDateTime
• WriteDate pour les valeurs de type TDate
• WriteTime pour les valeurs de type TTime
• WriteBinaryStream pour des flux binaires d'un type descendant de TStream

- 164 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Ces méthodes créent ou mettent à jour la valeur relative à un clé dans une section. Leurs prototypes sont similaires et
ne se distinguent que dans le dernier paramètre propre au type traité :

void __fastcall WriteString(const AnsiString Section, const AnsiString Ident, const AnsiString
Value);

Section identifie la section à considérer, Ident est le nom de la clé concernée, et Value correspond à la valeur qu'on désire
faire correspondre à la clé.

Voici un exemple d'écriture dans un fichier .ini :

TIniFile *f;
try
{
f = new TIniFile("C:\\Test.ini");
f->WriteBool("Section bool", "Clé bool", true);
f->WriteDate("Section TDate", "Clé TDate", Date());
f->WriteInteger("Section int", "Clé int", 29);
f->WriteString("Section AnsiString", "Clé AnsiString", "Test.ini");
}
__finally
{
delete f;
}

Voici le résultat :

[Section bool]
Clé bool=1
[Section TDate]
Clé TDate=28/10/2004
[Section int]
Clé int=29
[Section AnsiString]
Clé AnsiString=Test.ini

lien : Comment créer/ouvrir un fichier .ini ?

Comment lire le contenu d'un fichier .ini ?


Auteurs : Ricky81 ,
On utilise après l'ouverture du fichier .ini les différentes méthodes ReadXXXX.
Il existe une méthode par type de donnée supporté dans un fichier .ini, qui sont au nombre de 8 :
• ReadString pour les valeurs de type AnsiString
• ReadBool pour les valeurs de type bool
• ReadInteger pour les valeurs de type int
• ReadFloat pour les valeurs de type float
• ReadDateTime pour les valeurs de type TDateTime
• ReadDate pour les valeurs de type TDate
• ReadTime pour les valeurs de type TTime
• ReadBinaryStream pour des flux binaires d'un type descendant de TStream

Ces méthodes lisent la valeur relative à une clé dans une section. Leurs prototypes sont similaires et ne se distinguent
que par le type renvoyé et celui de la valeur par défaut :

- 165 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

AnsiString __fastcall ReadString(const AnsiString Section, const AnsiString Ident, const AnsiString
Default);

Section identifie la section à considérer, Ident est le nom de la clé concernée, et Default correspond à la valeur à renvoyer
dans les situations suivantes :
• la section n'existe pas
• la clé n'existe pas
• aucun valeur n'est définie

Voici un exemple de lecture d'un fichier .ini :

TIniFile *f;
bool b;
TDate d;
int i;
AnsiString s;

try
{
f = new TIniFile("C:\\Test.ini");
b = f->ReadBool("Section bool", "Clé bool", false);
d = f->ReadDate("Section TDate", "Clé TDate", Date());
i = f->ReadInteger("Section int", "Clé int", 0);
s = f->ReadString("Section AnsiString", "Clé AnsiString", "");
}
__finally
{
delete f;
}

Remarque : la méthode ReadBinaryStream est l'exception à la règle puisque le dernier paramètre est un pointeur vers
le flux dans lequel la valeur sera extraite.

lien : Comment savoir si une section existe dans un fichier .ini?


lien : Comment savoir si une clé existe dans un fichier .ini?
lien : Comment lire les noms de toutes les sections d'un fichier .ini ?
lien : Comment lire les noms de clés d'une section particulière dans un fichier .ini ?
lien : Comment lire l'ensemble des valeurs d'une section d'un fichier .ini ?
lien : Comment lire l'ensemble des valeurs de toutes les sections d'un fichier .ini ?

Comment savoir si une section existe dans un fichier .ini?


Auteurs : Laurent Dardenne ,
La méthode SectionExists permet de déterminer si une section existe ou non dans le fichier .ini.

bool __fastcall SectionExists(const AnsiString Section);

- 166 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Section spécifie la section du fichier .ini à rechercher.

lien : Comment savoir si une clé existe dans un fichier .ini?

Comment savoir si une clé existe dans un fichier .ini?


Auteurs : Laurent Dardenne ,
La méthode ValueExists permet de déterminer si une clé existe ou non dans le fichier .ini.

bool __fastcall ValueExists(const AnsiString Section, const AnsiString Ident);

Section spécifie la section du fichier .ini dans laquelle rechercher la clé, et Ident le nom de la clé.

lien : Comment savoir si une section existe dans un fichier .ini?


lien : Comment lire les noms de clés d'une section particulière dans un fichier .ini ?

Comment lire les noms de toutes les sections d'un fichier .ini ?
Auteurs : Ricky81 ,
La méthode ReadSections lit et renvoie les noms de toutes les sections dans un objet de type descendant de TStrings
comme par exemple TStringList, ou la propriété Lines d'un TMemo.

TIniFile *f;
try
{
TStringList *l = new TStringList();
f = new TIniFile("C:\\Test.ini");
f->ReadSections(l);
ShowMessage(IntToStr(l->Count)+" sections présentes.");
delete l;
}
__finally
{
delete f;
}

Remarque : le contenu de l'objet est écrasé.

lien : Comment savoir si une section existe dans un fichier .ini?

Comment lire les noms de clés d'une section particulière dans un fichier .ini ?
Auteurs : Ricky81 ,
La méthode ReadSection lit et renvoie tous les noms de clés d'une section donnée dans un objet de type descendant de
TStrings, comme par exemple TStringList, ou la propriété Lines d'un TMemo.

TIniFile *f;
try
{
f = new TIniFile("C:\\Test.ini");
f->ReadSection("Section bool", Memo1->Lines);

- 167 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

}
__finally
{
delete f;
}

Remarque : le contenu de l'objet est écrasé.

Comment lire l'ensemble des valeurs d'une section d'un fichier .ini ?
Auteurs : Ricky81 ,
La méthode ReadSectionValues lit les valeurs de l'ensemble des clés d'une section donnée et les envoie à un objet de type
descendant de TStrings sous la forme "clé=valeur".
Les valeurs sont donc converties dans leur représentation AnsiString.

TIniFile *f;
try
{
f = new TIniFile("C:\\Test.ini");
f->ReadSectionValues("Section int", Memo1->Lines);
}
__finally
{
delete f;
}

Remarque : le contenu de l'objet est écrasé.

lien : Comment lire l'ensemble des valeurs de toutes les sections d'un fichier .ini ?

Comment lire l'ensemble des valeurs de toutes les sections d'un fichier .ini ?
Auteurs : Laurent Dardenne , Ricky81 ,
On combine l'appel des méthodes ReadSections et ReadSectionValues.

TIniFile *f;
AnsiString section;

try
{
TStringList *lSections = new TStringList();
TStringList *lValeurs = new TStringList();

f = new TIniFile("C:\\Test.ini");
f->ReadSections(lSections);
for(int i=0 ; i < lSections->Count ; ++i)
{
section = lSections->Strings[i];
f->ReadSectionValues(section, lValeurs);
Memo1->Lines->Append(section);
Memo1->Lines->AddStrings(lValeurs);
}

delete lSections;
delete lValeurs;
}

- 168 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

__finally
{
delete f;
}

lien : Comment lire l'ensemble des valeurs d'une section d'un fichier .ini ?
lien : Comment lire les noms de toutes les sections d'un fichier .ini ?

Comment supprimer une section dans un fichier .ini ?


Auteurs : Laurent Dardenne ,
La méthode EraseSection supprime l'ensemble des couples clé/valeur déclarés dans une section, tout en supprimant
également la section proprement dite.

void __fastcall EraseSection(const AnsiString Section);

Comment supprimer une clé dans un fichier .ini ?


Auteurs : Ricky81 ,
La méthode DeleteKey efface la valeur donnée associée à une entrée dans le fichier .ini.

void __fastcall DeleteKey(const AnsiString Section, const AnsiString Ident);

Section détermine la section concernée, et Ident le nom de la clé pour laquelle le couple clé/valeur va être retiré du fichier.

Remarque : les tentatives de suppression de clés dans une section inexistante ou de suppression de clés inexistantes ne
sont pas considérées comme des erreurs. Dans ces situations, DeleteKey ne fait rien.

Comment écrire un TColor dans un fichier .ini ?


Auteurs : Nono40 ,
Le TColor est en fait un Integer, il donc donc possible d'écrire et de lire une valeur de type TColor avec les méthodes
WriteInteger et ReadInteger.

- 169 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système > Base de Registre


Comment est structurée la base de registre ?
Auteurs : Laurent Dardenne ,
La base de registre stocke ses données dans un arbre hiérarchiquement structuré. La partie du registre qui apparaît en
tant que fichier sur votre disque dur s'appelle une ruche. Le sous-arbre du registre est divisé en ruches (en raison de
leur ressemblance avec la structure cellulaire d'une ruche d'abeilles). Une ruche correspond à un ensemble discret de
clés, de sous-clés et de valeurs, qui figure en haut de la hiérarchie du Registre.

Chaque noeud dans l'arbre s'appelle une clé.


Chaque clé peut contenir des sous-clés et des rubriques valuées appelées valeurs. Une clé peut avoir n'importe quel
nombre de valeurs, et les valeurs peuvent être de n'importe quel type prédéfini.
Chaque clé possède un nom se composant d'un ou plusieurs caractères imprimables c'est-à-dire, s'étendant des valeurs
ASCII 32 à 127.
Les noms principaux ne peuvent pas inclure d'espace, d'antislash (\), ou de caractère de remplacement (* ou ?).
Les noms principaux commençant par un point (.) sont réservés.
Le nom de chaque sous-clé est unique dans le contexte de sa clé parente.
Les noms de clé n'utilisent pas d'autres langues que l'US ; les valeurs peuvent par contre utiliser d'autres langues.

Notes:
• Une clé absolue commence par une barre oblique inverse (\) et est sous-clé de la clé racine.
• Une clé relative est sous-clé de la clé en cours.
• Une clé non-volatile est stockée dans un fichier et est préservée lorsque le système redémarre ( NT ).
• Une clé volatile est stockée en mémoire et n'est pas préservée lorsque le système redémarre ( NT ).

Clés racines prédéfinies :


HKEY_CURRENT_USER
Correspond à la racine contenant les informations de configuration de l'utilisateur connecté. Les paramètres utilisateur
des dossiers, des couleurs d'écran et du Panneau de configuration sont stockés ici. Ces informations constituent un
profil utilisateur.

HKEY_USERS
Correspond à la racine de tous les profils d'utilisateurs de l'ordinateur. HKEY_CURRENT_USER est une sous-clé de
HKEY_USERS.

HKEY_LOCAL_MACHINE
Contient les informations de configuration spécifiques à l'ordinateur (pour tous les utilisateurs).

HKEY_CLASSES_ROOT
Sous-clé de HKEY_LOCAL_MACHINE\Software. Les informations stockées ici garantissent l'ouverture du
programme voulu lorsque vous ouvrez un fichier depuis l'Explorateur Windows.

HKEY_CURRENT_CONFIG
Contient des informations sur le profil matériel utilisé par l'ordinateur local au démarrage.

Types de données prédéfinis :


REG_BINARY
Données binaires brutes. La plupart des informations concernant les composants matériels est stockée sous forme de
données binaires.

REG_DWORD

- 170 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Données représentées par un nombre de 4 octets. Beaucoup de paramètres concernant les pilotes de périphériques et
les services sont de ce type.

REG_EXPAND_SZ
Chaîne de longueur variable. Ce type de données comprend les variables qui sont résolues lorsqu'un programme ou
un service les utilise.

REG_MULTI_SZ
Chaîne multiple. Les valeurs qui contiennent des listes ou plusieurs valeurs sous une forme lisible par l'homme sont
généralement de ce type. Les différentes valeurs sont séparées par un espace, une virgule ou un autre signe.

REG_SZ
Chaîne de texte de longueur fixe.

REG_FULL_RESOURCE_DESCRIPTOR
Série de tableaux imbriqués destinés à stocker une liste de ressources pour un composant matériel ou un pilote.

A noter que les noms de clés et de type prédéfinis dépendent de la version de l'OS. Certaines versions de C++ Builder
ne gèrent nativement qu'un sous ensemble de type prédéfini. Reportez-vous à l'aide en ligne du programme Regedit
ou au SDK Windows.

lien : SDK - Registry Functions

Comment accéder à la base de registre de Windows ?


Auteurs : Laurent Dardenne , Ricky81 ,
Tous les accès à la base de registre sont encapsulés dans une classe : TRegistry. Cette classe est définie dans l'unité
Registry, c'est pourquoi il est indispensable d'inclure registry.hpp avant toute manipulation du registre.

#include <registry.hpp>

L'accès à la base de registre se fait en plusieurs étapes.

1. Création d'un objet Registry :


Il faut commencer par initialiser un objet pour manipuler la base de registre :

TRegistry *registre = new TRegistry();

Il est possible de passer au constructeur un long pour initialiser la propriété Access (niveau d'accès à utiliser).

2. Sélection de la clé racine :


Avant d'accéder à la clé, il faut en spécifier la clé racine dans le registre. Cela se fait en affectant le nom de la clé
racine à la propriété RootKey de l'objet registre précédemment crée. Ce nom de clé est un nom prédéfini, par exemple
HKEY_CURRENT_USER (voyez dans Winreg.h pour les constantes disponibles).

registre->RootKey = HKEY_CLASSES_ROOT;

- 171 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Si par la suite on souhaite accéder à une autre clé racine on doit fermer la clé racine courante puis ouvrir avec la
nouvelle clé racine.

3. Fermeture de la clé racine :


Avant de terminer les opérations sur la base de registre ou de modifier la propriété RootKey, il est important de valider
les modifications apportées par la fermeture la clé en cours. Le type TRegistry possède une méthode qui permet de le
faire : CloseKey.

registre->CloseKey();

Le comportement de cette méthode dépend de la propriété LazyWrite. Il est recommandé de ne pas maintenir les clés
ouvertes plus longtemps que nécessaire.

4. Destruction de l'objet Registre et libération des ressources :


Afin de libérer la mémoire, il est nécessaire de détruire l'objet créé au début du traitement.

delete registre;

Le destructeur appelle la méthode CloseKey avant de détruire l'objet. La suite d'instructions qui suit est donc
redondante :

registre->CloseKey();
delete regisre;

Note : Il est recommandé d'utiliser la gestion d'exception de type try...catch et/ou try...__finally afin de gérer tous les
cas d'erreurs et ainsi libérer la mémoire allouée.

TRegistry *registre = new TRegistry();


try
{
registre->RootKey = HKEY_CLASSES_ROOT;
// Traitement...
}
__finally
{
delete registre;
}

lien : Comment modifier les droits d'accès d'un objet de type TRegistry ?

Comment tester l'existence d'une clé ?


Auteurs : Laurent Dardenne ,
Quelques méthodes de TRegistry n'opèrent que sur des clés existantes, dans ces cas-là on testera préalablement
l'existence de la clé en utilisant la méthode KeyExists.

if registre->KeyExists("nom_de_la_clé")
{

- 172 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

// ...

lien : Comment tester l'existence d'une valeur d'une clé ?


lien : Comment tester l'existence d'une sous-clé ?

Comment tester l'existence d'une valeur d'une clé ?


Auteurs : Laurent Dardenne ,
Quelques méthodes de TRegistry n'opèrent que sur des valeurs de clé existante, dans ces cas-là on testera préalablement
leur existence en utilisant la méthode ValueExists.

if registre->ValueExists("nom_de_la_valeur")
{
// ...

lien : Comment tester l'existence d'une clé ?


lien : Comment tester l'existence d'une sous-clé ?

Comment tester l'existence d'une sous-clé ?


Auteurs : Laurent Dardenne ,
Lorsqu'on exécute un traitement itératif sur un sous-ensemble de clés il est parfois nécessaire de savoir si la clé en cours
possède des sous-clés. Dans ces cas-là on utilisera la méthode HasSubKeys.

if registre->HasSubKeys()
{
// ...

Cette méthode est généralement couplée avec la méthode GetKeyNames.

lien : Comment tester l'existence d'une valeur d'une clé ?


lien : Comment tester l'existence d'une clé ?

Comment créer une clé ?


Auteurs : Ricky81 ,
Pour créer une nouvelle clé on utilise la méthode CreateKey. Le nom de la clé à créer peut être absolu ou relatif.

TRegistry *registre = new TRegistry();


registre->RootKey = HKEY_CURRENT_USER;
if(registre->CreateKey("\\Software\\Essai")) // Nom absolu
{
...

Une clé en absolu l'est par rapport à la clé racine, la chaîne passée commence nécessairement par \ (doublé ici car \ est
le caractère d'échappement). Ici nous créons la clé HKEY_CURRENT_USER\Software\Essai.

TRegistry *registre = new TRegistry();

- 173 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

registre->RootKey = HKEY_CURRENT_USER;
if(registre->OpenKeyReadOnly("Software"))
{
if(registre->CreateKey("Test")) // Nom relatif
{
...

Une clé en relatif l'est par rapport à la clé courante. Ici nous nous sommes placés sur la clé HKEY_CURRENT_USER
\Software et créons donc la clé HKEY_CURRENT_USER\Software\Test.

Comment ouvrir une clé et lire/modifier/supprimer une valeur ?


Auteurs : Laurent Dardenne ,
Pour accéder à la valeur d'un nom de clé, il faut ouvrir la clé qui la contient. On utilise pour cela la méthode OpenKey
de TRegistry :

bool __fastcall OpenKey(const AnsiString Key, bool CanCreate);

Exemple :

registre->OpenKey("nom_de_la_clé", true);

Notez ici que le paramètre CanCreate a pour valeur true. Cela permet au cas où la clé n'existerait pas, de forcer sa
création puis son ouverture. Il s'agit en quelque sorte d'une combinaison d'appel de CreateKey puis d'OpenKey.

Il est à présent possible de lire, écrire ou supprimer une valeur d'une clé.
Pour lire, écrire ou supprimer une valeur chaîne dans la clé, on utilisera les méthodes ReadString, WriteString ou
DeleteString de TRegistry.

Pour la lecture :

maChaine = registre->ReadString("nom_de_la_valeur");

Pour l'écriture :

registre->WriteString("nom_de_la_valeur", "valeur");

On utilisera cette méthode pour modifier une clé existante.

Pour la suppression :

if(registre->DeleteValue("nom_de_la_valeur");
{
...

- 174 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Note : Ici nous avons traité les exemples de la lecture, de l'écriture et de la suppression d'une valeur d'une clé de type
chaîne de caractères. Il existe des méthodes spécifiques pour manipuler les autres types de données. Pour les connaître
reportez-vous à l'aide.

Comment lire les noms de toutes les sous-clés de la clé en cours ?


Auteurs : Ricky81 ,
Lorsqu'on envisage d'effectuer un traitement itératif sur un ensemble de clés, on utilise la méthode GetKeyNames. Elle
permet de récupérer une liste de l'ensemble des noms des sous-clés de la clé en cours en initialisant un objet d'un type
descendant de TStrings.

TRegistry *registre = new TRegistry();


TStringList *mesCles = new TStringList();

// la clé racine par défaut est HKEY_CURRENT_USER


registre->OpenKeyReadOnly("Software"); // clé courante
registre->GetKeyNames(mesCles);
ShowMessage(mesCles->Count); // affiche le nombre de sous-clés

delete registre;
delete mesCles;

lien : Comment lire toutes les valeurs de la clé en cours ?

Comment lire toutes les valeurs de la clé en cours ?


Auteurs : Ricky81 ,
Lorsqu'on envisage d'effectuer un traitement itératif sur l'ensemble des valeurs d'une clé, on utilise la méthode
GetValueNames. Elle permet de récupérer une liste de l'ensemble des valeurs de la clé en cours en initialisant un objet
d'un type descendant de TStrings.

TRegistry *registre = new TRegistry();


TStringList *mesCles = new TStringList();

registre->OpenKeyReadOnly("Software\\Borland\\C++Builder\\6.0"); // clé courante


registre->GetValueNames(mesCles); // lecture des noms

// affichage d'une des valeurs


AnsiString val, res;
val = mesCles->Strings[6];
res = val + "=" + registre->ReadString(val);
ShowMessage(res); // affiche "Version=PRO"

delete registre;
delete mesCles;

lien : Comment lire les noms de toutes les sous-clés de la clé en cours ?

Comment supprimer une clé ?


Auteurs : Laurent Dardenne ,
On peut supprimer une clé devenue inutile : cette opération supprimera également toutes les valeurs qu'elle contient.
Ceci est le rôle de la méthode DeleteKey de TRegistry.

- 175 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

if(registre->DeleteKey("nom_de_la_clé"))
{
// la clé a bien été supprimée
}

Note : Après l'avoir supprimée, il n'est pas nécessaire de fermer cette clé.
Le comportement de cette méthode diffère selon l'OS. Consultez l'aide.

Comment opérer sur une base de registre d'une machine distante ?


Auteurs : Laurent Dardenne ,
Il est parfois nécessaire de modifier des clés de registre d'une machine distante. Dans ce cas on utilise la méthode
RegistryConnect.

bool __fastcall RegistryConnect(const AnsiString UNCName);

Le paramètre "UNCName" contient un nom de machine au format UNC. Le format UNC étant égal à \\<serveur>
\<nom_partage> (ne pas oublier de doubler le caractère \ pour une chaîne de caractères).

void __fastcall LitClesDistantes(AnsiString serverName, TStringList* listeSousCles)


{
AnsiString CleMachineDistante = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion";
AnsiString CleRecherchee = "App Paths";

TRegistry *registreMachineDistante = new TRegistry();


listeSousCles->Clear();

try
{
/* pour les accès distant la propriété RootKey est égale soit
à HKEY_USERS soit à HKEY_LOCAL_MACHINE */
registreMachineDistante->RootKey = HKEY_LOCAL_MACHINE;
if(!registreMachineDistante->RegistryConnect("\\\\"+serverName))
{
// vérifier la configuration réseau ou les permissions d'accès
ShowMessage("Impossible de se connecter.");
return;
}
if(registreMachineDistante->OpenKeyReadOnly("\\"+CleMachineDistante+"\\"+CleRecherchee))
{
registreMachineDistante->GetKeyNames(listeSousCles); // liste des sous-clés
}
else
{
ShowMessage("Erreur, clé absente.");
}
}
__finally
{
delete registreMachineDistante;
}

- 176 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Comment modifier les droits d'accès d'un objet de type TRegistry ?


Auteurs : Laurent Dardenne ,
La propriété ACCESS spécifie le niveau d'accès à utiliser lors de l'ouverture d'une clé. Le niveau d'accès autorisé dépend
des permissions associées à votre compte NT.

L'accès à la base de registre d'une machine peut être limité par l'administrateur. Si vous définissez la propriété
Access=KEY_ALL_ACCESS vous devez avoir le droit d'accès NT 'contrôle total' sur la clé que vous souhaitez modifier.

Sous NT/W2K et XP, vous pouvez visualiser les droits en utilisant l'outil RegEdt32.
Voir l'aide en ligne pour plus de détails.

- 177 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système > Lecteurs


Comment savoir si une disquette est présente dans le lecteur ?
Auteurs : Geronimo , Ricky81 ,
La fonction DiskSize permet de connaître la taille d'un lecteur. Elle prend en paramètre un entier qui correspond au
lecteur à examiner : 1 pour A:, 2 pour B:, et ainsi de suite.
Si la fonction échoue, elle renvoie la valeur -1, permettant ainsi de savoir que le lecteur est vide.
Néanmoins, une erreur Windows est également affichée dans ce cas. Pour ne pas avoir l'affichage de cette erreur, nous
utilisons la fonction SetErrorMode.

UINT oldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);

if (DiskSize(1) > -1)


{
ShowMessage("Une disquette est dans le lecteur");
}
else
{
ShowMessage("Aucune disquette n'est dans le lecteur");
}

SetErrorMode(oldErrorMode); // on restitue l'ancienne valeur

Comment connaître la taille d'un lecteur ?


Auteurs : Ricky81 ,
La fonction DiskSize permet de connaître la taille d'un lecteur. Elle prend en paramètre un entier qui correspond au
lecteur à examiner : 1 pour A:, 2 pour B:, et ainsi de suite.

__int64 taille = DiskSize(3);

Ce code renvoie la taille, en octets, du lecteur C:.

Comment connaître l'espace mémoire total sur un lecteur ?


Auteurs : Freeze ,
La fonction DiskSize permet de connaître la taille d'un lecteur. Elle prend en paramètre un entier qui correspond au
lecteur à examiner : 1 pour A:, 2 pour B:, et ainsi de suite.

__int64 espaceTotal = DiskSize(3);

- 178 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Ce code renvoie l'espace mémoire du lecteur C:, en octets.

Comment connaître l'espace mémoire libre sur un lecteur ?


Auteurs : Ricky81 ,
La fonction DiskFree permet de connaître la taille d'un lecteur. Elle prend en paramètre un entier qui correspond au
lecteur à examiner : 1 pour A:, 2 pour B:, et ainsi de suite.

__int64 espaceLibre = DiskFree(3);

Ce code renvoie l'espace mémoire du lecteur C:, en octets, pouvant encore être utilisé.

Comment ouvrir et/ou fermer le tiroir CD ?


Auteurs : Geronimo , TABZ ,
Utilisez pour cela la commande mciSendString (mmsystem.h).

Pour ouvrir :

mciSendString("Set cdaudio door open wait", 0, 0, 0);

Pour fermer :

mciSendString("Set cdaudio door closed wait", 0, 0, 0);

Dans le cas de plusieurs lecteurs, il vous faut initialiser le lecteur concerné avec la commande suivante :

mciSendString("open F:\ type cdaudio alias cdaudio"); // le lecteur est ici F

De la même façon, vous aurez à utiliser la commande suivante pour clôturer l'association :

mciSendString("close cdaudio", 0, 0, 0);

Tout ceci donne donc le code suivant pour ouvrir par exemple :

mciSendString("open F:\ type cdaudio alias cdaudio", 0, 0, 0);


mciSendString("Set cdaudio door open wait", 0, 0, 0);

- 179 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

mciSendString("close cdaudio", 0, 0, 0);

Comment déterminer le type d'un lecteur ?


Auteurs : TABZ ,
Il suffit d'utiliser la fonction GetDriveType, en créant par exemple la méthode suivante :

String TypeLecteur(String lecteur)


{
int id = GetDriveType(lecteur.c_str());
switch(id)
{
case 0 : return "Inconnu";
case 1 : return "Inexistant";
case DRIVE_REMOVABLE : return "Lecteur de disquette";
case DRIVE_FIXED : return "Lecteur de disque";
case DRIVE_REMOTE : return "Lecteur distant";
case DRIVE_CDROM : return "Lecteur de CD-ROM";
case DRIVE_RAMDISK : return "Ramdisk";
}
}

Ainsi par exemple, TypeLecteur("C:\") retournera "Lecteur de disque".

lien : Comment lire le nom de volume et le numéro de série d'un disque ?

Comment lire le nom de volume et le numéro de série d'un disque ?


Auteurs : Nono40 , Ricky81 , Freeze , virtuA ,
La fonction suivante permet d'obtenir des informations sur un disque :

int GetVolumeInformationA(
const char * lpRootPathName,
char * lpVolumeNameBuffer,
unsigned long nVolumeNameSize,
unsigned long * lpVolumeSerialNumber,
unsigned long * lpMaximumComponentLength,
unsigned long * lpFileSystemFlags,
char * lpFileSystemNameBuffer,
unsigned long nFileSystemNameSize)

Il suffit de passer en paramètre le chemin vers la racine du disque ("C:\\"), afin d'obtenir les informations voulues.
Au retour de la fonction :
• lpVolumeNameBuffer va contenir le nom de volume
• lpFileSystemNameBuffer va contenir le nom du système de fichiers
• lpVolumeSerialNumber va contenir le numéro de série
• lpMaximumComponentLength va contenir la longueur maximum d'un nom de fichier
• lpFileSystemFlags va contenir la liste des états du disque

Exemple d'utilisation de la fonction :

void __fastcall TForm1::Button1Click(TObject *Sender)

- 180 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

{
const int Max_Length = 256;
char * VolName = new char[Max_Length];
char * FileSysName = new char[Max_Length];
unsigned long VolSerial;
unsigned long FileMaxLen;
unsigned long FileFlags;

if(GetVolumeInformationA("C:\\", VolName, Max_Length, &VolSerial, &FileMaxLen, &FileFlags,


FileSysName, Max_Length))
{
AnsiString Message = "Nom du disque : " + AnsiString(VolName);
Message += "\nSystème de fichiers : " + AnsiString(FileSysName);
Message += "\nNuméro de série : " + FloatToStr(VolSerial);
ShowMessage(Message);
}

delete[] VolName;
delete[] FileSysName;
}

Une variante avec la fonction suivante :

BOOL GetVolumeInformation(
LPCTSTR lpRootPathName,// adresse du volume
LPTSTR lpVolumeNameBuffer,// structure qui accueillera le nom du volume
DWORD nVolumeNameSize,// taille de la structure qui accueillera le nom du volume
LPDWORD lpVolumeSerialNumber,// structure qui accueillera le numéro de série du volume
LPDWORD lpMaximumComponentLength,// structure qui accueillera la taille maximale d'un nom de fichier
LPDWORD lpFileSystemFlags,// structure qui accueillera des informations sur le système de fichiers
LPTSTR lpFileSystemNameBuffer,// structure qui accueillera le nom du système de fichiers
DWORD nFileSystemNameSize // taille de la structure qui accueillera le nom du système de fichiers
);

Exemple d'utilisation de cette fonction (n'oubliez pas d'inclure stdio.h) :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
AnsiString numserie;

char VolName[12],serial[15];
DWORD VolumeSerialNumber;
DWORD MaximumComponentLength;
DWORD FileSystemFlags;
char FileSystemName[5];
if (GetVolumeInformation("C:\\",
VolName,
sizeof(VolName),
&VolumeSerialNumber,
&MaximumComponentLength,
&FileSystemFlags,
FileSystemName,
sizeof(FileSystemName)))
{
sprintf(serial,"%X-%X",HIWORD(VolumeSerialNumber),LOWORD(VolumeSerialNumber));
numserie = serial;
AnsiString Message = "Nom du disque : " + AnsiString(VolName);
Message += "\nSystème de fichiers : " + AnsiString(FileSystemName);
Message += "\nNuméro de série : " + numserie;
ShowMessage(Message);
}
}

- 181 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

La seule différence à la restitution concerne le numéro de série qui ici est au format hexadécimal.

lien : Comment déterminer le type d'un lecteur ?

- 182 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système > Moniteurs


Comment obtenir la résolution de l'écran ?
Auteurs : Geronimo ,
Avec C++Builder, vous avez à votre disposition l'objet Screen qui dispose d'un certain nombre de méthodes et propriétés
concernant, comme son nom l'indique, l'écran. Pour obtenir la résolution, il suffit de récupérer la largeur et la hauteur
de l'écran en pixels :

int width = Screen->Width; // longueur


int height = Screen->Height; // hauteur
ShowMessage("La résolution de l'écran est :" + IntToStr(width) + "*" + IntToStr(height));

lien : Comment changer la résolution de l'écran ?


lien : Comment revenir à la résolution par défaut de l'écran ?

Comment changer la résolution de l'écran ?


Auteurs : Atlantis , Ricky81 , Bandit Boy ,
Voici une fonction qui fait cela très bien :

bool __fastcall ChangeResolution(int Width, int Height)


{
TDeviceMode *Dev = new TDeviceMode;
EnumDisplaySettings(0,ENUM_CURRENT_SETTINGS, Dev);
Dev->dmPelsWidth = Width;
Dev->dmPelsHeight = Height;
Dev->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
bool result = (ChangeDisplaySettingsA(Dev, CDS_RESET) == DISP_CHANGE_SUCCESSFUL);
delete Dev;
return result;
}

Attention, cette fonction ne teste pas si votre écran supporte la résolution que vous souhaitez. Prévoyez au cas où dans
votre développement de pouvoir revenir à la résolution précédente.

lien : Comment obtenir la résolution de l'écran ?


lien : Comment revenir à la résolution par défaut de l'écran ?

Comment revenir à la résolution par défaut de l'écran ?


Auteurs : Nono40 , Ricky81 ,
Si dans votre application vous changez la résolution de l'écran, il est possible de revenir à celle par défaut (celle utilisée
au démarrage de Windows). Pour cela utilisez la méthode suivante :

ChangeDisplaySettingsA(0, 0);

lien : Comment obtenir la résolution de l'écran ?

- 183 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

lien : Comment changer la résolution de l'écran ?

Comment lancer l'écran de veille défini par défaut ?


Auteurs : Ricky81 ,
Pour cela, il vous faut utiliser la fonction SendMessage (qui permet d'envoyer un message à une fenêtre donnée) comme
ci-dessous :

SendMessage(Application->Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 1);

lien : Comment mettre en veille le moniteur ?


lien : Comment empêcher l'exécution de l'écran de veille et la mise en veille ?

Comment mettre en veille le moniteur ?


Auteurs : Geronimo ,
Pour cela, il vous faut utiliser la fonction SendMessage (qui permet d'envoyer un message à une fenêtre donnée) comme
ci-dessous :

SendMessage(Application->Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1);

lien : Comment lancer l'écran de veille défini par défaut ?


lien : Comment empêcher l'exécution de l'écran de veille et la mise en veille ?

Comment empêcher l'exécution de l'écran de veille et la mise en veille ?


Auteurs : Gysmo , Ricky81 ,
Dans certains cas, il est pratique qu'au lancement du programme celui-ci désactive l'écran de veille ainsi que la mise
en veille du moniteur.
Pour cela, nous allons utiliser l'API SystemParametersInfo :

SystemParametersInfo(unsigned int uiAction,


unsigned int uiParam,
void * pvParam,
unsigned int fWinIni)

Voici un exemple d'utilisation pour suspendre l'écran de veille et la mise en veille du moniteur durant l'exécution d'un
programme (void * Param; est un membre privé de la fiche) :

//---------------------------------------------------------------------------
// Au lancement de l'application on modifie les valeurs d'attente
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// si l'écran de veille est actif
if(!SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, NULL, SPIF_UPDATEINIFILE))
{
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, NULL, SPIF_UPDATEINIFILE);
}

// On récupère le temps d'attente avant la mise en veille

- 184 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

SystemParametersInfo(SPI_GETPOWEROFFTIMEOUT, 0, &Param, SPIF_UPDATEINIFILE);


ShowMessage(IntToStr(Param));
if(Param > 0)
{
// on désactive la mise en veille
SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, 0, NULL, SPIF_UPDATEINIFILE);
}
}
//---------------------------------------------------------------------------
// A la fermeture de l'application on rétablit les valeurs
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(!SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 1, NULL, SPIF_UPDATEINIFILE))
{
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, NULL, SPIF_UPDATEINIFILE);
}

if(Param > 0)
{
SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, (int) Param, NULL, SPIF_UPDATEINIFILE);
}
}
//---------------------------------------------------------------------------

lien : Comment lancer l'écran de veille défini par défaut ?


lien : Comment mettre en veille le moniteur ?

Comment obtenir des informations sur les polices du système ?


Auteurs : Pierre Castelain , Ricky81 ,
Récupérer les informations concernant les polices utilisées dans une application C++ Builder est évident : Il suffit de
consulter les attributs des propriétés de type TFont. Par contre, nous n'avons pas accès à toutes les polices. Par exemple
la police utilisée pour la barre de titre n'est pas disponible directement. Il nous faut donc utiliser une fonction de l'API
Windows : SystemParametersInfo
Voici un exemple d'utilisation de cette fonction. Le code suivant récupère juste le nom de la police de la barre de titre,
mais vous pouvez le modifier facilement en utilisant les variables de metrics.lfCaptionFont

AnsiString GetTitleBarFontName()
{
NONCLIENTMETRICS metrics;
metrics.cbSize = sizeof(metrics);
AnsiString result = "Aucune Font trouvée";
if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(metrics), &metrics, 0))
{
result = metrics.lfCaptionFont.lfFaceName;
}
return result;
}

lien : Comment détecter la taille de la police d'affichage de Windows ?

Comment détecter la taille de la police d'affichage de Windows ?


Auteurs : Pierre Castelain , Ricky81 ,
Si vous désirez réaliser une interface graphique qui soit utilisable sur tous les systèmes de vos utilisateurs, vous allez
peut-être vouloir connaître la taille de la police d'affichage afin d'adapter votre interface en fonction. Ce paramètre, qui
peut être modifié par le panneau de configuration de l'affichage, a un impact non négligeable sur l'aspect des fenêtres

- 185 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

réalisées avec C++ Builder. En effet, les fenêtres héritant de TForm utilisent cette taille comme taille par défaut de leur
propre police. Pour obtenir cette information, un simple appel à la fonction GetDeviceCaps suffit.
La fonction d'exemple suivante vous retourne directement la taille de la police. Les valeurs principales sont :

• 96 pour une petite police


• 120 pour une grande police
• et n'importe quelle autre valeur si l'utilisateur l'a spécifiée (relativement rare)

int GetSystemFontSize()
{
HDC dc = GetDC(0);
int result = GetDeviceCaps(dc, LOGPIXELSX);
ReleaseDC(0, dc);
return result;
}

lien : Comment obtenir des informations sur les polices du système ?

- 186 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système > Clavier et souris


Comment gérer le clavier et la souris avec l'API Windows ?
Auteurs : Geronimo ,
Consultez le tutoriel dont le lien figure ci-dessous.

lien : Contrôle du clavier et de la souris sous Windows


lien : Comment simuler un clic de souris ?
lien : Comment tester l'état d'un bouton ou d'une touche ?
lien : Comment connaître la position de la souris ?

Comment intercepter tous les évènements clavier des composants d'une fiche ?
Auteurs : Geronimo ,
Pour permettre à une fiche de récupérer les évènements du clavier se produisant dans l'un de ses contrôles enfants,
vous devez positionner la propriété KeyPreview à true, la fiche recevra tous les évènements du clavier avant que les
contrôles ne les reçoivent.

Vous pouvez définir cette propriété dans l'inspecteur d'objet ou à tout moment par le code suivant :

KeyPreview = true;

lien : Comment détecter le verrouillage des touches (NumLock, CapsLock, ScrollLock) ?


lien : Comment tester l'état d'un bouton ou d'une touche ?

Comment détecter le verrouillage des touches (NumLock, CapsLock, ScrollLock) ?


Auteurs : Geronimo , Ricky81 ,
Prenons l'exemple de la surveillance de l'écriture dans un TEdit et intéressons nous à l'évènement OnKeyDown :

void __fastcall Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift);

Nous allons utiliser la fonction GetKeyState qui permet non seulement de savoir si une touche est enfoncée, mais
également de savoir si celle-ci est bloquée.
Pour cela, il faut examiner de plus près la valeur renvoyée par cette fonction : elle renvoie un SHORT. Le bit de poids
le plus fort est à 1 si la touche est enfoncée et le bit de poids le plus faible est à 1 si la touche est verrouillée.
Le code suivant permet donc de tester le verrouillage ou non du NumLock :

void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)


{
if(Key == VK_NUMLOCK)
{
if((GetKeyState(VK_NUMLOCK) & 1) == 1)
{
ShowMessage("NumLock vient d'être verrouillé !");
}
}

- 187 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

lien : Comment tester l'état d'un bouton ou d'une touche ?

Comment connaître la position de la souris ?


Auteurs : Geronimo ,
Utilisez pour cela la fonction GetCursorPos qui initialise un objet avec les coordonnées actuelles du pointeur de la souris.
Pour cela, on lui passe en paramètre un pointeur sur une instance d'un objet de type TPoint, lequel type permet
d'identifier un point de l'espace en deux dimensions par une abscisse et une ordonnée.

TPoint *Position = new TPoint;


GetCursorPos(Position);
int x = Position->x;
int y = Position->y;
delete Position;

lien : Comment gérer le clavier et la souris avec l'API Windows ?

Comment simuler un clic de souris ?


Auteurs : Al-Yazdi , Ricky81 ,
Il suffit de déplacer la souris, faire croire à Windows que le bouton est appuyé, puis relâcher et remettre (ou pas) le
curseur en place. Voici comment faire :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
TPoint MyPoint;
// Récupère la position du curseur
GetCursorPos(&MyPoint);
// Positionne le curseur sur l'écran
SetCursorPos(200, 200);
// Simule l'action de clic du bouton gauche de la souris
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
// Simule l'action de relâcher du bouton gauche de la souris
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
// Repositionne le curseur à sa position d'origine
SetCursorPos(MyPoint.x, MyPoint.y);
}

Il existe aussi les constantes :

• MOUSEEVENTF_RIGHTDOWN et MOUSEEVENTF_RIGHTUP pour provoquer des clics droits


• MOUSEEVENTF_MIDDLEDOWN et MOUSEEVENTF_MIDDLEUP pour provoquer un clic du bouton du
milieu
• MOUSEEVENTF_MOVE pour faire croire que la souris a bougé sans la faire bouger

- 188 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

• MOUSEEVENTF_WHEEL pour faire croire que la molette a bougé (sans indication de sens)

lien : Comment gérer le clavier et la souris avec l'API Windows ?

Comment tester l'état d'un bouton ou d'une touche ?


Auteurs : Nono40 , Ricky81 ,
Il est possible de tester à tout moment l'état d'une touche du clavier ou d'un bouton de la souris grâce à la fonction API :

short GetAsyncKeyState(int vKey)

Cette fonction retourne l'état de la touche, le bit 15 du résultat est à 1 si la touche (ou le bouton) est actuellement
enfoncée. Le test fonctionne aussi même si l'application n'est pas active. Le numéro de touche passé en paramètre doit
être le code de touche virtuelle. C++ Builder définit les constantes VK_xxxx pour chaque touche du clavier. A noter
que pour les touches de type lettre, on peut également utiliser le code ASCII de la lettre majuscule, ou le charactère
correspondant (ce qui revient au même).

Pour obtenir la liste des codes de touche virtuelle, recherchez dans l'aide de BCB la rubrique Codes de touche virtuelle

Par exemple pour tester l'état du bouton gauche de la souris :

void __fastcall TForm1::Timer1Timer(TObject *Sender)


{
if((GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0)
{
Label1->Caption = "Enfoncé";
}
else
{
Label1->Caption = "Relâché";
}
}

lien : Comment gérer le clavier et la souris avec l'API Windows ?


lien : Comment intercepter tous les évènements clavier des composants d'une fiche ?
lien : Comment détecter le verrouillage des touches (NumLock, CapsLock, ScrollLock) ?

Comment répéter une action lorsque le bouton gauche de la souris reste enfoncé ?
Auteurs : blondelle , pottiez , henderson ,
Cette fonction repète une action tant que le bouton gauche de la souris reste enfoncé.
Attention : ne pas utiliser dans le code les variables X et Y qui sont les coordonnées de la souris.

void __fastcall TForm1::Button1MouseDown(TObject *Sender,


TMouseButton Button, TShiftState Shift, int X, int Y)
{
// dans la boucle ne pas utiliser X et Y qui sont les coordonnées de
// la souris renvoyées par Button1MouseDown
unsigned int time;
int a = 0; // utiliser pour tester
// on boucle tant que le bouton gauche de la souris est enfoncé
while ((GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0)

- 189 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

{
a = a + 1;
Label1->Caption = a;
Application->ProcessMessages();
time = GetTickCount();
while (GetTickCount() < time + 150) // 150 ms
{
// 150 ms temporisation utilisée pour un appui bref
// sinon le déplacement est de plusieurs pixels si le délai est trop court
}
}
}

La boucle " while ((GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0) " répète l'action tant que le bouton gauche
reste enfoncé, dès que celui-ci est relaché l'action cesse.
La boucle " while (GetTickCount() < time + 150) " assure une temporisation qui ralentit le test sur l'état du bouton afin
de ne prendre en compte que l'incrément de 1 lors d'un appui bref.

- 190 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système > Mémoire


Comment obtenir la mémoire vive (RAM) totale ?
Auteurs : Ricky81 , Freeze ,
Il est possible d'utiliser la structure MEMORYSTATUSEX (Windows.hpp) conjuguée avec la fonction
GlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;


GlobalMemoryStatusEx(MS);
float tailleRam = MS->ullTotalPhys; // résultat en octets
delete MS;

La fonction GlobalMemoryStatusEx initialise la variable MS avec différentes informations concernant l'état instantané
de la mémoire.
La quantité de mémoire vive installée sur le poste est récupérable par le membre ullTotalPhys.

Une variante :

int ram;

MEMORYSTATUSEX X;
X.dwLength = sizeof(X);
GlobalMemoryStatusEx(&X);
ram = X.ullTotalPhys+524288;

Comment obtenir la quantité de mémoire vive (RAM) libre ?


Auteurs : Ricky81 ,
Il est possible d'utiliser la structure MEMORYSTATUSEX (Windows.hpp) conjuguée avec la fonction
GlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;


GlobalMemoryStatusEx(MS);
float ramLibre = MS->ullAvailPhys; // résultat en octets
delete MS;

La fonction GlobalMemoryStatusEx initialise la variable MS avec différentes informations concernant l'état instantané
de la mémoire.
La quantité de mémoire vive libre est récupérable par le membre ullAvailPhys.

Comment déterminer le pourcentage de mémoire vive (RAM) utilisée ?


Auteurs : Ricky81 ,
Il est possible d'utiliser la structure MEMORYSTATUSEX (Windows.hpp) ainsi que la fonction
GlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;


GlobalMemoryStatusEx(MS);

- 191 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

float pourcentageUtilisation = MS->dwMemoryLoad; // valeur entre 0 et 100


delete MS;

La fonction GlobalMemoryStatusEx initialise la variable MS avec différentes informations concernant l'état instantané
de la mémoire.
Le pourcentage d'utilisation de la mémoire vive est récupérable par le membre dwMemoryLoad.

Comment obtenir la quantité de mémoire virtuelle libre restante ?


Auteurs : Ricky81 ,
Il est possible d'utiliser la structure MEMORYSTATUSEX (Windows.hpp) conjuguée avec la fonction
GlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;


GlobalMemoryStatusEx(MS);
float memoireVirtuelleLibre = MS->ullAvailVirtual; // résultat en octets
delete MS;

La fonction GlobalMemoryStatusEx initialise la variable MS avec différentes informations concernant l'état instantané
de la mémoire.
La quantité de mémoire virtuelle libre restante est récupérable par le membre ullAvailVirtual.

Comment obtenir la quantité de mémoire virtuelle totale utilisable ?


Auteurs : Ricky81 ,
Il est possible d'utiliser la structure MEMORYSTATUSEX (Windows.hpp) conjuguée avec la fonction
GlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;


GlobalMemoryStatusEx(MS);
float memoireVirtuelle = MS->ullTotalVirtual; // résultat en octets
delete MS;

La fonction GlobalMemoryStatusEx initialise la variable MS avec différentes informations concernant l'état instantané
de la mémoire.
La quantité de mémoire virtuelle pouvant être utilisée est récupérable par le membre ullTotalVirtual.

Comment obtenir la quantité de mémoire paginée libre ?


Auteurs : Ricky81 ,
Il est possible d'utiliser la structure MEMORYSTATUSEX (Windows.hpp) conjuguée avec la fonction
GlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;


GlobalMemoryStatusEx(MS);
float memoirePagineeLibre = MS->ullAvailPageFile; // résultat en octets
delete MS;

- 192 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

La fonction GlobalMemoryStatusEx initialise la variable MS avec différentes informations concernant l'état instantané
de la mémoire.
La quantité de mémoire paginée libre restante est récupérable par le membre ullAvailPageFile.

Comment obtenir la quantité de mémoire paginée totale pouvant être allouée ?


Auteurs : Ricky81 ,
Il est possible d'utiliser la structure MEMORYSTATUSEX (Windows.hpp) conjuguée avec la fonction
GlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;


GlobalMemoryStatusEx(MS);
float memoirePaginee = MS->ullTotalPageFile; // résultat en octets
delete MS;

La fonction GlobalMemoryStatusEx initialise la variable MS avec différentes informations concernant l'état instantané
de la mémoire.
La quantité de mémoire paginée pouvant être utilisée est récupérable par le membre ullTotalPageFile.

- 193 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système > Son


Comment jouer un son d'un fichier Wave ?
Auteurs : Ricky81 ,
Pour jouer un fichier Wave, commencez par inclure le header mmsystem.h, puis utilisez la fonction PlaySound.

PlaySound("E:\\WINDOWS\\Media\\notify.wav", NULL, SND_SYNC);

Dans cet exemple, le son est joué et la fonction renvoie true après la fin du son.
Voyez l'aide pour la liste des options possibles.

Comment produire un son système Windows ?


Auteurs : Geronimo ,
Pour produire un son système Windows, vous pouvez utiliser la fonction MessageBeep. Cette fonction prend une
constante en argument qui précise le type de son à produire. Voici tout d'abord un exemple simple d'utilisation :>

MessageBeep(MB_OK);

Les sons utilisables sont :


• 0xFFFFFFFF : Message sonore basique généré par l'haut-parleur de votre PC
• MB_ICONASTERISK : SystemAsterisk - Message d'information
• MB_ICONEXCLAMATION : SystemExclamation - Message d'avertissement
• MB_ICONHAND : SystemHand - Message d'Erreur (interruption d'un processus)
• MB_ICONQUESTION : SystemQuestion - Message demandant une confirmation ou une infirmation
• MB_OK : SystemDefault - Message sonore par défaut

Comment afficher la fenêtre de réglage du volume Windows ?


Auteurs : Geronimo ,
Il suffit de lancer le programme correspondant avec la fonction ShellExecute.

ShellExecute(0, "open", "sndvol32.exe", 0, 0, SW_SHOW);

Comment régler le volume du son dans Windows ?


Auteurs : Bibmari , Crayon ,
Pour régler le volume du son dans Windows, il va falloir utiliser deux fonctions de l'API Win32 : waveOutGetVolume
pour récupérer le volume courant, et waveOutSetVolume pour le positionner.
Ces deux fonctions sont déclarées dans le header mmsystem.h.
Le Handle utilisé sera NULL pour impacter le son dans son intégralité. Cette usage n'est pas documenté dans la MSDN,
mais il semble qu'il l'ait été dans une version précédente.

Le code suivant montre comment récupérer le volume actuel du mixer, le modifier, et retourner à la valeur précédente.

- 194 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

#include <mmsystem.h>
...
unsigned long volume;
waveOutGetVolume(NULL, (LPDWORD) &volume);
waveOutSetVolume(NULL, (DWORD)0x0);
waveOutSetVolume(NULL, volume);

A partir de Windows Vista ces méthodes ne sont plus gérées, on peut donc utiliser le code
suivant pour afficher la fenêtre de contrôle de son :

ShellExecute(0, "open", "sndvol.exe", 0, 0, SW_SHOW);

lien : MSDN : waveOutGetVolume


lien : MSDN : waveOutSetVolume

- 195 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système > DLL


Comment connaître les fonctions contenues dans une DLL ?
Auteurs : Ricky81 ,
Il faut utiliser l'utilitaire TDUMP, fourni avec C++ Builder, présent dans le répertoire BIN. Dans une fenêtre de
commandes :

tdump -ee -m votredll.dll

Le résultat affiché vous donne les noms des fonctions mais il n'est malheureusement pas possible de connaître les
paramètres attendus par les fonctions.

On peut également utiliser l'outil gratuit Dependency Walker, qui montre en plus les dépendances entre modules.

lien : Dependency Walker

- 196 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système > Port série / RS 232 et port parallèle


Comment piloter le port parallèle ?
Auteurs : Geronimo ,
Consultez le tutoriel dont le lien figure ci-dessous.

lien : Tutoriel TDLPortIO

Comment piloter le port série ?


Auteurs : Geronimo ,
Consultez le tutoriel dont le lien figure ci-dessous.

lien : Tutoriel TComPort

Comment obtenir la liste des ports COM et parallèles d'un PC ?


Auteurs : Bandit Boy ,
Cette fonction permet de lire la base de données registre de la machine et d'en tirer la liste des port COM et parallèle
du PC.

TStringList* availableComPorts = new TStringList();


TRegistry *Registry = new TRegistry(KEY_READ);
AnsiString portNb ="";

Registry->RootKey = HKEY_LOCAL_MACHINE;
// The com ports are administered in the following directory.
// false, because no entry is supposed to be created.
Registry->OpenKey("HARDWARE\\DEVICEMAP\\SERIALCOMM", false);

// Extract the COM port names and store them.


Registry->GetValueNames(availableComPorts);
// List the available COM ports in the corresponding combo box.
for (int i(0); i < availableComPorts->Count; i++)
{
portNb = Registry->ReadString(availableComPorts->Strings[i]);
ComboBox1->AddItem(portNb, NULL);
}
delete Registry;
delete availableComPorts;

- 197 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Système > Divers


Comment ajouter une entrée aux Documents récemment ouverts de Windows ?
Auteurs : Geronimo , Ricky81 ,
Pour ajouter une entrée, il vous faut utiliser la fonction SHAddToRecentDocs (shlobj.h) et l'appeler comme suit :

AnsiString fichier = "C:\\monFichier.txt";


SHAddToRecentDocs(SHARD_PATH, fichier);

Si vous rencontrez un problème à l'inclusion de shlobj.h il vous faudra modifier les fichiers shobjidl.h et shlobj.h comme
suit :

shobjidl :
• Commenter les lignes 2189 à 2193
• Commenter les lignes 8085 à 8095

shlobj.h :
• Modifier la ligne 1422 en } *LPFVSHOWINFO;
• Modifier la ligne 3457 en } *LPSHELLFLAGSTATE;

Comment masquer les icônes du bureau ?


Auteurs : Geronimo , Ricky81 ,
Sous Windows, le bureau est représenté par une fenêtre, qui a pour enfant toutes les autres fenêtres. Il faut donc
récupérer le Handle de cette fenêtre, ce qui se fait avec la fonction FindWindow.
La fonction ShowWindow permet elle d'agir sur une fenêtre (cacher, afficher, réduire, agrandir, ...).

HWND Bureau = FindWindow("Progman", "Program Manager");


ShowWindow(Bureau, SW_HIDE);

Pour réactiver le bureau, il vous suffit de reproduire le code suivant :

HWND Bureau = FindWindow("Progman", "Program Manager");


ShowWindow(Bureau, SW_SHOW);

Comment fermer une session Windows ?


Auteurs : Ricky81 ,
Pour fermer une session Windows, il faut faire appel à la fonction ExitWindowsEx :

ExitWindowsEx(EWX_LOGOFF,0);

Remarque : pour forcer les applications à se terminer, il est possible d'utiliser le flag EWX_FORCE en complément
de EWX_LOGOFF.
Par exemple :

- 198 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0);

Comment mettre en veille l'ordinateur ?


Auteurs : Ricky81 ,
Pour mettre l'ordinateur en veille, il faut faire appel à la fonction SetSystemPowerState :

SetSystemPowerState(False,True);

Le code précédent met l'ordinateur en veille en utilisant la technique d'hibernation et envoie le message de mise en veille
aux applications sans attendre de réponse.

Cette fonction ne fonctionnera avec les systèmes NT que si l'application dispose du privilège SE_SHUTDOWN_NAME.

lien : Comment donner un privilege à une application ?

Comment redémarrer l'ordinateur ?


Auteurs : Ricky81 ,
Pour redémarrer l'ordinateur, il faut faire appel à la fonction ExitWindowsEx :

ExitWindowsEx(EWX_REBOOT,0);

Remarque : pour forcer les applications à se terminer, il est possible d'utiliser le flag EWX_FORCE en complément
de EWX_REBOOT.
Par exemple :

ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);

Cette fonction ne fonctionnera avec les systèmes NT que si l'application dispose du privilège SE_SHUTDOWN_NAME.

lien : Comment donner un privilege à une application ?

Comment éteindre l'ordinateur ?


Auteurs : Geronimo ,
Pour éteindre l'ordinateur, il faut faire appel à la fonction ExitWindowsEx :

ExitWindowsEx(EWX_SHUTDOWN,0);

Le code précédent ferme Windows mais n'éteint pas nécessairement l'ordinateur.


Pour éteindre complètement l'ordinateur, il faut utiliser le flag EWX_POWEROFF à la place de EWX_SHUTDOWN.

Remarque : pour forcer les applications à se terminer, il est possible d'utiliser le flag EWX_FORCE en complément
d'un des 2 précédemment cités.

- 199 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Par exemple :

ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);

Cette fonction ne fonctionnera avec les systèmes NT que si l'application dispose du privilège SE_SHUTDOWN_NAME.

lien : Comment donner un privilege à une application ?

Comment obtenir la version de Windows ?


Auteurs : Greybird , Ricky81 ,
Il existe un certain nombre de constantes et variables définies par SysUtils.hpp qui permettent d'obtenir les informations
adéquates.
Notamment, Win32Platform renvoie le type de plateforme utilisée : VER_PLATFORM_WIN32s,
VER_PLATFORM_WIN32_WINDOWS ou VER_PLATFORM_WIN32_NT.
Pour affiner, il est ensuite nécessaire de consulter les variables Win32MajorVersion et Win32MinorVersion, ainsi que
Win32CSDVersion pour les Service Packs.

Pour obtenir la version de Windows installée sur le PC, C++ Builder fournit ainsi les variables Win32MajorVersion et
Win32MinorVersion, entre autres. On peut en déduire la version de Windows à l'aide du code suivant :

AnsiString __fastcall GetWindowsVersion()


{
AnsiString result;
switch(Win32MajorVersion)
{
case 3: result = "Windows NT 3.51";break;
case 4:
switch(Win32MinorVersion)
{
case 0:
switch (Win32Platform)
{
case 1:
{
switch (Win32CSDVersion[1])
{
case 'A': result = "Windows 95 SP 1";break;
case 'B': result = "Windows 95 SP 2";break;
}
break;
}
case 2: result = "Windows NT 4.0";break;
}
break;
case 10:
switch (Win32CSDVersion[1])
{
case 'A': result = "Windows 98 SP 1";break;
case 'B': result = "Windows 98 SP 2";break;
}
break;
case 90: result = "Windows ME";break;
}
break;
case 5:
switch (Win32MinorVersion)
{

- 200 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

case 0: result = "Windows 2000";break;


case 1: result = "Windows XP";break;
case 2: result = "Windows 2003";break;
}
break;
}
if (result.IsEmpty())
{
result = "Inconnue";
}
return result;
}

Cette méthode permet d'obtenir simplement le nom du système d'exploitation. Il est cependant possible d'obtenir des
informations plus détaillées (numéro de construction, pro/perso, etc.) en utilisant les fonctions de l'API Windows. Cette
méthode un peu plus longue est donnée dans le fichier zip ci-dessous.

lien : MSDN - GetVersionEx


lien : MSDN : Getting the System Version
windowsversion.zip

Comment obtenir le nom de la machine ?


Auteurs : ksly ,
Le code suivant renvoie le nom de la machine :

AnsiString __fastcall GetMac()


{
AnsiString mac("");
DWORD t_computer(MAX_COMPUTERNAME_LENGTH + 1);
char *name_computer=new char[t_computer];
if( GetComputerName(name_computer, &t_computer) )
{
mac=AnsiString(name_computer);
}
delete[] name_computer;
return mac;
}

Comment obtenir le login de l'utilisateur connecté ?


Auteurs : ksly ,
Le code suivant retourne le nom de l'utilisateur connecté :

AnsiString __fastcall GetUser()


{
AnsiString user("");
DWORD t_user(256);
char *name_user=new char[t_user];
if( GetUserName(name_user, &t_user) )
{
user=AnsiString(name_user);
}
delete[] name_user;
return user;

- 201 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Comment paramétrer l'affichage de la barre des tâches ?


Auteurs : Bandit Boy ,
Voici une petite fonction qui permet de modifier le paramètre d'affichage de la barre des tâches en libérant l'espace
(ce n'est pas un Hide()) :

//change la propriété de la barre de tâches


_AppBarData TaskBar;
TaskBar.hWnd = FindWindow("Shell_TrayWnd", NULL);
TaskBar.cbSize = sizeof(TaskBar);
if((UINT) SHAppBarMessage(ABM_GETSTATE, &TaskBar) == ABS_ALWAYSONTOP)
{
TaskBar.lParam = ABS_AUTOHIDE ;
}
else
{
TaskBar.lParam = ABS_ALWAYSONTOP;
}
if( (UINT) SHAppBarMessage(ABM_SETSTATE, &TaskBar) == false )
{
Application->MessageBox("Erreur de changement de propriété", "Erreur", MB_OK);
}

Je déclare une structure TaskBar du même type que celle de la barre de tâches windows (type _AppBarData), ensuite
je récupère le Handle de la barre de tâche pour lire ses paramètres.
Je m'intéresse tout particulièrement à TaskBar.lParam qui correspond à l'affichage de la barre. Ce paramètre peut
prendre plusieurs valeurs dont voici la liste :

Liste de valeurs extraite de la documentation


• ABM_ACTIVATE : Notifies the system that an appbar has been activated.
• ABM_GETAUTOHIDEBAR : Retrieves the handle to the autohide appbar associated with a particular edge of
the screen.
• ABM_GETSTATE : Retrieves the autohide and always-on-top states of the Microsoft Windows taskbar.
• ABM_GETTASKBARPOS : Retrieves the bounding rectangle of the Windows taskbar.
• ABM_NEW : Registers a new appbar and specifies the message identifier that the system should use to send
notification messages to the appbar.
• ABM_QUERYPOS : Requests a size and screen position for an appbar.
• ABM_REMOVE : Unregisters an appbar, removing the bar from the system's internal list.
• ABM_SETAUTOHIDEBAR : Registers or unregisters an autohide appbar for an edge of the screen.
• ABM_SETPOS : Sets the size and screen position of an appbar.
• ABM_SETSTATE : Sets the state of the appbar's autohide and always-on-top attributes.
• ABM_WINDOWPOSCHANGED : Notifies the system when an appbar's position has changed.

Une fois connue, soit je le modifie pour un affichage "Masqué automatiquement" ou "Toujours affiché".

- 202 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

On peut voir que cette fonction peut permettre de modifier d'autres paramètres de la barre ... Par ailleurs, la commande
ABM_SETSTATE permet d'appliquer la modification.

lien : Lien vers l'API

Comment tester si un compte est administrateur ?


Auteurs : Bandit Boy , pottiez ,
On pourrait utiliser la fonction IsUserAnAdmin() mais elle semble poser problème avec l'inclusion de " shlobj.h " (voir
les erreurs générées) :

--------------------------------------------------------------------------------
[C++ Error] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS'
[C++ Error] shobjidl.h(8095): E2238 Multiple declaration for 'DESKBANDINFO'
[C++ Error] shlobj.h(1422): E2238 Multiple declaration for 'FVSHOWINFO'
--------------------------------------------------------------------------------

Cela semble bien être la faute à BCB :


http://bdn.borland.com/article/0,1410,26650,00.html
[C++ Error] shlobj.h(3457) : E2238 Multiple declaration for 'SHELLFLAGSTATE'
Pour déterminer si un utilisateur est administrateur ou non, on examine l'accès utilisateur à l'aide de la fonction
GetTokenInformation(). Ces informations représentent les droits de l'utilisateur et le groupe auquel il appartient.
Quand l'utilisateur lance une application, ses droits d'accès y sont associés. Pour examiner ses droits, on utilise la
fonction OpenProcessToken().
Ce code est proposé dans la rubrique d'aide de Windows (Win32.hlp).

BOOL IsAdmin(void)
{
HANDLE hProcess, hAccessToken;

UCHAR InfoBuffer[1024];
PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer;
DWORD dwInfoBufferSize;
PSID psidAdministrators;
SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
UINT x;

hProcess = GetCurrentProcess();

if(!OpenProcessToken(hProcess,TOKEN_READ,&hAccessToken))
return(FALSE);

if(!GetTokenInformation(hAccessToken,TokenGroups,InfoBuffer,
1024, &dwInfoBufferSize)) return(FALSE);

AllocateAndInitializeSid(&siaNtAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&psidAdministrators);

for(x=0;x<ptgGroups->GroupCount;x++)
{
if( EqualSid(psidAdministrators, ptgGroups->Groups[x].Sid) )
{
FreeSid(&psidAdministrators);
return( TRUE );
}

- 203 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

}
FreeSid(&psidAdministrators);
return(FALSE);
}

Attention :
Cette fonction déclenche une fenêtre CPU lors de l'éxécution de la ligne de libération de la structure de type SID, en
mode debug. Ce problème n'intervient pas dans l'exécutable généré.

Comment modifier le papier peint du bureau ?


Auteurs : Bandit Boy , pottiez ,
Comment charger le papier peint du bureau dans un TImage ?
Cette opération s'effectue en utilisant l'API SystemParametersInfo avec la commande SPI_GETDESKWALLPAPER.
Cette API est décrite sur le site de msdn.

char path[200];
//récupère le chemin de l'image utilisée comme papier peint
if(SystemParametersInfo( SPI_GETDESKWALLPAPER,
200,
path,
0) == TRUE)
{
AnsiString Chemin;
float i=0;
//garde la proportion de l'écran pour l'affichage de l'image
Image1->Picture->LoadFromFile(path);
i = (float)Screen->Height/(float)Screen->Width;
Image1->Height = i * Image1->Width;
}

Comment établir une image comme papier peint du bureau ?


On utilise la même API que pour la lecture, mais on utilise la commande SPI_SETDESKWALLPAPER. Ici l'image est
chargée par un OpenDialog, puis modifiée et écrasée avant d'être établie comme papier peint.

if(OpenDialog1->Execute())
{
Image1->Picture->LoadFromFile(OpenDialog1->FileName);
Image1->Canvas->TextOutA(10,10,"modif de l'image par Builder");
Image1->Picture->SaveToFile(OpenDialog1->FileName);

if(SystemParametersInfo( SPI_SETDESKWALLPAPER,
OpenDialog1->FileName.Length(),
OpenDialog1->FileName.c_str(),
WM_SETTINGCHANGE) != TRUE)
{
Button2->Caption = "Erreur";
}
}

- 204 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Bases de données


Comment accélérer les opérations sur ma base ?
Auteurs : Giovanny Temgoua , Ricky81 ,
Dans une application, les sources de données possèdent généralement des ensembles de données sous-jacents qui lui sont
connectés à travers une DataSource. À partir de ce moment, ces ensembles de données réagissent à tout évènement qui se
produit sur la source de données et en particulier sur l'évènement BeforeScroll. Ceci a pour avantage d'avoir des données
toujours actualisées. Cependant, dans le cas de recherche (tri ou recherche incrémentale) dans la source, l'inconvénient
sera de ralentir énormément la recherche (du fait du raffraîchissement constant des ensembles de données). À ce
moment, il est nécessaire d'appeler la méthode DisableControls avant le début de la recherche et EnableControls juste
après.

try {
DBGrid1->DataSource->DataSet->DisableControls();
for(int i=0;i<DBGrid1->SelectedRows->Count;i++)
{
// tests, modification, suppression, etc...
}
} finally {
DBGrid1->DataSource->DataSet->EnableControls();
}

Comment désactiver la demande de connexion à une base de données ?


Auteurs : Nono40 ,
Lors d'une connexion à une base de donnée, une fenêtre apparaît pour demander le nom d'utilisateur et le mot de
passe. Ceci est le comportement par défaut de tous les composants de connexion à une base même si les informations
de connexion sont correctement renseignées.
Tous les composants de connexion disposent d'une propriété LoginPrompt permettant de demander le login à
l'utilisateur (TSQLConnection, TDCOMConnection, TDataBase, TAdoConnection, TIBDatabase, etc...). Il suffit de
mettre cette propriété à la valeur false pour désactiver cette demande.

- 205 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Bases de données > BDE


Comment installer le BDE sur une machine ?
Auteurs : Neo41 ,
Vous pouvez utiliser l'installateur BDEInfoSetup qui permet une installation très facile du BDE 5.2. Le lien ci-dessous
vous permettra de le télécharger.

lien : BDEInfoSetup

Comment savoir si le BDE est installé ?


Auteurs : Ricky81 , Giovanny Temgoua ,
La fonction DbiInit de l'unité BDE (bde.hpp à inclure) permet d'initialiser le BDE. On peut donc en détourner
l'utilisation première pour savoir si le BDE est installé, ce qui est fait par le code suivant :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
if(DbiInit(NULL) == DBIERR_NONE)
{
ShowMessage("BDE installé !");
}
else
{
ShowMessage("BDE non trouvé !");
}
}

Le paramètre de DbiInit permet de définir certains paramètres comme le fichier de configuration et le répertoire de
travail du BDE. En lui passant NULL, ce sont des valeurs par défaut qui sont utilisées.

Comment obtenir les paramètres d'un alias BDE ?


Auteurs : Atlantis , Ricky81 ,
Le BDE fournit la fonction DbiGetDatabaseDesc qui extrait les paramètres d'un alias BDE.
Pour cela, il est nécessaire d'inclure le header bde.hpp

Le code suivant affiche les paramètres de l'alias BCDEMOS dans un mémo :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
Session->Open();
AnsiString alias = "BCDEMOS";
DBDesc Desc;
Check(DbiGetDatabaseDesc(alias.c_str(),&Desc));
Memo1->Clear();
Memo1->Lines->Add("Driver name : " +StrPas(Desc.szDbType));
Memo1->Lines->Add("AliasName : "+StrPas(Desc.szName));
Memo1->Lines->Add("Text : "+StrPas(Desc.szText));
Memo1->Lines->Add("Physical Name/Path : "+StrPas(Desc.szPhyName));
Session->Close();
}

- 206 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Remarque : Il est important d'avoir une session (TSession) et de l'ouvrir pour interroger le BDE.

Comment obtenir la liste des alias du BDE ?


Auteurs : Ricky81 ,
La méthode GetAliasNames renvoie une liste des alias BDE persistants, ceux qui existent dans un stockage permanent
ou dans le fichier de configuration du BDE.

Pour avoir dans la liste les alias créés localement (dans la session), il suffit de définir la propriété ConfigMode à cmAll.

Le code suivant affiche la liste des alias dans un mémo :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
Session->ConfigMode = cmAll;
Session->Open();
Session->GetAliasNames(Memo1->Lines);
Session->Close();
}

lien : Comment obtenir les paramètres d'un alias BDE ?

Comment créer dynamiquement un alias BDE ?


Auteurs : Ricky81 ,
Le composant TSession propose deux méthodes : AddAlias et AddStandardAlias.
Cette dernière permet de créer un alias spécifiquement pour des tables Paradox, dBASE ou ASCII.

L'exemple suivant crée un alias et l'enregistre définitivement par l'intermédiaire de SaveConfigFile :

void __fastcall TForm1::Button1Click(TObject *Sender)


{
TStringList *liste = new TStringList();

liste->Add("SERVER NAME = IB_SERVER:/PATH/DATABASE.GDB");


liste->Add("USER NAME = MYNAME");
liste->Add("PASSWORD = MYPWD");

Session1->Open();
Session1->AddAlias("MonIBAlias", "INTRBASE", liste);
Session1->SaveConfigFile();
Session1->Close();

delete liste;
}

Comment filtrer les alias BDE dans ma session ?


Auteurs : Ricky81 , Greybird ,
La propriété ConfigMode d'un objet de type TSession définit la visibilité de ladite session sur les alias BDE disponibles
(dans les deux sens).

- 207 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Elle permet en quelque sorte de définir un niveau d'isolation de la session.

Il existe un set de 3 valeurs, décrites dans l'aide, qui sont les suivantes :
• cfmVirtual
• cfmPersistent
• cfmSession

Ainsi, si ConfigMode ne contient que cfmSession, la session ne pourra voir que les alias qu'elle crée en mémoire, et les
autres sessions n'auront pas la possibilité d'accéder à ces alias. De plus, l'enregistrement des alias n'a dès lors aucun
sens : l'appel de la méthode SaveConfigFile sera sans effet.
Si la propriété ne contient que Virtual, on obtiendra les entrées ODBC définies au niveau de Windows (Administrateur
ODBC).
Enfin, si elle ne contient que Persistant, on obtiendra les entrées ODBC définies au niveau du BDE (Administrateur
BDE).

La valeur cmAll correspond à la combinaison des 3 listées précédemment et rend donc l'accès à l'ensemble des alias, et
même entre sessions différentes. C'est également la valeur par défaut de ConfigMode.

Quelques exemples :

Session1->ConfigMode = TConfigMode() << cfmSession;


Session2->ConfigMode = TConfigMode() << cfmSession << cfmPersistent;
Session3->ConfigMode = cmAll;

- 208 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Bases de données > SQL


Comment insérer une chaine dans une requète SQL ?
Auteurs : Neo41 ,
Pour exécuter une requête d'insertion ou de mise à jour contenant le caractère ', il vous faut formatter la requête avant
exécution afin de dédoubler ce caractère. Pour ceci vous pouvez utiliser la fonction QuotedStr de l'unité SysUtils.hpp.
Elle permet de rajouter en début et fin des apostrophes, mais aussi de convertir correctement les apostrophes situées
en milieu de la chaîne.

AnsiString __fastcall QuotedStr(const AnsiString S);

Exemple:

#include <SysUtils.hpp>
------------------------------------------------------------------------------
AnsiString Requete = "UPDATE MATABLE SET DESCRIPTION=";
Requete+= QuotedStr("L'adresse de l'intervention");
//Exécution de la requête...

- 209 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Bases de données > ADO


Comment se connecter à une base Access avec ADO ?
Auteurs : virtuA ,
Ajouter le composant ADOConnection sur votre fiche.
Utiliser le code suivant pour se connecter :

AnsiString strDir = "c:\\data.mdb";

try
{
ADOConnection1->ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;Extended Prope
+ (AnsiString)strDir + ";DefaultDir=" + (AnsiString)strDir

+ ";Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;FILEDSN="


+
(AnsiString)strDir + ";MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5"
+ ";SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;";

ADOConnection1->Open();
}
catch(Exception &exception)
{
MessageBox(Handle,"ERREUR Impossible d'ouvrir la Base de Donnée !!",
"Avertissement",MB_OK|MB_ICONSTOP ) ;
return;
}

Il est aussi possible de se connecter en faisant "clic droit sur le composant ADOConnection" puis -> "Modifier la chaîne
de connexion".

Comment créer une table dans une base Access avec ADO ?
Auteurs : virtuA ,
Pour créer une table il suffit de passer par une requête SQL.
Il faut placer le Composant ADOQuery sur la fiche désirée (l'utilisation de ce code sous-entend que la connexion avec
la base Access est établie).

AnsiString Nom = "MATABLE";


ADOQuery1->Connection = ADOConnection1; // Lien avec la Connection
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add((String)"CREATE TABLE "+Nom+" (MONCHAMP1 INTEGER, MONCHAMP2 STRING)");
ADOQuery1->ExecSQL();

La table "MATABLE" avec les champs "MONCHAMP1" (qui est un entier) et "MONCHAMP2" qui est une chaîne,
est alors créée.

Comment ajouter un enregistrement dans une Table Access avec ADO ?


Auteurs : virtuA ,
Dans un premier temps, il faut établir la connexion avec la base de donnée et la table :

- 210 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Composants sur la fiche


• ADOConnection
• ADOTable

// ouverture connexion, bdd et table


Form1->ADOConnection1->Open();
Form1->ADOTable1->Open();

Ajouter un enregistrement vide :

// position au début de la table


Form1->ADOTable1->First();
//Ajoute un enregistrement vide
Form1->ADOTable1->Append();

Mettre la table en mode Édition :

// Positionne la table en mode Edition


Form1->ADOTable1->Edit();

Puis il suffit de renseigner les champs désirés et de valider l'engeristrement :

Form1->ADOTable1->FieldByName("MONCHAMP1")->Value = 5;
Form1->ADOTable1->FieldByName("MONCHAMP2")->Value = "VALEUR";
// Valide l'édition dans la base de données
Form1->ADOTable1->Post();

- 211 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Bases de données > INTERBASE


Comment créer une base de données Interbase et s'y connecter ?
Auteurs : virtuA ,
Le serveur Interbase doit être installé sur la machine cible.

Les composants suivant doivent être sur la fiche


• IBDatabase
• IBTransaction
• IBQuery

IBDatabase->DatabaseName = "127.0.0.1:C:\\data.gdb";
IBDatabase->SQLDialect = 3;
IBDatabase->Params->Clear();
IBDatabase->Params->Add("USER \"SYSDBA\"");
IBDatabase->Params->Add("PASSWORD \"masterkey\"");
IBDatabase->Params->Add("PAGE_SIZE 4096");
IBDatabase->LoginPrompt = true;

IBDatabase->CreateDatabase();

IBDatabase->Connected = true;

IBTransaction->DefaultDatabase = IBDatabase;
IBQuery->Database = IBDatabase;
IBQuery->Transaction = IBTransaction;

IBQuery servira ensuite pour créer les tables et autres éléments via les requêtes SQL.

- 212 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > Bases de données > ACCESS


Comment créer un base de données Access ?
Auteurs : virtuA , pottiez ,
Pour cela, récupérer la odbccp32.dll (32bits), utiliser un petit IMPLIB pour faire le odbccp32.lib, et lier tout ça au projet:

BOOL fCreated;

fCreated = SQLConfigDataSource(NULL,
ODBC_ADD_DSN,
"Microsoft Access Driver (*.mdb)",
"CREATE_DB=C:\\Test.mdb General\0" );

Comment ouvrir une base de données Access vide sous OleADO sans Access ?
Auteurs : blondelle , virtuA , NoisetteProd ,

// ne pas oublier d'inclure #include <comobj.hpp>

Variant vADO;
AnsiString Filename = "C:\\Documents and Settings\\blondelle\\Mes documents\\MySQL\\maBdd2.mdb";
AnsiString provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +Filename+";";

if (FileExists(Filename.c_str()))
{
MessageBox(Handle,"Ce fichier existe déja!" ,"ATTENTION",MB_OK|MB_ICONWARNING ) ;
vADO = Unassigned;
return;
}

vADO = Variant::CreateObject("ADOX.Catalog");
vADO.OleFunction("create", provider.c_str());

// on termine
vADO = Unassigned;

Comment compacter une base de données OleADO ?


Auteurs : blondelle , Fbartolo , NoisetteProd ,
Cette procédure permet de compresser une base de données Access sans que Access soit installé sur le poste, donc
directement avec "JRO.JetEngine".

// ne pas oublier d'inclure #include <comobj.hpp>

void CompactDatabase(AnsiString Base1, AnsiString psw1, AnsiString Base2, AnsiString psw2)


{

AnsiString Provider1= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +


Base1 + ";Password =" + psw1;
AnsiString Provider2= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
Base2 + ";Password =" + psw2;

Variant v=Variant::CreateObject("JRO.JetEngine");
v.OleFunction("CompactDatabase", Provider1.c_str(), Provider2.c_str());

- 213 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

v = Unassigned;
}
void __fastcall TForm1::Button4Click(TObject *Sender)
{
AnsiString Base1="C:\\Documents and Settings\\Fernand Bartolo\\Dev\\Testxxxxxx\\Iris.mdb";
AnsiString psw1="";

AnsiString Base2="C:\\Documents and Settings\\Fernand Bartolo\\Dev\\Testxxxxxx\\Test.mdb";


AnsiString psw2="";

if (FileExists(Base2))
DeleteFile(Base2);
CompactDatabase(Base1,psw1,Base2,psw2);
ShowMessage("OK!!");
}

- 214 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office

- 215 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Généralités


Comment savoir si une application COM est en cours d'exécution ?
Auteurs : Ricky81 , Laurent Dardenne ,
La méthode GetActiveOleObject renvoie une référence à l'interface IDispatch de l'objet actif pour la classe indiquée par
ClassName. ClassName est l'ID de programmation de la classe de l'objet actif dans la table des objets OLE actifs.
GetActiveOleObject permet d'accéder à cette table. Cette table permet donc de déterminer si un objet d'une classe donnée
est en cours d'exécution ou non.

La méthode OleCheck, appelée par GetActiveOleObject, déclenche une exception EOleSysError si aucun objet de la
classe spécifiée n'existe.

bool AppExist = true;


Variant vMSWord;
try
{
vMSWord = Variant::GetActiveObject("Word.Application");
}
catch (EOleSysError &e)
{
AppExist = false;
}
if(AppExist)
{
ShowMessage("Word est en cours d'exécution.");
}
else
{
ShowMessage("Word n'est pas en cours d'exécution.");
}

Où peut-on trouver les constantes utilisées par Word, Excel, ..., ?


Auteurs : Ricky81 ,
Vous pouvez trouver les constantes directement dans l'application en ouvrant une fenêtre Visual Basic (ALT+F11) puis
en consultant l'explorateur d'objets. Une petite recherche et vous obtiendrez la valeur d'une constante à partir de son
nom.
Vous pouvez également trouver une partie des constantes dans le header Excel_2k.h en ce qui concerne Excel (présent
dans Include/VCL/ et vous pouvez même utiliser directement les noms des constantes dans votre programme en incluant
ce fichier.

Quelle entête faut-il ajouter pour utiliser le pilotage OLE ?


Auteurs : Ricky81 ,
Il faut ajouter utilcls.h.

- 216 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

#include <utilcls.h>

lien : Comment fonctionne le pilotage OLE d'Excel avec Borland C++ Builder ?

Qu'est ce que le type Variant ?


Auteurs : Ricky81 ,
Le type Variant est capable de représenter des valeurs qui changent de type dynamiquement. Alors qu'une variable
de n'importe quel autre type est liée statiquement à ce type, une variable de type Variant peut prendre des valeurs de
plusieurs types lors de l'exécution. Le type Variant est généralement utilisé quand le véritable type à manipuler varie
ou qu'il n'est pas connu lors de la compilation. Cette souplesse se fait au dépend de la mémoire et les opérations sont
substantiellement moins rapides que les opérations sur des valeurs statiquement typées.

Voici les types supportés par le Variant :


• short
• int
• float
• double
• Currency
• TDateTime
• bool
• WordBool
• Byte
• AnsiString&
• char *
• wchar_t * const
• Ole2::IDispatch* const
• Ole2::IUnknown* const

lien : Comment convertir un AnsiString en Variant ?

Quel est l'équivalent de NULL pour les paramètres facultatifs en pilotage OLE ?
Auteurs : Ricky81 ,
Les paramètres facultatifs doivent être passés comme des Variants Unassigned.
Tout Variant est initialisé à Unassigned lorsqu'il est déclaré, et l'affectation de Unassigned à un Variant permet de
libérer la mémoire occupée.

Exemple :

Variant vMSExcel; // vMSExcel est à Unassigned


vMSExcel = Variant::GetActiveObject("Excel.Application");
vMSExcel.OleFunction("Quit");

- 217 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vMSExcel = Unassigned; // libération de la mémoire

lien : Qu'est ce que le type Variant ?

Comment convertir un AnsiString en Variant ?


Auteurs : Ricky81 ,
Il faut utiliser la fonction StringToOleStr

extern PACKAGE wchar_t * __fastcall StringToOleStr(const AnsiString Source);

lien : Qu'est ce que le type Variant ?


lien : Pourquoi ai-je une erreur lorsque je passe un AnsiString comme paramètre dans un appel OLE ?

Pourquoi ai-je une erreur lorsque je passe un AnsiString comme paramètre dans un appel OLE ?
Auteurs : Ricky81 ,
Le pilotage OLE repose sur le type Variant, or le type AnsiString n'est pas supporté par le Variant. Vous pouvez par
exemple passer le pointeur sur votre AnsiString grâce à la méthode c_str()ou effectuer la conversion.

lien : Comment convertir un AnsiString en Variant ?


lien : Qu'est ce que le type Variant ?

- 218 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel


Comment utiliser Excel avec Borland C++ Builder ?
Auteurs : Ricky81 ,
Pour utiliser Excel avec Borland C++ Builder, vous pouvez utiliser le composant TExcelApplication de l'onglet
office_2k. Il vous suffit d'appeler la méthode Connect pour lancer Excel, vous pourrez ensuite utiliser les différentes
fonctions disponibles.
Vous pouvez également recourir au pilotage OLE d'Excel. Cette méthode vous accorde davantage de flexibilité avec
l'avantage de ne pas dépendre des composants de Borland C++ Builder.

Remarque : les deux solutions nécessitent d'avoir Excel installé.

lien : Comment fonctionne le pilotage OLE d'Excel avec Borland C++ Builder ?

Comment fonctionne le pilotage OLE d'Excel avec Borland C++ Builder ?


Auteurs : Ricky81 ,
Consultez le tutoriel dont le lien figure ci-dessous.

lien : Introduction au pilotage OLE d'Excel


lien : Comment créer une nouvelle instance d'Excel ?

- 219 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion de l'application


Comment récupérer l'instance active d'Excel ?
Auteurs : Ricky81 ,
Nous allons manipuler Excel dans le cadre de son pilotage OLE, et donc tenter de récupérer l'instance active.
Le Variant vMSExcel sera initialisé avec cette valeur et permettra par la suite de manipuler l'ensemble des éléments
propres à Excel.

Variant vMSExcel;
vMSExcel = Variant::GetActiveObject("Excel.Application");

lien : Comment créer une nouvelle instance d'Excel ?

Comment créer une nouvelle instance d'Excel ?


Auteurs : Ricky81 ,
Nous allons manipuler Excel dans le cadre de son pilotage OLE, et donc tenter de créer une nouvelle instance.
Le Variant vMSExcel sera initialisé avec cette valeur et permettra par la suite de manipuler l'ensemble des éléments
propres à Excel.

Variant vMSExcel;
vMSExcel = Variant::CreateObject("Excel.Application");

lien : Comment récupérer l'instance active d'Excel ?

Comment fermer mon application Excel ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant représentant l'instance d'Excel.

vMSExcel.OleFunction("Quit");

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

- 220 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion de l'application > Paramétrage de l'application
Comment faire pour que mon application Excel ne soit pas visible par l'utilisateur ?
Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir la propriété Visible.

vMSExcel.OlePropertySet("Visible", false);

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment désactiver toute interaction entre Excel et le clavier et la souris ?


Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir la propriété Interactive.

vMSExcel.OlePropertySet("Interactive", false);

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment désactiver la mise à jour de l'écran ? (amélioration de la vitesse d'exécution)


Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir la propriété ScreenUpdating.

vMSExcel.OlePropertySet("ScreenUpdating", false);

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment définir/changer le mode d'affichage des feuilles (L1C1 ou A1) ?


Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir la propriété ReferenceStyle.

vMSExcel.OlePropertySet("ReferenceStyle", vReferenceStyle);

vReferenceStyle est une constante à choisir dans la classe XlReferenceStyle dont voici les valeurs :

xlA1 = 1
xlR1C1 = -4150

- 221 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Remarque : attention aux formules par exemple (elles sont modifiées lors de changement, mais il faut respecter le style
en cours lors de leur définition).

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment définir le mode de recalcul d'Excel ?


Auteurs : Superstivix , Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir la propriété Calculation.

vMSExcel.OlePropertySet("Calculation", vValue);

Le Variant vValue doit avoir une valeur définie dans la classe XlCalculation dont voici les constantes :

xlCalculationAutomatic = -4105
xlCalculationManual = -4135
xlCalculationSemiautomatic = 2

Les 3 possibilités permettent respectivement de définir le recalcul automatique après toute modification, le recalcul
fait uniquement à la demande de l'utilisateur, et un mode intermédiaire dit semi-automatique où le recalcul se fait par
exemple lorsque le classeur est enregistré.

Remarque : il est intéressant, pour des raisons de performances, de désactiver le recalcul automatique le temps des
traitements.

Attention : pour pouvoir agir sur cette propriété, il est nécessaire d'avoir un classeur présent dans l'application.

lien : Comment lancer la recalculation lorsque celle ci n'est pas faite automatiquement ?
lien : Comment créer une nouvelle instance d'Excel ?
lien : Comment récupérer l'instance active d'Excel ?

Comment savoir quel est le répertoire par défaut lorsqu'on demande l'ouverture d'un fichier ?
Auteurs : Superstivix ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir la propriété DefaultFilePath.

AnsiString defFilePath;
defFilePath = vMSExcel.OlePropertyGet("DefaultFilePath");

Comment connaître l'imprimante active ?


Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons récupérer la propriété ActivePrinter :

Variant vPrinter;

- 222 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vPrinter = vMSExcel->OlePropertyGet("ActivePrinter");

Le résultat renvoyé est une chaîne de caractères identifiant l'imprimante.

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment désactiver les messages de demande de confirmation ?


Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir la propriété DisplayAlerts.

vMSExcel.OlePropertySet("DisplayAlerts", false);

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment faire pour afficher ma fenêtre Excel en plein écran ?


Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir la propriété DisplayFullScreen.

vMSExcel.OlePropertySet("DisplayFullScreen", true);

Attention à ne pas oublier de remettre le mode plein écran à sa valeur d'origine avant de fermer l'instance d'Excel.
Dans le cas contraire, la fenêtre sera toujours en plein écran à la prochaine ouverture d'Excel.

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment détecter la langue utilisée par mon application Excel ?


Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons commencer par consulter la propriété
LanguageSettings.

Variant vLSettings;
vLSettings = vMSExcel.OlePropertyGet("LanguageSettings");
int LanguageID = vLSettings.OlePropertyGet("LanguageID", vType);

Attention : cette propriété est en lecture seule.

Les valeurs pour le paramètre vType sont à choisir parmi les constantes de la classe MsoAppLanguageID :

msoLanguageIDExeMode = 4
msoLanguageIDHelp = 3
msoLanguageIDInstall = 1

- 223 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

msoLanguageIDUI = 2
msoLanguageIDUIPrevious = 5

L'entier obtenu en retour peut s'interpréter en consultant les constantes de la classe MsoLanguageID d'Excel.

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment activer/désactiver un élément de menu ?


Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons récupérer un élément de menu et définir sa propriété
Enabled.

Variant vCommandBar, vElement;


vCommandBar = vMSExcel.OlePropertyGet("CommandBars", 1);
vElement = vCommandBar.OlePropertyGet("Controls", "Outils");
vElement.OlePropertySet("Enabled", false);

Si vous souhaitez désactiver le second élément du menu 'Outils', vous utiliserez le code suivant :

Variant vSousElement;
vSousElement = Element.OlePropertyGet("Controls", 2);
vSousElement.OlePropertySet("Enabled", false);

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment modifier le séparateur décimal ?


Auteurs : Superstivix ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir les propriétés DecimalSeparator et
UseSystemSeparators.

vMSExcel.OlePropertySet("DecimalSeparator", vText);
vMSExcel.OlePropertySet("UseSystemSeparators", false);

La première ligne permet de spécifier la valeur que l'on veut pour nouveau séparateur décimal.
La seconde ligne désactive l'utilisation des séparateurs systèmes.

lien : Comment modifier le séparateur de milliers ?

Comment modifier le séparateur de milliers ?


Auteurs : Superstivix ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir les propriétés ThousandsSeparator et
UseSystemSeparators.

- 224 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vMSExcel.OlePropertySet("ThousandsSeparator", vText);
vMSExcel.OlePropertySet("UseSystemSeparators", false);

La première ligne permet de spécifier la valeur que l'on veut pour nouveau séparateur de milliers.
La seconde ligne désactive l'utilisation des séparateurs systèmes.

lien : Comment modifier le séparateur décimal ?

- 225 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion de l'application > Recours aux fonctionnalités
Comment utiliser les fonctions intégrées d'Excel ?
Auteurs : Ricky81 ,
Cela se fait en 2 étapes : on récupère d'abord un Variant correspondant aux fonctions intégrées, puis on appelle une
fonction particulière.
Nous partons bien entendu d'un Variant représentant notre instance d'Excel.

Variant vSheetFunction;
vSheetFunction = vMSExcel.OlePropertyGet("WorksheetFunction");
int res = vSheetFunction.OleFunction("Max", 3, 4);

lien : Comment exécuter une macro contenue dans un classeur ?


lien : Comment créer une nouvelle instance d'Excel ?
lien : Comment récupérer l'instance active d'Excel ?

Comment obtenir un nom de fichier avec la boite de dialogue ouvrir d'Excel ?


Auteurs : Bidou , Ricky81 ,
Cela n'est pas possible en pilotage OLE Excel (impossible de récupérer l'ensemble sélectionné car l'appel se fait par
une 'OleProcedure' qui par définition ne renvoie pas de résultat). Nous sommes obligés de passer par le composant
TExcelApplication :

ExcelApplication1->Connect();
Variant file;
Variant title = StringToOleStr("Titre"); // titre à donner à la boite de dialogue
Variant multiselect = true; // selection multiple autorisée
file = ExcelApplication1->GetOpenFilename(EmptyParam, EmptyParam, title, EmptyParam,
multiselect, 0);

Le résultat est un Variant, mais il est nécessaire de faire la distinction pour le mode de sélection multiple. En effet, dans
ce cas, c'est un Variant de type tableau qui est renvoyé (même si un seul fichier est finalement sélectionné), lequel doit
être traité différemment. Dans le cas où c'est le bouton Annuler qui a été cliqué, un Variant simple ayant pour valeur
"False" est renvoyé.

Voici un exemple de code qui permet de traiter les 2 modes :

if(file.IsArray())
{
for(int i=1 ; i<=file.ArrayHighBound(1) ; i++)
{
ShowMessage(file.GetElement(i));
}
}
else
{
ShowMessage(file);
}

- 226 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Attention : Comme le composant TOpenDialog, cette boite de dialogue n'effectue aucune opération d'ouverture. Elle
permet juste de sélectionner un ou plusieurs fichiers.

lien : Comment obtenir un nom de fichier avec la boite de dialogue enregistrer sous d'Excel ?
lien : Comment utiliser une boite de saisie Excel ?

Comment obtenir un nom de fichier avec la boite de dialogue enregistrer sous d'Excel ?
Auteurs : Bidou , Ricky81 ,
Cela n'est pas possible en pilotage OLE Excel (impossible de récupérer l'ensemble sélectionné car l'appel se fait par
une 'OleProcedure' qui par définition ne renvoie pas de résultat). Nous sommes obligés de passer par le composant
TExcelApplication :

ExcelApplication1->Connect();
Variant file;
Variant initFile = StringToOleStr("E:\\Ricky\\classeur.xls"); // fichier sélectionné au départ
Variant title = StringToOleStr("Titre"); // titre de la boite de dialogue
file = ExcelApplication1->GetSaveAsFilename(initFile, EmptyParam, EmptyParam, title, EmptyParam, 0);

Le résultat est un Variant valant en particulier "False" dans le cas d'un recours au bouton Annuler.

Attention : Comme le composant TSaveDialog, cette boite de dialogue n'effectue aucune opération de sauvegarde. Elle
permet juste de sélectionner un nom de fichier.

lien : Comment obtenir un nom de fichier avec la boite de dialogue ouvrir d'Excel ?
lien : Comment utiliser une boite de saisie Excel ?

Comment utiliser une boite de saisie Excel ?


Auteurs : Bidou , Ricky81 ,
Cela n'est pas possible en pilotage OLE Excel (impossible de récupérer l'ensemble sélectionné car l'appel se fait par
une 'OleProcedure' qui par définition ne renvoie pas de résultat). Nous sommes obligés de passer par le composant
TExcelApplication :

ExcelApplication1->Connect();
Variant prompt = StringToOleStr("Texte"); // texte de la boite de saisie
Variant title = StringToOleStr("Titre"); // titre de la boite de saisie
Variant def = StringToOleStr("def"); // valeur par défaut
// positionnement
Variant left = 50;
Variant top = 100;
Variant answer;
answer = ExcelApplication1->InputBox(prompt, title, def, left, top, EmptyParam, EmptyParam,
EmptyParam, 0);

lien : Comment obtenir un nom de fichier avec la boite de dialogue ouvrir d'Excel ?

- 227 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

lien : Comment obtenir un nom de fichier avec la boite de dialogue enregistrer sous d'Excel ?

Comment lancer la recalculation lorsque celle ci n'est pas faite automatiquement ?


Auteurs : Ricky81 ,
Il est possible de faire ceci pour l'ensemble de l'application, un classeur, une feuille, ou même un groupe de cellules.
Voyons un exemple pour l'application représentée par le Variant vMSExcel :

vMSExcel.OleProcedure("Calculate");

lien : Comment définir le mode de recalcul d'Excel ?


lien : Comment créer une nouvelle instance d'Excel ?
lien : Comment récupérer l'instance active d'Excel ?

Comment récupérer le résultat d'une chaîne de caractères décrivant une opération ?


Auteurs : Ricky81 ,
Nous allons travailler à partir d'un Variant représentant l'instance d'Excel.

int res = vMSExcel.OleFunction("Evaluate", vOperation);


// vOperation = "(3+4)*2" ou "=(3+4)*2" par exemple

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment afficher à l'écran un classeur/feuille donné ?


Auteurs : Ricky81 ,
Nous devons travailler avec le classeur ou la feuille que nous souhaitons afficher.
Prenons l'exemple du classeur, défini par le Variant vWorkbook :

vWorkbook.OleProcedure("Activate");

Comment agir sur la fenêtre d'Excel pour minimiser/maximiser ?


Auteurs : Ricky81 ,
Nous allons travailler sur une instance d'Excel (Variant vMSExcel).

vMSExcel.OlePropertySet("WindowState", vValue);

La valeur vValue est à choisir parmi les constantes suivantes appartenant à la classe XlWindowState

xlMaximized = -4137
xlMinimized = -4140

- 228 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

xlNormal = -4143

- 229 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion de l'application > Fonctionnalités d'impression
Comment imprimer une feuille avec les options par défaut sans intervention utilisateur ?
Auteurs : Ricky81 ,
Nous allons travailler sur la feuille en question, matérialisée par le Variant vWorksheet.

vWorksheet.OleProcedure("PrintOut");

Comment imprimer une feuille en précisant certains paramètres ?


Auteurs : Ricky81 ,
Nous allons travailler sur la feuille en question, matérialisée par le Variant vWorksheet.

vWorksheet.OleProcedure("PrintOut", from, to, nb);

Ce code va imprimer la feuille de la page from à la page to en nb exemplaires.

Comment spécifier l'échelle d'impression ?


Auteurs : Superstivix ,
Nous allons travailler sur la feuille en question, matérialisée par le Variant vWorksheet.

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("Zoom", vValue);

vValue est la valeur entière du zoom désiré.

Comment spécifier l'orientation de l'impression ?


Auteurs : Superstivix ,
Nous allons travailler sur la feuille en question, matérialisée par le Variant vWorksheet.

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("Orientation", vValue);

vValue peut prendre les valeurs 1 (portrait) ou 2 (paysage).


Ces valeurs sont des constantes de la classe XlPageOrientation.

Comment modifier l'ordre d'impression des pages ?


Auteurs : Superstivix ,
Nous allons travailler sur la feuille en question, matérialisée par le Variant vWorksheet.

- 230 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("Order", vOrder);

Les valeurs possibles pour vOrder sont définies dans la classe XlOrder :

xlDownThenOver = 1
xlOverThenDown = 2

Comment spécifier les marges d'impression ?


Auteurs : Superstivix ,
Nous allons travailler sur la feuille en question, matérialisée par le Variant vWorksheet.
Il s'agit de définir la taille des différentes zones en spécifiant pour chacune une valeur entière en points.

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("TopMargin", vValue);
vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("LeftMargin", vValue);
vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("RightMargin", vValue);
vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("BottomMargin", vValue);
vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("HeaderMargin", vValue);
vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("FooterMargin", vValue);

Comment définir les entêtes et pieds de page ?


Auteurs : Superstivix ,
Nous allons travailler sur la feuille en question, matérialisée par le Variant vMSExcel et définir le contenu des différentes
sections comme suit :

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("CenterHeader", vText);
vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("LeftHeader", vText);
vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("RightHeader", vText);
vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("CenterFooter", vText);
vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("LeftFooter", vText);
vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("RightFooter", vText);

vText contient le texte qui doit apparaître dans chaque section.

Comment centrer l'impression ?


Auteurs : Superstivix ,
Nous allons travailler sur la feuille en question, matérialisée par le Variant vWorksheet.
Il est possible de définir un alignement centré en horizontal ainsi qu'en vertical :

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("CenterHorizontally", true);

- 231 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("CenterVertically", true);

Comment spécifier le format d'impression ?


Auteurs : Superstivix ,
Nous allons travailler sur la feuille en question, matérialisée par le Variant vWorksheet.

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("PaperSize", vFormat);

Les valeurs possibles pour vFormat sont définies dans la classe XlPaperSize.

Comment imprimer le quadrillage d'Excel ?


Auteurs : Superstivix ,
Nous allons travailler sur la feuille en question, matérialisée par le Variant vWorksheet.

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("PrintGridlines", true);

Comment faire pour inclure les titres de colonnes et/ou de lignes à l'impression ?
Auteurs : Superstivix ,
Il faut agir sur l'objet PageSetup et sur ses propriétés PrintTitleRows et PrintTitleColumns.
Ces propriétés doivent être initialisées avec l'adresse d'une plage de valeurs définissant les lignes/colonnes à considérer.
Partant d'un Variant (vWorksheet) représentant une feuille, nous allons par exemple travailler sur un Variant vRange
correspondant à une plage de cellules.

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("PrintTitleRows",
vRange.OlePropertyGet("Address"));

Pour inclure les 2 premières colonnes, vous pourrez par exemple utiliser le code suivant :

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("PrintTitleColumns", "A1:B1");

Comment lancer l'aperçu avant impression ?


Auteurs : blondelle ,
A partir d'un Variant représentant l'instance d'Excel, nous allons appeler la fonction PrintPreview sur la feuille
courante.

vMSExcel.OlePropertyGet("ActiveWindow").OlePropertyGet("SelectedSheets").OleFunction("PrintPreview");

- 232 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion des classeurs


Comment définir le nombre de feuilles par défaut lors de l'ouverture d'un classeur ?
Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons définir la propriété SheetsInNewWorkbook.

vMSExcel.OlePropertySet("SheetsInNewWorkbook", nbSheets);

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?

Comment récupérer l'ensemble des classeurs ouverts ?


Auteurs : Ricky81 ,
A partir d'un Variant représentant l'instance d'Excel, nous allons récupérer l'ensemble des classeurs.

Variant vXLWorkbooks;
vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");

Il est nécessaire de passer par cet objet même s'il n'y a pas de classeurs, par exemple pour ouvrir un classeur.

lien : Comment créer une nouvelle instance d'Excel ?


lien : Comment récupérer l'instance active d'Excel ?
lien : Comment définir le nombre de feuilles par défaut lors de l'ouverture d'un classeur ?

Comment ouvrir un fichier Excel ?


Auteurs : Ricky81 ,
Nous allons ouvrir un classeur existant.

Variant vWorkbook;
// vXLWorkbooks représente l'ensemble des classeurs
// vFileName est un Variant sous la forme chaîne de caractères correspondant au fichier à ouvrir
vXLWorkbook =
vXLWorkbooks.OleFunction("Open",vFileName); // on récupère un Variant correspondant au classeur ajouté

lien : Comment récupérer l'ensemble des classeurs ouverts ?


lien : Comment ajouter un nouveau fichier Excel ?
lien : Comment ouvrir un classeur en lecture seule ?
lien : Comment ouvrir un classeur protégé par un mot de passe ?

Comment ouvrir un classeur en lecture seule ?


Auteurs : Ricky81 ,
Nous allons ouvrir un classeur existant.

- 233 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Variant vWorkbook, vReadOnly;


// vXLWorkbooks représente l'ensemble des classeurs
vReadOnly = true;
// vFileName est un Variant sous la forme chaîne de caractères correspondant au fichier à ouvrir
vWorkbook = vWorkbooks.OleFunction("Open", vFileName, Unassigned, vReadOnly);

lien : Comment ouvrir un fichier Excel ?


lien : Comment récupérer l'ensemble des classeurs ouverts ?
lien : Comment ouvrir un classeur protégé par un mot de passe ?
lien : Comment ouvrir un classeur au format csv ?

Comment ouvrir un classeur au format csv ?


Auteurs : Ricky81 ,
Nous allons ouvrir un classeur existant en spécifiant le séparateur recherché.

Variant vWorkbook;
// vXLWorkbooks représente l'ensemble des classeurs
// vFileName est un Variant sous la forme chaîne de caractères correspondant au fichier à ouvrir
vWorkbook = vWorkbooks.OleFunction("Open", vFileName, Unassigned, Unassigned, vSeparator);
// vSeparator = valeur du séparateur

Les valeurs possibles pour vSeparator vont de 1 à 5 :


• 1 : tabulation
• 2 : point virgule
• 3 : espace
• 4 : point virgule
• 5 : aucun séparateur

lien : Comment récupérer l'ensemble des classeurs ouverts ?


lien : Comment ouvrir un fichier Excel ?
lien : Comment ouvrir un classeur en lecture seule ?
lien : Comment ouvrir un classeur protégé par un mot de passe ?
lien : Comment ajouter un nouveau fichier Excel ?

Comment ouvrir un classeur protégé par un mot de passe ?


Auteurs : Ricky81 ,
Nous allons ouvrir un classeur existant protégé par mot de passe.

Variant vWorkbook;
// vXLWorkbooks représente l'ensemble des classeurs
vWorkbook = vWorkbooks.OleFunction("Open", vFileName, Unassigned, Unassigned, Unassigned, vPwd);
// vFileName est un Variant sous la forme chaîne de caractères correspondant au fichier à ouvrir
// vPwd = mot de passe

lien : Comment récupérer l'ensemble des classeurs ouverts ?


lien : Comment ouvrir un fichier Excel ?
lien : Comment ouvrir un classeur en lecture seule ?

- 234 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

lien : Comment ouvrir un classeur au format csv ?

Comment ajouter un nouveau fichier Excel ?


Auteurs : Ricky81 ,
Nous allons ajouter un nouveau classeur à notre ensemble de classeurs.

Variant vXLWorkbook;
// vXLWorkbooks représente l'ensemble des classeurs
vXLWorkbook =
vXLWorkbooks.OleFunction("Add"); // on récupère un Variant correspondant au classeur ajouté

Il est à noter que même si vous n'avez pas encore de classeur ouvert, vous devez nécessairement passer par l'objet
vXLWorkbook.

lien : Comment récupérer l'ensemble des classeurs ouverts ?


lien : Comment ouvrir un fichier Excel ?

Comment enregistrer mon classeur ?


Auteurs : Ricky81 ,
L'objet cible est un Variant (vXLWorkbook) correspondant au classeur à sauver.

vXLWorkbook.OleProcedure("Save");

Comment enregistrer un classeur en lui attribuant un nom ?


Auteurs : Ricky81 , blondelle ,
L'objet cible est un Variant (vXLWorkbook) correspondant au classeur à sauver.

// vFileName est un Variant correspondant au nom du classeur


vXLWorkbook.OleProcedure("Saveas", vFileName);

FileFormat peut prendre différentes valeurs suivant le format de sauvegarde désiré, ce qui
permet de charger un fichier sous un format et de le sauvegarder sous un autre format

FileFormat = 6; // fichier CSV (extension .csv)


FileFormat = -4158; //fichier Texte et separateur tabulation (extension .txt)
FileFormat = 36; //fichier Texte et separateur espace (extension .prn)
FileFormat = -4143; // valeur de xlNormal "sauvegarde sous format classeur excel"

Description de la fonction complète


tous les paramètres de la sauvegarde sont décrits

Variants FileFormat, Mot_passe, Password, WriteResPassword, ReadOnlyRecommended;


Variants vFileName, CreateBackup, Nom_Du_Fichier;
// utiliser Unassigned si le paramètre n'est pas utilisé

- 235 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Mot_passe = Unassigned; //"Mon_Mot_De_Passe" pour la protection du fichier


Password = Mot_passe; // mot de passe pour protéger le fichier
WriteResPassword = Mot_passe; // confirmation du mot de passe
ReadOnlyRecommended = false; // fichier en lecture seule (False True Unassigned)
// création d'une copie si le fichier existe déjà
CreateBackup = false; // création d'une copie (False True Unassigned)

Nom_Du_Fichier = le nom du fichier avec extension .csv ou .txt ou.prn ou .xls

// sauvegarde du fichier sous le format desire


vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\Nom_Du_Fichier";
vXLWorkbook.OleProcedure("Saveas", vFileName, FileFormat, Password, WriteResPassword,
ReadOnlyRecommended, CreateBackup);

Comment fermer un classeur ?


Auteurs : Ricky81 ,
La version suivante ferme le classeur avec la possibilité d'avoir une confirmation par l'utilisateur en cas de modifications
non enregistrées.

vXLWorkbook.OleFunction("Close");

Voici une seconde version qui permet de préciser si les modifications non enregistrées doivent être intégrées ou non.

vXLWorkbook.OleFunction("Close",
vSaveChanges); // vSaveChanges est un booléen (ou un Variant contenant true ou false)

Cette dernière version permet l'enregistrement dans un nouveau fichier (les modifications ne sont pas répercutées dans
le fichier en cours). Le nouveau fichier est créé (ou écrasé) uniquement si le fichier en cours a été modifié depuis la
dernière sauvegarde.

vXLWorkbook.OleFunction("Close", true, vFileName);

Comment récupérer un classeur dans un objet ?


Auteurs : Ricky81 ,
Si le classeur n'est pas encore ouvert, il est plus aisé de récupérer cet objet lors de l'ouverture du classeur ou de l'ajout
d'un nouveau classeur (cf. autres Q/R).
Sinon, il est possible de récupérer un objet sur un classeur à partir de l'objet gérant l'ensemble des classeurs.

vXLWorkbook = vXLWorkbooks.OlePropertyGet("Item", vIndex);


// vIndex correspond à la "position" du classeur au niveau de l'application (indice commençant à 1)

Malheureusement il n'est possible que de passer un entier en paramètre. Vous pourrez par exemple tester la propriété
Name des classeurs pour trouver le classeur recherché. Voici un exemple :

if (vXLWorkbooks.OlePropertyGet("Item", 1).OlePropertyGet("Name") == "monFichier.xls" )

- 236 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

{
...
}

lien : Comment récupérer l'ensemble des classeurs ouverts ?


lien : Comment ajouter un nouveau fichier Excel ?
lien : Comment ouvrir un fichier Excel ?
lien : Comment connaître le nombre de classeurs ouverts ?

Comment connaître le nombre de classeurs ouverts ?


Auteurs : Ricky81 ,
Il suffit simplement d'interroger la propriété Count sur l'objet correspondant à l'ensemble des classeurs.

// vXLWorkbooks est de type Variant


int nb = vXLWorkbooks.OlePropertyGet("Count");

lien : Comment récupérer l'ensemble des classeurs ouverts ?

Comment protéger ou déprotéger un classeur ?


Auteurs : Ricky81 ,
La protection d'un classeur agit sur la structure et sur les feuilles (supprimer, renommer, déplacer les feuilles) de façon
générale (le contenu n'étant pas protégé).
Dans la suite, le Variant vWorkbook correspond à un classeur.

vWorkbook.OleProcedure("Protect", "motdepasse", true, true);

Le premier booléen indique que la protection doit être activée pour la structure du classeur, alors que le second concerne
les feuilles.

Pour supprimer la protection :

vWorkbook.OleProcedure("UnProtect", "motdepasse");

lien : Comment récupérer l'ensemble des classeurs ouverts ?


lien : Comment protéger ou déprotéger une feuille ?

Comment mettre le calendrier depuis 1904 ?


Auteurs : Superstivix ,
L'objet cible est un Variant (vXLWorkbook) correspondant au classeur dont on souhaite modifier le paramétrage.

vXLWorkbook.OlePropertySet("Date1904", true);

- 237 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion des feuilles


Comment récupérer l'ensemble des feuilles d'un classeur ?
Auteurs : Ricky81 ,
Nous allons récupérer cet ensemble sous la forme d'une propriété d'un objet faisant office de classeur.

Variant vWorksheets;
// vXLWorkbook est de type Variant
vWorksheets = vXLWorkbook.OlePropertyGet("Worksheets");

lien : Comment récupérer un classeur dans un objet ?

Comment récupérer une feuille à partir de son nom ?


Auteurs : Ricky81 ,
Nous allons travailler directement sur le classeur concerné :

Variant vWorksheet;
// vXLWorkbook est de type Variant
vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", vWsName);
// vWsName est un Variant initialisé au nom de la feuille

lien : Comment récupérer une feuille à partir de sa position dans le classeur ?


lien : Comment récupérer l'ensemble des classeurs ouverts ?

Comment récupérer une feuille à partir de sa position dans le classeur ?


Auteurs : Ricky81 ,
Nous allons travailler directement sur le classeur concerné :

Variant vWorksheet;
// vXLWorkbook est de type Variant
vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", vWsPos);
// vWsName est un Variant initialisé à la position (commence à 1)

lien : Comment récupérer une feuille à partir de son nom ?


lien : Comment récupérer l'ensemble des classeurs ouverts ?

Comment ajouter une nouvelle feuille à un classeur ?


Auteurs : Ricky81 , blondelle ,
Nous allons exécuter la fonction Add sur le Variant correspondant à l'ensemble des feuilles.

Variant vWorksheet;
vWorksheet = vWorksheets.OleProdedure("Add");

- 238 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Excel donnera pour nom FeuilI (cas de la version française) où I est le plus petit nombre tel que FeuilI n'existe pas
encore. La feuille sera placée en première position.

lien : Comment récupérer l'ensemble des feuilles d'un classeur ?

Comment modifier le nom d'une feuille ?


Auteurs : Ricky81 ,
Il suffit pour cela d'agir sur la propriété Name d'un Variant correspondant à la feuille.

// vWsName est un Variant initialisé au nouveau nom de la feuille


vWorksheet.OlePropertySet("Name", vWsName);

lien : Comment récupérer une feuille à partir de son nom ?

Comment déplacer une feuille ?


Auteurs : Ricky81 ,
Travaillons sur le Variant correspondant à la feuille.

// vSheet est un Variant correspondant à la feuille avant laquelle notre feuille doit être plaçée
vWorksheet.OleProcedure("Move", vSheet);

Exemple :

Variant vWorksheet1, vWorksheet3;


vWorksheet3 = vXLWorkbook.OlePropertyGet("Worksheets", 3);
vWorksheet1 = vXLWorkbook.OlePropertyGet("Worksheets", 1);
vWorksheet3.OleProcedure("Move", vWorksheet1);

Nous déplaçons la 3ème feuille en la mettant en première position.

lien : Comment récupérer une feuille à partir de sa position dans le classeur ?

Comment protéger ou déprotéger une feuille ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vWorksheet correspondant à une feuille.

vWorksheet.OleProcedure("Protect", "motdepasse", true, true, true, true);

Les 4 booléens correspondent respectivement aux paramètres 'DrawingObjects', 'Contents', 'Scenarios' et


'UserInterfaceOnly'. Il est possible d'affiner la protection avec des paramètres facultatifs trop nombreux pour être
décrits ici.

Pour ôter la protection :

- 239 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vWorksheet.OleProcedure("UnProtect", "motdepasse");

lien : Comment protéger ou déprotéger un classeur ?


lien : Comment récupérer une feuille à partir de son nom ?
lien : Comment récupérer une feuille à partir de sa position dans le classeur ?

Comment supprimer une feuille ?


Auteurs : Ricky81 ,
Agissons au niveau du Variant correspondant à la feuille en question.

vWorksheet.OleFunction("Delete");

lien : Comment récupérer une feuille à partir de son nom ?


lien : Comment récupérer une feuille à partir de sa position dans le classeur ?

Comment créer une nouvelle feuille (nouveau classeur) à partir d'une feuille d'un classeur (copie) ?
Auteurs : Ricky81 ,
Il nous faut travailler au niveau d'une feuille, par exemple définie par le Variant vWorksheet.

vWorksheet.OleFunction("Copy");

Cette fonction renvoie un booléen.

Comment dupliquer une feuille au sein d'un classeur ?


Auteurs : Ricky81 ,
Il nous faut travailler au niveau d'une feuille, par exemple celle définie par le Variant vWorksheet.

// la feuille que l'on souhaite précéder est représentée par le Variant vSheetBefore
vWorksheet.OleFunction("Copy", vSheetBefore);

Cette fonction renvoie un booléen.

Comment déterminer la zone utile ou le nombre de lignes/colonnes utiles dans ma feuille ?


Auteurs : Ricky81 ,
Plaçons-nous au niveau d'une feuille qui serait définie par le Variant vWorksheet.
Le code suivant permet de récupérer un Variant correspondant à la plage de cellules utile.

vUsedRange = vWorksheet.OlePropertyGet("UsedRange");

Il est après par exemple possible de compter le nombre de lignes :

- 240 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Variant vLines;
vLines = vUsedRange.OlePropertyGet("Rows");
int i = vLines.OlePropertyGet("Count");

ou le nombre de colonnes :

Variant vCols;
vCols = vUsedRange.OlePropertyGet("Columns");
int i = vCols.OlePropertyGet("Count");

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment récupérer toutes les cellules d'une feuille ?

Comment savoir si la suppression de lignes ou de colonnes est permise ?


Auteurs : Superstivix ,
Nous allons travailler sur une feuillle, représentée par le Variant vWorksheet.
Pour accéder à cette information, il faut interroger l'objet Protection de cette feuille :

bool supprLignePermis, supprColonnePermis;


// vWorksheet est de type Variant
supprLignePermis = vWorksheet.OlePropertyGet("Protection").OlePropertyGet("AllowDeletingRows");
supprColonnePermis =
vWorksheet.OlePropertyGet("Protection").OlePropertyGet("AllowDeletingColumns");

lien : Comment insérer ou supprimer une cellule ?

Comment savoir si l'insertion de lignes ou de colonnes est permise ?


Auteurs : Superstivix ,
Nous allons travailler sur une feuillle, représentée par le Variant vWorksheet.
Pour accéder à cette information, il faut interroger l'objet Protection de cette feuille :

bool insertLignePermis, insertColonnePermis;


// vWorksheet est de type Variant
insertLignePermis = vWorksheet.OlePropertyGet("Protection").OlePropertyGet("AllowInsertingRows");
insertColonnePermis =
vWorksheet.OlePropertyGet("Protection").OlePropertyGet("AllowInsertingColumns");

lien : Comment insérer ou supprimer une cellule ?

Comment savoir si l'insertion d'un lien hypertexte est permise ?


Auteurs : Superstivix ,
Nous allons travailler sur une feuillle, représentée par le Variant vWorksheet.
Pour accéder à cette information, il faut interroger l'objet Protection de cette feuille :

bool insertPermis;
// vWorksheet est de type Variant

- 241 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

insertPermis = vWorksheet.OlePropertyGet("Protection").OlePropertyGet("AllowInsertingHyperlinks");

Comment effacer la grille d'une feuille Excel ?


Auteurs : blondelle ,
Il est possible d'effacer la grille de fond d'une feuille Excel.

// on efface la grille de la feuille courante


vMSExcel.OlePropertyGet("ActiveWindow").OlePropertySet("DisplayGridlines",false);
// on affiche la grille
vMSExcel.OlePropertyGet("ActiveWindow").OlePropertySet("DisplayGridlines",true);

Comment dessiner un objet sur une feuille ?


Auteurs : blondelle ,
Exemple de 2 carrés l'un dans l'autre :

// vXLWorkbook est un Variant qui représente le classeur


// (msoShapeBevel = 15)
Variant vLigne1;
// on dessine sur la première feuille
vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
vLigne1 = vWorksheet.OlePropertyGet("Shapes");
vLigne1.OleProcedure("AddShape", 15, 201.6, 269.4, 18.6, 18.6);

Le code complet qui dessine un trait.


On peut changer l'épaisseur, la couleur du trait, et rendre le trait visible ou invisible.

Variant vLine;
vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
// pour les donnees (1, 1, 200, 100) il faut lire X, Y, X1, Y1
// X, Y point de depart de la ligne X1, Y1 point d'arrivee de la ligne
vLine = vWorksheet.OlePropertyGet("Shapes").OleFunction("AddLine", 1, 1, 200,100);
vLine.OlePropertyGet("Line").OlePropertySet("Weight", 8); // epaisseur de la ligne
vLine.OlePropertyGet("Line").OlePropertyGet("ForeColor").OlePropertySet("SchemeColor", 22); // couleur de la lig
vLine.OlePropertyGet("Line").OlePropertySet("Visible", false);
vLine.OlePropertyGet("Line").OlePropertySet("Visible", true);

Comment figer/libérer les volets sur une feuille ?


Auteurs : blondelle ,
Pour figer/libérer les volets, il faut au préalable sélectionner la/les cellule(s), puis définir la propriété FreezePanes.

// vMSExcel représente l'instance Excel


Variant vWorksheet, vRange;
// on selectionne la première feuille
vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
// on selectionne la cellule qui sert a positionner les volets
vRange = vWorksheet.OlePropertyGet("Range", "B4");
// on selectionne la cellule

- 242 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vRange.OleProcedure("Select");
// soit on fige soit on libere les volets
vMSExcel.OlePropertyGet("ActiveWindow").OlePropertySet("FreezePanes", true);
// pour liberer les volets remplacer "true" par "false"

Comment connaitre le nombre de feuilles d'un classeur ?


Auteurs : blondelle ,
Il suffit simplement d'interroger la propriété Count sur l'objet correspondant à l'ensemble des feuilles.

// vXLWorkbook représente un classeur


Variant vWorksheets;
vWorksheets = vXLWorkbook.OlePropertyGet("Worksheets");
int nb_de_feuilles = vWorksheets.OlePropertyGet("Count");

Comment recopier le contenu d'une feuille vers une autre feuille ?


Auteurs : blondelle ,
Ce code copie une feuille, ouvre un nouveau classeur renomme la feuille du nouveau classeur, colle la copie et
désélectionne les feuilles de chaque classeur.
Par défaut Excel crée les feuilles avec le nom Feuil1, Feuil2, ... que l'on peut renommer, mais qui conserve toujours son
rang dans la classification. Nous l'écrirons donc en OLE ("Worksheets", 1) ou ("Worksheets", "toto").
Il en est de même pour les classeurs.

Le Variant vMSExcel représente l'application Excel.

Variant vXLWorkbooks, vXLWorkbook, vWorksheet;


// l'ensemble des classeurs
vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
// on selectionne toute la feuille du classeur 1 et on la copie
vXLWorkbook = vMSExcel.OlePropertyGet("Workbooks", 1);
vWorksheet =
vXLWorkbook.OlePropertyGet("Worksheets", 1); // ici on peut remplacer "1" par le nom de la feuille "ma_feuille"
vWorksheet.OleProcedure("Select");
vWorksheet.OlePropertyGet("Cells").OleProcedure("Select");
vMSExcel.OlePropertyGet("Selection").OlePropertyGet("Copy");

// on cree un nouveau classeur


vXLWorkbooks.OleProcedure("Add");
vWorksheet = vMSExcel.OlePropertyGet("ActiveSheet");

// on renomme la feuille du nouveau classeur


vWorksheet.OlePropertySet("Name", "SAUVEGARDE_2");

// on recopie le contenu dans SAUVEGARDE_2


vWorksheet.OleProcedure("Select");
vWorksheet.OlePropertyGet("Cells").OleProcedure("Select");
vMSExcel.OlePropertyGet("ActiveSheet").OleProcedure("Paste");

// on deselectionne la feuille SAUVEGARDE_2 du nouveau classeur


vMSExcel.OlePropertySet("CutCopyMode", false);
vWorksheet.OlePropertyGet("Range", "A1").OleProcedure("Select");

// on active le classeur 1
vXLWorkbook =
vMSExcel.OlePropertyGet("Workbooks", 1); // ici on peut remplacer "1" par le nom du classeur "mon_classeur"

- 243 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vXLWorkbook.OleProcedure("Activate");

// on active la feuille 1 du classeur 1


vWorksheet =
vXLWorkbook.OlePropertyGet("Worksheets", 1); // ici on peut remplacer "1" par le nom de la feuille "ma_feuille
vWorksheet = vMSExcel.OlePropertyGet("ActiveSheet");

// on deselectionne la feuille
vWorksheet.OleProcedure("Select");
vWorksheet.OlePropertyGet("Range", "A1").OleProcedure("Select");

Comment connaitre le nombre de feuilles du classeur sur lequel on travaille ?


Auteurs : blondelle , pottiez ,
Cette procédure permet de connaitre le nombre de feuilles du classeur actif.

int Nb_feuilles = vXLWorkbook.OlePropertyGet("Sheets").OlePropertyGet("Count");

- 244 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion des cellules


Comment récupérer toutes les cellules d'une feuille ?
Auteurs : Ricky81 ,
Travaillons avec un Variant correspondant à la feuille.

Variant vCells;
vCells = vWorksheet.OlePropertyGet("Cells");

lien : Comment déterminer la zone utile ou le nombre de lignes/colonnes utiles dans ma feuille ?

Comment récupérer une cellule à partir de son adresse ?


Auteurs : Ricky81 ,
Les cellules sont référencées par leur nom (par exemple "A1") et il est donc possible de récupérer une instance de cellule
à partir de ce nom avec l'aide de la fonction Evaluate. Nous allons travailler directement sur l'instance d'Excel, ce qui
signifie que la cellule renvoyée est celle du classeur en cours et de la feuille en cours.

Variant vCell;
vCell = vMSExcel.OleFunction("Evaluate", "A1");

Remarque : c'est un raccourci intéressant vous évitant d'avoir à passer par les éléments intermédiaires que sont le
classeur et la feuille.

Attention : n'oubliez pas de tenir compte du format actuel de définition des cellules (A1 ou L1C1).

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment créer une nouvelle instance d'Excel ?
lien : Comment récupérer l'instance active d'Excel ?
lien : Comment définir/changer le mode d'affichage des feuilles (L1C1 ou A1) ?

Comment utiliser la recherche au niveau d'une plage de cellules ?


Auteurs : Bidou , Ricky81 ,
Les méthodes Find et FindNext permettent d'effectuer une recherche sur une plage de cellules.
Considérons donc le Variant vRange.

Variant vCell;
vCell = vRange.OleFunction("Find", "ricky81"); // recherche de la valeur "ricky81"

La fonction renvoie donc la première cellule rencontrée contenant la valeur recherchée. Pour poursuivre la recherche,
il est nécessaire de faire appel à la fonction FindNext à laquelle on passe en paramètre la cellule à partir de laquelle
la recherche doit se faire.

vCell = vRange.OleFunction("FindNext", vCell);

Etant donné que la cellule passée en paramètre contient la valeur recherchée, il n'est pas nécessaire de la déclarer.

- 245 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Attention : lorsque FindNext a fini de parcourir la plage, il reprend au départ. Il est donc nécessaire de mémoriser la
cellule renvoyée par Find pour ne pas avoir une boucle infinie.

Comment insérer ou supprimer une cellule ?


Auteurs : Ricky81 ,
Agissons au niveau du Variant correspondant à un cellule.

Pour insérer :

vCell.OleProcedure("Insert", shift);

Où shift correspond au décalage à effectuer. Il peut prendre les valeurs de la classe XlInsertShiftDirection :

xlShiftDown = -4121
xlShiftToRight = -4161

Pour supprimer :

vCell.OleProcedure("Delete", shift);

Où shift correspond au décalage à effectuer. Il peut prendre les valeurs de la classe XlDeleteShiftDirection :

xlShiftUp = -4162
xlShiftToLeft = -4159

Remarque : ces opérations peuvent bien entendu également être réalisées sur un plage de cellules, et plus
particulièrement une colonne ou une ligne.

lien : Comment savoir si la suppression de lignes ou de colonnes est permise ?


lien : Comment savoir si l'insertion de lignes ou de colonnes est permise ?

- 246 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion des cellules > Manipulation des cellules
Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
Auteurs : Ricky81 ,
Plaçons-nous au niveau de la feuille :

Variant vCell;
vCell = vWorksheet.OlePropertyGet("Range", vWsRange);
// vWsRange contient l'adresse sous forme d'un chaîne de caractères

Selon le format de définition des cellules en cours, pour récupérer la première cellule de votre feuille, vous aurez à
donner la valeur "A1" ou "L1C1" à vWsRange.

lien : Comment accéder à une cellule à partir de ses coordonnées ?


lien : Comment récupérer une cellule à partir de son adresse ?
lien : Comment accéder à un groupe de cellules défini au format Excel (ex. A1:B2 ou L1C1:L2C2) ?

Comment accéder à une cellule à partir de ses coordonnées ?


Auteurs : Ricky81 ,
Plaçons-nous au niveau de la feuille

Variant vCell;
vCell = vWorksheet.OlePropertyGet("Cells", vX, vY);

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment accéder à un groupe de cellules délimité par 2 cellules ?

Comment accéder à un groupe de cellules défini au format Excel (ex. A1:B2 ou L1C1:L2C2) ?
Auteurs : Ricky81 ,
Plaçons-nous au niveau de la feuille

Variant vRange;
vRange = vWorksheet.OlePropertyGet("Range", vWsRange);
// vWsRange est un Variant contenant la chaîne de caractère correspondant à la plage recherchée

Selon le format de définition des cellules en cours, il faudra donner à vWsRange la valeur "A1:B2" ou "L1C1:L2C2"
pour récupérer les 4 premières cellules de la feuille.

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment accéder à un groupe de cellules délimité par 2 cellules ?

Comment accéder à un groupe de cellules délimité par 2 cellules ?


Auteurs : Ricky81 ,
Plaçons-nous au niveau de la feuille

- 247 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Variant vRange;
vRange = vWorksheet.OlePropertyGet("Range", vCell1, vCell2);
// vCell1 et vCell2 sont des Variants définissant chacun une cellule

lien : Comment accéder à un groupe de cellules défini au format Excel (ex. A1:B2 ou L1C1:L2C2) ?
lien : Comment accéder à une cellule à partir de ses coordonnées ?
lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?

Comment récupérer le contenu d'une cellule ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vCell correspondant à la cellule.

Variant vValue;
vValue = vCell.OlePropertyGet("Value");

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment accéder à une cellule à partir de ses coordonnées ?
lien : Comment définir le contenu d'une cellule ?
lien : Comment récupérer les valeurs d'une plage de cellules dans un Variant ?

Comment définir le contenu d'une cellule ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vCell correspondant à la cellule.

vCell.OlePropertySet("Value", vValue); // vValue Variant initialisé à la nouvelle valeur

Remarque : si une même valeur doit être définie pour plusieurs cellules, l'opération précédente peut également être
appelée sur un Variant définissant un groupe de cellules.

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment accéder à une cellule à partir de ses coordonnées ?
lien : Comment récupérer le contenu d'une cellule ?

Comment affecter une formule à une cellule ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vCell correspondant à la cellule.

vCell.OlePropertySet("Formula", vValue);
// vValue est un Variant contenant la formule, par exemple "=A1+1"

- 248 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Attention, l'écriture de formules peut dépendre de la langue utilisée par Excel.Il existe 2 modes pour les formules : le
mode international (Formula) et le mode local (FormulaLocal). Il peut donc être intéressant d'en tenir compte et de
choisir entre les deux possibilités.

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment accéder à une cellule à partir de ses coordonnées ?
lien : Comment savoir si une formule est présente dans un groupe de cellules ?

Comment savoir si une formule est présente dans un groupe de cellules ?


Auteurs : Superstivix ,
Nous allons travailler sur le Variant vRange correspondant à une cellule ou un groupe de cellules.

bool contientFormule;
contientFormule = vRange.OlePropertyGet("HasFormula");

Si au moins une cellule du groupe contient une formule, cette propriété renverra la valeur true. S'il n'y en a aucune,
elle renverra false.

lien : Comment affecter une formule à une cellule ?

Comment effacer une plage de cellules ?


Auteurs : Ricky81 ,
Agissons au niveau du Variant correspondant à la plage de cellules cible.

vRange.OleFunction("ClearContents");

Comment récupérer les valeurs d'une plage de cellules dans un Variant ?


Auteurs : Ricky81 ,
Agissons au niveau du Variant correspondant à la plage de cellules cible.
Nous allons tout simplement utiliser la même propriété que pour une simple cellule.

Variant vValues;
vValues = vRange.OlePropertyGet("Value");
for(int i=1 ; i<=vValues.ArrayHighBound(1) ; i++)
{
for(int j=1 ; j<=vValues.ArrayHighBound(2) ; j++)
{
ShowMessage(vValues.GetElement(i,j));
}
}

- 249 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Dans le cas d'une plage de cellules, le Variant renvoyé est de type tableau. Le tableau est à 2 dimensions et le code
précédent permet de le parcourir.

lien : Comment récupérer le contenu d'une cellule ?

Comment récupérer un objet sur une colonne de ma feuille ?


Auteurs : Ricky81 ,
Agissons au niveau du Variant correspondant à la feuille en question.

Variant vCol;
vCol = vWorksheet.OlePropertyGet("Columns", vWsCol); // vWsCol correspond à l'indice de colonne

lien : Comment récupérer un objet sur une ligne de ma feuille ?


lien : Comment récupérer un objet correspondant à la ligne/colonne complète à laquelle appartient un groupe de
cellules ?

Comment récupérer un objet sur une ligne de ma feuille ?


Auteurs : Ricky81 ,
Agissons au niveau du Variant correspondant à la feuille en question.

Variant vRow;
vRow = vWorksheet.OlePropertyGet("Rows",vWsRow); // vWsRow correspond à l'indice de ligne

lien : Comment récupérer un objet sur une colonne de ma feuille ?


lien : Comment récupérer un objet correspondant à la ligne/colonne complète à laquelle appartient un groupe de
cellules ?

Comment récupérer un objet correspondant à la ligne/


colonne complète à laquelle appartient un groupe de cellules ?
Auteurs : Superstivix ,
Nous allons travailler sur le Variant vCell correspondant à la cellule.

Variant vCol, vRow;


vRow = vRange.OlePropertyGet("EntireRow");
vCol = vRange.OlePropertyGet("EntireColumn");

lien : Comment récupérer un objet sur une colonne de ma feuille ?


lien : Comment récupérer un objet sur une ligne de ma feuille ?

- 250 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion des cellules > Mise en forme des cellules
Comment masquer une ligne/colonne ?
Auteurs : Ricky81 ,
Agissons au niveau du Variant correspondant à la ligne ou la colonne en question.
Prenons l'exemple d'une colonne :

vCol.OlePropertySet("Hidden", true);

lien : Comment récupérer un objet sur une colonne de ma feuille ?


lien : Comment récupérer un objet sur une ligne de ma feuille ?

Comment fusionner des cellules ?


Auteurs : Ricky81 ,
Après avoir récupéré un Variant (vRange dans la suite) correspondant à la sélection de la zone à fusionner, il suffit
d'appeler la procédure Merge.

vRange.OleProcedure("Merge");

lien : Comment accéder à un groupe de cellules défini au format Excel (ex. A1:B2 ou L1C1:L2C2) ?
lien : Comment accéder à un groupe de cellules délimité par 2 cellules ?
lien : Comment dissocier des cellules ?

Comment dissocier des cellules ?


Auteurs : Ricky81 ,
Pour pouvoir faire l'opération inverse d'une fusion de cellules, il suffit de travailler sur une cellule ou un groupe de
cellules inclus dans l'ensemble fusionné.
Supposons par exemple que la cellule représentée par le Variant vCell appartient à une zone issue de la fusion de cellules.
Le code suivant dissocie les cellules.

vCell.OleProcedure("UnMerge");

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment accéder à une cellule à partir de ses coordonnées ?
lien : Comment fusionner des cellules ?

Comment modifier la hauteur d'une ligne ?


Auteurs : Ricky81 ,
Plaçons-nous au niveau d'une ligne définie par le Variant vRow.

- 251 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vRow.OlePropertySet("RowHeight", vValue); // vValue correspond à la hauteur en pixels

lien : Comment récupérer un objet sur une ligne de ma feuille ?


lien : Comment modifier la largeur d'une colonne ?

Comment modifier la largeur d'une colonne ?


Auteurs : Ricky81 ,
Plaçons-nous au niveau d'une colonne définie par le Variant vCol.

vCol.OlePropertySet("ColumnWidth", vValue); // vValue correspond à la largeur en pixels

lien : Comment récupérer un objet sur une colonne de ma feuille ?


lien : Comment modifier la hauteur d'une ligne ?

- 252 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion des cellules > Mise en forme des cellules > Contenu des
cellules
Comment récupérer un objet contenant les informations sur la police de caractères ?
Auteurs : Ricky81 ,
La police de caractères peut être récupérée, et par la suite traitée, que ce soit pour une cellule précise ou un groupe
de cellules.
Prenons l'exemple d'un groupe de cellules défini par le Variant vRange

Variant vFont;
vFont = vRange.OlePropertyGet("Font");

lien : Comment mettre la police de caractères en gras ?


lien : Comment mettre la police de caractères en italique ?
lien : Comment mettre la police de caractères en souligné ?
lien : Comment définir la taille de la police de caractères ?
lien : Comment modifier le type/nom de la police de caractères ?
lien : Comment modifier la couleur de la police de caractères ?

Comment mettre la police de caractères en gras ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vFont correspondant à une police de caractères définie pour une cellule ou un
groupe de cellules (voir autres Q/R).

vFont.OlePropertySet("Bold", true);

Bien entendu, pour désactiver la mise en gras, il suffit de passer pour second paramètre le booléen false ou un booléen/
Variant initialisé à false.

lien : Comment récupérer un objet contenant les informations sur la police de caractères ?
lien : Comment mettre la police de caractères en italique ?
lien : Comment mettre la police de caractères en souligné ?
lien : Comment définir la taille de la police de caractères ?
lien : Comment modifier le type/nom de la police de caractères ?
lien : Comment modifier la couleur de la police de caractères ?

Comment mettre la police de caractères en italique ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vFont correspondant à une police de caractères définie pour une cellule ou un
groupe de cellules (voir autres Q/R).

vFont.OlePropertySet("Italic", true);

- 253 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Bien entendu, pour désactiver la mise en italique, il suffit de passer pour second paramètre le booléen false ou un
booléen/Variant initialisé à false.

lien : Comment récupérer un objet contenant les informations sur la police de caractères ?
lien : Comment mettre la police de caractères en gras ?
lien : Comment mettre la police de caractères en souligné ?
lien : Comment définir la taille de la police de caractères ?
lien : Comment modifier le type/nom de la police de caractères ?
lien : Comment modifier la couleur de la police de caractères ?

Comment mettre la police de caractères en souligné ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vFont correspondant à une police de caractères définie pour une cellule ou un
groupe de cellules (voir autres Q/R).

vFont.OlePropertySet("Underline", true);

Bien entendu, pour désactiver le soulignement, il suffit de passer pour second paramètre le booléen false ou un booléen/
Variant initialisé à false.

lien : Comment récupérer un objet contenant les informations sur la police de caractères ?
lien : Comment mettre la police de caractères en gras ?
lien : Comment mettre la police de caractères en italique ?
lien : Comment définir la taille de la police de caractères ?
lien : Comment modifier le type/nom de la police de caractères ?
lien : Comment modifier la couleur de la police de caractères ?

Comment définir la taille de la police de caractères ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vFont correspondant à une police de caractères définie pour une cellule ou un
groupe de cellules (voir autres Q/R).

vFont.OlePropertySet("Size", true);

Il est bien entendu possible de lire celle-ci avec la commande suivante :

Variant vSize;
vSize = vFont.OlePropertyGet("Size");

lien : Comment récupérer un objet contenant les informations sur la police de caractères ?
lien : Comment mettre la police de caractères en gras ?
lien : Comment mettre la police de caractères en italique ?
lien : Comment mettre la police de caractères en souligné ?
lien : Comment modifier le type/nom de la police de caractères ?

- 254 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

lien : Comment modifier la couleur de la police de caractères ?

Comment modifier le type/nom de la police de caractères ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vFont correspondant à une police de caractères définie pour une cellule ou un
groupe de cellules (voir autres Q/R).

vFont.OlePropertySet("Name", vName);
// vName contient une chaîne de caractères définissant la nouvelle police, par exemple vName="Arial"

Bien entendu, pour désactiver la mise en gras, il suffit de passer pour second paramètre le booléen false ou un booléen/
Variant initialisé à false.

lien : Comment récupérer un objet contenant les informations sur la police de caractères ?
lien : Comment mettre la police de caractères en gras ?
lien : Comment mettre la police de caractères en italique ?
lien : Comment mettre la police de caractères en souligné ?
lien : Comment définir la taille de la police de caractères ?
lien : Comment modifier la couleur de la police de caractères ?

Comment modifier la couleur de la police de caractères ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vFont correspondant à une police de caractères définie pour une cellule ou un
groupe de cellules (voir autres Q/R).

vFont.OlePropertySet("Color", vValue); // vValue est un Variant définissant la couleur

vValue peut par exemple être un entier codant la couleur dont la représentation hexadécimale est bbggrr.

lien : Comment récupérer un objet contenant les informations sur la police de caractères ?
lien : Comment mettre la police de caractères en gras ?
lien : Comment mettre la police de caractères en italique ?
lien : Comment mettre la police de caractères en souligné ?
lien : Comment définir la taille de la police de caractères ?
lien : Comment modifier le type/nom de la police de caractères ?

Comment modifier l'alignement d'une cellule ou d'un groupe de cellules ?


Auteurs : Ricky81 ,
Cette opération est bien évidemment possible pour une seule cellule ou pour un ensemble de cellules.
Prenons par exemple le cas d'un ensemble de cellules défini par le Variant vRange.

vRange.OlePropertySet("HorizontalAlignment", vValue);

- 255 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

pour l'alignement horizontal.

vRange.OlePropertySet("VerticalAlignment", vValue);

pour l'alignement vertical.

La valeur de vValue est un entier dont les valeurs possibles sont les suivantes (définies dans la classe Constants d'Excel).

xlCenter = -4108
xlJustify = -4130
xlLeft = -4131
xlRight = -4152

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment accéder à une cellule à partir de ses coordonnées ?

Comment définir le format des données pour une cellule ou un groupe de cellules ?
Auteurs : Ricky81 ,
Plaçons nous par exemple au niveau d'une cellule définie par le Variant vCel.

vCel.OlePropertySet("NumberFormat", vValue);

Le Variant vValue correspond à une chaîne de caractères définissant le format (par exemple "Standard", "0,00", "@"
pour texte, "jj, mm, aaaa", ...).
Attention : certains formats (par exemple "jj, mm, aaaa") dépendent de la langue utilisée par Excel.

Astuce : Décrivez votre format dans Excel pour une cellule (par exemple la première, puis récupérer le avec le code
suivant) :

ShowMessage(vCell.OlePropertyGet("NumberFormat"));

Comment insérer un nouveau commentaire sur un groupe de cellules ?


Auteurs : Superstivix ,
Nous allons travailler sur le Variant vRange correspondant à une cellule ou un groupe de cellules.

vRange.OleProcedure("AddComment", vText); // vText Variant initialisé à la valeur du commentaire

lien : Comment supprimer un commentaire sur un groupe de cellules ?

Comment supprimer un commentaire sur un groupe de cellules ?


Auteurs : Superstivix ,
Nous allons travailler sur le Variant vRange correspondant à une cellule ou un groupe de cellules.

- 256 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vRange.OlePropertyGet("Comment").OleProcedure("Delete");

lien : Comment insérer un nouveau commentaire sur un groupe de cellules ?

- 257 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion des cellules > Mise en forme des cellules > Taille des cellules
Comment forcer le contenu d'une cellule à s'adapter aux dimensions de celle-ci ?
Auteurs : Ricky81 ,
Plaçons-nous au niveau de la cellule ou du groupe de cellules représenté par le Variant vRange.

vRange.OlePropertySet("ShrinkToFit", true);

Remarque : agit sur la taille de la police de caractère.

Comment forcer le retour à la ligne lorsque le texte est trop long ?


Auteurs : Ricky81 ,
Plaçons-nous au niveau de la cellule ou du groupe de cellules représenté par le Variant vRange.

vRange.OlePropertySet("WrapText", true);

Comment ajuster la largeur de la colonne/hauteur de ligne en fonction du contenu ?


Auteurs : Ricky81 ,
Agissons au niveau du Variant correspondant à la ligne ou la colonne en question.
Prenons l'exemple d'une colonne :

vCol.OleFunction("Autofit");

lien : Comment récupérer un objet sur une colonne de ma feuille ?


lien : Comment récupérer un objet sur une ligne de ma feuille ?

Comment changer l'orientation du texte d'un groupe de cellules ?


Auteurs : Superstivix ,
Agissons au niveau du Variant correspondant à la plage de cellules cible.

vRange.OlePropertySet("Orientation", vAngle);

vAngle est un nombre représentant la valeur en degrés de l'angle à former (sens anti-horaire).

- 258 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion des cellules > Mise en forme des cellules > Manipulation de
bordures
Comment récupérer le cadre d'une cellule ou d'un groupe de cellules dans un objet ?
Auteurs : Ricky81 ,
Travaillons par exemple sur le Variant vCell correspondant à une cellule.

Variant vBorders;
vBorders = vCell.OlePropertyGet("Borders");

Attention : dans le cas d'un groupe de cellules, les délimitations des cellules entre elles seront comprises dans le résultat.

lien : Comment récupérer une seule partie des bordures d'un encadrement ?
lien : Comment définir le type de bordure pour un encadrement ou une partie d'encadrement ?
lien : Comment définir la couleur d'une bordure ?
lien : Comment définir l'épaisseur d'une bordure ?

Comment récupérer une seule partie des bordures d'un encadrement ?


Auteurs : Ricky81 ,
Nous allons travailler sur le Variant vBorders définissant un encadrement.

Variant vBorder;
vBorder = vBorders.OlePropertyGet("Item",
vValue); // vValue identifie la partie du contour à extraire

Les valeurs possibles pour vValue sont définies dans la classe XlBorderIndex dont voici les constantes :

xlDiagonalDown = 5
xlDiagonalUp = 6
xlEdgeBottom = 9
xlEdgeLeft = 7
xlEdgeRight = 10
xlEdgeTop = 8
xlInsideHorizontal = 12
xlInsideVertical = 11

lien : Comment récupérer le cadre d'une cellule ou d'un groupe de cellules dans un objet ?
lien : Comment définir le type de bordure pour un encadrement ou une partie d'encadrement ?
lien : Comment définir la couleur d'une bordure ?
lien : Comment définir l'épaisseur d'une bordure ?

Comment définir le type de bordure pour un encadrement ou une partie d'encadrement ?


Auteurs : Ricky81 ,
Cette définition est à la fois possible pour un cadre ou une partie d'un cadre.
Prenons par exemple le cas d'un cadre défini par le Variant vBorders.

- 259 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vBorders.OlePropertySet("LineStyle", vValue);

Les valeurs possibles pour vValue sont définies dans la classe XlLineStyle dont voici les constantes :

xlContinuous = 1
xlDash = -4115
xlDashDot = 4
xlDashDotDot = 5
xlDot = -4118
xlDouble = -4119
xlLineStyleNone = -4142
xlSlantDashDot = 13

lien : Comment récupérer le cadre d'une cellule ou d'un groupe de cellules dans un objet ?
lien : Comment récupérer une seule partie des bordures d'un encadrement ?
lien : Comment définir la couleur d'une bordure ?
lien : Comment définir l'épaisseur d'une bordure ?

Comment définir l'épaisseur d'une bordure ?


Auteurs : Ricky81 , blondelle ,
Cette définition est à la fois possible pour un cadre ou une partie d'un cadre.
Prenons par exemple le cas d'une bordure définie par le Variant vBorder.

vBorder.OlePropertySet("Weight", vValue);

Les valeurs possibles pour vValue sont définies dans la classe XlBorderWeight dont voici les constantes :

xlHairline = 1;
xlMedium = -4138;
xlThick = 4;
xlThin = 2;

lien : Comment récupérer le cadre d'une cellule ou d'un groupe de cellules dans un objet ?
lien : Comment récupérer une seule partie des bordures d'un encadrement ?
lien : Comment définir le type de bordure pour un encadrement ou une partie d'encadrement ?
lien : Comment définir la couleur d'une bordure ?

Comment définir le cadre autour d'une plage de cellules ?


Auteurs : Ricky81 ,
Travaillons à partir du Variant vRange représentant la plage de cellule à mettre en forme.

vRange.OleFunction("BorderAround", vLineStyle, vLineWeight);

Les valeurs possibles pour vLineStyle sont à rechercher dans la classe XlLineStyle et les valeurs possibles pour
vLineWeight dans la classe XlBorderWeight

- 260 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Remarque : Vous pouvez bien entendu vous limiter aux 2 premiers paramètres si le reste ne vous intéresse pas.

lien : Comment récupérer le cadre d'une cellule ou d'un groupe de cellules dans un objet ?
lien : Comment récupérer une seule partie des bordures d'un encadrement ?
lien : Comment définir le type de bordure pour un encadrement ou une partie d'encadrement ?
lien : Comment définir l'épaisseur d'une bordure ?

Comment définir la couleur d'une bordure ?


Auteurs : Ricky81 ,
Cette définition est à la fois possible pour un cadre ou une partie d'un cadre.
Prenons par exemple le cas d'une bordure définie par le Variant vBorder.

vBorder.OlePropertySet("Color", vValue);

vValue peut par exemple être un entier codant la couleur dont la représentation hexadécimale est bbggrr.

lien : Comment récupérer le cadre d'une cellule ou d'un groupe de cellules dans un objet ?
lien : Comment récupérer une seule partie des bordures d'un encadrement ?
lien : Comment définir le type de bordure pour un encadrement ou une partie d'encadrement ?
lien : Comment définir l'épaisseur d'une bordure ?

- 261 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion des cellules > Plages de sélection
Comment associer un nom à une plage de cellule ?
Auteurs : Ricky81 ,
Travaillons directement sur le Variant représentant une plage de cellules.

vRange.OlePropertySet("Name", "ricky81");

Nous pouvons désormais retrouver notre plage par son nom au niveau du Variant vWorksheet correspondent à la feuille
sur laquelle nous travaillons.

Variant vOtherRange;
vOtherRange = vWorksheet.OlePropertyGet("Range", "ricky81");

lien : Comment récupérer la cible en fonction du nom ?


lien : Comment récupérer une cellule à partir de son adresse ?

Comment récupérer la cible en fonction du nom ?


Auteurs : Ricky81 ,
Supposons qu'une cellule ou un groupe de cellule soit associé à un nom (en l'occurrence "ricky81"). Nous allons chercher
ici à récupérer un Variant sur ce groupe de cellules.
Travaillons au niveau de la feuille concernée représentée par le Variant vWorksheet.

Variant vNames, vRange;


vNames = vWorksheet.OlePropertyGet("Names");
vRange = vNames.OleFunction("Item", "ricky81").OlePropertyGet("RefersToRange")

lien : Comment récupérer une cellule à partir de son adresse ?

Comment agrandir ou rétrécir une plage de cellules ?


Auteurs : Ricky81 ,
Nous allons pour cela travailler au niveau d'un Variant vRange représentant un plage de cellules.

Variant vNewRange;
vNewRange = vRange.OlePropertyGet("Resize", rowsize, columnsize);

Les variables rowsize et columnsize sont les tailles attendues pour la nouvelle plage.
Cette plage est obtenue en partant de la cellule supérieure gauche de la plage initiale.

lien : Comment décaler une plage de cellules ?

Comment décaler une plage de cellules ?


Auteurs : Ricky81 ,
Nous allons pour cela travailler au niveau d'un Variant vRange représentant une plage de cellules.

- 262 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Variant vNewRange;
vNewRange = vRange.OleProcedure("Offset", rowoffset, columnoffset);

Les variables rowoffset et columnoffset sont les déplacements attendus par rapport à la plage initiale.

lien : Comment agrandir ou rétrécir une plage de cellules ?

Comment faire une copie d'une plage de cellules ?


Auteurs : Ricky81 ,
Agissons au niveau du Variant correspondant à la plage de cellules cible.

vRange.OleProcedure("Copy", vCell);
// le Variant vCell représente le coin supérieur gauche destination

Comment obtenir l'union ou l'intersection de plusieurs groupes de cellules ?


Auteurs : Ricky81 ,
Nous allons travailler au niveau de l'instance Excel, représentée par le Variant vMSExcel, et faire appel aux fonctions
Union et Intersect avec pour paramètres des Variants représentant des cellules ou groupes de cellules.

Union :

Variant vRange;
vRange = vMSExcel.OleFunction("Union", vCell1, vCell2, vCell3);

Intersection :

vRange = vMSExcel.OleFunction("Intersect", vRange1, vRange2, vRange3);

Remarque : il est possible de rajouter d'autres cellules/groupes de cellules en paramètre, la limite étant fixée à 30
paramètres.

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment accéder à une cellule à partir de ses coordonnées ?
lien : Comment accéder à un groupe de cellules défini au format Excel (ex. A1:B2 ou L1C1:L2C2) ?
lien : Comment accéder à un groupe de cellules délimité par 2 cellules ?

Comment récupérer la définition d'une plage d'adresses au format Excel ?


Auteurs : Ricky81 ,
Il est possible de récupérer, au format en cours utilisé par l'application Excel, l'adresse d'une cellule ou plage de cellules.
Prenons l'exemple d'une plage de cellules matérialisée par le Variant vRange que nous aurons précédemment initialisé.

Variant vSelection;

- 263 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vSelection = vRange.OlePropertyGet("Address");

Le Variant vSelection contient alors la chaîne de caractères correspondant à la zone en question. Un exemple de retour
pourrait par exemple être "$A$1:$B$2".

lien : Comment accéder à une cellule définie au format Excel (ex. A1 ou L1C1) ?
lien : Comment accéder à une cellule à partir de ses coordonnées ?
lien : Comment accéder à un groupe de cellules défini au format Excel (ex. A1:B2 ou L1C1:L2C2) ?
lien : Comment accéder à un groupe de cellules délimité par 2 cellules ?

Comment récupérer la plus grande zone remplie d'une plage de cellules ?


Auteurs : Ricky81 ,
Nous allons pour cela travailler au niveau d'un Variant vRange représentant une plage de cellules.

Le code suivant renvoie la plage en cours dans laquelle est l'objet Range. On entend par plage en cours, l'ensemble
des cellules limitées par une combinaison de lignes et de colonnes vides en partant du coin supérieur gauche défini par
la plage.

Variant vRegion;
vRegion = vRange.OlePropertyGet("CurrentRegion");

lien : Comment déterminer la zone utile ou le nombre de lignes/colonnes utiles dans ma feuille ?

Comment récupérer des plages particulières ?


Auteurs : Ricky81 ,
Nous allons travailler au niveau d'un Variant vRange représentant un plage de cellules.
Voici quelques exemples :

- Des cellules vides :

Variant vBlankCells;
vBlankCells = vRange.OlePropertyGet("SpecialCells", xlCellTypeBlanks);

- Des cellules constantes contenant du texte :

Variant vTextCells;
vTextCells = vRange.OlePropertyGet("SpecialCells", xlCellTypeConstants, xlTextValues);

- Des cellules constantes contenant une valeur numérique :

Variant vNumbersCells;
vNumbersCells = vRange.OlePropertyGet("SpecialCells", xlCellTypeConstants, xlNumbers);

- Des cellules contenant une formule :

- 264 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Variant vFormulaCells;
vFormulaCells = vRange.OlePropertyGet("SpecialCells", xlCellTypeFormulas);

Pour davantage d'éléments, les différentes valeurs possibles pour le second et le troisième paramètre sont respectivement
des constantes des classes XlCellType et XlSpecialCellsValue.

Comment sélectionner une plage de cellules ?


Auteurs : blondelle ,
Pour sélectionner une plage de cellules, il faut au préalable avoir définit la plage, par exemple en délimitant la zone
avec 2 cellules.
Il suffit ensuite d'appeler la fonction Select :

//on selectionne la plage de cellules délimitées par vCell1 et vCell2


// vCell1 et vCell2 sont des Variant représentant des cellules
// vWorksheet est un Variant représentant une feuille
vWorksheet.OlePropertyGet("Range", vCell1, vCell2).OleFunction("Select");

Comment sélectionner plusieurs plages de cellules ?


Auteurs : blondelle ,
Pour sélectionner plusieurs plages de cellules, il faut au préalable avoir défini les plages, par exemple en délimitant la
zone avec 2 cellules.
Une fois cela fait, il faut unir les sélections grace à la fonction Union.
Il suffit ensuite d'appeler la fonction Select :

vWorksheet.OleProcedure("Activate");

// définition des plages


// vMSExcel.OlePropertyGet("Range", "C5:D9,G9:H16,B14:D18");
//Variant Aire1 = vWorksheet.OlePropertyGet("Range", "A1:B2");
Variant Aire1 = vWorksheet.OlePropertyGet("Range",
vWorksheet.OlePropertyGet("Cells",1,1),vWorksheet.OlePropertyGet("Cells",2,2));
//Variant Aire2 = vWorksheet.OlePropertyGet("Range", "C3:D4");
Variant Aire2 = vWorksheet.OlePropertyGet("Range",
vWorksheet.OlePropertyGet("Cells",3,3),vWorksheet.OlePropertyGet("Cells",4,4));
//Variant Aire3 = vWorksheet.OlePropertyGet("Range", "B8:F14");
Variant Aire3 = vWorksheet.OlePropertyGet("Range",
vWorksheet.OlePropertyGet("Cells",8,2),vWorksheet.OlePropertyGet("Cells",14,6));
Variant mesMultiAires = vMSExcel.OleFunction("Union", Aire1, Aire2, Aire3);

// sélection des plages


mesMultiAires.OleProcedure("Select");

// on récupère le NB de lignes et de colonnes


Variant lign1 = Aire1.OlePropertyGet("Rows").OlePropertyGet("Count");
Variant colon1 = Aire1.OlePropertyGet("Columns").OlePropertyGet("Count");
Variant lign2 = Aire2.OlePropertyGet("Rows").OlePropertyGet("Count");
Variant colon2 = Aire2.OlePropertyGet("Columns").OlePropertyGet("Count");
Variant lign3 = Aire3.OlePropertyGet("Rows").OlePropertyGet("Count");
Variant colon3 = Aire3.OlePropertyGet("Columns").OlePropertyGet("Count");

- 265 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Excel > Gestion des macro Excel
Comment installer, exécuter, puis désinstaller une macro définies dans un fichier ?
Auteurs : blondelle ,
Soit un fichier contenant du code VBE :

Fichier testrows.txt
Sub essai()
Rows("10:11").Select
End sub

Les Variant vMSExcel et vXLWorkbook représentent respectivement une instance de l'application Excel et un classeur.
Il s'agit de manipuler un module VBE et de créer à la volée une macro à partir d'un fichier, puis de la supprimer après
execution.

Attention, le code suivant peut ne pas fonctionner selon votre configuration sécurité d'Excel (cf. Options de sécurité,
sécurité des macros).

Variant VBComp;
// installation du Module
VBComp = vXLWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents");
VBComp.OleProcedure("Import", "c:\\testrows.txt");
// execution de la macro
vMSExcel.OleProcedure("Run", "essai");
// destruction de la macro
VBComp.OleFunction("Remove", VBComp.OleFunction("Item", "Module1"));
// à partir d'ici il n'y a plus de macro n'y Module

Comment créer temporairement une macro pour l'exécuter ?


Auteurs : blondelle ,
Le Variant vMSExcel représente une instance d'Excel, vXLWorkbook repésente un classeur.
Il s'agit de manipuler un module VBE et de créer à la volée une macro, puis de la supprimer après execution.

Attention, le code suivant peut ne pas fonctionner selon votre configuration sécurité d'Excel (cf. Options de sécurité,
sécurité des macros).

Variant VBComp;
// on cree un module pour du code VB
VBComp =
vXLWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents").OleFunction("Add", 1);

// on renomme le module sans espaces dans le nom


VBComp.OlePropertySet("Name", "MyModule");

// on ecrit la macro dans le module cree


VBComp.OlePropertyGet("CodeModule").OleProcedure("InsertLines", 1, "Sub laMacro()");
VBComp.OlePropertyGet("CodeModule").OleProcedure("InsertLines", 2, " Rows(\"10:11\").Select");
VBComp.OlePropertyGet("CodeModule").OleProcedure("InsertLines", 3, "End Sub");
// on l'execute
vMSExcel.OleProcedure("Run", "laMacro");

vXLWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents").OleFunction("Remove",
VBComp);

- 266 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

// ici il n'y a plus aucune trace de la macro

Cette façon de faire est plutôt adaptée à l'execution de petites macros, voire de macros dont le code doit être rendu
dynamique (cf. changeant selon certains paramètres saisis dans votre application C++).

Comment exécuter une macro contenue dans un classeur ?


Auteurs : Ricky81 ,
Considérons l'instance d'Excel représentée par le Variant vMSExcel.

vMSExcel.OleProcedure("Run", "monClasseur.xls!MaMacro");

Le code ci-dessus va donc lancer la macro "MaMacro" définie dans le classeur ouvert nommé "monClasseur".

Remarques :

• Les éventuels paramètres de la macro sont à ajouter comme paramètres à la suite du nom de la macro dans l'appel
précédent
• Il vous est bien sûr possible d'appeler une macro définie dans une module en adaptant votre code
("monClasseur.xls!monmodule.MaMacro")

lien : Comment utiliser les fonctions intégrées d'Excel ?


lien : Comment créer une nouvelle instance d'Excel ?
lien : Comment récupérer l'instance active d'Excel ?

- 267 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Word

- 268 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Word > Gestion de l'application


Comment ouvrir une application Word ?
Auteurs : blondelle , pottiez , Alain Malval ,
Cette procédure permet de créer une Instance de Word.
Dans le try on récupére l'instance Word si il est chargé.
Le catch(...) permet de traiter le cas Word non chargé, et donc de le charger.
Puis on rend l'application Word visible.

Nous allons manipuler Word dans le cadre de son pilotage OLE, et donc tenter de récupérer l'instance active.
Le Variant vMSWord sera initialisé avec cette valeur et permettra par la suite de manipuler l'ensemble des éléments
propres à Word.

Variant vMSWord;
try
{
vMSWord = Variant::GetActiveObject("Word.Application");
}
catch(...)
{
vMSWord = Variant::CreateObject("Word.Application");
}
vMSWord.OlePropertySet("Visible", true); // ("Visible", false)

Comment ouvrir un nouveau document Word ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de créer un nouveau document à partir de l'instance de Word et d'afficher une feuille vierge.

Variant vWDocuments, vWDocument;


vWDocuments = vMSWord.OlePropertyGet("Documents");
// ici on ouvre le document avec une feuille vierge
vWDocument = vWDocuments.OleFunction("Add");

Comment ouvrir un document Word existant ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de d'ouvrir un document Word existant.
Important : il est préférable de déclarer le nom du fichier et les differents paramètres de la fonction Open dans des
variables.
Les variables non utilisées sont déclarées "Unassigned".
Nous allons travailler sur le Variant représentant l'instance du document.

Variant vFileName, vLink, vReadOnly, vFormat, vReadPass, vWDocuments, vWDocument;


vFileName = "c:\\book1.doc";
vLink = Unassigned;
vReadOnly = false; // lecture seule
vFormat = Unassigned;
vReadPass = "MotDePasse"; // mot de passe du document
vWDocuments = vMSWord.OlePropertyGet("Documents");
// ici on charge un document sur la feuille

- 269 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vWDocument = vWDocuments.OleFunction("Open", vFileName, vLink, vReadOnly, vFormat, vReadPass);

Comment utiliser la fonction "Enregister sous..." de Word ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de sauvegarder le document sous le nom souhaité.
Important : il est préférable de déclarer le nom du fichier de la fonction Saveas dans une variable.
L'objet cible est un Variant (vWDocument) correspondant au document à sauver.

Variant vFileName;
vFileName = "c:\\book1.doc";
vWDocument.OleProcedure("Saveas", vFileName);

Comment sauvegarder un document Word ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de sauvegarder le document avec le nom donné à l'ouverture.
L'objet cible est un Variant (vWDocument) correspondant au document à sauver.

vWDocument.OleProcedure("Save");

Comment fermer un document Word ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de fermer le document.
Nous allons travailler sur le Variant représentant l'instance du document.

Variant vMSWord;
vWDocuments.OleFunction("Close");
// on libere les Variants
vMSWord = Unassigned;

Comment quitter Word ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procedure permet de quitter Word.
Nous allons travailler sur le Variant représentant l'instance de Word.

Variant vMSWord;
vMSWord.OleFunction("Quit");
// on libere les Variants

- 270 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vMSWord = Unassigned;

Comment imprimer un exemplaire du document Word ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet d'imprimer le document.

vWDocument.OleProcedure("PrintOut");

vMSWord.OleProcedure("PrintOut");

Comment imprimer plusieurs exemplaires d'un document Word ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet d'imprimer plusieurs exemplaires du document.

Procedure ImprimerPage
//InstanceDeWord.printout(copies := NbrCopie);

// ("PrintOut", NbrCopie, Collate)


vMSWord.OleProcedure("PrintOut", 2, true); // ("PrintOut", NbrCopie, Collate)

// ("PrintOut", wdPrintRangeOfPages, NbrCopie, Collate)


vMSWord.OleProcedure("PrintOut", 4, 1, 2);

Comment avoir un aperçu avant impression ?


Auteurs : blondelle , pottiez ,
Cette procédure permet d'avoir un aperçu avant impression.

// on ouvre l'apercu avant impression


vWDocument.OleProcedure("PrintPreview");

// on ferme l'apercu avant impression


vWDocument.OleProcedure("ClosePrintPreview");

Comment changer le mode d'affichage ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de forcer un mode d'affichage.

Il existe plusieurs modes dont :


• le mode plan : forcer la propriété "Type" à 2.
• le mode page : forcer la propriété "Type" à 3.

- 271 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("View").OlePropertySet("Type", 2);
// ou
vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("View").OlePropertySet("Type", 3);

Remarque : si on souhaite une entête, il faut chosir le mode 3. Pour les autres modes voir Comment avoir différents
modes d'affichage ?

lien : Comment avoir différents modes d'affichage ?

Comment avoir différents modes d'affichage ?


Auteurs : blondelle , pottiez , Corfoudiou ,
Voici une liste des différents modes d'affichage :

//wdNormalView:
vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").
OlePropertySet("Type", 1);

//wdOutlineView:
vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").
OlePropertySet("Type", 2);

//wdPageView:
vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").
OlePropertySet("Type", 3);

//wdPrintPreview:
vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").
OlePropertySet("Type", 4);

//wdPrintPreview:
vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").
OlePropertySet("Type", 5);

//wdOnlineView:
vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").
OlePropertySet("Type", 6);

Comment connaître le numéro de version Word que l'on utilise ?


Auteurs : blondelle , pottiez ,
Cette procédure permet de connaître le numéro de version Word que l'on utilise, ceci peut être utile car certaines
fonctions ont été complétées avec les nouvelles versions.

String version_word;
// connaître le numéro de version Word que l'on utilise
version_word = vMSWord.OlePropertyGet("Version");

- 272 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Word > Modifier la police de caractère


Comment changer le type de la police d'écriture ?
Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de changer le type de la police d'écriture.
Il faut passer l'instance de Word et non celle du document.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Name", "wingdings 3");

Comment changer la taille de la police d'écriture ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de spécifier la taille de la police d'écriture.
Il faut ici passer l'instance de Word et non celle du document.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Size", "18");

Comment activer le soulignement sur la police d'écriture ?


Auteurs : blondelle , pottiez , firejocker ,
Ces procédures activent ou désactivent le soulignement sur la police d'écriture.
Il faut ici passer l'instance de Word et non celle du document.

// on souligne le texte
vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Underline", 1);

// on retire le soulignement
vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Underline", 0);

Comment mettre la police d'écriture en italique ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure met en italique la police d'écriture.
Il faut utiliser l'instance de Word et non celle du document.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Italic", "9999998");

Comment mettre en gras la police d'écriture ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet d'activer ou de désactiver la mise en gras de la police d'écriture.
Il faut ici passer l'instance de Word et non celle du document.

- 273 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", "9999998");

Comment mettre la police d'écriture en indice ?


Auteurs : blondelle , pottiez , firejocker ,
Ces procédures mettent ou retirent la mise en indice de la police d'écriture.
Il faut utiliser ici l'instance de Word et non celle du document.

// on met la police de type indice


vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Subscript", true);

// on retire le type indice


vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Subscript", false);

Comment mettre la police d'écriture en exposant ?


Auteurs : blondelle , pottiez , firejocker ,
Ces procédures mettent ou retirent la mise en exposant de la police d'écriture.
Il faut passer ici l'instance de Word et non celle du document.

// on met la police de type exposant


vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Superscript", true);

// on retire le type exposant


vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Superscript", false);

- 274 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Word > Modifier la mise en page du document
Comment insérer un saut de page ?
Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet d'insérer un saut de page.

vMSWord.OlePropertyGet("Selection").OleProcedure("InsertBreak", 7);

Comment changer l'indentation de droite ?


Auteurs : blondelle , pottiez , firejocker ,
Cette fonction permet de changer l'indentation à droite.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").
OlePropertySet("RightIndent", 28.35);

Comment changer l'indentation de gauche ?


Auteurs : blondelle , pottiez , firejocker ,
Cette fonction permet de changer l'indentation à gauche.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").
OlePropertySet("LeftIndent", 28.35);

Comment changer l'interligne ?


Auteurs : blondelle , pottiez , firejocker ,
Cette fonction permet de changer l'interligne.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").
OlePropertySet("LineSpacing", 10);

Comment activer le document ?


Auteurs : blondelle , pottiez , firejocker ,
Cette fonction active le document (en rapport avec le pied de page et l'entête).

vMSWord.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").

- 275 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

OlePropertySet("SeekView", "0");

Comment activer le pied de page ?


Auteurs : blondelle , pottiez , firejocker ,
Cette fonction active le pied de page du document.

vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").
OlePropertySet("SeekView", "10");

Comment activer l'entête du document ?


Auteurs : blondelle , pottiez , firejocker ,
Cette fonction active l'entête du document.

vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").
OlePropertySet("SeekView", "9");

- 276 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Word > Gestion du document


Comment choisir le type d'alignement souhaité ?
Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de choisir le type d'alignement souhaité.
Il faut ici passer l'instance de Word et non celle du document.

// à gauche

vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").OlePropertySet("Alignment", "0");

// centré

vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").OlePropertySet("Alignment", "1");

// à droite

vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").OlePropertySet("Alignment", "2");

// justifiée

vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").OlePropertySet("Alignment", "3");

Comment déplacer X fois le curseur ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de déplacer le curseur X fois dans la direction souhaitée.

Par exemple ("MoveUp", 5, 1) déplace le curseur vers le haut d'une ligne : ("MoveUp", ligne, count).
Pour un caractère ("MoveLeft", 1, 1) déplace le curseur vers la gauche d'un caractère : ("MoveLeft", caractere, count).

// déplacement vers le haut


vMSWord.OlePropertyGet("Selection").OleFunction("MoveUp", 5, 1);

// déplacement vers le bas


vMSWord.OlePropertyGet("Selection").OleFunction("MoveDown", 5, 1);

// déplacement vers la gauche


vMSWord.OlePropertyGet("Selection").OleFunction("MoveLeft", 1, 1);

// déplacement vers la droite


vMSWord.OlePropertyGet("Selection").OleFunction("MoveRight", 1, 1);

Comment figer la mise à jour de l'écran ?


Auteurs : blondelle , pottiez ,
Cette procédure permet de figer ou de rétablir la mise à jour de l'écran.

vMSWord.OlePropertySet("ScreenUpdating", false); // pas de mise à jour

- 277 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vMSWord.OlePropertySet("ScreenUpdating", true); // autoriser la mise à jour

Comment sauter à la page souhaitée ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure fait un saut à la page souhaitée.

//Procedure AllerALaPage wdGoToPage = 1 ,wdGoToNext = 2 ,NumeroDePage = N


° page + nb page choisie

vMSWord.OlePropertyGet("Selection").OleProcedure("Goto", 1, 2, 2);

Comment sauter au début du fichier ?


Auteurs : blondelle , pottiez ,
Cette procédure fait un saut au début du fichier.

// wdStory = 6

vMSWord.OlePropertyGet("Selection").OleProcedure("HomeKey", "6");

Comment sauter en fin de fichier ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure fait un saut en fin du fichier.

// wdStory = 6

vMSWord.OlePropertyGet("Selection").OleProcedure("EndKey", "6");

Comment sauter des lignes ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de sauter des lignes.

// Il faut passer l'instance de Word et non celle du document

int i;
i = 0;

for ( i; i < 5; i++)


{
vMSWord.OlePropertyGet("Selection").OleProcedure("TypeParagraph");

- 278 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Comment aller en début de ligne ?


Auteurs : blondelle , pottiez ,
Cette procédure permet d'aller au début de la ligne.

// wdLine = 5

vMSWord.OlePropertyGet("Selection").OleProcedure("HomeKey", "5");

Comment aller en fin de ligne ?


Auteurs : blondelle , pottiez ,
Cette procédure permet d'aller en fin de ligne.

// wdLine = 5

vMSWord.OlePropertyGet("Selection").OleProcedure("EndKey", "5");

Comment changer l'orientation de la page ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de changer l'orientation de la page
wdOrientLandscape = 1 ,wdOrientPortrait = 0

// mode paysage
vWDocument.OlePropertyGet("PageSetup").OlePropertySet("Orientation", "1");
// mode portrait
vWDocument.OlePropertyGet("PageSetup").OlePropertySet("Orientation", "0");

Comment créer ses étiquettes de réexpédition ?


Auteurs : blondelle , pottiez ,
Cette procédure permet de créer des étiquettes de réexpédition.

// étiquettes de réexpédition
String Name = "C2160"; // type d'étiquette
String addr = "Dave Edson \r\n123 Skye St. \r\nOur Town \r\nWA 98004"; // adresse du destinataire
Variant AutoText = ""; // par défaut
Variant ExtractAddress = false; // par défaut

- 279 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vMSWord.OlePropertyGet("MailingLabel").OleFunction("CreateNewDocument", Name.c_str(),
addr.c_str(), WideString(AutoText), ExtractAddress);

Comment créer ses enveloppes avec le nom et adresse


de l'expéditeur et le nom et adresse du destinataire ?
Auteurs : blondelle , pottiez ,
Cette procédure permet de créer des enveloppes avec le nom et adresse de l'expéditeur et le nom et adresse du
destinataire.

// enveloppes
String addr = "Don Funk \r\n123 Skye St. \r\nOur Town \r\nWA 98040"; // destinataire
String AutoText = "";
String retaddr = "Karin Gallagher \r\n123 Main \r\nOther Town \r\nWA 98004"; // expediteur
vWDocuments.OleFunction("Add").OlePropertyGet("Envelope").OleFunction("Insert", false, addr.c_str(),
AutoText.c_str(), false, retaddr.c_str());
vMSWord.OlePropertyGet("ActiveWindow").OlePropertyGet("View").OlePropertySet("Type", 3);

- 280 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Word > Insertion de texte venant de composants
Comment insérer du texte provenant d'un TEdit ?
Auteurs : blondelle , pottiez ,
Cette procédure permet d'insérer du texte en provenance d'un TEdit sur le document Word sélectionné.

// Il faut passer par l'instance de Word et non par celle du document


// le texte provient d'un TEdit

vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", WideString(Edit1->Text));

Comment insérer du texte provenant d'un TMemo ?


Auteurs : blondelle , pottiez ,
Cette procédure permet d'insérer du texte en provenance d'un TMemo sur le document Word sélectionné.

// Il faut passer par l'instance de Word et non par celle du document


// le texte provient d'un TMemo

vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", WideString(Memo1->Lines->Text));

Comment insérer du texte en provenance d'un TListBox ?


Auteurs : blondelle , pottiez ,
Cette procédure permet d'insérer du texte en provenance d'un TListBox sur le document Word sélectionné.

// Il faut passer par l'instance de Word et non par celle du document


// le texte provient d'un TListBox, ici on lit la première ligne

vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", WideString(ListBox1->Items->Strings[0]));

Comment insérer du texte en provenance d'un TComboBox ?


Auteurs : blondelle , pottiez ,
Cette procédure permet d'insérer du texte en provenance d'un TComboBox sur le document Word sélectionné.

// Il faut passer par l'instance de Word et non par celle du document


// le texte provient d'un TComboBox, ici on lit la ligne sélectionnée

vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", WideString(ComboBox1->Text));

Comment insérer du texte en provenance d'un TRichedit ?


Auteurs : blondelle , pottiez ,

- 281 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Cette procédure permet d'insérer du texte en provenance d'un TRichEdit sur le document Word sélectionné.

// Il faut passer par l'instance de Word et non par celle du document


// le texte provient d'un TRichEdit

vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", WideString(RichEdit1->Lines->Text));

Comment insérer du texte en provenance d'un TStringGrid ?


Auteurs : blondelle , pottiez ,
Cette procédure permet d'insérer du texte en provenance d'un TStringGrid sur le document Word sélectionné.

// le texte provient d'un TStringGrid

vMSWord.OlePropertySet("ScreenUpdating", false); // on empêche le rafraîchissement écran afin de gagner en rapi

int cmptRows = Form1->StringGrid1->RowCount;


int cmptColumns = Form1->StringGrid1->ColCount;
String chaine;
Variant vTable;

vWDocument.OlePropertyGet("Tables").OleFunction("Add", vMSWord.OlePropertyGet("Selection").
OlePropertyGet("Range"), cmptRows, cmptColumns, 1, 0);

vTable = vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1");

for (int lignes = 0; lignes < cmptRows; lignes++)


{
for (int colonnes = 0; colonnes < cmptColumns; colonnes++)
{
chaine = (StringGrid1->Cells[colonnes][lignes]);
vTable.OleFunction("Cell", lignes + 1, colonnes + 1).
OlePropertyGet("Range").OleFunction("InsertAfter", WideString(chaine));
}
}

vMSWord.OlePropertySet("ScreenUpdating", true); // on rafraîchit l'écran


}

Comment insérer du texte en provenance d'un TDBGrid ?


Auteurs : blondelle , pottiez ,
Cette procédure permet d'insérer du texte en provenance d'un TDBGrid dans un tableau du document Word
sélectionné.

// déclaration des Variants


Variant vMSword, vTable, vCell, vDocument, vDocuments;

// si Word est ouvert on l'active, sinon on l'ouvre


try
{

- 282 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vMSword = Variant::GetActiveObject("Word.Application");
}
catch(...)
{
vMSword = Variant::CreateObject("Word.Application");
}
// on rend l'application Word visible
vMSword.OlePropertySet("Visible", true);
// on crée une page
vMSword.OlePropertyGet("Documents").OleFunction("Add");
// la nouvelle page est sélectionnée
Variant vSelect = vMSword.OlePropertyGet("Selection");

// on sélectionne la police du TDBgrid


vSelect.OlePropertyGet("Font").OlePropertySet("Size", GridCustomers->Font->Size);
vSelect.OlePropertyGet("Font").OlePropertySet("Name", GridCustomers->Font->Name.c_str());
// on récupère le nombre de lignes
int nRowCount(GridCustomers->DataSource->DataSet->RecordCount + 1);

// on récupère le nombre de colonnes


int nColCount(GridCustomers->Columns->Count);

// on crée un tableau avec le nombre de lignes et de colonnes que l'on a récupérées


vMSword.OlePropertyGet("ActiveDocument").OlePropertyGet("Tables").OleProcedure("Add",
vSelect.OlePropertyGet("Range"), nRowCount, nColCount, 1, // wdWord9TableBehavior
0); // wdAutoFitFixed
//
vTable = vMSword.OlePropertyGet("ActiveDocument").
OleFunction("Range").OlePropertyGet("Tables").OleFunction("Item", 1);
//
for(int i=0; i<nColCount; i++)
{
int nColWidth = GridCustomers->Columns->Items[i]->Width;
vTable.OlePropertyGet("Columns").OleFunction("Item", i + 1)
.OlePropertySet("PreferredWidthType", 3); // wdPreferredWidthPoints
vTable.OlePropertyGet("Columns").OleFunction("Item", i + 1)
.OlePropertySet("PreferredWidth", nColWidth);
}
// ici on remplit le tableau Word avec le TDBGrid
for(int j=0; j<GridCustomers->Columns->Count; j++)
{
vCell = vTable.OleFunction("Cell", 1, j + 1);
vCell.OlePropertySet("Range", GridCustomers->Columns->Items[j]->FieldName.c_str());
// wdColorGray125
vCell.OlePropertyGet("Shading").OlePropertySet("BackgroundPatternColor", 14737632);
}
//
GridCustomers->DataSource->DataSet->First();
for(int i=0; i<nRowCount; i++)
{
//
for(int j=0; j<GridCustomers->Columns->Count; j++)
{
vCell = vTable.OleFunction("Cell", i + 2, j + 1);
vCell.OlePropertySet("Range",
GridCustomers->DataSource->DataSet->FieldByName(
GridCustomers->Columns->Items[j]->FieldName)->AsString.c_str());
}
GridCustomers->DataSource->DataSet->Next();
}

- 283 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Word > Modification du texte


Comment supprimer X caractères ?
Auteurs : blondelle , pottiez , firejocker ,
Dans une boucle ces fonctions permettent de supprimer X caractères, soit en simulant l'appui sur la touche Backspace,
soit l'appui sur la touche Del.

// on simule la touche Backspace


vMSWord.OlePropertyGet("Selection").OleFunction("TypeBackspace");

// on simule la touche Del


vMSWord.OlePropertyGet("Selection").OleFunction("Delete", 1, 3);

Comment insérer une date ou une heure ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet d'insérer une date ou une heure ou les deux.

Voici les différents formats possible :


TypeDate
1 : ChaineDate = "jj/MM/aaaa";
2 : ChaineDate = "jjjj j MMMM aaaa";
3 : ChaineDate = "j MMMM aaaa";
4 : ChaineDate = "jj/MM/aa";
5 : ChaineDate = "aaaa-MM-jj";
6 : ChaineDate = "j-MMM-aa";
7 : ChaineDate = "jj.MM.aaaa";
8 : ChaineDate = "j MMM. aa";
9 : ChaineDate = "jj.MM.aa";
10 : ChaineDate = "MMMM aa";
11 : ChaineDate = "MMM-aa";
12 : ChaineDate = "jj/MM/aaaa HH:mm";
13 : ChaineDate = "jj/MM/aaaa HH:mm:ss";
14 : ChaineDate = "h:mm";
15 : ChaineDate = "h:mm:ss";
16 : ChaineDate = "HH:mm";
17 : ChaineDate = "HH:mm:ss";

vMSWord.OlePropertyGet("Selection").OleProcedure("InsertDateTime", "dddd, dd MMMM YYYY", false);

Comment insérer un lien hypertexte ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure insère un lien hypertexte.
Attention : si le lien est un chemin windows, il ne faut pas oublier de doubler le '\\' dans le nom de chemin, autrement
le lien ne fonctionnera pas lorsque l'on cliquera dessus.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Hyperlinks").

- 284 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

OleProcedure("Add", vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"),
"c:\\book1.doc");

Comment coller le presse-papier ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de coller des données en provenance du presse-papier.
Il faut ici passer l'instance de Word et non celle du document.

vMSWord.OlePropertyGet("Selection").OleProcedure("PasteAndFormat", 0);

Comment copier la sélection ?


Auteurs : blondelle , pottiez ,
Cette procédure permet de copier la sélection.
Il faut ici passer l'instance de Word et non celle du document.

vMSWord.OlePropertyGet("Selection").OleProcedure("Copy");

Comment changer la couleur du texte ?


Auteurs : blondelle , pottiez ,
Cette procédure permet de changer la couleur du texte.
ColorIndex est compris entre 0 et 16.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("ColorIndex", 5);

Comment retourner à la ligne normalement ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de retourner à la ligne "normalement"
ex : met fin à la mise en forme d'un "titre 1".

vMSWord.OlePropertyGet("Selection").OleFunction("TypeParagraph");

Comment choisir la mise en forme du texte ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de choisir la mise en forme du texte (normal, titre1...).

- 285 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vMSWord.OlePropertyGet("Selection").OlePropertySet("Style", "Titre 2");

Comment sélectionner tout le document ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de sélectionner tout le contenu du document.

vMSWord.OlePropertyGet("Selection").OleFunction("WholeStory");

Comment insérer du texte provenant d'une chaîne de caractères ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet d'insérer une chaîne de caractères sur le document Word sélectionné.

// Il faut passer par l'instance de Word et non par celle du document

vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", "insertion de texte");

Comment ajouter le numéro de page en champ automatique ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de rajouter le numéro de page en champ automatique.
wdFieldPage = 33

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Fields").
OleFunction("Add", vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"), 33);

Comment ajouter le nombre de pages en champ automatique ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet d'ajouter le nombre total de pages en champ automatique.
wdFielNumpages = 26

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Fields").
OleFunction("Add", vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"), 26);

Comment ajouter la date en champ automatique ?


Auteurs : blondelle , pottiez , firejocker ,
Cette fonction permet d'ajouter la date en champ automatique.
wdFielDate = 31

- 286 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Fields").
OleFunction("Add", vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"), 31);

Comment ajouter l'heure en champ automatique ?


Auteurs : blondelle , pottiez , firejocker ,
Cette fonction permet de rajouter l'heure en champ automatique.
wdFielTime = 32

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Fields").
OleFunction("Add", vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"), 32);

Comment mettre a jour des champs automatiques ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de mettre à jour des champs automatiques lorsque le curseur est dessus.
Exemple : date, nom du fichier,...

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Fields").OleProcedure("Update");

Comment insérer une image à partir d'un fichier ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet d'insérer une image à partir d'un emplacement déterminé.
LinkToFile = False, SaveWithDocument = True

Variant vFileName;
// chemin de l'image
vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\Mes images\\
041227165954_31.jpg";
// Voici comment procéder
vMSWord.OlePropertyGet("Selection").OlePropertyGet("InlineShapes").
OleProcedure("AddPicture", vFileName, LinkToFile:=False, SaveWithDocument:=True);
// le code correspondant
vMSWord.OlePropertyGet("Selection").OlePropertyGet("InlineShapes").
OleProcedure("AddPicture", vFileName, false, true);

Comment charger une image et paramétrer pour que l'image


soit toujours de dimensions proportionnelles à celles d'origine ?
Auteurs : blondelle , pottiez ,
Cette procédure permet de charger une image au format jpg et de conserver la proportionalité originale.

Variant vFileName, Shape;

- 287 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\Mes images\\041227165954_31.jpg";

Shape = vMSWord.OlePropertyGet("Selection").OlePropertyGet("InlineShapes").OleFunction("AddPicture",
vFileName, false, true);
Shape.OlePropertySet("LockAspectRatio", true);

Comment remplacer un texte par un autre ?


Auteurs : blondelle , pottiez , Corfoudiou ,
Cette procédure permet de remplacer du texte par un autre.
Exemple :
toto texte à rechercher.
tata texte qui remplace.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Find").
OleFunction("Execute", "toto", false, true, false, false, false, true, false, false,
"tata", 2, false, false, false, false);

Comment écrire dans l'entête du document ?


Auteurs : blondelle , pottiez ,
Cette procédure permet d'écrire dans l'entête du document.

vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").OlePropertySet("S
vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", "écrire dans l'entête");

Comment écrire dans le pied de page du document ?


Auteurs : blondelle , pottiez ,
Cette procédure permet d'écrire dans le pied de page du document.

vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").OlePropertySet("Se
vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", "écrire dans le pied de page");

Comment insérer, soit dans l'entête, soit dans le pied de page, le numéro de page ?
Auteurs : blondelle ,
Cette fonction permet d'ajouter une numérotation automatique dans l'entête ou le pied de page, de positionner cette
numérotation, et de sortir de l'entête ou du pied de page.

// pour l'entête utiliser le paramètre 9, pour le pied de page le paramètre 10

vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").OlePropertySet("S
// ajout de la numérotation de page automatique

- 288 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Fields").OleFunction("Add",
vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"), 33); // ajout numéro page
// valeur de l'alignement centrer 1, droite 2, gauche 0

vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").OlePropertySet("Alignment", 1); // centre


// on sort de l'entête ou du pied de page

vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").OlePropertySet("S

Comment mettre le texte selectionné en majuscules ou minuscules ?


Auteurs : blondelle , pottiez ,
Cette procédure permet de mettre le texte selectionné en majuscules ou minuscules.
Ce code agit comme une bascule Minuscule-Majuscule.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("AllCaps", 9999998); // wdToggle = 999

- 289 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Sommaire > MS Office > Word > Gestion des tableaux


Comment créer un nouveau tableau ?
Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de créer un nouveau tableau.
procedure ("Range"), 2 lignes, 6 colonnes)

vWDocument.OlePropertyGet("Tables").OleFunction("Add", vMSWord.OlePropertyGet("Selection").
OlePropertyGet("Range"), 2, 6);

Comment sélectionner un tableau complet ?


Auteurs : bakaneko , blondelle ,
Cette procédure permet de sélectionner un tableau complet et appliquer un alignement du texte sur toutes les cellules
en une seule commande.
Il faut passer l'instance du document et non l'instance de Word.

// on change l'alignement des cellules du tableau

vWDocument.OlePropertyGet("Tables").OleFunction("Item", 1).OlePropertyGet("Range").OlePropertyGet("Paragraphs")

Comment sélectionner l'alignement d'une colonne quand le curseur est dans une cellule ?
Auteurs : blondelle , pottiez ,
Cette procédure permet de sélectionner l'alignement d'une colonne,
le curseur étant dans une case de cette colonne à aligner.

// alignement a gauche, wdAlignParagraphLeft = 0


vMSWord.OlePropertyGet("Selection").OleProcedure("SelectColumn");
vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").
OlePropertySet("Alignment", 0);

// alignement a droite, wdAlignParagraphRight = 2


vMSWord.OlePropertyGet("Selection").OleProcedure("SelectColumn");
vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").
OlePropertySet("Alignment", 2);

// alignement centre, wdAlignParagraphCenter = 1


vMSWord.OlePropertyGet("Selection").OleProcedure("SelectColumn");
vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").
OlePropertySet("Alignment", 1);

Comment sélectionner l'alignement du texte d'une colonne ?


Auteurs : blondelle , pottiez ,
Cette procédure permet de sélectionner l'alignement du texte d'une colonne.

- 290 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

// alignement a gauche, wdAlignParagraphLeft = 0


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Columns").
OleFunction("Item", "3").OleProcedure("Select");
vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").
OlePropertySet("Alignment", 0);

// alignement a droite, wdAlignParagraphRight = 2


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Columns").
OleFunction("Item", "3").OleProcedure("Select");
vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").
OlePropertySet("Alignment", 2);

// alignement centre, wdAlignParagraphCenter = 1


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Columns").
OleFunction("Item", "3").OleProcedure("Select");
vMSWord.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").
OlePropertySet("Alignment", 1);

Comment sélectionner l'alignement souhaite dans une ligne d'un tableau ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de sélectionner l'alignement souhaité dans un tableau.
Il faut passer l'instance du document et non l'instance de Word.

// alignement à gauche du texte de la ligne


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows").
OleFunction("Item", "3").OlePropertyGet("Range").OlePropertyGet("Paragraphs").
OlePropertySet("Alignment", 0);
// alignement centre du texte de la ligne
vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows").
OleFunction("Item", "3").OlePropertyGet("Range").OlePropertyGet("Paragraphs").
OlePropertySet("Alignment", 1);
// alignement à droite du texte de la ligne
vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows").
OleFunction("Item", "3").OlePropertyGet("Range").OlePropertyGet("Paragraphs").
OlePropertySet("Alignment", 2);

Comment déplacer un tableau vers la droite ou la gauche ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de déplacer un tableau vers la droite ou la gauche.

// déplacer le tableau vers la gauche


vMSWord.OlePropertyGet("Selection").OleProcedure("SelectColumn");
vMSWord.OlePropertyGet("Selection").OlePropertyGet("Paragraphs").OleProcedure("Outdent");

// déplacer le tableau vers la droite


vMSWord.OlePropertyGet("Selection").OleProcedure("SelectColumn");
vMSWord.OlePropertyGet("Selection").OlePropertyGet("Paragraphs").OleProcedure("Indent");

Comment configurer la hauteur d'une ligne d'un tableau ?


Auteurs : blondelle , pottiez ,

- 291 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

Cette procédure permet de configurer la hauteur d'une ligne du tableau.


Il faut passer l'instance du document et non l'instance de Word.

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows").
OleFunction("Item", "3").OleProcedure("SetHeight", 50, 0);

Comment configurer la largeur d'une colonne d'un tableau ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de configurer la largeur d'une colonne du tableau.
Il faut passer l'instance du document et non l'instance de Word.

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Columns").
OleFunction("Item", "3").OleProcedure("SetWidth", 18, 0);

Comment sélectionner l'alignement souhaite dans une case d'un tableau ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de sélectionner l'alignement souhaité dans une case du tableau.
Il faut passer l'instance du document et non l'instance de Word.

// alignement à gauche, wdAlignParagraphLeft = 0


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).
OlePropertyGet("Range").OlePropertyGet("Paragraphs").OlePropertySet("Alignment", 0);

// alignement à droite, wdAlignParagraphRight = 2


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).
OlePropertyGet("Range").OlePropertyGet("Paragraphs").OlePropertySet("Alignment", 2);

// alignement centre, wdAlignParagraphCenter = 1


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).
OlePropertyGet("Range").OlePropertyGet("Paragraphs").OlePropertySet("Alignment", 1);

// alignement vertical haut, wdAlignVerticalTop = 0


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).
OlePropertySet("VerticalAlignment", 0);

// alignement vertical bas, wdAlignVerticalBottom = 3


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).
OlePropertySet("VerticalAlignment", 3);

// alignement vertical centre, wdAlignVerticalCenter = 1


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).
OlePropertySet("VerticalAlignment", 1);

Comment mettre en forme le tableau ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de mettre en forme les bordures d'un tableau.

- 292 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

// style de ligne pour tableau


// "LineStyle" peut avoir une valeur de 0 à 22

// bordure superieure
vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Borders").
OleFunction("Item", "-1").OlePropertySet("LineStyle", 8);

// bordure gauche
vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Borders").
OleFunction("Item", "-2").OlePropertySet("LineStyle", 8);

// bordure inferieure
vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Borders").
OleFunction("Item", "-3").OlePropertySet("LineStyle", 8);

// bordure droite
vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Borders").
OleFunction("Item", "-4").OlePropertySet("LineStyle", 8);

// lignes interieures
vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Borders").
OleFunction("Item", "-5").OlePropertySet("LineStyle", 8);

// colonnes interieures
vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Borders").
OleFunction("Item", "-6").OlePropertySet("LineStyle", 8);

// diagonales descendante dans toutes les cellules


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Borders").
OleFunction("Item", "-7").OlePropertySet("LineStyle", 8);

// diagonales montante dans toutes les cellules


vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Borders").
OleFunction("Item", "-8").OlePropertySet("LineStyle", 8);

Comment choisir le type de trait d'une cellule d'un tableau ?


Auteurs : blondelle , pottiez , firejocker ,
Cette procédure permet de choisir le type et la position du trait autour ou dans une cellule d'un tableau.

// MiseEnFormeCoteCelluleTableau(Document,NumeroTableau,NumeroDeColonne,NumeroDeLigne,TypeBordure,StyleBord

// style de ligne pour tableau


// "LineStyle" peut avoir une valeur de 0 à 22

// CoteHaut : Border -> Item = -1


// CoteGauche : Border -> Item = -2
// CoteBas : Border -> Item = -3
// CoteDroit : Border -> Item = -4
// Diagonale descendante : Border -> Item = -7
// Diagonale montante : Border -> Item = - 8

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).


OlePropertyGet("Borders").OleFunction("Item", "-1").OlePropertySet("LineStyle", 8);

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).


OlePropertyGet("Borders").OleFunction("Item", "-2").OlePropertySet("LineStyle", 8);

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).


OlePropertyGet("Borders").OleFunction("Item", "-3").OlePropertySet("LineStyle", 8);

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).

- 293 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://cpp.developpez.com/faq/bcb/
Les réponses à vos questions sur BCB

OlePropertyGet("Borders").OleFunction("Item", "-4").OlePropertySet("LineStyle", 8);

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).


OlePropertyGet("Borders").OleFunction("Item", "-7").OlePropertySet("LineStyle", 8);

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).


OlePropertyGet("Borders").OleFunction("Item", "-8").OlePropertySet("LineStyle", 8);

Comment compter le nombre de lignes d'un tableau ?


Auteurs : blondelle , pottiez ,
Cette procédure permet de compter le nombre de lignes d'un tableau.

Variant nblignes;

nblignes = vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").


OlePropertyGet("Rows").OlePropertyGet("Count");

comment compter le nombre de colonnes d'un tableau ?


Auteurs : blondelle , pottiez ,
Cette procédure permet de compter le nombre de colonnes d'un tableau.

Variant nbcolonnes;

nbcolonnes = vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").


OlePropertyGet("Columns").OlePropertyGet("Count");

Comment sélectionner des cellules d'un tableau et appliquer un format ?


Auteurs : blondelle , pottiez ,
Cette procédure sélectionne des cellules et leur applique un format.

// on sélectionne les cellules ligne 1, colonne 1 jusque ligne 1, colonne3