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 :

bdd

Embed Size (px)

Citation preview

Page 1: bdd

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 informationsqu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur esthumaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez uneerreur, 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. Nousvous souhaitons une bonne lecture.L'équipe C++ Builder de Developpez.

Commentez cette FAQ :

Page 2: bdd

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 -

Page 3: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

1. Informations générales (3) .........................................................................................................................................................52. Généralités (13) ......................................................................................................................................................................... 7

2.1. Le logiciel C++ Builder (6) ............................................................................................................................................. 82.2. Apprentissage de C++ Builder (5) ................................................................................................................................. 102.3. Comparaison avec d'autres langages/IDE (2) .................................................................................................................13

3. Concepts (3) .............................................................................................................................................................................144. Langage (46) ............................................................................................................................................................................15

4.1. Types de données (23) ................................................................................................................................................... 194.1.1. Nombres (8) ........................................................................................................................................................... 214.1.2. Chaînes de caractères (14) .....................................................................................................................................26

4.2. Assembleur (4) ................................................................................................................................................................334.3. Compilation et édition de liens (11) .............................................................................................................................. 35

4.3.1. Comment résoudre l'erreur... (5) ........................................................................................................................... 465. Utilisation de C++ Builder (24) .............................................................................................................................................. 48

5.1. Concepteur de fiches (7) ................................................................................................................................................ 515.2. Palette de composants (2) ...............................................................................................................................................535.3. Outils et fonctions (6) .....................................................................................................................................................545.4. Divers (5) ........................................................................................................................................................................ 56

6. Gestion des fichiers (31) ......................................................................................................................................................... 586.1. Répertoires (15) .............................................................................................................................................................. 596.2. Fichiers (15) ....................................................................................................................................................................69

7. Gestion du temps (14) ............................................................................................................................................................. 767.1. Opérations sur les dates/heures (5) ................................................................................................................................ 797.2. Dates particulières (4) .....................................................................................................................................................82

8. Interface (135) ......................................................................................................................................................................... 848.1. Gestion de l'exécution (7) ...............................................................................................................................................858.2. Applications GUI (19) ....................................................................................................................................................89

8.2.1. Aide (4) ..................................................................................................................................................................918.2.2. Interface (11) ..........................................................................................................................................................93

8.3. Applications console (5) .................................................................................................................................................998.4. Composants (94) ........................................................................................................................................................... 101

8.4.1. Généralités et installation (10) ............................................................................................................................ 1028.4.2. Les boutons (4) .................................................................................................................................................... 1058.4.3. Les listes (8) ........................................................................................................................................................ 1068.4.4. Les grilles (11) .....................................................................................................................................................1128.4.5. Les zones d'édition (8) ........................................................................................................................................ 1218.4.6. Les images et le graphisme (17) ......................................................................................................................... 124

8.4.6.1. TChart (12) ................................................................................................................................................. 1278.4.7. Le composant TCppWebBrowser (17) ................................................................................................................1318.4.8. Le composant TStringList (3) ............................................................................................................................. 1428.4.9. Création dynamique / Recherche de composants à l'exécution (5) ..................................................................... 1448.4.10. Divers (11) ......................................................................................................................................................... 148

8.5. API Windows (7) ..........................................................................................................................................................1538.6. Ressources (3) ...............................................................................................................................................................159

9. Système (75) .......................................................................................................................................................................... 1639.1. Fichiers .INI (12) .......................................................................................................................................................... 1649.2. Base de Registre (12) ................................................................................................................................................... 1709.3. Lecteurs (7) ...................................................................................................................................................................1789.4. Moniteurs (8) ................................................................................................................................................................ 1839.5. Clavier et souris (7) ......................................................................................................................................................1879.6. Mémoire (7) .................................................................................................................................................................. 1919.7. Son (4) .......................................................................................................................................................................... 1949.8. DLL (1) .........................................................................................................................................................................1969.9. Port série / RS 232 et port parallèle (3) .......................................................................................................................197

Page 4: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

9.10. Divers (12) .................................................................................................................................................................. 19810. Bases de données (16) .........................................................................................................................................................205

10.1. BDE (6) .......................................................................................................................................................................20610.2. SQL (1) ....................................................................................................................................................................... 20910.3. ADO (3) ...................................................................................................................................................................... 21010.4. INTERBASE (1) .........................................................................................................................................................21210.5. ACCESS (3) ................................................................................................................................................................213

11. MS Office (266) .................................................................................................................................................................. 21511.1. Généralités (7) .............................................................................................................................................................21611.2. Excel (129) ..................................................................................................................................................................219

11.2.1. Gestion de l'application (36) ............................................................................................................................. 22011.2.1.1. Paramétrage de l'application (13) ............................................................................................................. 22111.2.1.2. Recours aux fonctionnalités (8) ................................................................................................................22611.2.1.3. Fonctionnalités d'impression (12) .............................................................................................................230

11.2.2. Gestion des classeurs (14) ................................................................................................................................. 23311.2.3. Gestion des feuilles (20) ....................................................................................................................................23811.2.4. Gestion des cellules (54) ................................................................................................................................... 245

11.2.4.1. Manipulation des cellules (13) ................................................................................................................. 24711.2.4.2. Mise en forme des cellules (26) ............................................................................................................... 251

11.2.4.2.1. Contenu des cellules (11) ................................................................................................................ 25311.2.4.2.2. Taille des cellules (4) ...................................................................................................................... 25811.2.4.2.3. Manipulation de bordures (6) .......................................................................................................... 259

11.2.4.3. Plages de sélection (11) ............................................................................................................................26211.2.5. Gestion des macro Excel (3) ............................................................................................................................. 266

11.3. Word (113) ..................................................................................................................................................................26811.3.1. Gestion de l'application (13) ............................................................................................................................. 26911.3.2. Modifier la police de caractère (7) ....................................................................................................................27311.3.3. Modifier la mise en page du document (7) .......................................................................................................27511.3.4. Gestion du document (12) ................................................................................................................................. 27711.3.5. Insertion de texte venant de composants (7) .....................................................................................................28111.3.6. Modification du texte (22) .................................................................................................................................28411.3.7. Gestion des tableaux (40) ..................................................................................................................................29011.3.8. Gestion des macros (5) ......................................................................................................................................302

11.4. Outlook (5) ..................................................................................................................................................................30511.4.1. Gestion de l'application (5) ............................................................................................................................... 306

11.5. PowerPoint (11) .......................................................................................................................................................... 30911.5.1. Gestion de l'application (11) ............................................................................................................................. 310

11.6. Access (1) ................................................................................................................................................................... 31311.6.1. Gestion des macros (1) ......................................................................................................................................314

12. OpenOffice (34) ...................................................................................................................................................................31512.1. Gestion des documents (3) ......................................................................................................................................... 31812.2. Gestion des feuilles (28) .............................................................................................................................................320

13. Windows Image Acquisition (WIA) (10) ........................................................................................................................... 336

Page 5: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 etcomplè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échargercontenant un programme de démonstration. Ces programmes sont volontairement très simples afin qu'il soit aisé delocaliser le code intéressant. Les réponses peuvent également être complétées de liens vers d'autres réponses ou versun 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 modificationsapporté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 vousdé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 grandebase 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 desaméliorations, et notamment :• Erwy• Louis-Guillaume Morant• Anomaly

Page 6: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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.

Page 7: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Sommaire > Généralités

Page 8: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 permettantd'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). Ilpermet de construire rapidement des applications en utilisant des composants et simplifie au maximum l'écriture ducode et la réalisation de l'interface. On peut ainsi très rapidement se consacrer à la partie "métier" du code (le coderé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 Borlandlien : 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 duC. 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 ensemblede 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, vousne disposerez pas des droits nécessaires à la commercialisation de vos applications.

• La version Professionnelle comporte beaucoup plus de fonctions. Elle permet la commercialisation desapplications. 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 cependantextrè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 denombreux outils performants pour le développement ainsi que de nombreux services pour base de données. Laversion d'évaluation est basée sur cette version.

Page 9: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 Borlandlien : 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 estexactement la même que la version Professionnelle, ormis l'absence de documentation manuscrite, ce qui n'est pas ungros 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 undixième du prix)

Cependant, il est important de noter que, possesseur d'une version destinée aux étudiants et enseignants, vous ne pouvezabsolument pas distribuer vos applications, et vous ne pouvez utiliser les applications produites que dans un contextepé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

Page 10: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 pasnécessaire d'avoir de grandes connaissances en C++. Cependant, dès que vous souhaiterez faire des applications de plusgrande 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 minimumde 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++ Builderlien : 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'interrogerle 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 :

Page 11: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

• Aide automatique

Via le menu Outils | Options de l'éditeur..., onglet Audit de Code, vous pouvez configurer les fonctionnalités d'aideautomatique.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é dedéboguage

• Audit de symbole dans conseil : Cette fonctionnalité permet de vous indiquer, lorsque vous survolez un type, desinformations 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, pourles 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++ BuilderIl 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 directementdepuis le menu Aide de C++ Builder dans certaines versions. Il est toujours accessible depuis le menu Démarrer dansla rubrique Aide de C++ Builder. Cependant ce fichier correspond à une version ancienne de l'aide de Microsoft etn'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. Voustrouverez 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 directementvers 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

Page 12: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

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

Page 13: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 unlangage très répandu : si beaucoup de personnes programment avec Borland Delphi, il y a énormément de monde quiprogramme 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 voirparfois, le C++ n'est pas un langage en train de disparaître au profit de Java. Le choix d'un langage dépend de beaucoupde facteurs et de préférences personnelles. Si vous aimez les langages très structurés, très typés, le C++ est un langageque 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 devezdonc 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 queVisual 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 nemaitrisez 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 ?

Page 14: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 estdé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 beaucoupd'interaction avec l'utilisateur. Un service reçoit des demandes provenant de clients (requêtes) et renvoie desinformations 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éfinirvous 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êtreHWND Handle;// pour un contexte de périphériqueHDC Handle;// pour un bitmapHBITMAP Handle;// pour une icôneHICON 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 Handlede fenêtre Windows sous-jacent au composant.

Page 15: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 LangageC++ :

"La connaissance du C n'est pas un préalable à l'apprentissage du C++. La programmation en C encourage denombreuses 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é auC ; 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éservercette syntaxe aux tests simples. Il peut en effet devenir fastidieux de lire un code construit uniquement autour de cetopé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 pourle 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;

Page 16: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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érerané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 parce tableau. L'utilisation du simple delete ne libérerait pas la mémoire correctement. Dans cet exemple, nous supposonsque 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 TEtoilevoid 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 étoilesvoid 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 = newEtoile*[nbetoiles]; permet de construire le tableau de pointeurs. Il faut ensuite allouer la mémoire nécessaire à chaqueTEtoile, ce que fait la boucle for. La méthode LibereEtoiles fait la démarche inverse : elle libère tous les TEtoile, puisla 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 cettesyntaxe :

Page 17: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

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

Par exemple,

// Pour constuire dynamiquement un tableau de 100 entiersint 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émentsdu 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 serontplacés dans des registres du processeurs (eax, edx et ecx), si leur taille le permet. Cela permet d'accélérer le traitementde certaines méthodes. Evitez de l'utiliser pour des méthodes récursives car les registres devraient être vidés à chaquenouvel appel de la méthode, et donc cette directive perdrait de son intérêt. Selon l'aide, "toutes les méthodes membresd'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'avezpas de droits.Le cas classique est la libération de mémoire déjà libérée.

Page 18: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 auraaucun 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 dela 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 fautchercher pourquoi la création d'un objet échoue, et enfin, il faut veiller à bien allouer la mémoire nécessaire avantd'utiliser un objet.

Page 19: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 avecdes 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 desconstantes à l'aide d'une énumération, ce qui permet de bien visualiser à quoi correspondent ces constantes, et d'êtresû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 vousn'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 :

Page 20: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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);//...

Page 21: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 pastoujours le même. Si votre application est sensible à ce caractère, il est conseillé de le fixer à l'initialisation del'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 autreszones 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 del'implémentation. Par exemple, avec C++Builder, un entier peut être utilisé pour un nombre de 20 chiffres grandmaximum (au moyen du type __int64. Consultant l'aide, on pourrait souhaiter utiliser le type double qui permetd'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'estpas 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 dontGMP, ou la librairie NTL . La librairie NTL s'est compilée sans aucun problème sous Windows avec C++Builder, cequi 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 uneclasse, cette classe contenant toutes les opérations ; donc vous devrez définir les opérateurs de base tels +, -, /, *, % sansoublier quelques fonctions très utiles telles la fonction puissance, la fonction factorielle... Pour représenter l'entier danscette classe, vous devrez utiliser un tableau.

Page 22: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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++ oualors aux suivantes (nécessite d'inclure Math.hpp) :

int Ceil(long double X);

Ceil arrondit à l'entier supérieur :Ceil(1.2) donne 2Ceil(1.9) donne 2Ceil(-1.5) donne -1

int Floor(long double X);

Floor arrondit à l'entier inférieur :Floor(1.2) donne 1Floor(1.9) donne 1Floor(-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 pairqui est choisi.RoundTo(1.2, 0) donne 1RoundTo(1.9, 0) donne 2RoundTo(1.5, 0) donne 2RoundTo(2.5, 0) donne 2RoundTo(2.500001, 0) donne 3RoundTo(-1.4, 0) donne -1RoundTo(-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'entiersupérieur qui est choisi.SimpleRoundTo(1.2, 0) donne 1SimpleRoundTo(1.9, 0) donne 2SimpleRoundTo(1.5, 0) donne 2

Page 23: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

SimpleRoundTo(2.5, 0) donne 3SimpleRoundTo(-1.4, 0) donne -1SimpleRoundTo(-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 fonctionsproposé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écessited'inclure Math.hpp). La différence se situe au niveau de l'arrondi pour les valeurs se situant à distance égale de 2nombres : dans ce cas SimpleRoundTo() arrondit vers la valeur supérieure alors que RoundTo() vers la valeur finissantpar un chiffre pair.

Exemple :

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

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

Page 24: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 18ShowMessage(HexToInt("F1")); // affiche 241ShowMessage(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)

Page 25: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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îneN[1] = (char)(N[1] + (I & 1)); // on évite un ifI = I / 2; // prêt pour le bit suivant}return N;}

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

Page 26: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 uncaractè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 AnsiStringen une chaîne C (C string).

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

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

Page 27: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

AnsiString Src;AnsiString Dest;//...// Ce code ne génerera aucune erreurCopyFile(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 suivantl'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();// instructionsCopyFile(pSrc,pDest,true);

En effet, au moment où CopyFile est exécutée, pSrc et pDest pointent sur un emplacement mémoire dont le contenuest 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 nesera pas toujours le cas, et le programme peut très bien fonctionner parfaitement pendant très longtemps, et planterde 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 terminalchar * pDest = new char[Dest.Length()+1];strcpy(pSrc,Src.c_str());strcpy(pDest,Dest.c_str());// instructionsCopyFile(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 contenantleur é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());

Page 28: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 peutne pas être convertible en entier : "Hello" ne pourra pas être convertie en entier. Une exception est déclenchée quandce 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 ficheun 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 doitrentrer 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 conversionn'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");// traitementsdelete Liste;

Page 29: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 uneAnsiString.

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îneASCII, 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++) {

Page 30: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 typeAnsiString.

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 souhaiteré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";

Page 31: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 laposition d'une occurrence à l'intérieur d'une chaîne de caractères. Elles retournent la position de la première occurrencesi 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 etAnsiReplaceText. 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 comptede 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 :

Page 32: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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'astuceconsiste à 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;}

Page 33: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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, maisce 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. Pourcela, 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 suffitde 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

Page 34: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

en tête de l'unité où vous avez placé de l'assembleur. Le compilateur redémarre donc la compilation en activant lacompilation de l'assembleur quand il en rencontre. Lorsque vous placez cette directive, le compilateur est prévenu dèsle 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.

Page 35: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Sommaire > Langage > Compilation et édition de liens

Comment créer un exécutable indépendant ?

Auteurs : Geronimo , Neilos ,

Dans C++Builder6Il suffit pour cela de décocher deux cases. Cliquez sur le menu Projet puis Options.Dans l'onglet Lieur, décochez : Utiliser la RTL dynamiqueDans l'onglet Paquets, décochez : Construire avec les paquets d'exécution

Page 36: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Dans C++Builder2006

Page 37: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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'unprogramme :• 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 paquetsd'exécution de l'onglet Paquets. Attention, votre programme ne fonctionnera plus sur d'autres ordinateurs quin'auront pas les paquets requis. Il faudra donc les déployer avec votre application.

Page 38: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

• Enfin, vous pouvez essayer d'utiliser les optimisations du compilateur : Projet | Modifier le fichier d'options. Dansle 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, laseconde 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". Consultezce 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. Cecomportement 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 sielles 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 à lasuivante :

• 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 avoirde mal à tester l'application. Dans le cas contraire il vous faudra ajouter à la main dans les propriétés du projet lesbibliothèques nécessaires voire installer les bibliothèques manquantes.

Attention : vérifiez bien que votre version de C++ Builder (Personnelle, Professionnelle, Entreprise) dispose desbibliothè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;

Page 39: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 commandeLa 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 unespace. Chaque option doit être précédée d'un trait d'union hyphen (-) ou d'une barre oblique (/). Par exemple :BCC32 -Ic:\code\hfilesLes options et noms de fichiers saisis sur la ligne de commande remplacent ceux initialisés dans les fichiers deconfiguration.Vous pouvez utiliser BCC32 pour envoyer les fichiers .OBJ à ILINK32 ou les fichiers .ASM à TASM32 (si TASM32est installé sur votre machine).

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

Page 40: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Les fichiers avec l'extension .CPP sont compilés comme des fichiers C++. Les fichiers ayant une extension .C, sansextension, 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 (8octets), 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

Page 41: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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é

Page 42: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 leré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

Page 43: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 nomsoient 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)

Page 44: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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écessairepour 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)

Page 45: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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)

Page 46: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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, maisdont 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 vousavez 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'agitprobablement 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 dereconstruire la librairie (la recompilation ne suffit pas).

[Lieur Erreur] Unresolved external '__fastcallTForm1::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 entant 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 notreexample)

Page 47: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 assezfré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 dontil dispose, même s'ils ne sont pas nécessaires à ce projet. Cela peut poser des problèmes lors de la désinstallation depaquets, 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

Page 48: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 votreprogramme sans rien avoir à rajouter. Voici ce qui est affichée dans la zone d'édition lors de la création d'une nouvelleapplication :

//---------------------------------------------------------------------------#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 lesinstructions 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-dessusde cette directive seront placés dans les entêtes précompilées. Les en-têtes précompilées permettent d'accélérer lacompilation, au détriment de la place sur le disque dur. Veillez à ce que dans toutes les unités, ce soient les mêmesfichiers 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"

Page 49: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 directivesignale que le fichier en cours (Unit1.cpp) est le fichier unité d'une fiche : c'est le fichier lié à la fiche. Vient ensuite ladé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 quicontient 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 quien a de nouvelles : tous les composants que vous rajoutez. Ainsi, le code ci-dessus signifie qu'on appelle le constructeurde la classe parente de TForm1, qui est TForm avec comme argument l'argument passé en au constructeur de la classeTForm1.

Page 50: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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éersont 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 moinsfréquentes que dans les autres langages, surtout parce que l'on n'a accès qu'à ce qui peut être utile, mais pour cela, ilfaut 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érentsprogrammes 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 programmeest composé d'un seul exécutable, un programme d'installation ne sert à rien, une compression Zip suffit. N'ajoutez pasinutilement 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

Page 51: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 souhaitezaligner avec précision ([MAJ] + clic pour en sélectionner plusieurs) et cliquez sur le bouton de la palette d'alignement

Page 52: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

correspondant. Aidez-vous des conseils (s'ils ne s'affichent pas, cliquez avec le bouton droit sur la palette et cochezAfficher 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 rectangleavec la souris et tous les composants situés dans cette zone seront sélectionnés. Pour tracer cette zone dans un composantpouvant 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éeet 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 cescomposants 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é bleuentourera le composant sélectionné. Vous pourrez alors cliquer à plusieurs reprises dans la fiche pour ajouter plusieurscomposants.

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... Pourrécupérer plus rapidement la fenêtre, utilisez le raccourci [Alt]+[0] (pas le zéro du pavé numérique), ce qui afficheraune 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

Page 53: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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. Cliquezensuite 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. Tapezdans la zone d'édition le nom du composant. Ensuite, double-cliquez sur un composant pour l'ajouter. La fenêtre ne seferme pas ce qui vous permet d'ajouter des composants "à la chaîne".

Page 54: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 desymbô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 processeurainsi 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 passeulement accessible en cas d'erreur : vous pouvez la faire apparaitre lorsque vous le souhaitez : placez un bouton survotre 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 aucuneopération. Ce petit programme n'a donc pas d'intérêt si ce n'est celui de vous montrer une utilisation simple de lafenê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écutel'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 registrecontient bien cette valeur.

Page 55: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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égardepolluent votre projet : il suffit que vous double-cliquiez sur un composant pour créer un évènement ! Si vous souhaitezles 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 sanscontenu.

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] pourdé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'ongletExceptions du langage. Décochez ensuite les cases Arrêter sur exceptions Delphi et Arrêter sur exceptions C++.

Page 56: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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'ongletPaquets. Dans cet onglet, décochez tous les paquets qui ne vous servent pas, cela accélerera le démarrage de BCB quin'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 peuventapparaître à tout moment, particulièrement lorsque vous créez un nouveau projet, compilez,... En général, ces messagene plantent pas C++Builder et il suffit de valider sur OK pour continuer à développer normalement. Si ces messagespersistent, redémarrez C++Builder, voire l'ordinateur. Il est cependant extrèmement rare que cela entraîne des pertesd'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 ladiffusion de vos librairies ou applications.

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

Supposons que nous ayons créé la variable jAPI avec la valeur E:\Program Files\Borland\CBuilder6\composants\jAPIpour définir le répertoire accueillant la librairie jAPI. Il suffit dès lors dans les projets faisant appel à cette librairie derajouter 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).

Page 57: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Exemple

Label1->Caption = __LINE__;

Page 58: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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);

Page 59: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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'ondoit y faire référence, de le demander au système. Pour cela, on utilise l'API Win32 GetWindowsDirectory. Cette APIprend 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'ondoit y faire référence, de le demander au système. Pour cela, on utilise l'API Win32 GetSystemDirectory. Cette API prendcomme 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()

Page 60: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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'ondoit y faire référence, de le demander au système. Pour cela, on utilise l'API Win32 GetTempPath. Cette API prendcomme 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;

Page 61: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 changerselon les ordinateurs... Il peut paraître plus simple d'omettre le chemin lorsqu'on fait référence à un fichier se trouvantdans 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 del'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 enextrait 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 choisirle 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 secondargument 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>'

Page 62: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 :" );}

Page 63: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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épertoirec:\temp\mon_application, il faut que le répertoire temp existe déjà. Utilisez ForceDirectories, définie dans l'unité FileCtrlou 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)){ //...

Page 64: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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.

Page 65: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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)

Page 66: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 cetterecherche, 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 :

Page 67: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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'utilisateurString __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 ){

Page 68: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 ?

Page 69: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 trouvele répertoire dans lequel est situé un fichier sélectionné dans une boîte de dialogue d'ouverture. Placez donc uneOpenDialog 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èrecette taille dans une chaîne et comment on la formate pour qu'elle soit facilement lisible par l'utilisateur :

// ouverture du fichier en lectureint 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 fichierFileClose(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 :

Page 70: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

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

La fonction FileAge retourne un entier. Pour obtenir un objet DateTime, utilisez la fonction FileDateToDateTime. Apartir 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.datChangeFileExt("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 quelnouveau 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 testpour 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 demandedu fichier d'origine et destination grâce à un TOpenDialog et un TSaveDialog :

Page 71: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 pourarguments 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);

Page 72: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

}

Voici donc notre méthode. Les paramètres qui doivent lui être passés sont respectivement FilePath, le répertoire danslequel il faut faire la recherche, Extensions, la liste des extensions à recenser et enfin, ListeFichiers, un objet de typeTStrings 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 lesfichiers trouvés. Regardez l'aide sur FindFirst pour avoir plus de précisions sur celle-ci. Sachez simplement qu'elleattend en premier argument le répertoire de recherche, en second argument le type de fichiers à rechercher et enfin, lastructure dans laquelle elle va stocker ses données. Cette fonction retourne 0 si elle trouve un fichier. Dans ce cas, oncommence la boucle do...while. C'est la fonction FindNext qui prend le relais, FindFirst ne servant que pour la premièrefois.

Ensuite, on parcourt la liste des extensions et on regarde si l'extension du fichier trouvé SRec.Name correspond à unede 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);

Page 73: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

}

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

La méthode crée une structure Infos_fichier qui permettra à la fonction FindFirst de stocker des informations sur lesfichiers trouvés. Regardez l'aide sur FindFirst pour avoir plus de précisions sur celle-ci. Sachez simplement qu'elleattend 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, oncommence la boucle do...while. C'est la fonction FindNext qui prend le relais, FindFirst ne servant que pour la premièrefois.

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'estun 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 listeet d'ouvrir chaque fichier. Nous faisons appel pour cela à une méthode Ouvrir, que vous pouvez écrire pour votreprogramme.

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){

Page 74: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 lafonction DeleteFile, cette dernière supprimant définitivement le fichier. Pour réaliser ceci pour vous pouvez utiliserSHFileOperation (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_DATAqui 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.

Page 75: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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);

Page 76: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 JJTDateTime 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 nombrede 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édentdate2 = Date(); // renvoie le jour actueldate3 = Tomorrow(); // renvoie le jour suivantdate4 = 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, SSet 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 initialiseles 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);

Page 77: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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/heurevalide.

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 uneheure absolue. La fonction suivante permet de mettre à l'heure le PC en fonction des décalages horaires et de l'heured'é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 :

Page 78: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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, correspondantau 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}

Page 79: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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

Page 80: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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;

Page 81: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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);

Page 82: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 estmultiple de 400. Les années 1700, 1800 et 1900 ne sont pas bissextiles alors que 2000 est bissextile. On trouve égalementla fonction IsInLeapYear(const TDateTime) qui renvoie un booléen.Pour l'utiliser, il vous faut inclure "DateUtils.hpp"

Page 83: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 fonctionJulianDateToDateTime().Pour l'utiliser, il vous faut inclure "DateUtils.hpp"

double jourJulien; // à initialiser à une valeurTDateTime 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 fonctionDateTimeToJulianDate().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 soitstrictement supérieure au 15/10/1582 00:00:00 (début du calendrier Grégorien). Avant cette date, il manque le décalagede 10 jours entre les deux calendriers. Pour les dates strictement inférieures au 5 octobre 1582, il suffit de rajouter10 au résultat de la fonction. On ne peut pas calculer les jours Juliens des dates du 5 au 14 octobre 1582 puisqu'ellesn'existent pas.

Page 84: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Sommaire > Interface

Page 85: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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/Windowsque 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 AnsiStringen 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()){

Page 86: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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érode l'argument.Dans l'exemple suivant, nous chargeons dans un TMemo le fichier placé en argument de la ligne de commande. Placezle 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 signalerune 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 AnsiStringqui 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 dedialogue :

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 indiquele 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 argumentpermet de lier la boîte de dialogue à une rubrique d'aide. Un des grands avantages de cette fonction est qu'elle permetde 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();

Page 87: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 deMessageDlg, 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'exempleprésenté ci-dessous déclenche une tâche ininterrompue lors du clic sur un bouton. Nous dessinons un quadrillage parrebonds 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(); }}

Page 88: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Maintenant, il nous faut pouvoir arrêter cette boucle dessin. Pour cela, nous avons vu qu'il suffit de placer la variableStop à 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 quitterle 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.

Page 89: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 passantle 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. Ilsuffit 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 :

Page 90: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 vouspouvez faire à l'aide de Fichier | Inclure l'en-tête d'unité et en double-cliquant sur Unit2.

Page 91: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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'uncontrôle. Dans cette bulle, il est possible de donner plus d'informations sur le contrôle. Les informations placées dansle 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 placerdans 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 queles hints apparaissent dans toute l'application, vous pouvez placer le code suivant dans le constructeur de votre ficheprincipale :

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 remplacepas. (quand vous cherchiez un composant dans la palette de C++ Builder, ne vous êtes-vous jamais aidé des bullesd'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 rougeintense. L'octet de poids fort (les deux premiers 0 de gauche) concerne les palettes de couleurs (cf l'aide de C++ Buildersur 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 enoeuvre 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 premierPanel de la barre de statut, soit dans le SimplePanel, si cette option est activée.

Page 92: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

• Si vous souhaitez afficher ce hint dans une autre partie de la barre de statut, il faut écrire le gestionnaired'é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 statutexiste dans ce but). Enfin, dans le constructeur de votre fiche, nous attribuons cette fonction comme gestionnaire del'é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

Page 93: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 modifierce 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èmeHMENU HandleMenuSysteme = GetSystemMenu(Handle, FALSE);

// Insertion de l'élément dans le menuAppendMenu(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 (unpointeur sur ce menu). Nous faisons donc appel à la fonction GetSystemMenu. Pour l'ajouter au menu, nous utilisons lafonction AppendMenu, qui ajoute un élément à la fin d'un menu. En premier argument, nous lui passons le Handle dumenu système, en second, le type d'élément qui va être rajouté : une chaîne. Notez seulement que le troisième argumentest 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éerune fonction-gestionnaire d'évènements qui sera appelée lorsque le message WM_SYSCOMMAND sera déclenché parWindows, c'est-à-dire quand l'utilisateur cliquera sur un élément du menu système. Il faut donc déclarer notre fonctioncomme 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émentdu 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 nefaisant 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); }}

Page 94: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Dans cette fonction, deux cas se présentent : soit le message provient de notre élément menu système et nous devonsle gérer, soit c'est un autre élément : dans ce cas, nous passons la main à la fonction Dispatch de la classe TForm afinqu'elle le gère. Si nous oublions ce second cas, seul notre élément fonctionnera. La différenciation des deux cas se faitgrâ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 lebouton Charger icône..., vous pourrez charger une nouvelle icône qui doit être au format.ico. Si vous souhaitez dessinerune 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 combinaisonALT+F4 ou l'option Fermer (clic droit sur l'icône de la fiche dans la barre de tâches). Pour empêcher la fermetured'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, enretirant la commande Déplacer du menu système de la fiche. L'appel à SetWindowPos permet de prendre en charge lesmodifications apportées à ce menu.

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

Page 95: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 detitre, option Fermer dans le menu système de la fenêtre). C'est ainsi à l'utilisateur d'implémenter son propre code et sapropre 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 Closesur une fiche ne la détruit pas mais la cache uniquement. Pour détruire la fenêtre il faut agir sur le paramètre Actiondans l'évènement OnClose.Pour intercepter la demande de fermeture d'une fiche il faut implémenter l'évènement OnCloseQuery de la façonsuivante:

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 dela 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

Page 96: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Il n'est pas possible de supprimer le bouton Close indépendamment des autres. En revanche, il est possible de ledé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 vousdé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. Utilisezles options (Projet | Options) pour ne pas créer la fiche automatiquement au démarrage. Ensuite, affichez la fonctionWinMain de votre projet (Fichier | Voir le source). Avant les instructions Application->CreateForm(/*...*/), placez lecode suivant :

Splash_dlg=new TSplash_dlg(NULL); // Crée la fiche dynamiquementSplash_dlg->Show(); // Affiche la ficheSplash_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émentcompréhensibles, n'oubliez pas que nous sommes dans une classe fiche, donc que Left et Top sont les positions de lafiche. Enfin, il suffit de faire coïncider la largeur et la hauteur de la fiche avec celle de l'écran, ce que font nos deuxdernières lignes. Bien sûr, ce code se place dans le constructeur de votre fiche, ou dans l'évènement OnCreate.

Page 97: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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:[email protected]?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 ;

Page 98: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

• 15 => du coin haut gauche.

Page 99: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 serait16bits. 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 à prendrede 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'estnotamment le cas pour un utilitaire permettant de scanner les PCs d'un réseau local pour déterminer quels sont ceuxqui 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 unedes 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.

Page 100: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 applicationconsole !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 ?

Page 101: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Sommaire > Interface > Composants

Page 102: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 declasses représentant des composants visuels qui permet de concevoir rapidement des applications. Les composants quevous 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 apparueavec 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 estla 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 limiterla 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 VCLcô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 auxdonné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 lescomportements communs. Il gère de plus les aspects création/destruction, l'introspection (cf. la notion de RTTI), et lagestion des messages.

Dans la hiérarchie on retrouve également les types TPersistent et TComponent qui proposent successivement unenrichissement en méthodes et comportements. Jusqu'à arriver à TControl qui est l'ancêtre de tous les contrôles visiblespar l'utilisateur à l'écran lors de l'exécution et avec lesquels il peut interagir.

Page 103: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Lorsque vous construisez vous même un nouveau composant visuel par exemple à partir de TControl, vous pouvezchoisir 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 vouslimitez pas aux composants "C++Builder" quand vous téléchargez des composants. Notez que la VCL a été écrite enPascal 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ésoudrece problème, allez dans le menu Projet | Modifier le fichier d'options. Descendez un peu pour voir le tag PFLAGS quidevrait ê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 paquetexistant 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 sourcecorrespondant au composant.Après validation, vous devriez avoir une nouvelle fenêtre listant pour le paquet selectionné les fichiers de composantsréférencés ainsi que les dépendances. A partir de cette fenêtre vous pouvez gérer des ajouts ou retraits de composantsmais aussi compiler le paquet et installer les nouveaux composants. Le fonctionnement est identique à celui d'un projetpuisque vous avez par ailleurs accès dans le menu Projet aux commandes Make et Construire.

Page 104: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Remarque : Pour accéder directement à un package de composants, vous pouvez également tout simplement ouvrir lefichier .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 unpaquet 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'estpas 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, leré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 lequelinstaller 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.

Page 105: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 (paletteSupplément), qui est un bouton plus perfectionné car plus personnalisable. Vous pouvez également placer un bitmapdedans avec la propriété Glyph.

Page 106: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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. Placezun 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 pourajouter des éléments, nous utilisons les méthodes de Items. Pour ajouter un élément, on utilise la méthode Add de cetteliste Items, ce qui donne ListBox1->Items->Add(Texte). Ensuite, l'utilisation la plus classique est de regarder quel élémenta é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 tableaucontenant 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é.

Page 107: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

N.B. Si votre ComboBox autorise la saisie (Style = csSimple ou csDropDown), l'affectation à sa propriété Text d'unechaî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 csDropDoxnListet 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 saproprié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éthodedé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 deCB_SETDROPPEDWIDTH ainsi que les messages s'appliquant au TComboBox - tels que CB_GETDROPPEDWIDTHou 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 plusgrand ?

Comment fixer automatiquement la largeur de la listedé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ènementOnDrawItem de façon à réaliser le dessin des éléments de cette liste :

Page 108: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 largeurde 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 dansl'explorateur Windows.Placez sur votre fiche un composant TListView, deux TEdit et un TButton. Lorsqu'on cliquera sur le bouton, unenouvelle 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-ciavec le bouton droit, puis sur Editeur de colonnes. Dans la boîte de dialogue qui s'affiche, cliquez deux fois sur Ajouterun 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);}

Page 109: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

On déclare un pointeur sur un TListItem. Un TListItem représente un élément de TListView. La méthode Add crée cenouveau 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 dessinsur le contrôle.En voici un exemple :

// on récupère le TListBox qui a lancé l'évènement, et son TCanvasTListBox * pListBox = ((TListBox *)Control);TCanvas * pCanvas = pListBox->Canvas;

// on met les lignes paires en fond jauneif ((Index % 2)==0){ pCanvas->Brush->Color = clYellow;}

// on met les lignes sélectionnées en jaune sur fond rougeif(State.Contains(odSelected)){ pCanvas->Brush->Color = clRed; pCanvas->Font->Color = clYellow;}

// on dessine le fond de la cellulepCanvas->FillRect(Rect);

// on dessine le texte de la celluleAnsiString 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 pourautant de TListBox que vous le souhaitez. Il vous suffit de positionner leur propriété Style, et de relier leur évènementOnDrawItem à 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èreson 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 solutionparmi d'autres.

Fichier .cpp :

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

Page 110: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 disquesUINT 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 suppressionfor(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 disquesSetErrorMode(oldErrorMode); // on restitue l'ancienne valeurNoDrive0 = 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 declarationspublic: // User declarations

Page 111: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Fichier .h : __fastcall TForm1(TComponent* Owner);};//---------------------------------------------------------------------------extern PACKAGE TForm1 *Form1;//---------------------------------------------------------------------------#endif

Page 112: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 cellulecourante (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 cellule.}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];

Page 113: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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", quisera 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 ilfaut 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 lemessage 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

Page 114: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 classeTStringGrid à 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 laproprié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;

Page 115: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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éesif (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éesif (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) {

Page 116: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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éeif (MultiSelect == true){// on enregistre dans la TstringList l'index de la ligne selectionnéepListeIndex->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 TStringListpGrille->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 lesoptions 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}

Page 117: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Si vous voulez vérouiller plusieurs cellules, je vous propose d'utiliser un vecteur et de vérifier chaque valeur du vecteurgrâce à un boucle

int vectCoordonnee[5][2] = {{1,1},{2,5},{3,1},{1,4},{1,2}} ;int i ;StringGrid1->Options << goEditing; // rendre éditablefor(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 classeTStringGrid à 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 valeursseront 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 :

Page 118: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 contenuedans un Bitmap, mais elle peut aussi être contenue dans un TImage. Cette procédure gère le déplacement du fond del'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.

Page 119: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 grandepour 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 ethorizontal. Le dessin est ici effectué avec l'API de Windows car la fonction TextOut du canevas des composants nepermet 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; }

Page 120: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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);}

Page 121: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 "faisantcroire" à 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 celarespectivement 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 dansle 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 simplenuméro de caractère donné par RichEdit1->SelStart. On utilise pour cela les messages Windows EM_* se rapportantaux 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.

Page 122: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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éroest passé en second paramètre ; pour avoir le "déplacement horizontal", on n'a plus alors qu'à soustraire ce résultatau 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 facilementrécupérer le numéro (absolu) du 1er caractère d'une ligne donnée, grâce à EM_LINEINDEX. Nous nous en servonscette 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'unecouleur 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);

Page 123: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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èreune 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 bidirectionnelspécifie la direction de la lecture du texte. En localisant l'application on arrive à aligner le texte à droite. Dansl'événement OnCreate :

SysLocale.MiddleEast = True;MonEdit->BiDiMode = bdRightToLeft;

Page 124: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 fautsavoir que vous ne dessinez pas directement sur la fiche mais sur le Canvas de la fiche. C'est une surface spécialementdestiné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 pourargument 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;

Page 125: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

On crée ici directement un Bitmap et on lui affecte la copie d'écran, puis on utilise la méthode SaveToFile du Bitmappour 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 objetClipboard. Le code suivant montre comment faire. Pour cela, placez un composant TImage sur une fiche ainsi qu'unbouton. 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 fautpas créer d'objet Clipboard avec l'opérateur new car une seule instance du presse-papiers est autorisée. La méthodeClipboard gère cela en créant un nouvel objet si il n'en existe pas. Sinon, elle renvoie un pointeur sur le Clipboarddéjà existant. La condition de la ligne suivante permet de vérifier que le contenu du presse-papiers est bien une imageBitmap. Ensuite, nous essayons de charger l'image dans Image1 grâce à la méthode LoadFromClipboardFormat. Lesdonné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 composantesrouges, bleues et vertes d'une couleur au format RGB, et donc en particulier pour un objet TColor. Voici un exempleconcret d'utilisation : nous passons la souris sur une image que l'utilisateur peut changer et les valeurs des différentescomposantes de la couleur située sous le pointeur est affichée dans un TLabel. Placez donc sur votre fiche un composantTImage, 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); }

Page 126: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 couleurest celle du pixel situé sous la souris à la position (X, Y) d'où le code Image1->Canvas->Pixels[X][Y], Pixels étant untableau 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 valeurpré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).

Page 127: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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ésenterun repère orthonormé, un histogramme, un camembert, ou un diagramme de Gantt. Le repère orthonormé permetd'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 à laconception 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);

Page 128: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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° sontrepré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 nefera 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 lafonction 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");

Page 129: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 égalementmodifier 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

Page 130: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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;

Page 131: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 exempleCppWebBrowser_bpk. Tapez une description (je vous conseille de la commencer par un underscore _ pourrepé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 TCppWebBrowsera été installé. Vous pouvez trouver le composant dans l'onglet ActiveX de la palette de composants. Si vous avezdes 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éfautTCOMIWebBrowser m_OCXIntf;

et

// Interface d'OCX par défaut IWebBrowser2Disp m_OCXIntf;

par

// Interface d'OCX par défautIWebBrowser2Disp 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 convertirchar* en wchar_t*". Vous pouvez convertir votre AnsiString vers un WideString utilisable par le composant en suivantla syntaxe suivante :

WideString Url = fichierHTML;CppWebBrowser1->Navigate(Url);

Page 132: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 depasser 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 souventd'avoir des fenêtres Popup qui s'ouvrent automatiquement. Pour annuler l'ouverture d'Internet Explorer dans ce caslà, vous devez écrire une procédure pour l'évènement OnNewWindow2 de votre TCppWebBrowser pour affecter lavaleur 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 moyendu 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");

Page 133: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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ôlenavigateur 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 êtreOLECMDEXECOPT_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ôlenavigateur 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 toutBrowser->ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT);

// Copier la sélection dans le presse-papierBrowser->ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT);

// Désélectionner toutBrowser->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ôlenavigateur Web, et de lui passer le paramètre OLECMDID_PAGESETUP.

Browser->ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT);

Page 134: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 dumenu contextuel, il suffit d'utiliser la méthode ExecWB.Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôlenavigateur Web, et de lui passer le paramètre OLECMDID_PROPERTIES.

Browser->ExecWB(OLECMDID_PROPERTIES, OLECMDEXECOPT_DODEFAULT);

Page 135: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 suffitd'utiliser la méthode ExecWB.Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôlenavigateur Web, et de lui passer le paramètre OLECMDID_SAVEAS.

Browser->ExecWB(OLECMDID_SAVEAS , OLECMDEXECOPT_DODEFAULT);

Page 136: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 duDocument 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.

Page 137: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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érerl'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");

Page 138: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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, lecatch 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)); } }

Page 139: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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'interfaceIHTMLDocument2, 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) {

Page 140: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 dela 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 derechercher 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 desoumettre 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 absolumentpas trivial. Le code ci-dessous est une version corrigée d'un article sur le portail Borland Developper Network, dontl'explication est hors du périmètre de cette question.

Dans le .h :

Page 141: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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

Page 142: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 sataille. 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 desfichiers 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 à uneposition donnée (il y a donc une réorganisation/décalage d'index pour une partie des éléments déjà existant), Delete quisupprime 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 quele premier élément sera référencé par un index valant 0 :

TStringList *Liste = new TStringList;// remplissageint 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 exemplede gérer très facilement des couples clé/valeur là où on pourrait penser devoir utiliser une structure plus complexe voire2 é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;

Page 143: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

La problématique de synchronisation des informations étant réglée, il est par exemple possible de trier les élémentssans 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 composantTStringList parait requise. Après avoir ajouté les différentes informations sous forme de chaînes de caractèresAnsiString, il vous suffit d'appeler la méthode SaveToFile qui enregistrera les différentes "lignes" ordonnées composantl'objet vers le fichier spécifié.

TStringList *Liste = new TStringList;// remplissageListe->SaveToFile("fichier.txt");delete Liste;

Page 144: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 quelest 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-cliquezsur 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 desavoir 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. Pourcela, 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ésdu 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é";

Page 145: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 estla fiche (Form1). Le Owner d'un composant est le composant qui a la charge de détruire celui-ci lors de sa propredestruction. (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 devezensuite 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 depasser 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 Topet 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 uncomposant, il suffit d'appeler le constructeur de la classe correspondante par l'intermédiaire du mot clé new. Pour lescomposants 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;

Page 146: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 nombrede 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êmemanière. Comme pour un attribut ou une propriété, il suffit d'affecter le nom de la méthode qui va prendre en chargela 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 (ilvous 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

Page 147: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

EditDynamique->OnKeyPress = MonTraiteKeyPress;

Page 148: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 lamé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 lafonction 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 commeréférence le contrôle passé en premier argument, et le second argument permet de définir le sens de parcours parrapport à 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 leTPageControl. La différence réside dans le fait que lorsque vous cliquez sur les onglets d'un TTabControl, lescomposants placés sur celui-ci ne changent pas : seul l'onglet actif change. Il faut gérer les modifications dansl'évènement OnChange.Pour un TPageControl, une page est liée à chaque onglet. Donc quand l'onglet change, tout le contenu du TPageControlchange. Celui que vous voyez le plus souvent, dans les boîtes de dialogue d'options par exemple (voir les options d'unprojet C++Builder) est le TPageControl.Le TTabControl est utilisé dans les logiciels MDI (Multiple Documents Interface) qui utilisent les onglets pour changerde documents : le contenu du TabControl n'a pas besoin de changer, cela doit rester une zone d'édition, mais dansl'é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;

Page 149: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 bandecontinue, 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 voulezaffecter 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 deniveau 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); }

Page 150: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 grastvi->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);}

Page 151: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Attention, si vous comptez supprimer des composants pendant le parcours, il faut impérativement effectuer la boucledans le sens descendant. Dans le cas contraire, vous serez victimes de la mise à jour de la propriété Components et descomposants 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 laméthode FindComponent du propriétaire. Le résultat de cette méthode est toujours de type TComponent, il est doncutile 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ésen 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îtrequel composant est à l'origine de l'évènement. C'est le rôle du paramètre Sender contenu dans toutes les signatures desméthodes associées à un évènement.

Par exemple, pour connaître le nom du bouton cliqué, même si Button1Click est également associé à Button2, Button3etc...

void __fastcall TForm1::Button1Click(TObject *Sender){ TButton *Button = dynamic_cast <TButton *> (Sender);

Page 152: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 quevous 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épassela taille standard d'un fichier icône, le composant vous demandera alors si il faut redimensionner l'image ou si il fautle 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

Page 153: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 denotre application). C'est très facile à réaliser à l'aide des fonctions de l'API Windows. Dans l'exemple qui suit, nousré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 modifierdirectement le contrôle : PBM_SETBARCOLOR. Il suffit d'envoyer ce message au contrôle barre de progression viason 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 duposte de travail), vous pourrez utiliser la fonction ci-dessous. Notez qu'il est conseillé de toujours retirer un privilègeune 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;

Page 154: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 nousbasant 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'APIWindows. 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 programmationde 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 declasse 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];

Page 155: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 CreateProcessou ShellExecuteEx.

Ceci peut se réaliser au moyen de la fonction FindWindow de l'API Windows. Cette fonction prend en premier paramètrele 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 cesdeux 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 chercheratoujours à 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 unmessage 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.

Page 156: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 disposel'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" );

Page 157: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 fonctionFindWindowqui 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 fonctionGetWindowThreadProcessIdrécupère l'ID du processus grâce au Handle. TerminateProcess ferme le programme.Pour l'exemple "Calculatrice" est le programme a terminer :

Page 158: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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);}

Page 159: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 (typeRESEXPLORER). 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 obtenirpour mettre à jour l'application. Pour cela, nous allons effectuer une copie de l'exécutable au même endroit que celui encours (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 applicationGetTempPath(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 lafonction 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 ressourceHANDLE 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 transmettredwFileSize = GetFileSize(hFile, NULL);lpBuffer = new BYTE[dwFileSize];if(ReadFile(hFile,lpBuffer,dwFileSize,&dwBytesRead,NULL) != FALSE){//récupération du Handle de la ressource

Page 160: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

HANDLE hResource = BeginUpdateResource(OriginalPath.c_str(), FALSE);if(NULL != hResource){//mise à jourif(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");elseShowMessage("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. Icile 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 TStringListpour 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 nepuissent 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 lesauver en RC_DATA.Pour l'enregistrer:

Page 161: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 leformat de sauvegarde, puis de sauver le fichier en tant que son propre type (".txt" pour les fichier texte, ".csv" pourles 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 (choixde la langue, fichiers chargés, modifications apportées par l'utilisateur...) puis le sauver en Ressource pour que l'exesoit portable.L'avantage de cette manipulation est que TOUT est dans UN fichier : l'application elle-même.

Page 162: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

L'inconvénient est que le code est un peu lourd à placer, et qu'il faut que l'application soit modifiable (non en lectureseule) pour être modifiée.

Page 163: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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")));

Page 164: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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ésentre crochets, et chaque section contient des couples clé/valeur.

[Section]NomDeClé=Valeur

[Section2]NomDeClé1=ValeurNomDeClé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, restepossible.

Note : Sous Windows Me/98/95 le système met en cache une version du fichier Win.ini afin d'augmenter lesperformances. Vous pourrez donc être amené à appeler la méhode UpdateFile pour nettoyer les lectures et les écrituresdu tampon depuis et vers le fichier .ini sur disque. UpdateFile est utile sous Windows Me/98/95, mais n'a aucun effetsous 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

Page 165: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Ces méthodes créent ou mettent à jour la valeur relative à un clé dans une section. Leurs prototypes sont similaires etne 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ésirefaire 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 distinguentque par le type renvoyé et celui de la valeur par défaut :

Page 166: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 à renvoyerdans 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 versle 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);

Page 167: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 TStringscomme 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 deTStrings, 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);

Page 168: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 typedescendant 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;}

Page 169: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 nesont 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éthodesWriteInteger et ReadInteger.

Page 170: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 entant que fichier sur votre disque dur s'appelle une ruche. Le sous-arbre du registre est divisé en ruches (en raison deleur ressemblance avec la structure cellulaire d'une ruche d'abeilles). Une ruche correspond à un ensemble discret declé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 quelnombre 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 valeursASCII 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_USERCorrespond à la racine contenant les informations de configuration de l'utilisateur connecté. Les paramètres utilisateurdes dossiers, des couleurs d'écran et du Panneau de configuration sont stockés ici. Ces informations constituent unprofil utilisateur.

HKEY_USERSCorrespond à la racine de tous les profils d'utilisateurs de l'ordinateur. HKEY_CURRENT_USER est une sous-clé deHKEY_USERS.

HKEY_LOCAL_MACHINEContient les informations de configuration spécifiques à l'ordinateur (pour tous les utilisateurs).

HKEY_CLASSES_ROOTSous-clé de HKEY_LOCAL_MACHINE\Software. Les informations stockées ici garantissent l'ouverture duprogramme voulu lorsque vous ouvrez un fichier depuis l'Explorateur Windows.

HKEY_CURRENT_CONFIGContient des informations sur le profil matériel utilisé par l'ordinateur local au démarrage.

Types de données prédéfinis :REG_BINARYDonnées binaires brutes. La plupart des informations concernant les composants matériels est stockée sous forme dedonnées binaires.

REG_DWORD

Page 171: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Données représentées par un nombre de 4 octets. Beaucoup de paramètres concernant les pilotes de périphériques etles services sont de ce type.

REG_EXPAND_SZChaîne de longueur variable. Ce type de données comprend les variables qui sont résolues lorsqu'un programme ouun service les utilise.

REG_MULTI_SZChaîne multiple. Les valeurs qui contiennent des listes ou plusieurs valeurs sous une forme lisible par l'homme sontgénéralement de ce type. Les différentes valeurs sont séparées par un espace, une virgule ou un autre signe.

REG_SZChaîne de texte de longueur fixe.

REG_FULL_RESOURCE_DESCRIPTORSé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++ Builderne gèrent nativement qu'un sous ensemble de type prédéfini. Reportez-vous à l'aide en ligne du programme Regeditou 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 exempleHKEY_CURRENT_USER (voyez dans Winreg.h pour les constantes disponibles).

registre->RootKey = HKEY_CLASSES_ROOT;

Page 172: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Si par la suite on souhaite accéder à une autre clé racine on doit fermer la clé racine courante puis ouvrir avec lanouvelle 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 validerles modifications apportées par la fermeture la clé en cours. Le type TRegistry possède une méthode qui permet de lefaire : 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ésouvertes 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 doncredondante :

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 lescas 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éalablementl'existence de la clé en utilisant la méthode KeyExists.

if registre->KeyExists("nom_de_la_clé"){

Page 173: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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éalablementleur 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 courspossè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 \ estle caractère d'échappement). Ici nous créons la clé HKEY_CURRENT_USER\Software\Essai.

TRegistry *registre = new TRegistry();

Page 174: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 OpenKeyde 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 sacré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 ouDeleteString 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");{ ...

Page 175: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 typechaîne de caractères. Il existe des méthodes spécifiques pour manipuler les autres types de données. Pour les connaîtrereportez-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. Ellepermet 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 typedescendant de TStrings.

TRegistry *registre = new TRegistry();TStringList *mesCles = new TStringList();

// la clé racine par défaut est HKEY_CURRENT_USERregistre->OpenKeyReadOnly("Software"); // clé couranteregistre->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éthodeGetValueNames. Elle permet de récupérer une liste de l'ensemble des valeurs de la clé en cours en initialisant un objetd'un type descendant de TStrings.

TRegistry *registre = new TRegistry();TStringList *mesCles = new TStringList();

registre->OpenKeyReadOnly("Software\\Borland\\C++Builder\\6.0"); // clé couranteregistre->GetValueNames(mesCles); // lecture des noms

// affichage d'une des valeursAnsiString 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.

Page 176: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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éthodeRegistryConnect.

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; }

Page 177: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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épenddes 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.

Page 178: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 aulecteur à 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, nousutilisons 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 aulecteur à 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 aulecteur à examiner : 1 pour A:, 2 pour B:, et ainsi de suite.

__int64 espaceTotal = DiskSize(3);

Page 179: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 aulecteur à 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);

Page 180: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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)

Page 181: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 volumeLPTSTR lpVolumeNameBuffer,// structure qui accueillera le nom du volumeDWORD nVolumeNameSize,// taille de la structure qui accueillera le nom du volumeLPDWORD lpVolumeSerialNumber,// structure qui accueillera le numéro de série du volume LPDWORD lpMaximumComponentLength,// structure qui accueillera la taille maximale d'un nom de fichierLPDWORD lpFileSystemFlags,// structure qui accueillera des informations sur le système de fichiersLPTSTR 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);}}

Page 182: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 ?

Page 183: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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ésconcernant, comme son nom l'indique, l'écran. Pour obtenir la résolution, il suffit de récupérer la largeur et la hauteurde l'écran en pixels :

int width = Screen->Width; // longueurint height = Screen->Height; // hauteurShowMessage("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ù dansvotre 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éeau démarrage de Windows). Pour cela utilisez la méthode suivante :

ChangeDisplaySettingsA(0, 0);

lien : Comment obtenir la résolution de l'écran ?

Page 184: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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) commeci-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) commeci-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 miseen 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'unprogramme (void * Param; est un membre privé de la fiche) :

//---------------------------------------------------------------------------// Au lancement de l'application on modifie les valeurs d'attentevoid __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

Page 185: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 valeursvoid __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 deconsulter les attributs des propriétés de type TFont. Par contre, nous n'avons pas accès à toutes les polices. Par exemplela police utilisée pour la barre de titre n'est pas disponible directement. Il nous faut donc utiliser une fonction de l'APIWindows : SystemParametersInfoVoici 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 allezpeut-être vouloir connaître la taille de la police d'affichage afin d'adapter votre interface en fonction. Ce paramètre, quipeut être modifié par le panneau de configuration de l'affichage, a un impact non négligeable sur l'aspect des fenêtres

Page 186: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 leurpropre 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 ?

Page 187: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 Windowslien : 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 lescontrô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 poidsle 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é !"); } }

Page 188: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 permetd'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) lecurseur 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

Page 189: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 actuellementenfoncé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 noterque pour les touches de type lettre, on peut également utiliser le code ASCII de la lettre majuscule, ou le charactèrecorrespondant (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 Button1MouseDownunsigned 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)

Page 190: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 gauchereste 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 afinde ne prendre en compte que l'incrément de 1 lors d'un appui bref.

Page 191: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 fonctionGlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;GlobalMemoryStatusEx(MS);float tailleRam = MS->ullTotalPhys; // résultat en octetsdelete 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 fonctionGlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;GlobalMemoryStatusEx(MS);float ramLibre = MS->ullAvailPhys; // résultat en octetsdelete 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 fonctionGlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;GlobalMemoryStatusEx(MS);

Page 192: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

float pourcentageUtilisation = MS->dwMemoryLoad; // valeur entre 0 et 100delete 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 fonctionGlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;GlobalMemoryStatusEx(MS);float memoireVirtuelleLibre = MS->ullAvailVirtual; // résultat en octetsdelete 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 fonctionGlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;GlobalMemoryStatusEx(MS);float memoireVirtuelle = MS->ullTotalVirtual; // résultat en octetsdelete 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 fonctionGlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;GlobalMemoryStatusEx(MS);float memoirePagineeLibre = MS->ullAvailPageFile; // résultat en octetsdelete MS;

Page 193: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 fonctionGlobalMemoryStatusEx.

MEMORYSTATUSEX *MS = new MEMORYSTATUSEX;GlobalMemoryStatusEx(MS);float memoirePaginee = MS->ullTotalPageFile; // résultat en octetsdelete 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.

Page 194: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 uneconstante 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 : waveOutGetVolumepour 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.

Page 195: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 codesuivant 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

Page 196: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 decommandes :

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 lesparamè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

Page 197: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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èledu 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;

Page 198: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 commesuit :

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 doncré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émentde EWX_LOGOFF.Par exemple :

Page 199: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 veilleaux 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émentde 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émentd'un des 2 précédemment cités.

Page 200: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 informationsadé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 queWin32CSDVersion pour les Service Packs.

Pour obtenir la version de Windows installée sur le PC, C++ Builder fournit ainsi les variables Win32MajorVersion etWin32MinorVersion, 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) {

Page 201: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 desinformations plus détaillées (numéro de construction, pro/perso, etc.) en utilisant les fonctions de l'API Windows. Cetteméthode un peu plus longue est donnée dans le fichier zip ci-dessous.

lien : MSDN - GetVersionEx

lien : MSDN : Getting the System Versionwindowsversion.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;

Page 202: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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), ensuiteje 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 peutprendre 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é".

Page 203: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

On peut voir que cette fonction peut permettre de modifier d'autres paramètres de la barre ... Par ailleurs, la commandeABM_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 " (voirles 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 fonctionGetTokenInformation(). 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 lafonction 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 ); }

Page 204: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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, enmode 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 estchargé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"; } }

Page 205: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 sontconnectés à travers une DataSource. À partir de ce moment, ces ensembles de données réagissent à tout évènement qui seproduit sur la source de données et en particulier sur l'évènement BeforeScroll. Ceci a pour avantage d'avoir des donnéestoujours actualisées. Cependant, dans le cas de recherche (tri ou recherche incrémentale) dans la source, l'inconvénientsera de ralentir énormément la recherche (du fait du raffraîchissement constant des ensembles de données). À cemoment, il est nécessaire d'appeler la méthode DisableControls avant le début de la recherche et EnableControls justeaprè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 depasse. Ceci est le comportement par défaut de tous les composants de connexion à une base même si les informationsde 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 demettre cette propriété à la valeur false pour désactiver cette demande.

Page 206: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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-dessousvous 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étournerl'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 detravail 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();}

Page 207: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 permanentou 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).

Page 208: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 lesautres sessions n'auront pas la possibilité d'accéder à ces alias. De plus, l'enregistrement des alias n'a dès lors aucunsens : 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 (AdministrateurODBC).Enfin, si elle ne contient que Persistant, on obtiendra les entrées ODBC définies au niveau du BDE (AdministrateurBDE).

La valeur cmAll correspond à la combinaison des 3 listées précédemment et rend donc l'accès à l'ensemble des alias, etmê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;

Page 209: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 avantexé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éesen 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...

Page 210: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 Properties=""DBQ=" + (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înede 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 avecla 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 :

Page 211: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Composants sur la fiche• ADOConnection• ADOTable

// ouverture connexion, bdd et tableForm1->ADOConnection1->Open();Form1->ADOTable1->Open();

Ajouter un enregistrement vide :

// position au début de la tableForm1->ADOTable1->First(); //Ajoute un enregistrement videForm1->ADOTable1->Append();

Mettre la table en mode Édition :

// Positionne la table en mode EditionForm1->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éesForm1->ADOTable1->Post();

Page 212: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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.

Page 213: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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, doncdirectement 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());

Page 214: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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!!");}

Page 215: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office

Page 216: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 parClassName. 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éeest en cours d'exécution ou non.

La méthode OleCheck, appelée par GetActiveOleObject, déclenche une exception EOleSysError si aucun objet de laclasse 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) puisen consultant l'explorateur d'objets. Une petite recherche et vous obtiendrez la valeur d'une constante à partir de sonnom.Vous pouvez également trouver une partie des constantes dans le header Excel_2k.h en ce qui concerne Excel (présentdans Include/VCL/ et vous pouvez même utiliser directement les noms des constantes dans votre programme en incluantce fichier.

Quelle entête faut-il ajouter pour utiliser le pilotage OLE ?

Auteurs : Ricky81 ,

Il faut ajouter utilcls.h.

Page 217: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 variablede n'importe quel autre type est liée statiquement à ce type, une variable de type Variant peut prendre des valeurs deplusieurs types lors de l'exécution. Le type Variant est généralement utilisé quand le véritable type à manipuler varieou 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 sontsubstantiellement 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 delibérer la mémoire occupée.

Exemple :

Variant vMSExcel; // vMSExcel est à UnassignedvMSExcel = Variant::GetActiveObject("Excel.Application");vMSExcel.OleFunction("Quit");

Page 218: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 parexemple 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 ?

Page 219: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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'ongletoffice_2k. Il vous suffit d'appeler la méthode Connect pour lancer Excel, vous pourrez ensuite utiliser les différentesfonctions disponibles.Vous pouvez également recourir au pilotage OLE d'Excel. Cette méthode vous accorde davantage de flexibilité avecl'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'Excellien : Comment créer une nouvelle instance d'Excel ?

Page 220: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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émentspropres à 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émentspropres à 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 ?

Page 221: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 = 1xlR1C1 = -4150

Page 222: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Remarque : attention aux formules par exemple (elles sont modifiées lors de changement, mais il faut respecter le styleen 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 = -4105xlCalculationManual = -4135xlCalculationSemiautomatic = 2

Les 3 possibilités permettent respectivement de définir le recalcul automatique après toute modification, le recalculfait uniquement à la demande de l'utilisateur, et un mode intermédiaire dit semi-automatique où le recalcul se fait parexemple lorsque le classeur est enregistré.

Remarque : il est intéressant, pour des raisons de performances, de désactiver le recalcul automatique le temps destraitements.

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;

Page 223: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 = 4msoLanguageIDHelp = 3msoLanguageIDInstall = 1

Page 224: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

msoLanguageIDUI = 2msoLanguageIDUIPrevious = 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 etUseSystemSeparators.

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 etUseSystemSeparators.

Page 225: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 ?

Page 226: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 unefonction 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 parune 'OleProcedure' qui par définition ne renvoie pas de résultat). Nous sommes obligés de passer par le composantTExcelApplication :

ExcelApplication1->Connect();Variant file;Variant title = StringToOleStr("Titre"); // titre à donner à la boite de dialogueVariant multiselect = true; // selection multiple autoriséefile = 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, dansce 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);}

Page 227: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Attention : Comme le composant TOpenDialog, cette boite de dialogue n'effectue aucune opération d'ouverture. Ellepermet 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 parune 'OleProcedure' qui par définition ne renvoie pas de résultat). Nous sommes obligés de passer par le composantTExcelApplication :

ExcelApplication1->Connect();Variant file;Variant initFile = StringToOleStr("E:\\Ricky\\classeur.xls"); // fichier sélectionné au départVariant title = StringToOleStr("Titre"); // titre de la boite de dialoguefile = 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. Ellepermet 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 parune 'OleProcedure' qui par définition ne renvoie pas de résultat). Nous sommes obligés de passer par le composantTExcelApplication :

ExcelApplication1->Connect();Variant prompt = StringToOleStr("Texte"); // texte de la boite de saisieVariant title = StringToOleStr("Titre"); // titre de la boite de saisieVariant def = StringToOleStr("def"); // valeur par défaut// positionnementVariant 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 ?

Page 228: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 = -4137xlMinimized = -4140

Page 229: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

xlNormal = -4143

Page 230: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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.

Page 231: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

vWorksheet.OlePropertyGet("PageSetup").OlePropertySet("Order", vOrder);

Les valeurs possibles pour vOrder sont définies dans la classe XlOrder :

xlDownThenOver = 1xlOverThenDown = 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érentessections 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);

Page 232: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 vRangecorrespondant à 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 feuillecourante.

vMSExcel.OlePropertyGet("ActiveWindow").OlePropertyGet("SelectedSheets").OleFunction("PrintPreview");

Page 233: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 à ouvrirvXLWorkbook = 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.

Page 234: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Variant vWorkbook, vReadOnly;// vXLWorkbooks représente l'ensemble des classeursvReadOnly = true;// vFileName est un Variant sous la forme chaîne de caractères correspondant au fichier à ouvrirvWorkbook = 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 à ouvrirvWorkbook = 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 classeursvWorkbook = 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 ?

Page 235: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 classeursvXLWorkbook = 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'objetvXLWorkbook.

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 classeurvXLWorkbook.OleProcedure("Saveas", vFileName);

FileFormat peut prendre différentes valeurs suivant le format de sauvegarde désiré, ce quipermet 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ètetous 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é

Page 236: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Mot_passe = Unassigned; //"Mon_Mot_De_Passe" pour la protection du fichierPassword = Mot_passe; // mot de passe pour protéger le fichierWriteResPassword = Mot_passe; // confirmation du mot de passeReadOnlyRecommended = 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 modificationsnon 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 dansle fichier en cours). Le nouveau fichier est créé (ou écrasé) uniquement si le fichier en cours a été modifié depuis laderniè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'ajoutd'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" )

Page 237: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 Variantint 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çongé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 concerneles 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);

Page 238: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 VariantvWorksheets = 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 VariantvWorksheet = 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 VariantvWorksheet = 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");

Page 239: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Excel donnera pour nom FeuilI (cas de la version française) où I est le plus petit nombre tel que FeuilI n'existe pasencore. 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 feuillevWorksheet.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çéevWorksheet.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 êtredécrits ici.

Pour ôter la protection :

Page 240: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 vSheetBeforevWorksheet.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 :

Page 241: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 VariantsupprLignePermis = 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 VariantinsertLignePermis = 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

Page 242: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 courantevMSExcel.OlePropertyGet("ActiveWindow").OlePropertySet("DisplayGridlines",false);// on affiche la grillevMSExcel.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 feuillevWorksheet = 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 lignevLine = vWorksheet.OlePropertyGet("Shapes").OleFunction("AddLine", 1, 1, 200,100);vLine.OlePropertyGet("Line").OlePropertySet("Weight", 8); // epaisseur de la lignevLine.OlePropertyGet("Line").OlePropertyGet("ForeColor").OlePropertySet("SchemeColor", 22); // couleur de la lignevLine.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 ExcelVariant vWorksheet, vRange;// on selectionne la première feuillevWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);// on selectionne la cellule qui sert a positionner les voletsvRange = vWorksheet.OlePropertyGet("Range", "B4");// on selectionne la cellule

Page 243: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

vRange.OleProcedure("Select");// soit on fige soit on libere les voletsvMSExcel.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 classeurVariant 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 etdé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 sonrang 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 classeursvXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");// on selectionne toute la feuille du classeur 1 et on la copievXLWorkbook = 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 classeurvXLWorkbooks.OleProcedure("Add");vWorksheet = vMSExcel.OlePropertyGet("ActiveSheet");

// on renomme la feuille du nouveau classeurvWorksheet.OlePropertySet("Name", "SAUVEGARDE_2");

// on recopie le contenu dans SAUVEGARDE_2vWorksheet.OleProcedure("Select");vWorksheet.OlePropertyGet("Cells").OleProcedure("Select");vMSExcel.OlePropertyGet("ActiveSheet").OleProcedure("Paste");

// on deselectionne la feuille SAUVEGARDE_2 du nouveau classeurvMSExcel.OlePropertySet("CutCopyMode", false);vWorksheet.OlePropertyGet("Range", "A1").OleProcedure("Select");

// on active le classeur 1vXLWorkbook = vMSExcel.OlePropertyGet("Workbooks", 1); // ici on peut remplacer "1" par le nom du classeur "mon_classeur"

Page 244: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

vXLWorkbook.OleProcedure("Activate");

// on active la feuille 1 du classeur 1vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1); // ici on peut remplacer "1" par le nom de la feuille "ma_feuillevWorksheet = vMSExcel.OlePropertyGet("ActiveSheet");

// on deselectionne la feuillevWorksheet.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");

Page 245: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 quisignifie 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 leclasseur 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 laquellela 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.

Page 246: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Attention : lorsque FindNext a fini de parcourir la plage, il reprend au départ. Il est donc nécessaire de mémoriser lacellule 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 = -4121xlShiftToRight = -4161

Pour supprimer :

vCell.OleProcedure("Delete", shift);

Où shift correspond au décalage à effectuer. Il peut prendre les valeurs de la classe XlDeleteShiftDirection :

xlShiftUp = -4162xlShiftToLeft = -4159

Remarque : ces opérations peuvent bien entendu également être réalisées sur un plage de cellules, et plusparticuliè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 ?

Page 247: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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

Page 248: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 êtreappelé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"

Page 249: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Attention, l'écriture de formules peut dépendre de la langue utilisée par Excel.Il existe 2 modes pour les formules : lemode international (Formula) et le mode local (FormulaLocal). Il peut donc être intéressant d'en tenir compte et dechoisir 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)); }}

Page 250: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Dans le cas d'une plage de cellules, le Variant renvoyé est de type tableau. Le tableau est à 2 dimensions et le codepré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 decellules ?

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 decellules ?

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 ?

Page 251: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 suffitd'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 decellules 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.

Page 252: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 ?

Page 253: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office > Excel > Gestion des cellules > Mise en forme des cellules > Contenu descellules

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 groupede 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 ungroupe 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 ungroupe de cellules (voir autres Q/R).

vFont.OlePropertySet("Italic", true);

Page 254: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Bien entendu, pour désactiver la mise en italique, il suffit de passer pour second paramètre le booléen false ou unboolé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 ungroupe 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 ungroupe 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 ?

Page 255: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 ungroupe 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 ungroupe 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);

Page 256: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 = -4108xlJustify = -4130xlLeft = -4131xlRight = -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 codesuivant) :

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.

Page 257: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

vRange.OlePropertyGet("Comment").OleProcedure("Delete");

lien : Comment insérer un nouveau commentaire sur un groupe de cellules ?

Page 258: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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).

Page 259: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office > Excel > Gestion des cellules > Mise en forme des cellules > Manipulation debordures

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 = 5xlDiagonalUp = 6xlEdgeBottom = 9xlEdgeLeft = 7xlEdgeRight = 10xlEdgeTop = 8xlInsideHorizontal = 12xlInsideVertical = 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.

Page 260: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

vBorders.OlePropertySet("LineStyle", vValue);

Les valeurs possibles pour vValue sont définies dans la classe XlLineStyle dont voici les constantes :

xlContinuous = 1xlDash = -4115xlDashDot = 4xlDashDotDot = 5xlDot = -4118xlDouble = -4119xlLineStyleNone = -4142xlSlantDashDot = 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 pourvLineWeight dans la classe XlBorderWeight

Page 261: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 ?

Page 262: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 feuillesur 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 chercherici à 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.

Page 263: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 fonctionsUnion 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 à 30paramè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;

Page 264: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

vSelection = vRange.OlePropertyGet("Address");

Le Variant vSelection contient alors la chaîne de caractères correspondant à la zone en question. Un exemple de retourpourrait 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'ensembledes cellules limitées par une combinaison de lignes et de colonnes vides en partant du coin supérieur gauche défini parla 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 :

Page 265: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 respectivementdes 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 zoneavec 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 feuillevWorksheet.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 lazone 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 plagesmesMultiAires.OleProcedure("Select"); // on récupère le NB de lignes et de colonnesVariant 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");

Page 266: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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").SelectEnd 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èsexecution.

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 ModuleVBComp = vXLWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents");VBComp.OleProcedure("Import", "c:\\testrows.txt");// execution de la macrovMSExcel.OleProcedure("Run", "essai");// destruction de la macroVBComp.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 VBVBComp = vXLWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents").OleFunction("Add", 1);

// on renomme le module sans espaces dans le nomVBComp.OlePropertySet("Name", "MyModule");

// on ecrit la macro dans le module creeVBComp.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'executevMSExcel.OleProcedure("Run", "laMacro");

vXLWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents").OleFunction("Remove", VBComp);

Page 267: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 rendudynamique (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'appelpré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 ?

Page 268: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office > Word

Page 269: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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émentspropres à 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 desvariables.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

Page 270: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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

Page 271: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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.

Page 272: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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érentsmodes 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 certainesfonctions ont été complétées avec les nouvelles versions.

String version_word;// connaître le numéro de version Word que l'on utiliseversion_word = vMSWord.OlePropertyGet("Version");

Page 273: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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.

Page 274: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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);

Page 275: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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").

Page 276: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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");

Page 277: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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

Page 278: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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");

Page 279: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 pagewdOrientLandscape = 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éditionString Name = "C2160"; // type d'étiquetteString addr = "Dave Edson \r\n123 Skye St. \r\nOur Town \r\nWA 98004"; // adresse du destinataireVariant AutoText = ""; // par défautVariant ExtractAddress = false; // par défaut

Page 280: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/bcb/

vMSWord.OlePropertyGet("MailingLabel").OleFunction("CreateNewDocument", Name.c_str(), addr.c_str(), WideString(AutoText), ExtractAddress);

Comment créer ses enveloppes avec le nom et adressede 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 dudestinataire.

// enveloppesString addr = "Don Funk \r\n123 Skye St. \r\nOur Town \r\nWA 98040"; // destinataireString AutoText = "";String retaddr = "Karin Gallagher \r\n123 Main \r\nOther Town \r\nWA 98004"; // expediteurvWDocuments.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);

Page 281: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 ,

Page 282: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 rapidité 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 Wordsélectionné.

// déclaration des Variants Variant vMSword, vTable, vCell, vDocument, vDocuments; // si Word est ouvert on l'active, sinon on l'ouvre try {

Page 283: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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(); }

Page 284: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 :TypeDate1 : 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, autrementle lien ne fonctionnera pas lorsque l'on cliquera dessus.

vMSWord.OlePropertyGet("Selection").OlePropertyGet("Hyperlinks").

Page 285: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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...).

Page 286: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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

Page 287: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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'imagesoit 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;

Page 288: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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("SeekView", "9"); 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("SeekView", "10");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 cettenumé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("SeekView", "10"); // 9 entête, 10 pied de page // ajout de la numérotation de page automatique

Page 289: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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); // centrer 1, droite 2, gauche 0 // on sort de l'entête ou du pied de page vWDocument.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane").OlePropertyGet("View").OlePropertySet("SeekView", 0); // sortir de l'entête

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 = 9999998

Page 290: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 cellulesen 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").OlePropertySet("Alignment", 2);

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.

Page 291: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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 ,

Page 292: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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.

Page 293: bdd

Les réponses à vos questions sur BCB

- 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 sourcesconstitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucunereproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

http://cpp.developpez.com/faq/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,StyleBordure); // 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).

Page 294: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/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 myTable = vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1"); myRange = vWDocument.OleFunction("Range", myTable.OleFunction("Cell", 1, 1) .OlePropertyGet("Range").OlePropertyGet("Start"), myTable.OleFunction("Cell", 1, 3). OlePropertyGet("Range").OlePropertyGet("End")); // puis on applique le format gras myRange.OlePropertyGet("Font").OlePropertySet("Bold",true);

Comment fusionner des cellules d'un tableau 1er version ?

Auteurs : blondelle , pottiez ,

Cette procédure permet de fusionner des cellules d'un tableau (1er version).

Page 295: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

myTable = vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1"); myTable.OleFunction("Cell", 1, 1).OleFunction("Merge", myTable.OleFunction("Cell", 2, 3));

Comment sélectionner des cellules d'un tableau et les fusionner 2ème version ?

Auteurs : blondelle , pottiez ,

Cette procédure permet de selectionner des cellules d'un tableau et de les fusionner (2ème version).

// on sélectionne les cellules ligne 1, colonne 1 jusque ligne 1, colonne3 myTable = vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1"); myRange = vWDocument.OleFunction("Range", myTable.OleFunction("Cell", 1, 1) .OlePropertyGet("Range").OlePropertyGet("Start"), myTable.OleFunction("Cell", 1, 3). OlePropertyGet("Range").OlePropertyGet("End")); // puis on fusionne les cellules myRange.OlePropertyGet("Cells").OleProcedure("Merge");

Comment sélectionner une ou plusieurs cellules pour modifier la couleur du fond ?

Auteurs : blondelle , pottiez ,

les couleurs vont de 0 à 56.

Cette procédure permet d'avoir le numéro et la couleur correspondante.

for (int i=1; i<=57; i++){vCell = vWorksheet.OlePropertyGet("Cells", i, 1);vWorksheet.OlePropertyGet("Cells", i, 1).OleProcedure("Select");vCell.OlePropertySet("Value", i - 1); // i-1 pour avoir la couleur 0vWorksheet.OlePropertyGet("Cells", i, 2).OleProcedure("Select");vMSExcel.OlePropertyGet("Selection").OlePropertyGet("Interior").OlePropertySet("ColorIndex", i - 1); // i-1 pour avoir la couleur 0}

Comment configurer la couleur d'une ligne d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure permet de configurer la couleur 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").OlePropertyGet("Cells").OlePropertyGet("Shading"). OlePropertySet("BackgroundPatternColorIndex", 9);

Comment supprimer une ligne d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Page 296: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Cette procédure permet de supprimer une ligne du tableau.

// N° de ligne 0 = suppression dernière ligne

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows"). OleFunction("Item", "3").OleProcedure("Delete");

Comment configurer la couleur et la texture d'une colonne d'un tableau ?

Auteurs : blondelle , pottiez ,

Cette procédure permet de configurer la couleur et la texture d'une colonne du tableau.

// Il faut passer l'instance du document et non l'instance de Word // color = 9, wdTexture12Pt5Percent = 125 vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Columns"). OleFunction("Item", "3").OlePropertyGet("Cells").OlePropertyGet("Shading"). OlePropertySet("BackgroundPatternColorIndex", "9"); vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Columns"). OleFunction("Item", "3").OlePropertyGet("Shading").OlePropertySet("Texture", 125);

Comment configurer la couleur d'une cellule d'un tableau ?

Auteurs : blondelle , pottiez ,

Cette procédure permet de configurer la couleur d'une cellule du tableau.

// Il faut passer l'instance du document et non l'instance de Word. // color = 9, wdTexture12Pt5Percent = 125 vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2). OlePropertyGet("Shading").OlePropertySet("BackgroundPatternColorIndex", "9"); vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2). OlePropertyGet("Shading").OlePropertySet("Texture", 125);

Comment configurer la couleur de gris d'une ligne d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure permet de configurer la couleur de gris de fond du tableau.

// Il faut passer l'instance du document et non l'instance de Word // color = 9, wdTexture12Pt5Percent = 125 vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows"). OlePropertyGet("Shading").OlePropertySet("BackgroundPatternColorIndex", "9"); vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows").

Page 297: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

OlePropertyGet("Shading").OlePropertySet("Texture", 125);

Comment configurer la couleur de gris de fond d'une ligne d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure permet de configurer la couleur de gris de fond d'une ligne du tableau.

// Il faut passer l'instance du document et non l'instance de Word // color = 9, wdTexture12Pt5Percent = 125 vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows"). OleFunction("Item", "3").OlePropertyGet("Cells").OlePropertyGet("Shading"). OlePropertySet("BackgroundPatternColorIndex", "9"); vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows"). OleFunction("Item", "3").OlePropertyGet("Shading").OlePropertySet("Texture", 125);

Comment mettre en gras la police d'une colonne d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure permet de rendre gras la police de toute une colonne.

// 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("Select"); vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", 9999998);

Comment mettre en gras la police d'une ligne d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure permet de rendre gras la police de toute une ligne.

// Il faut passer l'instance du document et non l'instance de Word vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows"). OleFunction("Item", "3").OlePropertyGet("Range").OlePropertyGet("Font").OlePropertySet("Bold", 9999998);

Comment mettre en gras la police d'une cellule ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure permet de rendre gras la police d'une cellule.

// Il faut passer l'instance du document et non l'instance de Word vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 2).

Page 298: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

OlePropertyGet("Range").OlePropertySet("Bold", 9999998);

Comment coller le presse-papier dans une cellule d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure permet de coller le presse-papier dans une cellule du tableau.

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 3). OlePropertyGet("Range").OleFunction("Paste");

Comment coller une image du presse-papier dans une cellule d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure permet de coller une image du presse-papier dans une cellule du tableau.

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 3). OlePropertyGet("Range").OleFunction("Paste", false, 5, 0, false);

Comment placer le curseur dans la cellule souhaitée d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Trois procédures pour déplacer le curseur dans la cellule souhaitée d'un tableau.

// cette procédure permet de placer le curseur dans la case souhaitée d'un tableau vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 3). OlePropertyGet("Range").OleFunction("select"); // déplacer le curseur en début de ligne vMSWord.OlePropertyGet("Selection").OleProcedure("HomeKey", "5"); // wdLine = 5 // déplacer le curseur en fin de ligne vMSWord.OlePropertyGet("Selection").OleProcedure("EndKey", "5"); // wdLine = 5

Comment définir la police et sa taille dans une cellule d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Ces procédures permettent de définir la police et la taille dans une cellule du tableau.

// changer la taille des caractères d'une case d'un tableau vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 3). OlePropertyGet("Range").OlePropertyGet("Font").OlePropertySet("Size", 18); // changer la fonte des caractères d'une case d'un tableau vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 3). OlePropertyGet("Range").OlePropertyGet("Font").OlePropertySet("Name", "wingdings 3");

Page 299: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Comment definir la police d'une ligne d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Ces procédures permettent de définir la police et la taille d'une ligne du tableau.

// changer la taille des caractères d'une ligne d'un tableau vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows") .OleFunction("Item", "1").OlePropertyGet("Range").OlePropertyGet("Font"). OlePropertySet("Size", "18"); // changer la fonte des caractères d'une ligne d'un tableau vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows"). OleFunction("Item", "1").OlePropertyGet("Range").OlePropertyGet("Font"). OlePropertySet("Name", "wingdings 3");

Comment permettre d'écrire dans une case d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure permet d'écrire dans une case du tableau.Il faut passer l'instance du document et non l'instance de Word.

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 3). OlePropertyGet("Range").OleFunction("InsertAfter", "essai d'insertion");

Comment insérer un lien hypertexte dans une case d'un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure insère un lien hypertexte dans une case du tableau.

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 3). OlePropertyGet("Range").OlePropertyGet("Hyperlinks").OleProcedure("Add", vWDocument. OlePropertyGet("Tables").OleFunction("Item", "1").OleFunction("Cell", 2, 3). OlePropertyGet("Range"), "c:\\date.doc");

Comment insérer une nouvelle ligne au tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure insère une nouvelle ligne au tableau.

// Voici comment proceder vWDocument.OlePropertyGet("Tables").OleFunction("Item", "N°tableau").OlePropertyGet("Rows"). OleProcedure("Add", vWDocument.OlePropertyGet("Tables").OleFunction("Item", "N°tableau"). OlePropertyGet("Rows").OleFunction("Item", "N° de ligne")); // le code correspondant vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows").

Page 300: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

OleProcedure("Add", vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1"). OlePropertyGet("Rows").OleFunction("Item", "2"));

Comment insérer une nouvelle colonne au tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure insère une nouvelle colonne au tableau.

// Voici comment proceder vWDocument.OlePropertyGet("Tables").OleFunction("Item", "N°tableau").OlePropertyGet("Columns"). OleProcedure("Add", vWDocument.OlePropertyGet("Tables").OleFunction("Item", "N°tableau"). OlePropertyGet("Columns").OleFunction("Item", "N° de colonne")); // le code correspondant vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Columns"). OleProcedure("Add", vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1"). OlePropertyGet("Columns").OleFunction("Item", "2"));

Comment centrer un tableau ?

Auteurs : blondelle , pottiez , firejocker ,

Cette procédure permet de centrer un tableau.wdAlignRowCenter = 1

vWDocument.OlePropertyGet("Tables").OleFunction("Item", "1").OlePropertyGet("Rows"). OlePropertySet("Alignment", 1);

Comment insérer une formule "somme" dans la cellule de gauche d'une ligne d'un tableau ?

Auteurs : blondelle , pottiez ,

Cette procédure insèrt la formule somme, sur les nombres contenus dans une ligne, dans la cellule de gauche d'untableau du document Word sélectionné.

vMSWord.OlePropertyGet("Selection").OleFunction("InsertFormula", "=SUM(RIGHT)", "");

Comment insérer une formule "somme" dans la cellule du bas d'une colonne d'un tableau ?

Auteurs : blondelle ,

Cette procédure insère la formule somme, sur les nombres contenus dans une colonne, dans la cellule du bas d'untableau du document Word sélectionné.

Page 301: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vMSWord.OlePropertyGet("Selection").OleFunction("InsertFormula", "=SUM(ABOVE)", "");

Comment insérer une formule "somme" dans la cellule du haut d'une colonne d'un tableau ?

Auteurs : blondelle , pottiez ,

Cette procédure insère la formule somme, sur les nombres contenus dans une colonne, dans la cellule du haut d'untableau du document Word sélectionné.

vMSWord.OlePropertyGet("Selection").OleFunction("InsertFormula", "=SUM(BELOW)", "");

Comment insérer une formule "somme" dans la cellule de droite d'une ligne d'un tableau ?

Auteurs : blondelle , pottiez ,

Cette procédure insère la formule somme, sur les nombres contenus dans une ligne, dans la cellule de droite d'un tableaudu document Word sélectionné.

vMSWord.OlePropertyGet("Selection").OleFunction("InsertFormula", "=SUM(LEFT)", "");

Page 302: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office > Word > Gestion des macros

Comment désactiver une macro à l'ouverture Word ?

Auteurs : blondelle , pottiez ,

Cette procédure permet de désactiver une Macro VB qui s'exécute automatiquement à l'ouverture de Word.Elle équivaut au maintien de la touche MAJ enfoncée à l'ouverture de Word.

Variant vFileName, vLink, vReadOnly, vFormat, vReadPass, vWDocuments, vWDocument; Variant vMSWord; vMSWord = Variant::CreateObject("Word.Application");

// ce code doit impérativement se trouver ici vMSWord.OlePropertyGet("WordBasic").OleProcedure("DisableAutoMacros");// ici on a désactive la macro qui s'exécute à l'ouverture

vMSWord.OlePropertySet("Visible", true); // ("Visible", false) 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 vWDocument = vWDocuments.OleFunction("Open", vFileName, vLink, vReadOnly, vFormat, vReadPass);

Comment créer temporairement une macro et l'exécuter ?

Auteurs : blondelle , pottiez ,

Le Variant vMSWord représente une instance de Word, vWordDoc un document Word.Il s'agit de manipuler un module VBE et de créer à la volée une macro, puis de la supprimer après exécution.

Attention, le code suivant peut ne pas fonctionner selon votre configuration sécurité de Word (cf. Options de sécurité,sécurité des macros).

Variant VBComp;// on crée un module pour du code VBVBComp = vWordDoc.OlePropertyGet("VBProject").OlePropertyGet("VBComponents").OleFunction("Add", 1); // on renomme le module sans espace dans le nomVBComp.OlePropertySet("Name", "MyModule"); // on écrit la macro dans le module crééVBComp.OlePropertyGet("CodeModule").OleProcedure("InsertLines", 1, "Sub laMacro()");VBComp.OlePropertyGet("CodeModule").OleProcedure("InsertLines", 2, "ActiveDocument.Content.Text = \"Coucou\" ");VBComp.OlePropertyGet("CodeModule").OleProcedure("InsertLines", 3, "End Sub");// on l'exécutevMSWord.OleProcedure("Run", "laMacro"); // on efface le modulevWordDoc.OlePropertyGet("VBProject").OlePropertyGet("VBComponents").OleFunction("Remove", VBComp);// ici il n'y a plus aucune trace de notre macro

Page 303: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Cette façon de faire est plutôt adaptée à l'exécution de petites macros, voire de macros dont le code doit être rendudynamique (c'est à dire changeant selon certains paramètres saisis dans votre application C++).

Comment lancer une macro dans Word ?

Auteurs : blondelle , pottiez , firejocker ,

Le Variant vMSWord représente une instance de l'application Word, et on suppose qu'un document est ouvert.

Cette procédure permet de lancer une macro connaissant son nom ici "laMacro".

vMSWord.OleProcedure("Run", "laMacro");

Ici on suppose qu'une macro nommée "laMacro" existe.

Comment importer une macro dans un document Word ?

Auteurs : blondelle , pottiez ,

Le code VB est créé par exemple sous Word et est recopié dans un fichier texte que l'on va utiliser pour importer lamacro.

macro_essai.txt

Sub laMacro()ActiveDocument.Content.Text = "Coucou"End Sub

On lance Word, puis on ouvre le document, et on exécute sur le Variant VBComp la procédure d'importation commesuit :

Variant Appli, WordDoc, WordDocs, VBComp, vFileName; Appli = Variant::GetActiveObject("Word.Application");vFileName = "C:\\book1.doc";WordDocs = Appli.OlePropertyGet("Documents");WordDoc = WordDocs.OleFunction("Open", vFileName); VBComp = WordDoc.OlePropertyGet("VBProject").OlePropertyGet("VBComponents");// on insère un code VB à partir d'un fichierVBComp.OleProcedure("Import", "C:\\macro_essai.txt");

Attention, le code suivant peut ne pas fonctionner selon votre configuration sécurité de Word (cf. Options de sécurité,sécurité des macros).

Comment détruire un module contenant une macro VB ?

Auteurs : blondelle , pottiez ,

Cette procédure permet de détruire une ou plusieurs macros VB contenues dans un module.

Page 304: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

// on supprime la macro VBComp.OleFunction("Remove", VBComp.OleFunction("Item", "Module1"));

Page 305: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office > Outlook

Page 306: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office > Outlook

Comment ouvrir Outlook ?

Auteurs : blondelle , Laurent Dardenne ,

Cette procédure permet d'ouvrir Outlook

Variant vMSOutlook, vEspaceDeNom, vDossierReception, olFolderInbox; try { vMSOutlook = Variant::GetActiveObject("Outlook.Application"); } catch(...) { vMSOutlook = Variant::CreateObject("Outlook.Application"); } vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", "MAPI");

Logon "myProfile", "myPassword", True, TrueProfile Argument de type Variant facultatif. Nom du profil, en tant que valeur String, à utiliser pour la session.Password Argument de type Variant facultatif. Mot de passe (le cas échéant), en tant que valeur String, associé au profil.ShowDialog Argument de type Variant facultatif. Affectez-lui la valeur True pour afficher la boîte de dialogued'ouverture de session MAPI.NewSession Argument de type Variant facultatif. Affectez-lui la valeur True pour créer une session (n'utilise pas unesession existante). Vous ne pouvez pas créer plusieurs sessions dans Outlook.La méthode Logon connecte l'utilisateur à MAPI, et ouvre une session MAPI.

// Ici on utilise le profil par défaut vEspaceDeNom.OleFunction("Logon", "", "", true, true);

Arguments qu'il est possible de passer a la fonction suivante en fonction des dossiers que l'on ouvrir3 = éléments supprimés4 = boite d'envoi5 = éléments envoyés6 = boite de réception9 = calendrier10 = contacts11 = boite de dialogue activer journal suivi messages12 = notes13 = taches14 = rappels15 = rappels16 = brouillons

vDossierReception = vEspaceDeNom.OlePropertyGet("GetDefaultFolder", 6); vDossierReception.OleFunction("Display");

Comment fermer Outlook ?

Auteurs : blondelle , Laurent Dardenne ,

Cette procédure permet de fermer outlook

Page 307: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vEspaceDeNom.OleFunction("Logoff"); vMSOutlook.OleFunction("Quit");

Comment ouvrir la page envoyer un mail OleOutlook ?

Auteurs : blondelle ,

Cette procédure permet d'ouvrir la page d'envoi de nouveau message

Variant vmyItem; vmyItem = vMSOutlook.OleFunction("CreateItem", 0); vmyItem.OleFunction("Display");

Comment afficher un message que l'on a recu ?

Auteurs : blondelle ,

Cette procédure permet d'afficher un des messages que l'on a reçu

Variant vEspaceDeNom, vDossierReception, vmyItem; vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", "MAPI"); vDossierReception = vEspaceDeNom.OlePropertyGet("GetDefaultFolder", 6); vDossierReception.OleFunction("Display"); vmyItem = vDossierReception.OlePropertyGet("Items", 2);// ici on affiche le deuxieme message recu // sortie ecran vmyItem.OleFunction("Display");

Cette procédure permet l'impression dans la foulée du message reçu

// tempo de stabilisation affichage Sleep(1000); // impression vmyItem.OleFunction("PrintOut");

Comment envoyer un message OleOutlook ?

Auteurs : blondelle ,

Cette procédure permet d'envoyer un message

Variant vEspaceDeNom, vobjNewMail, chemin; vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", "MAPI"); vobjNewMail = vMSOutlook.OleFunction("CreateItem", 0); vobjNewMail.OleFunction("Display"); vobjNewMail.OlePropertySet("Body", "This e-mail message was created automatically on "); vobjNewMail.OlePropertySet("Subject", "essai"); vobjNewMail.OlePropertySet("To", [email protected].);

Page 308: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Cette procédure permet d'attacher une pièce jointe au message

// piece jointe chemin = "C:\\Classeur1.xls"; vobjNewMail.OlePropertyGet("Attachments").OleFunction("Add", chemin); vobjNewMail.OleFunction("Send");

Page 309: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office > PowerPoint

Page 310: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office > PowerPoint

Comment ouvrir PowerPoint avec Ole ?

Auteurs : blondelle ,

Cette procédure permet d'ouvrir PowerPoint

// ne pas oublier d'inclure " #include <utilcls.h> "

Variant vMSPowerPoint,NameSpace; try { // on récupére l'instance active. vMSPowerPoint = Variant::GetActiveObject("PowerPoint.Application"); } catch(...) { // sinon on crée une nouvelle instance vMSPowerPoint = Variant::CreateObject("PowerPoint.Application"); } // on rend Visible l'instance d'Excel que nous avons défini vMSPowerPoint.OlePropertySet("Visible", true);

Comment fermer PowerPoint avec Ole ?

Auteurs : blondelle ,

Cette procédure permet de fermer PowerPoint

vMSPowerPoint.OleFunction("Quit");vMSPowerPoint = Unassigned;

Comment ouvrir un fichier OlePowerPoint ?

Auteurs : blondelle ,

Cette procédure permet d'ouvrir le fichier d'une présentation PowerPoint.

Variant vMSPowerPoint; vMSPowerPoint.OlePropertyGet("Presentations").OleFunction("Open", "C:\\Documents and Settings\\blondelle\\Mes documents\\astro\\Presentation_master05.ppt", false);

Comment sauver un document OlePowerPoint ?

Auteurs : blondelle ,

Cette procédure permet de sauvegarder la présentation

Page 311: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vMSPowerPoint.OlePropertyGet("ActivePresentation").OleFunction("Save");

Comment ajouter une nouvelle diapositive vierge ?

Auteurs : blondelle ,

Cette procédure permet d'ajouter une nouvelle diapositive vierge

vMSPowerPoint.OlePropertyGet("Presentations").OleFunction("Add", true);

Comment récupérer le nom du diaporama en cours OlePowerPoint ?

Auteurs : blondelle ,

Cette procédure permet de récupérer le nom de la diapositive en cours

String vNom_du_Diaporama = vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("Name");

Comment sélectionner une diapositive OlePowerPoint ?

Auteurs : blondelle ,

Cette procédure permet de sélectionner une diapositive à partir de son numéro

// ("Range", 3) la valeur 3, represente le numero de la diapositive que l'on va selectionner vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("Slides").OleFunction("Range", 3).OleFunction("Select");

Comment compter le nombre de pages d'une présentation OlePowerPoint ?

Auteurs : blondelle ,

Cette procédure permet de compter le nombre de pages de la présentation

int nb_pages = vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("Slides").OlePropertyGet("Count");

Comment exécuter une présentation OlePowerPoint ?

Auteurs : blondelle ,

Cette procédure permet de réaliser la visualisation du diaporama

// parametrage de la visualisation

Page 312: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("SlideShowSettings").OlePropertySet("ShowType", 1); vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("SlideShowSettings").OlePropertySet("LoopUntilStopped", 0); vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("SlideShowSettings").OlePropertySet("ShowWithNarration", -1); vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("SlideShowSettings").OlePropertySet("ShowWithAnimation", -1); vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("SlideShowSettings").OlePropertySet("RangeType", 1); vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("SlideShowSettings").OlePropertySet("AdvanceMode", 2); vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("SlideShowSettings").OlePropertyGet("PointerColor").OlePropertySet("RGB", (255, 0, 0));

// lancement de la visualisation du diaporama vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("SlideShowSettings").OleFunction("Run"); // boucle pour changer de page si la presentation n'est pas programmee en automatique for (int i = 0; i <= NB_de pages; i++) { vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("SlideShowWindow").OlePropertyGet("View").OleFunction("Next"); // ici inserer une temporisation suffisante pour avoir le temps de visualiser les pages }

Comment revenir è la page précédente OlePowerPoint ?

Auteurs : blondelle ,

Cette procédure permet de revenir sur la page précédente

// fonction pour revenir a la page precedente vMSPowerPoint.OlePropertyGet("ActivePresentation").OlePropertyGet("SlideShowWindow").OlePropertyGet("View").OleFunction("Previous");

Comment fermer une fenêtre de visualisation sans quitter OlePowerPoint ?

Auteurs : blondelle ,

Cette procédure permet de fermer la fenêtre de visualisation sans fermer PowerPoint

vMSPowerPoint.OlePropertyGet("ActiveWindow").OleFunction("Close");

Page 313: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office > Access

Page 314: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > MS Office > Access

Comment exécuter une procédure VBAccess contenue dans une base Access ?

Auteurs : blondelle , pottiez ,

Cette procédure permet d'exécuter une macro contenue dans une base Access

// ne pas oublier #include <utilcls.h> Variant vMSAccess, vFileName;// on ouvre AccessvMSAccess = Variant::CreateObject("Access.Application");// on rend visible AccessvMSAccess.OlePropertySet("Visible", true); // on defini le chemin de la base a chargervFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\MySQL\\UtilisationBDE\\fichiers\\maBdd\\maBdd1.mdb";// ouverture de la table AccessvMSAccess.OleFunction("OpenCurrentDatabase", vFileName, false); // on execute la macro "essai" contenue dans la basevMSAccess.OleProcedure("Run", "essai"); // fermeture d'Access// on ferme la basevMSAccess.OleProcedure("CloseCurrentDatabase");// on quitte AccessvMSAccess.OleFunction("Quit");// liberation memoirevMSAccess = Unassigned;

Page 315: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > OpenOffice

Qu'est ce qu'OpenOffice.org ?

Auteurs : blondelle , pottiez , Atlantis ,

1/ Qu'est ce qu'OpenOffice.org ?OpenOffice.org est une suite bureautique open source entièrement francisée et multi plateforme, qui contient :- un traitement de textes, avec un éditeur d'équations (Writer)- un tableur (Calc)- un logiciel de présentation (Impress)- un éditeur de dessin vectoriel (Draw)Pour plus d'information : http://wiki.services.openoffice.org/...office.org/FAQ2/ Quel avenir pour OpenOffice.org ?OpenOffice.org suit un cycle de développement de 18 mois pour chaque nouvelle version. Actuellement la version 2.2est disponible.3/ Où télécharger OpenOffice.org ?http://fr.openoffice.org/about-downloads.html4/ Format des fichiers OpenOffice.orgUn des atouts de cette suite bureautique est son format de fichier qui repose sur XML. Un fichier OpenOffice.org ale même modèle pour toutes les applications bureautiques, seule l'extension change. C'est un fichier au format zip quicontient les fichiers XML suivant :- le fichier XML content.xml pour le contenu du document- le fichier XML styles.xml pour le style (style et contenu sont présentés de façon séparée)- le fichier XML meta.xml qui regroupe des informations sur le document, que vous pouvez saisir sous Fichier |Propriétés. A noter que lorsque vous enregistrez un document avec chiffrement, seul meta.xml n'est pas chiffré.- le fichier XML settings.xml contient les choix applicatifs sur les paramètres du document, par exemple surl'imprimante, l'historique des modifications, la source de données connectée, etc. Le fichier meta-inf/manifest.xml décritla structure du fichier XML- le répertoire Pictures conservant les fichiers binaires (images...)- le répertoire Basic contient les macros écrites en Basic-code. Les - bibliothèques Basic liées se trouvent dans d'autressous-répertoires de Basic.Tout ceci est, conservé dans un seul fichier zip, dont l'extension est propre à la nature du document (.sxw pour les textes,ou .sxc pour les classeurs). Le résultat est un format complexe comportant plus de 450 éléments et plus de 1600 attributsfacile à lire et surtout facile à transformerExtensions des fichiers OpenOffice utilisésTexte (formaté) odt créé par WriterClasseur ods créé par CalcPrésentation odp créée par ImpressDessin créé par DrawBase de données odb créée par BaseFormule odf créée par MathDocument maitre odm créé par WriterModèle de document txt ott créé par WriterModèle de classeur ots créé par CalcModèle de présentation otp créé par ImpressModèle de dessin otg créé par DrawModèle de document HTML oth créé par Writer/Web5/ Je remercie TABZ qui m'a aidé pour des problèmes avec "CoreReflection"Je cite:(La fonction "Bridge_GetStruct" permet de créer facilement des propriétés, alors que le passage par CoreReflectionest souvent problématique avec BCB.)Les fonctions avec "CoreReflection" peuvent être remplacées par "Bridge_GetStruct"En principe c'est sans problème, mais cela n'est valable que pour les versions d'Open Office supérieures à la 1.1.0(J'ajouterai que rien de tout cela ne fonctionne avec BCB3 pro, sans que je ne sache pourquoi.)

Page 316: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

6/ Les tests ont été faits avec Windows XP PRO Pack2 et OpenOffice 2.2 (dernière version à ce jour)7/ un lien sur le site vers des exemples et explications en OOobasichttp://silkyroad.developpez.com/8/ un lien vers la FAQ Delphi qui a servie de supporthttp://delphi.developpez.com/faq/?page=openoffice

Comment se connecter/déconnecter à OpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Pour utiliser OpenOffice avec BCB vous devez utiliser OLE.1/ Se connecter à OpenOfficeDéclarer les variables globales openOffice et Document et ajouter #include <ComObj.hpp>

Variant vOOoOpenOffice;Variant vOOoDocument;if (VarIsEmpty(vOOoOpenOffice)){vOOoOpenOffice = CreateOleObject("com.sun.star.ServiceManager");}

2/ Se déconnecter d'OpenOffice.orgPositionner OpenOffice à Unassigned permet de libérer le Variant.

OpenOffice = Unassigned;

3/ Savoir si on est connecté à OpenOffice

boolean vOOoConnect;vOOoConnect = ! (VarIsEmpty(vOOoOpenOffice) || VarIsNull(vOOoOpenOffice));

Qu'est ce que l'API de reflection (Core Reflection ) ?

Auteurs : blondelle , pottiez , TABZ , Atlantis ,

Ou comment créer une instance d'une classe dont on connaît le nom.C'est un objet qui permet de travailler sur les attributs, méthodes et constructeurs de classes "chargées". Elle permetpar exemple de construire "dynamiquement" un nouvel objet (ou même tableau) ou encore d'accéder à ses attributset méthodes.Par exemple pour créer un objet à partir du nom d'une classe et transmettre des arguments à son constructeur :Je remercie TABZ qui m'a aidé pour des problèmes avec "CoreReflection"Je cite:(La fonction "Bridge_GetStruct" permet de créer facilement des propriétés, alors que le passage par CoreReflectionest souvent problématique avec BCB.)Les fonctions avec "CoreReflection" peuvent être remplacées par "Bridge_GetStruct"

Cette fonction ouvre un document en lecture seule

Variant vOOoOpenOffice, vOOoDesktop, vOOoLoadParams, vOOoDocument, vOOoPropertyValue;try

Page 317: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

{vOOoOpenOffice = CreateOleObject("com.sun.star.ServiceManager");}catch (...){// si on passe ici c'est qu'il y a une erreur}if (VarType(vOOoOpenOffice) == varDispatch)vOOoDesktop = vOOoOpenOffice.OleFunction("createInstance", "com.sun.star.frame.Desktop");int Bounds[2] = {0,0};vOOoLoadParams = VarArrayCreate(Bounds, 1, varVariant);vOOoPropertyValue = vOOoOpenOffice.OleFunction("Bridge_GetStruct", "com.sun.star.beans.PropertyValue");vOOoPropertyValue.OlePropertySet("Name", "ReadOnly"); // pour ReadOnly ou pour HiddenvOOoPropertyValue.OlePropertySet("Value", true);vOOoLoadParams.PutElement(vOOoPropertyValue, 0);//ouverture fichier existant// FilePath = "file://localhost/C:/essai.sxc" -- pour un fichier Calc//ou// FilePath = "file:///C:/essai.sxc" -- pour un fichier CalcAnsiString FileName = "file:///C:/";// FileName += ExtractFilePath(Application->ExeName);FileName += "essai.sxc";FileName = StringReplace(FileName,"<A href="file://\\","/",TReplaceFlags">\\","/",TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);Variant vFileName = StringToOleStr(FileName);vOOoDocument = vOOoDesktop.OleFunction("LoadComponentFromURL",vFileName,"_blank",0,vOOoLoadParams);

Page 318: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > OpenOffice > Gestion des documents

Comment ouvrir Calc OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici comment ouvrir Calc OpenOffice sous Ole

Variant vOOoOpenOffice, vOOoDocument, vOOoDesktop, vOOoLoadParams;Boolean vOOoDocumentExist; try{ vOOoOpenOffice = CreateOleObject("com.sun.star.ServiceManager");}catch (...){ // si on passe ici c'est qu'il y a une erreur qu'il faudra traiter}if (VarType(vOOoOpenOffice) == varDispatch)vOOoDesktop = vOOoOpenOffice.OleFunction("createInstance", "com.sun.star.frame.Desktop");int Bounds[2] = {0,-1};vOOoLoadParams = VarArrayCreate(Bounds, 1, varVariant);// ici on ouvre un nouveau document vierge calcvOOoDocument = vOOoDesktop.OleFunction("LoadComponentFromURL", "private:factory/scalc", "_blank", 0, vOOoLoadParams);vOOoDocumentExist = !(VarIsEmpty(vOOoOpenOffice) || VarIsNull(vOOoOpenOffice)); // false

Comment fermer Calc OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici les différentes façons de fermer Calc

// trois façons de fermer le document // ici on ferme le document ouvert sans sauvegarde comme décrit dans la FAQ delphi vOOoDocument.OleFunction("dispose"); vOOoOpenOffice = Unassigned; // ici on ferme le document avec ou sans sauvegarde vOOoDocument.OleFunction("close", false); // true vOOoDocument = Unassigned(); // la fermeture brutale vOOoDesktop.OleFunction("terminate"); // vOOoDesktop = Unassigned();

Comment imprimer un document ?

Auteurs : blondelle , pottiez , Atlantis ,

Pour imprimer le document avec l'imprimante par défaut

int Bounds[2] = {0,-1};

Page 319: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vOOoDocument.OleFunction("print", VarArrayCreate(Bounds, 1, varVariant));

Page 320: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > OpenOffice > Gestion des feuilles

Comment obtenir le nombre de feuilles du classeur OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici comment obtenir le nombre de feuilles du classeur Calc:

La fonction GetCount permet d'obtenir le nombre de feuilles contenues dans le classeur.

Variant vOOoMonClasseur;int vOOoNombreDeFeuilles; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoNombreDeFeuilles = vOOoMonClasseur.OleFunction("GetCount");

Comment protéger une feuille OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Pour protéger la feuille calc

Variant vOOoMonClasseur;Variant vOOoMaFeuille; // on protège la feuillevOOoMonClasseur = vOOoDocument.OleFunction("getSheets");// ("GetByIndex", 0) donne la feuille ici la 1er feuillevOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByIndex", 0);vOOoMaFeuille.OleFunction("protect", "password");

Comment déprotéger une feuille OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici comment déprotéger une feuille calc

Variant vOOoMonClasseur;Variant vOOoMaFeuille; // on déprotège la feuillevOOoMonClasseur = vOOoDocument.OleFunction("getSheets");// ("GetByIndex", 0) donne la feuille ici la 1er feuillevOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByIndex", 0);vOOoMaFeuille.OleFunction("Unprotect", "password");

Comment tester si une feuille est protegée OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici comment tester si une feuille est protegée calc

Boolean vOOoprotect;

Page 321: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

// on teste si la feuille est protegéevOOoprotect = vOOoMaFeuille.OleFunction("Isprotected");

Comment modifier la visibilité d'une feuille OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici comment rendre invisible ou visible une feuille calcLes feuilles de calcul contiennent la propriété IsVisible qui permet d'afficher ou masquer la feuille dans le classeur.

Variant vOOoMonClasseur;Variant vOOoMaFeuille; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");// ("GetByIndex", 0) représente la 1er feuillevOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByIndex", 0);// on rend la feuille invisiblevOOoMaFeuille.OlePropertySet("IsVisible", false); // on rend la feuille visiblevOOoMaFeuille.OlePropertySet("IsVisible", true);

Comment accéder à une feuille par son index OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici comment accéder à une feuille Calc par son index dans ce cas on sélectionne la première feuille.

Variant vOOoMonClasseur;Variant vOOoMaFeuille; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");// ("GetByIndex", 0) représente la 1er feuillevOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByIndex", 0);

Comment accéder à une feuille par son nom OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Toutes les QR suivantes sont basées sur une variable "MaFeuille" représentant une feuille du classeur ouvert.On peut utiliser le nom de la feuille pour accéder à cette variable. Ce nom est celui qui apparaît dans l'onglet de lafeuille (fonction GetByName) :

Variant vOOoMonClasseur;Variant vOOoMaFeuille; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");

Page 322: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");

Comment supprimer une feuille OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

On doit utiliser le nom de la feuille pour pouvoir la supprimer. Ce nom est celui qui apparaît dans l'onglet de la feuille.

Variant vOOoMonClasseur; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMonClasseur.OleFunction("RemoveByName", "Feuille1");

Comment dupliquer une feuille OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici comment dupliquer une feuille Calc:

En utilisant la fonction CopyByName(Source, Copie, IndexCopie);Source correspond au nom situé dans l'onglet de la feuille à copierCopie correspond au nom de la nouvelle feuille qui va figurer dans l'onglet de cette feuilleIndexCopie correspond à la position de la nouvelle feuille créée

Variant vOOoMonClasseur; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");// "Feuille1" la feuille que l'on va déplacer// 3 va placer la feuille trois emplacements plus loinvOOoMonClasseur.OleFunction("copyByName", "Feuille1", 2);

Comment déplacer une feuille OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici comment déplacer une feuille Calc:

En utilisant la fonction MoveByName(Feuille : string, NouvelIndex: integer);

Variant vOOoMonClasseur;vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");// "Feuille1" la feuille que l'on va déplacer// 3 va positionner la feuille à l'emplacement 3vOOoMonClasseur.OleFunction("moveByName", "Feuille1", 3);

Comment ajouter une nouvelle feuille OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Comment ajouter une feuille dans mon classeur ?

Page 323: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

La fonction InsertNewByName permet d'ajouter une feuille dans le classeur.Function insertNewByName(Nom : string, index : integer);La valeur de Index correspond à la position de la feuille dans le classeur

Variant vOOoMonClasseur; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");// "Nom_de_la_Nouvelle_Feuille", nom de la feuille que l'on va créer// 0 emplacement de la feuille crééevOOoMonClasseur.OleFunction("InsertNewByName", "Nom_de_la_Nouvelle_Feuille", 0);

Comment obtenir le nom d'une feuille du classeur OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici comment obtenir le nom d'une feuille Calc.

La méthode GetName permet d'obtenir le nom de chaque feuille :

Variant vOOoMonClasseur;String vOOoNomDeLaFeuille; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");// 0 emplacement de la feuille dont on cherche le nomvOOoNomDeLaFeuille = vOOoMonClasseur.OleFunction("getByIndex", 0).OleFunction("GetName");

Comment renommer une feuille Ole OpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici comment renommer une feuille Calc

Pour modifier le nom qui apparaît dans l'onglet de la feuille il suffit de modifier la propriété Name de la feuille :

Variant vOOoMonClasseur;Variant vOOoMaFeuille; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");// ("GetByIndex", 0) 0 represente la 1er feuillevOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByIndex", 0);vOOoMaFeuille.OlePropertySet("Name", "Nouveau_Nom_de_la_Feuille");

Comment connaître le type de la Cellule OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Pour récupérer le type de donnée stockée dans une cellule, il suffit d'appeler la méthode GetType par l'intermédiaired'une variable CelluleCette méthode retourne :0 pour une Cellule Vide1 pour une Cellule contenant une valeur de type Nombre2 pour une Cellule contenant une valeur de type Chaine de caractère

Page 324: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

3 pour une Cellule contenant une valeur de type Formule

Variant vOOoMonClasseur;Variant vOOoMaFeuille;int vOOoresult; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoresult = vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0).OleFunction("GetType"); switch (vOOoresult) {case 0 :ShowMessage("Cellule Vide");return;case 1 :ShowMessage("Cellule contenant un Nombre");return;case 2 :ShowMessage("Cellule contenant une chaine de caractère");return;case 3 :ShowMessage("Cellule contenant une formule");return; }

Comment copier une plage de cellules OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Pour effectuer une copie d'une plage de cellules, nous devons définir la plage de cellule source (objetde classe com.sun.star.table.CellRangeAddress) et l'adresse de la cellule de destination (objet de classecom.sun.star.table.CellAddress).Ensuite nous allons utiliser la fonction CopyRange(madestination, maselection)madestination correspond à l'objet dans lequel nous avons défini la cellule de destinationMaselection correspond à l'objet dans lequel nous avons défini la plage de cellules

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoMaDestination;Variant vOOoMaPlage; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1"); vOOoMaDestination = vOOoOpenOffice.OleFunction("Bridge_GetStruct", "com.sun.star.table.CellAddress");vOOoMaPlage = vOOoOpenOffice.OleFunction("Bridge_GetStruct", "com.sun.star.table.CellRangeAddress"); vOOoMaDestination.OlePropertySet("Sheet", 0);vOOoMaDestination.OlePropertySet("Column", 5);vOOoMaDestination.OlePropertySet("Row", 5);vOOoMaPlage.OlePropertySet("Sheet", 0);vOOoMaPlage.OlePropertySet("StartColumn", 0);vOOoMaPlage.OlePropertySet("StartRow", 0);vOOoMaPlage.OlePropertySet("EndColumn", 1);vOOoMaPlage.OlePropertySet("EndRow", 1);

Page 325: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vOOoMaFeuille.OleFunction("CopyRange", vOOoMaDestination, vOOoMaPlage);

Comment déplacer une plage de cellules OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Pour effectuer un déplacement d'une plage de cellules, nous devons définir la plage de cellule source(objet de classe com.sun.star.table.CellRangeAddress) et l'adresse de la cellule de destination (objet de classecom.sun.star.table.CellAddress).Ensuite nous allons utiliser la fonction MoveRange(madestination, maselection) .madestination correspond à l'objet dans lequel nous avons défini la cellule de destination.Maselection correspond à l'objet dans lequel nous avons défini la plage de cellules.

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoMaPlage;Variant vOOoMaDestination; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoMaDestination = vOOoOpenOffice.OleFunction("Bridge_GetStruct", "com.sun.star.table.CellAddress");vOOoMaPlage = vOOoOpenOffice.OleFunction("Bridge_GetStruct", "com.sun.star.table.CellRangeAddress");vOOoMaDestination.OlePropertySet("Sheet", 0);vOOoMaDestination.OlePropertySet("Column", 5);vOOoMaDestination.OlePropertySet("Row", 5); vOOoMaPlage.OlePropertySet("Sheet", 0);vOOoMaPlage.OlePropertySet("StartColumn", 0);vOOoMaPlage.OlePropertySet("StartRow", 0);vOOoMaPlage.OlePropertySet("EndColumn", 5);vOOoMaPlage.OlePropertySet("EndRow", 5);vOOoMaFeuille.OleFunction("moveRange", vOOoMaDestination, vOOoMaPlage);

Comment fusionner des cellules OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Voici un exemple de fusion et d'annulation de fusion pour la plage de cellules A1:B1

Variant vOOoMonClasseur;Variant vOOoMaFeuille; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");if (vOOoMaFeuille.OleFunction("getCellRangeByName", "A1:B1").OleFunction("Getismerged")) {vOOoMaFeuille.OleFunction("getCellRangeByName", "A1:B1").OleFunction("merge", false); // ou false }else {vOOoMaFeuille.OleFunction("getCellRangeByName", "A1:B1").OleFunction("merge", true); // ou false }

La fonction GetIsMerged permet de savoir si la sélection de cellules est fusionnée ou non.La fonction merge, quand a elle, permet de basculer l'état de la sélection de fusionné à non fusionné.

Page 326: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Comment supprimer des cellules lignes colonnes d'une feuille OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

La suppression de cellules dans une feuille de calcul se passe en 2 temps.Dans un premier temps, nous devons définir la plage de cellules que nous voulons supprimer à l'aide d'un objet de classecom.sun.star.table.CellRangeAddressEnsuite nous allons utiliser la fonction RemoveRange(MaPlage, ModeDeSuppression)MaPlage correspond à l'objet dans lequel nous avons défini la plage de cellulesModeDeSuppression définit la manière dont se comporte le contenu des cellules sélectionnées. Sa valeur peut être :1 : Les cellules se trouvant en dessous prennent la place des cellules supprimées.2 : Les cellules se trouvant à droite prennent la place des cellules supprimées.3 : Supprime les lignes entières de la sélection4 : Supprime les colonnes entières de la sélection

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoMaPlage; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoMaPlage = vOOoOpenOffice.OleFunction("Bridge_GetStruct", "com.sun.star.table.CellRangeAddress");vOOoMaPlage.OlePropertySet("Sheet", 0);vOOoMaPlage.OlePropertySet("StartColumn", 0);vOOoMaPlage.OlePropertySet("StartRow", 0);vOOoMaPlage.OlePropertySet("EndColumn", 5);vOOoMaPlage.OlePropertySet("EndRow", 5);vOOoMaFeuille.OleFunction("removeRange", vOOoMaPlage, 1);

Pour effacer simplement des colonnes il existe une autre technique qui ne nécessite pas la création d'une plage de cellules.Nous allons utiliser la fonction RemoveByIndex(Indexdecolonne, NombredeColonne)IndexDeColonne : est l'index de la première colonne effacée.NombreDeColonne : Nombre de Colonnes que vous voulez effacer

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoMesColonnes; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoMesColonnes = vOOoMaFeuille.OleFunction("GetColumns");vOOoMesColonnes.OleFunction("removeByIndex", 1, 1);

Nous pouvons faire de même pour la suppression de lignes

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoMesLignes; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoMesLignes = vOOoMaFeuille.OleFunction("GetRows");

Page 327: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vOOoMesLignes.OleFunction("removeByIndex", 1, 1);

Comment insérer des cellules, des lignes, des colonnes dans une feuille OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

L'insertion de cellules dans une feuille de calcul se passe en 2 temps.Dans un premier temps, nous devons définir la plage de cellules que nous voulons insérer à l'aide d'un objet de classecom.sun.star.table.CellRangeAddressEnsuite nous allons utiliser la fonction InsertCells(MaPlage, ModeDInsertion)MaPlage correspond à l'objet dans lequel nous avons défini la plage de cellulesModeDInsertion définit la manière dont se comporte le contenu des cellules sélectionnées sa valeur peut être :1 : Déplace la plage de cellules vers le bas2 : Déplace la plage de cellules vers la droite3 : Insère des lignes entières4 : Insère des colonnes entières

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoMaPlage; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoMaPlage = vOOoOpenOffice.OleFunction("Bridge_GetStruct", "com.sun.star.table.CellRangeAddress");vOOoMaPlage.OlePropertySet("Sheet", 0);vOOoMaPlage.OlePropertySet("StartColumn", 0);vOOoMaPlage.OlePropertySet("StartRow", 0);vOOoMaPlage.OlePropertySet("EndColumn", 5);vOOoMaPlage.OlePropertySet("EndRow", 5);vOOoMaFeuille.OleFunction("insertCells", vOOoMaPlage, 1);

Pour insérer simplement des colonnes il existe une autre technique qui ne nécessite pas la création d'une plage de cellules.Nous allons utiliser la fonction InsertByIndex(IndexDeColonne, NombreDeColonne)IndexDeColonne : est l'index de la première colonne insérée.NombreDeColonne : Nombre de Colonnes que vous voulez insérer

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoMesColonnes; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoMesColonnes = vOOoMaFeuille.OleFunction("GetColumns");vOOoMesColonnes.OleFunction("insertByIndex", 1, 1);

Nous pouvons faire de même pour l'insertion de lignes

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoMesLignes; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoMesLignes = vOOoMaFeuille.OleFunction("GetRows");

Page 328: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vOOoMesLignes.OleFunction("insertByIndex", 1, 1);

Comment définir une plage de cellules OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Une plage de cellules est contenue dans un objet de classe com.sun.star.table.CellRangeAddressPropriétés de l'objet com.sun.star.table.CellRangeAddress :Sheet : Index de la feuille de calcul dans laquelle nous définissons la plage (0 pour la feuille 1)StartColumn : Index de la colonne de départ de la sélectionEndColumn : Index de la colonne de fin de la sélectionStartRow : Index de la Ligne de départ de la sélectionEndRow : Index de la Ligne de départ de la sélectionPour créer un objet de cette classe, nous devons utiliser l'API de reflections

Variant vOOoCoreReflection;Variant vOOoMaPlage; vOOoMaPlage = vOOoOpenOffice.OleFunction("Bridge_GetStruct", "com.sun.star.table.CellRangeAddress");vOOoMaPlage.OlePropertySet("Sheet", 0);vOOoMaPlage.OlePropertySet("StartColumn", 0);vOOoMaPlage.OlePropertySet("StartRow", 0);vOOoMaPlage.OlePropertySet("EndColumn", 5);vOOoMaPlage.OlePropertySet("EndRow", 5);

Comment récupérer la valeur d'une cellule de OLeOpenOffice ?

Auteurs : blondelle , pottiez , MFDev ,

Pour récupérer la valeur d'une cellule, il suffit d'appeler la méthode GetValue.Par l'intermédiaire d'une variable Cellule :

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoCellule;int vOOoresult; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoCellule = vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0);vOOoresult = vOOoCellule.OleFunction("GetValue");

Ou directement en utilisant la feuille :

Variant vOOoMonClasseur;Variant vOOoMaFeuille;int vOOoresult; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");

Page 329: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vOOoresult = vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0).OleFunction("GetValue");

Comment modifier la propriété arrière-plan des cellules OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

La couleur d'arrière plan est stockée dans la propriété CellBackColor au format RVB (Rouge Vert Bleu) Si la cellulene doit pas contenir de couleur de remplissage, la propriété IsCellBackgroundTransparent, doit être basculée à True.Exemple pour définir la couleur suivante :

Page 330: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

La couleur choisie est constituée de la manière suivante :Rouge : 187 en décimales, soit la valeur BB en HexadécimalVert : 187 en décimales, soit la valeur BB en HexadécimalBleu : 255 en décimales, soit la valeur FF en HexadécimalPour définir cette couleur comme arrière plan de la cellule, il faudra passer la valeur $BBBBFF ($RougeVertBleu enhexadécimal)

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoCellule;vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoCellule = vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0);vOOoCellule.OleFunction("setPropertyValue", "IsCellBackgroundTransparent", false);

Page 331: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vOOoCellule.OleFunction("setPropertyValue", "CellBackColor", 0xBBBBFF);

Comment modifier les propriétés protection des cellules OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Les informations de protection sont stockées dans un objet de type com.sun.star.util.CellProtection1 Propriété IsHidden de type booleanMasque les formules et le contenu des cellules sélectionnées.2 Propriété IsLocked de type booleanEmpêche toute modification des cellules sélectionnées.3 Propriété IsFormulaHidden de type booleanMasque les formules dans les cellules sélectionnées.4 Propriété IsPrintHidden de type BooleanEmpêche l'impression des cellules sélectionnées.

Page 332: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoCellule;Variant vOOoprotection; vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoCellule = vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0);vOOoprotection = vOOoOpenOffice.OleFunction("Bridge_GetStruct", "com.sun.star.util.CellProtection");vOOoprotection.OlePropertySet("IsHidden", false);vOOoprotection.OlePropertySet("IsPrintHidden", true);vOOoprotection.OlePropertySet("IsLocked", true);vOOoprotection.OlePropertySet("IsFormulaHidden", true);vOOoCellule.OleFunction("setPropertyValue", "CellProtection", vOOoprotection);

Comment accéder à une cellule et modifier sa valeur OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Pour affecter une valeur à une cellule il suffit d'appeler la méthode SetValue.Par l'intermédiaire d'une variable Cellule :

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoCellule;vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoCellule = vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0);vOOoCellule.OleFunction("SetValue", 123);

Ou directement en utilisant la feuille :

Variant vOOoMonClasseur;Variant vOOoMaFeuille;vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0).OleFunction("SetValue", 123);

Comment affecter une formule à une cellule OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Pour affecter une formule à une cellule :

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoCellule;vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");

Page 333: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0).OleFunction("SetFormula", "=A2+B4");

Comment remplir une cellule avec du texte OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Selon le type de texte que l'on souhaite intégrer, il faudra utiliser la fonction insertString (texte standard) ouinsertControlCharacter (caractères spéciaux).

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoCellule;Variant vOOoTextCursor;vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoCellule = vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0);vOOoTextCursor = vOOoCellule.OleFunction("createTextCursor");vOOoCellule.OleProcedure("insertString", vOOoTextCursor, "1er Ligne", false);vOOoCellule.OleProcedure("insertControlCharacter", vOOoTextCursor, 0, false);vOOoCellule.OleProcedure("insertString", vOOoTextCursor, "2em Ligne", false);

Liste des codes utilisables avec la fonction insertControlCharacter :PARAGRAPH_BREAK = 0;LINE_BREAK = 1;HARD_HYPHEN = 2;SOFT_HYPHEN = 3;HARD_SPACE = 4;APPEND_PARAGRAPH = 5;

Comment ajouter un hyperlien dans une cellule OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Pour ajouter un hyperlien dans une cellule :

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoCellule;Variant vOOoTextCursor;Variant vOOoHyperlinkObj;vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoCellule = vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0);vOOoTextCursor = vOOoCellule.OleFunction("createTextCursor");vOOoHyperlinkObj = vOOoDocument.OleFunction("createInstance", "com.sun.star.text.TextField.URL");vOOoHyperlinkObj.OleFunction("setPropertyValue", "URL", http://www.developpez.com/");vOOoHyperlinkObj.OleFunction("setPropertyValue", "Representation", "Visiter Developpez.com");vOOoCellule.OleFunction("insertTextContent", vOOoTextCursor, vOOoHyperlinkObj, false);

Comment modifier les propriétés police des cellules OleOpenOffice ?

Auteurs : blondelle , pottiez , Atlantis ,

Pour modifier les propriétés des cellules, il faut utiliser la procédure setPropertyValue(paramètre, valeur)

Page 334: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Attention les paramètres et les valeurs doivent respecter la casse.

1 Propriété : CharFontName de type stringCette propriété spécifie le nom de la police de caractère.2 Propriété : CharWeight de type ExtendedLa gestion du gras s'effectue en modifiant l'épaisseur de la police de caractère. Cette valeur est comprise entre 0 et 200Liste de valeurs disponibles :0 : Epaisseur non déterminée50 : Fin100 : Normal150 : Gras175 : Ultra Gras200: Noir2 Propriété : CharPosture de type com.sun.star.awt.FontSlantCette propriété spécifie l'inclinaison des caractères dans le texte.Liste des valeurs disponibles :- NONE :- OBLIQUE :- ITALIC- DONTKNOW- REVERSE_OBLIQUE- REVERSE_ITALICCoreReflection.forName('com.sun.star.awt.FontSlant').getField('ITALIC').get();3 Propriété : CharHeight de type ExtendedDéfinit la taille de la police.4 Propriété : CharLocale de type CharLocale

Page 335: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Définit la langue utilisée par le correcteur orthographique pour corriger la partie sélectionnée du texte saisi.

Variant vOOoMonClasseur;Variant vOOoMaFeuille;Variant vOOoLocale;Variant vOOoCellule;Variant vOOoCoreReflection;Variant vOOoOpenOffice;

vOOoCoreReflection = vOOoOpenOffice.OleFunction("createInstance","com.sun.star.reflection.CoreReflection");

vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByName", "Feuille1");vOOoCellule = vOOoMaFeuille.OleFunction("getCellByPosition", 0, 0);vOOoCellule.OleFunction("setPropertyValue", "CharFontName", "Arial");vOOoCellule.OleFunction("setPropertyValue", "CharHeight", 10);vOOoCellule.OleFunction("setPropertyValue", "CharWeight", 150);vOOoCellule.OleFunction("setPropertyValue", "CharPosture", vOOoCoreReflection.OleFunction("forName", "com.sun.star.awt.FontSlant").OleFunction("getField", "ITALIC").OleFunction("get", ""));vOOoLocale = vOOoOpenOffice.OleFunction("Bridge_GetStruct", "com.sun.star.lang.Locale");

vOOoLocale.OlePropertySet("Country", "FR");vOOoLocale.OlePropertySet("Language", "fr");vOOoLocale.OlePropertySet("Variant", "fr");

vOOoCellule.OleFunction("setPropertyValue","CharLocale", vOOoLocale);

Page 336: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

Sommaire > Windows Image Acquisition (WIA)

Comment imprimer des images avec l'assistant Photograhie Windows ?

Auteurs : ero-sennin , yarp , blondelle ,

Pour utiliser l'assistant Photographie Windows il vous faut tout d'abord créer une connexion avec le WIA, ajouter lesimages à imprimer, et pour finir il ne suffit plus qu'à lancer l'assistant :

#include <utilcls.h> // <---- ne pas oublier d'inclurevoid __fastcall TForm1::Button1Click(TObject *Sender){// impression d'image en utilisant WIAVariant vMSWIACommonDialog, vMSWIAVector;// créer un objet dialogvMSWIACommonDialog = Variant::CreateObject("WIA.CommonDialog");vMSWIAVector = Variant::CreateObject("WIA.Vector");// sélection des imagesvMSWIAVector.OleProcedure("Add", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\imageJPEG.jpg");vMSWIAVector.OleProcedure("Add", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\imageBMP.bmp");// impressionvMSWIACommonDialog.OleProcedure("ShowPhotoPrintingWizard", vMSWIAVector); vMSWIACommonDialog = Unassigned;vMSWIAVector = Unassigned;}

Comment lister les informations sur les filtres ?

Auteurs : blondelle , pottiez ,

Les filtres permettent de faire des opérations sur les images grâce au WIA.Ce code simple permet d'obtenir toutes les informations sur ces différents filtres dans un Mémo :

#include <utilcls.h> // <----- ne pas oublier d'inclure void __fastcall TForm1::Button1Click(TObject *Sender){ // lister Informations Générales Filtres Variant vMSWIAImageProcess; String sWIAFiltres, sWIADescriptFiltres; int iMSWIAnbFiltreDispo; // creation du gestionnaire de filtre vMSWIAImageProcess = Variant::CreateObject("WIA.ImageProcess"); // nombre de filtres disponibles iMSWIAnbFiltreDispo = vMSWIAImageProcess.OlePropertyGet("FilterInfos").OlePropertyGet("Count"); // boucle sur l'ensemble des filtres disponibles Memo1->ScrollBars = ssVertical; for(int x = 1; x <= iMSWIAnbFiltreDispo; x++) { sWIAFiltres = vMSWIAImageProcess.OlePropertyGet("FilterInfos", x).OlePropertyGet("Name"); Memo1->Lines->Add(sWIAFiltres); sWIADescriptFiltres = vMSWIAImageProcess.OlePropertyGet("FilterInfos", x).OlePropertyGet("Description"); Memo1->Lines->Add(sWIADescriptFiltres); Memo1->Lines->Add("\r\n**************\r\n"); }

Page 337: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

}

lien : Aide MSDN sur les filtres WIA

Comment redimensionner une image à l'aide de WIA ?

Auteurs : blondelle ,

Pour redimensionner une image, il suffit d'utiliser le bon filtre :

#include <utilcls.h> // <---------ne pas oublier // redimensionner Image Variant vMSWIAImageProcess, vMSWIAImageFile; // Création conteneur pour l'image à manipulervMSWIAImageFile = Variant::CreateObject("WIA.ImageFile");// Création du gestionnaire de filtrevMSWIAImageProcess = Variant::CreateObject("WIA.ImageProcess");// Chargement de l'image dans le conteneurvMSWIAImageFile.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\imageOrigine.bmp");// Ajoute le filtre pour redimensionner l'image (Scale)vMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Add", (vMSWIAImageProcess.OlePropertyGet("FilterInfos", "Scale").OlePropertyGet("FilterID")));// Définit la largeur maxi pour le redimensionnementvMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "MaximumWidth", 90);// Définit la hauteur maxi pour le redimensionnementvMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "MaximumHeight", 90);// remarque :// Les proportions sont conservées. Le filtre prend en compte// les ratios et adapte la taille pour ne pas dépasser les valeurs maxi définies.// Application du filtre à l'imagevMSWIAImageFile = vMSWIAImageProcess.OleFunction("Apply", vMSWIAImageFile);// Enregistre l'image redimensionnéevMSWIAImageFile.OleFunction("SaveFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\imageFinale.jpg");

lien : Comment lister les informations sur les filtres ?

Comment combiner deux images à l'aide de WIA ?

Auteurs : blondelle ,

Pour combiner deux images, il faut charger les images à combiner, puis utiliser le filtre approprié :

#include <utilcls.h> // <---------ne pas oublier // combiner Deux Images Variant vMSWIAImageProcess, vMSWIAImageFile1, vMSWIAImageFile2; // Création conteneur pour l'image à manipulervMSWIAImageFile1 = Variant::CreateObject("WIA.ImageFile");// remarque: vous devez créer un conteneur pour chaque imagevMSWIAImageFile2 = Variant::CreateObject("WIA.ImageFile");// Création du gestionnaire de filtrevMSWIAImageProcess = Variant::CreateObject("WIA.ImageProcess");

Page 338: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

// Chargement de la 1ere image dans le conteneurvMSWIAImageFile1.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\YourBmpHere.bmp");// Remarque pour cet exemple :// Les dimensions de la 2ème image doivent être plus petites que la première afin// que celle-ci ne soit pas totalement masquée// Chargement de la 2ème image dans le conteneurvMSWIAImageFile2.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\Photo\\Photo.jpg"); // Ajoute le filtre pour combiner/fusionner (Stamp)vMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Add", (vMSWIAImageProcess.OlePropertyGet("FilterInfos", "Stamp").OlePropertyGet("FilterID")));vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "ImageFile", vMSWIAImageFile2);// définit la position horizontale de la 2eme image pour la fusionvMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Left", (vMSWIAImageFile1.OlePropertyGet("Width") - vMSWIAImageFile2.OlePropertyGet("Width")));// définit la position verticale de la 2eme pour la fusionvMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Top", (vMSWIAImageFile1.OlePropertyGet("Height") - vMSWIAImageFile2.OlePropertyGet("Height"))); // Application du filtre à la 1ere imagevMSWIAImageFile1 = vMSWIAImageProcess.OleFunction("Apply", vMSWIAImageFile1);// sauvegarde de la nouvelle imagevMSWIAImageFile1.OleFunction("SaveFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\fourmiz_ImageCombinee.JPG");

lien : Comment lister les informations sur les filtres ?

Comment fusionner verticalement deux images à l'aide de WIA ?

Auteurs : blondelle ,

Pour fusionner deux images, il faut charger les images à fusionner, puis utiliser le filtre approprié :

#include <utilcls.h> // <---------ne pas oublier // Fusion Verticale Deux ImagesVariant Largeur, Hauteur, vMSWIAVector, vMSWIAImageProcess, vMSWIAImageFile1, vMSWIAImageFile2, vMSWIAImageFile3;long C; // Création conteneur pour l'image à manipulervMSWIAImageFile1 = Variant::CreateObject("WIA.ImageFile");// remarque: vous devez créer un conteneur pour chaque imagevMSWIAImageFile2 = Variant::CreateObject("WIA.ImageFile");// Création du gestionnaire de filtrevMSWIAImageProcess = Variant::CreateObject("WIA.ImageProcess"); // Chargement de la 1ère image dans le conteneur// (l'image qui sera placée au-dessus)vMSWIAImageFile1.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\Grue_Atelier.jpg");// Chargement de la 2ème image dans le conteneur// (l'image qui sera placée dessous)vMSWIAImageFile2.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\Photo\\Photo.jpg"); // ------création d'un support pour fusionner les deux imagesif(vMSWIAImageFile1.OlePropertyGet("Width") > vMSWIAImageFile2.OlePropertyGet("Width")) { Largeur = vMSWIAImageFile1.OlePropertyGet("Width"); }

Page 339: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

else { Largeur = vMSWIAImageFile2.OlePropertyGet("Width"); }Hauteur = vMSWIAImageFile1.OlePropertyGet("Height") + vMSWIAImageFile2.OlePropertyGet("Height"); C = 0x80000004; // couleur de fondvMSWIAVector = Variant::CreateObject("WIA.Vector");vMSWIAVector.OleProcedure("Add", C);vMSWIAVector.OleProcedure("Add", C);vMSWIAVector.OleProcedure("Add", C);vMSWIAVector.OleProcedure("Add", C); vMSWIAImageFile3 = vMSWIAVector.OlePropertyGet("ImageFile", 2, 2);vMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Add", (vMSWIAImageProcess.OlePropertyGet("FilterInfos", "Scale").OlePropertyGet("FilterID")));vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "MaximumWidth", Largeur);vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "MaximumHeight", Hauteur);vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "PreserveAspectRatio", false);vMSWIAImageFile3 = vMSWIAImageProcess.OleFunction("Apply", vMSWIAImageFile3);// ------------------// réinitialisation des filtresfor(int i = 1; i <= vMSWIAImageProcess.OlePropertyGet("Filters").OlePropertyGet("Count"); i++){vMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Remove", i);}// fusionne l'image1 dans le supportvMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Add", (vMSWIAImageProcess.OlePropertyGet("FilterInfos", "Stamp").OlePropertyGet("FilterID")));vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "ImageFile", vMSWIAImageFile1);vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Left", 0);vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Top", 0);vMSWIAImageFile3 = vMSWIAImageProcess.OleFunction("Apply", vMSWIAImageFile3);// fusionne l'image2 dans le supportvMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "ImageFile", vMSWIAImageFile2);vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Left", 0);vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Top", vMSWIAImageFile1.OlePropertyGet("Height"));// wiaFormatBMP ="{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";// wiaFormatPNG ="{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}";// wiaFormatGIF ="{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}";// wiaFormatJPEG ="{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";// wiaFormatTIFF ="{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}";vMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Add", (vMSWIAImageProcess.OlePropertyGet("FilterInfos", "Convert").OlePropertyGet("FilterID")));vMSWIAImageProcess.OlePropertyGet("Filters", 2).OlePropertyGet("Properties", "FormatID").OlePropertySet("Value", "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}");vMSWIAImageProcess.OlePropertyGet("Filters", 2).OlePropertyGet("Properties", "Quality").OlePropertySet("Value", 90);vMSWIAImageFile3 = vMSWIAImageProcess.OleFunction("Apply", vMSWIAImageFile3);// sauvegarde de la nouvelle imagevMSWIAImageFile3.OleFunction("SaveFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\resultat_Fusion_Deux_images.jpg");

lien : Comment lister les informations sur les filtres ?

Comment couper/rogner une image à l'aide de WIA ?

Auteurs : blondelle ,

Pour couper ou rogner une image, il suffit d'utiliser le filtre approprié :

Page 340: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

#include <utilcls.h> // <---------ne pas oublier // couper Image Variant vMSWIAImageProcess, vMSWIAImageFile; // Création conteneur pour l'image à manipulervMSWIAImageFile = Variant::CreateObject("WIA.ImageFile");// Création du gestionnaire de filtrevMSWIAImageProcess = Variant::CreateObject("WIA.ImageProcess"); // Chargement de l'image dans le conteneurvMSWIAImageFile.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\Grue_Atelier.jpg"); // Ajoute le filtre pour Couper/Rogner l'image (Crop)vMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Add", (vMSWIAImageProcess.OlePropertyGet("FilterInfos", "Crop").OlePropertyGet("FilterID")));// La coupe sera effectuée à l'intérieur du cadre défini ci-dessous:// **********// definit la position à partir du bord gauche pour la coupevMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Left", 0);// definit la position à partir du bord supérieur pour la coupevMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Top", 0);// definit la position à partir du bord droit pour la coupevMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Right", (vMSWIAImageFile.OlePropertyGet("Width") / 3));// definit la position à partir du bord inférieur pour la coupevMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Bottom", (vMSWIAImageFile.OlePropertyGet("Height") / 3)); // application du filtrevMSWIAImageFile = vMSWIAImageProcess.OleFunction("Apply", vMSWIAImageFile); // Sauvegarde de la nouvelle imagevMSWIAImageFile.OleFunction("SaveFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\sauvegarde_Image_Coupee.JPG");

lien : Comment lister les informations sur les filtres ?

Comment créer une image TIFF multipages à l'aide de WIA ?

Auteurs : blondelle ,

Pour créer une image multipages, il faut tout d'abord charger les différentes images utilisées pour l'image finale, puisil faut utiliser le filtre approprié :

#include <utilcls.h> // <---------ne pas oublier // création Image Multipage TIFFVariant vMSWIAImageFile1, vMSWIAImageFile2, vMSWIAImageFile3, vMSWIAImageProcess; // Création des conteneurs pour les images à manipulervMSWIAImageFile1 = Variant::CreateObject("WIA.ImageFile");vMSWIAImageFile2 = Variant::CreateObject("WIA.ImageFile");vMSWIAImageFile3 = Variant::CreateObject("WIA.ImageFile"); // Création du gestionnaire de filtrevMSWIAImageProcess = Variant::CreateObject("WIA.ImageProcess"); // chargement des imagesvMSWIAImageFile1.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\Grue_Atelier.jpg");

Page 341: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

vMSWIAImageFile2.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\resultat_Fusion_Deux_images.JPG");vMSWIAImageFile3.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\fourmiz_ImageCombinee.JPG"); // Ajoute un filtre pour gérer un premier Frame/MultipagevMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Add", (vMSWIAImageProcess.OlePropertyGet("FilterInfos", "Frame").OlePropertyGet("FilterID")));// définit le contenu du FramevMSWIAImageProcess.OlePropertyGet("Filters", (vMSWIAImageProcess.OlePropertyGet("Filters").OlePropertyGet("Count"))).OlePropertySet("Properties", "ImageFile", vMSWIAImageFile2);// Ajoute un filtre pour gérer un deuxieme Frame/MultipagevMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Add", (vMSWIAImageProcess.OlePropertyGet("FilterInfos", "Frame").OlePropertyGet("FilterID")));// définit le contenu du FramevMSWIAImageProcess.OlePropertyGet("Filters", (vMSWIAImageProcess.OlePropertyGet("Filters").OlePropertyGet("Count"))).OlePropertySet("Properties", "ImageFile", vMSWIAImageFile3);// Ajoute un filtre de conversion pour la nouvelle image (au format TIFF)// (TIFF est le seul format qui supporte la sauvegarde en multi-frames)vMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Add", (vMSWIAImageProcess.OlePropertyGet("FilterInfos", "Convert").OlePropertyGet("FilterID")));// wiaFormatTIFF ="{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"vMSWIAImageProcess.OlePropertyGet("Filters", (vMSWIAImageProcess.OlePropertyGet("Filters").OlePropertyGet("Count"))).OlePropertySet("Properties", "FormatID", "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"); // Application du filtre à la 1ere image:// (ajoute 2 frames dans la 1ere image, au format TiffvMSWIAImageFile1 = vMSWIAImageProcess.OleFunction("Apply", vMSWIAImageFile1); // sauvegarde de la nouvelle imagevMSWIAImageFile1.OleFunction("SaveFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\monImageMultipage.tif");

lien : Comment lister les informations sur les filtres ?

Comment contrôler qu'une image GIF est animée ou standard à l'aide de WIA ?

Auteurs : blondelle ,

Pour savoir si l'image GIF chargé est animé, il suffit de tester la propriété IsAnimated de cette image :

#include <utilcls.h> // <---------ne pas oublier // contrôle Format Image GIF Variant vMSWIAImageFile; // Création conteneur pour l'image à manipulervMSWIAImageFile = Variant::CreateObject("WIA.ImageFile"); // chargement de l'imagevMSWIAImageFile.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\YourBmpHere1.gif"); if(vMSWIAImageFile.OlePropertyGet("IsAnimated")){ ShowMessage("Gif animé");}else{ ShowMessage("Gif standard");

Page 342: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

}

Comment modifier le TAG (Titre, Commentaire, Auteur,...) d'une image à l'aide de WIA ?

Auteurs : blondelle ,

Pour modifier les TAG d'une image il suffit de procéder de la manière suivante :

#include <utilcls.h> // <---------ne pas oublier // Titre, Commentaire, Auteur, Mots clés // création TAG TITRE copie ImageVariant vMSWIAVector, vMSWIAImageProcess, vMSWIAImageFile; // Création conteneur pour l'image à manipulervMSWIAImageFile = Variant::CreateObject("WIA.ImageFile");// creation du gestionnaire de filtrevMSWIAImageProcess = Variant::CreateObject("WIA.ImageProcess");// création d'un vecteur// (Un vecteur permet de créer une collection pour des valeurs du même type.)vMSWIAVector = Variant::CreateObject("WIA.Vector"); // chargement de l'imagevMSWIAImageFile.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\Grue_Atelier.jpg"); // définit le filtre pour gérer l'EXIFvMSWIAImageProcess.OlePropertyGet("Filters").OleProcedure("Add", (vMSWIAImageProcess.OlePropertyGet("FilterInfos", "Exif").OlePropertyGet("FilterID")));vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "ID", 40091); // 40091 Titre // 40092 Commentaire // 40093 Auteur // 40094 Mots clés// spécifie le type de valeur pour le propriété du filtre:// constante VectorOfBytesImagePropertyType = 1101 (la valeur est un vecteur)vMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Type", 1101);// voir le fichier d'aide fourni avec la librairie WIA pour// obtenir la liste des constantes disponibles// stocke une chaîne de caractères dans le vecteurvMSWIAVector.OleProcedure("SetFromString", "Test de TAG 'TITRE' : utilisation de WIA v2.0");// applique au filtre le contenu du vecteurvMSWIAImageProcess.OlePropertyGet("Filters", 1).OlePropertySet("Properties", "Value", vMSWIAVector); // application du filtre dans l'imagevMSWIAImageFile = vMSWIAImageProcess.OleFunction("Apply", vMSWIAImageFile); // sauvegarde de l'imagevMSWIAImageFile.OleFunction("SaveFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\fourmiz_Test_EXIF.JPG");

Comment lister les propriétés d'une image à l'aide de WIA ?

Auteurs : blondelle ,

Pour lister les propriétés d'une image il suffit de procéder de la manière suivante, ici on les charge dans un TMemo :

#include <utilcls.h> // <---------ne pas oublier

Page 343: bdd

Les réponses à vos questions sur BCB

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

http://cpp.developpez.com/faq/bcb/

// lister les proprietés d'une imageVariant vMSWIAImageFile;String S; // Création conteneur pour l'image à manipulervMSWIAImageFile = Variant::CreateObject("WIA.ImageFile"); // Chargement de l'image dans le conteneurvMSWIAImageFile.OleFunction("LoadFile", "C:\\Documents and Settings\\toto\\Mes documents\\Mes images\\monImageMultipage.tif"); // Boucle sur la collection de propriétésfor(int nb = 1; nb <= vMSWIAImageFile.OlePropertyGet("Properties").OlePropertyGet("Count"); nb++){ S = vMSWIAImageFile.OlePropertyGet("Properties", nb).OlePropertyGet("Name"); S = S + " ("; S = S + vMSWIAImageFile.OlePropertyGet("Properties", nb).OlePropertyGet("PropertyID"); S = S + ") ="; if(vMSWIAImageFile.OlePropertyGet("Properties", nb).OlePropertyGet("IsVector")) { S = S + " - vector data not emitted - "; } // RationalImagePropertyType = 1006 else if(vMSWIAImageFile.OlePropertyGet("Properties", nb).OlePropertyGet("Type") == 1006) { S = S + (vMSWIAImageFile.OlePropertyGet("Properties", nb).OlePropertyGet("Value").OlePropertyGet("Numerator")); S = S + "/"; S = S + (vMSWIAImageFile.OlePropertyGet("Properties", nb).OlePropertyGet("Value").OlePropertyGet("Denominator")); } else if(vMSWIAImageFile.OlePropertyGet("Properties", nb).OlePropertyGet("Type") == 1002) { S =S + """" + (vMSWIAImageFile.OlePropertyGet("Properties", nb).OlePropertyGet("Value")) + """"; } else S = S + (vMSWIAImageFile.OlePropertyGet("Properties", nb).OlePropertyGet("Value")); Memo1->Lines->Add(S);}