Vous êtes sur la page 1sur 721

FAQ Delphi

Date de publication : 8 octobre 2003 Dernire mise jour : 28 juin 2013

Cette F.A.Q. a t ralise partir des questions frquemment poses sur les forums Delphi et Delphi et bases de donnes de www.developpez.com et de l'exprience 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 prtend pas non plus tre complte. Si vous trouvez une erreur, ou que vous souhaitez devenir rdacteur, lisez Comment participer cette F.A.Q. ?. Nous esprons que cette F.A.Q. saura rpondre un maximum de vos questions. Nous vous souhaitons une bonne lecture. L'quipe Delphi de Developpez.com.

Ont contribu cette FAQ :

Philton - PomaH - Vincent Callies - CodeGear - gbegreg - Korntex5 - TicTacToe - Dry - OutOfRange - Hauwke Lung - Herk77 - adaneels - sofiane44 - rx - Stef.web HumanTool - MFDev - Claudius40 - Mestoph - deetox petitcoucou31 - Phuphus - Malatar - anapurna - jmjmjm Smiley - Magnus - Wilco - Eric.H - Vulcanos - Big - waskol - qi130 - Manopower - Blaz2007 - DMO - doustij - Pedro mico2 - neilbgr - rsc - rv66 - Arrown - BeTuLa - Bruno75 Qazer - Stephane Poulet - Sioux - Charette - Skywaukers - Tofalu - Jean-Claude Snchal - Tourlourou - Smyley Xenos - Hdd34 - RDM - NoisetteProd - Portu - nek_kro_kvlt - SubZero2 - NotANumber - tiki06 - chavers - Guigui_ Linkin - DelpHichem - pipistrelle - MD Software - octal lil_jam63 - phenixauthor - hpalpha - hachesse - DelphiCool - Clment Cunin - ptitbob - nut62 - Atlantis - Gysmo Smortex - psl - Al-Yazdi - Didier Largange - Delphi-fan Nono40 - Pierre Castelain - Bloon - sur_uix - delphiprog - seb - bidou - Laurent Dardenne - reisubar - sub0 Pascal Jankowski - manuker - sjrd - Giovanny Temgoua - yobenzen - Didier100 - Olivier Lance - rbag - Mac LAK

FAQ Delphi

1. Informations gnrales (3) ..................................................................................................................................... 6 2. Gnralits (29) ......................................................................................................................................................8 2.1. Installation et informations (4) ....................................................................................................................... 9 2.2. Utilisation de l'EDI, toutes versions (11) ......................................................................................................11 2.3. Utilisation de l'EDI, Delphi 2005 (7) ............................................................................................................ 18 2.4. Utilisation de l'EDI, Delphi 2006 (1) ............................................................................................................ 21 2.5. Utilisation de l'EDI, Turbo Delphi 2006 (2) .................................................................................................. 22 2.6. Automatisation de la configuration de Delphi (1) ........................................................................................ 23 2.7. Dbogage (1) ............................................................................................................................................... 25 2.8. Divers (2) ..................................................................................................................................................... 26 3. Interface utilisateur (181) ..................................................................................................................................... 27 3.1. Gestion excution (25) .................................................................................................................................28 3.2. Application (30) ............................................................................................................................................ 52 3.3. Applications console (13) .............................................................................................................................80 3.4. Citrix (3) ....................................................................................................................................................... 90 3.5. DUnit (1) .......................................................................................................................................................93 3.5.1. Interface graphique (1) ........................................................................................................................ 94 3.6. Composants (104) ....................................................................................................................................... 96 3.6.1. Gnralits et installation (13) ............................................................................................................ 97 3.6.2. Cration dynamique / Recherche (6) ................................................................................................ 102 3.6.3. Utilisation des fonctions des APIs (7) ............................................................................................... 106 3.6.4. Le composant TDrawGrid (1) ............................................................................................................111 3.6.5. Le composant TStringGrid (13) .........................................................................................................112 3.6.6. Le composant TWebBrowser (13) .....................................................................................................125 3.6.7. Le composant TComboBox (2) ......................................................................................................... 133 3.6.8. Le composant TRichEdit (4) ..............................................................................................................135 3.6.9. Le composant TListBox (2) ............................................................................................................... 138 3.6.10. Le composant TPageControl (3) ..................................................................................................... 140 3.6.11. Le composant TFrame (1) ...............................................................................................................147 3.6.12. Le composant TTreeView (4) .......................................................................................................... 148 3.6.13. Le composant TRadioGroup (2) ......................................................................................................150 3.6.14. Divers (33) ....................................................................................................................................... 151 3.7. Gestion de messages Windows (5) ...........................................................................................................182 4. Langage (68) ...................................................................................................................................................... 186 4.1. Types de donnes (34) ..............................................................................................................................200 4.1.1. Nombres (8) .......................................................................................................................................210 4.1.2. Chanes de caractres (16) ...............................................................................................................217 4.1.3. La classe TStream (1) .......................................................................................................................233 4.2. Compilation (12) .........................................................................................................................................236 4.3. Divers (10) ................................................................................................................................................. 246 5. Gestion des fichiers (28) ....................................................................................................................................256 5.1. Rpertoire (11) ........................................................................................................................................... 257 5.2. Fichier (17) .................................................................................................................................................263 6. Gestion du temps (19) ....................................................................................................................................... 273 6.1. Oprations sur les dates/heures (7) .......................................................................................................... 277 6.2. Dates particulires (6) ................................................................................................................................282 7. Les ToolsAPI (1) .................................................................................................................................................285 7.1. Utilisation des interfaces (1) ...................................................................................................................... 286 8. Utilisation du XML partir de Delphi (9) ........................................................................................................... 287 9. Expressions rgulires (1) ................................................................................................................................. 296 10. IntraWeb (2) ..................................................................................................................................................... 298 11. Composants Indy (52) ...................................................................................................................................... 300 11.1. Gnralits (10) ........................................................................................................................................301 11.2. Indy et les threads (4) ..............................................................................................................................307

-3Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

11.3. Indy et le Client/Serveur (7) .....................................................................................................................311 11.4. Indy et les adresses IP (5) ...................................................................................................................... 318 11.5. IdHTTP (9) ............................................................................................................................................... 321 11.6. IdFTP (9) .................................................................................................................................................. 328 11.7. IdPOP3 (2) ............................................................................................................................................... 337 11.8. Indy 10 (6) ................................................................................................................................................340 12. Composants ICS (1) .........................................................................................................................................345 12.1. TPop3Cli (1) .............................................................................................................................................346 13. Systme (165) .................................................................................................................................................. 348 13.1. Administration (3) ..................................................................................................................................... 349 13.1.1. Restauration (3) ...............................................................................................................................350 13.2. Base de registre (17) ...............................................................................................................................355 13.3. Fichiers .INI (14) ...................................................................................................................................... 367 13.4. Lecteur (5) ................................................................................................................................................376 13.5. Moniteur, cran et affichage (11) .............................................................................................................380 13.6. Souris (5) ................................................................................................................................................. 385 13.7. Image/Vido (3) ........................................................................................................................................388 13.8. Son (4) ..................................................................................................................................................... 390 13.9. Rseau (13) ............................................................................................................................................. 394 13.9.1. Rseau Microsoft (7) ....................................................................................................................... 399 13.10. Internet (6) ............................................................................................................................................. 408 13.11. DLL (11) ..................................................................................................................................................414 13.12. Thread (3) .............................................................................................................................................. 426 13.13. Port srie / RS232 (2) ............................................................................................................................434 13.14. WMI (38) ................................................................................................................................................ 435 13.14.1. Introduction (4) .............................................................................................................................. 436 13.14.2. La gestion des erreurs WMI (3) .................................................................................................... 438 13.14.3. Oprations de base (12) ............................................................................................................... 441 13.14.4. Interrogation avec WQL (5) ...........................................................................................................457 13.14.5. Provider (7) ....................................................................................................................................463 13.14.6. Conversions diverses (2) ...............................................................................................................473 13.14.7. Fichiers et rpertoires (3) .............................................................................................................. 475 13.14.8. Classes (2) .................................................................................................................................... 479 13.14.8.1. Win32 (2) ...............................................................................................................................480 13.14.8.1.1. Systme d'exploitation (2) ............................................................................................ 481 13.14.8.1.1.1. Processus Win32 (2) ............................................................................................ 482 13.15. Shell Windows (2) ..................................................................................................................................483 13.16. Divers (28) ............................................................................................................................................. 485 14. Services Windows (12) .................................................................................................................................... 512 14.1. Cration de service (1) ............................................................................................................................ 513 14.2. Gestion des services NT (11) .................................................................................................................. 514 15. OLE/COM (2) ................................................................................................................................................... 522 16. Bases de donnes (98) ....................................................................................................................................524 16.1. Oracle (6) ................................................................................................................................................. 525 16.2. Interbase (15) ...........................................................................................................................................531 16.3. Access (7) ................................................................................................................................................ 542 16.4. Paradox (3) .............................................................................................................................................. 548 16.5. BDE (11) .................................................................................................................................................. 551 16.5.1. Erreurs rencontres avec le BDE (3) ..............................................................................................555 16.6. MySQL (2) ................................................................................................................................................557 16.7. MyBase (1) ...............................................................................................................................................559 16.8. ADO (5) ....................................................................................................................................................560 16.9. ODBC (3) ................................................................................................................................................. 567 16.10. SQL (10) ................................................................................................................................................ 569

-4Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

16.11. Composants (18) ....................................................................................................................................574 16.12. Bugs (1) ................................................................................................................................................. 584 16.13. Divers (15) ............................................................................................................................................. 585 16.14. Firebird (1) ............................................................................................................................................. 596 17. Gnrateurs d'tats (9) .................................................................................................................................... 597 17.1. Crystal Report (4) .................................................................................................................................... 598 17.2. Quick Report (1) ...................................................................................................................................... 602 17.3. Rave Report (4) ....................................................................................................................................... 603 18. Microsoft Office (146) .......................................................................................................................................606 18.1. Excel (63) .................................................................................................................................................608 18.1.1. Gestion de l'application (10) ............................................................................................................609 18.1.2. Gestion des classeurs (6) ............................................................................................................... 612 18.1.3. Utilisation des feuilles et de leur contenu (37) ................................................................................615 18.1.3.1. Gestion des feuilles (7) ........................................................................................................... 616 18.1.3.2. Plages de slection (10) ......................................................................................................... 618 18.1.3.3. Manipulation des formules (1) ................................................................................................ 622 18.1.3.4. Manipulation des valeurs (3) ...................................................................................................624 18.1.3.5. Manipulation des cellules (13) ................................................................................................ 625 18.1.3.6. Utiliser des noms (3) ...............................................................................................................629 18.1.4. Utilisation des graphes (9) .............................................................................................................. 630 18.2. Word (55) ................................................................................................................................................. 634 18.2.1. Slection et deplacement (14) ........................................................................................................ 635 18.2.2. Gestion des documents (14) ........................................................................................................... 642 18.2.3. Modification du texte (12) ................................................................................................................653 18.2.4. Tableaux (6) .....................................................................................................................................659 18.2.5. Signet (3) ......................................................................................................................................... 663 18.2.6. Divers (5) ......................................................................................................................................... 665 18.3. OutLook (23) ............................................................................................................................................ 667 18.3.1. Gestion de l'application (5) ..............................................................................................................670 18.3.2. Contacts et Mails (8) ....................................................................................................................... 673 18.3.3. Gestion des dossiers (3) ................................................................................................................. 678 18.3.4. Gestion des rendez-vous (3) ...........................................................................................................680 18.4. Access (1) ................................................................................................................................................ 683 18.4.1. Gestion de l'application (1) ..............................................................................................................684 19. Open Office.org (36) ........................................................................................................................................ 685 19.1. Gnralits (3) ......................................................................................................................................... 686 19.2. Gestion des documents (7) ..................................................................................................................... 688 19.3. Tableur (26) ..............................................................................................................................................693 19.3.1. Gestion des feuilles (10) ................................................................................................................. 694 19.3.2. Gestion des cellules (16) .................................................................................................................697 20. Gestion de projet (7) ........................................................................................................................................ 711 20.1. Gestionnaire de source (6) ...................................................................................................................... 712 20.1.1. CVS (5) ............................................................................................................................................713 20.2. Dploiement (1) ....................................................................................................................................... 717 21. Modlisation (2) ................................................................................................................................................718 21.1. Together (2) ..............................................................................................................................................719 22. Multilinguisme et Unicode (4) .......................................................................................................................... 720

-5Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Informations gnrales Comment bien utiliser cette F.A.Q. ?


Auteur : Clment Cunin Le but : Cette F.A.Q. a t conue pour tre la plus simple possible d'utilisation. Elle tente d'apporter des rponses simples et compltes aux questions auxquelles sont confronts tous les dbutants (et les autres). L'organisation : Les questions sont organises par thme, les thmes pouvant eux-mme contenir des sous-thmes. Lorsqu'une question porte sur plusieurs thmes, celle-ci est insre dans chacun des thmes, rendant la recherche plus facile. Les rponses : Les rponses contiennent des explications et des codes sources. Certaines sont compltes de fichiers tlcharger contenant un programme de dmonstration. Ces programmes sont volontairement trs simples afin qu'il soit ais de localiser le code intressant. Les rponses peuvent galement tre compltes de liens vers d'autres rponses ou vers un autre site en rapport. La recherche : Un moteur de recherche sur les pages de la F.A.Q. est disponible, utilisez le bouton [ Rechercher ] situ en haut de page. Nouveauts et mises jour : Lors de l'ajout ou de la modification d'une question/rponse, un indicateur est plac cot du titre de la question. Cet indicateur reste visible pour une dure de 15 jours afin de vous permettre de voir rapidement les modifications apportes. Nous esprons que cette F.A.Q. pourra rpondre vos questions. lien : Comment participer cette F.A.Q. ? lien : La rdaction de www.developpez.com

Comment participer cette F.A.Q. ?


Auteurs : Clment Cunin - Giovanny Temgoua Cette F.A.Q. est ouverte toute collaboration. Pour viter la multiplication des versions, il serait prfrable que toute collaboration soit transmise aux administrateurs de la F.A.Q. Plusieurs comptences sont actuellement recherches pour amliorer cette F.A.Q. : rdacteur : bien videmment, toute nouvelle question/rponse est la bienvenue ; correcteur : malgr nos efforts des fautes d'orthographe ou de grammaire peuvent subsister. Merci de contacter les responsables (adresse mail au bas de la page) si vous en dbusquez une... Idem pour les liens errons.

Vous pouvez galement participer la F.A.Q Delphi soit : en envoyant par mail votre QR aux responsables (adresse mail au bas de la page) ; en postant votre QR dans ce sujet du forum Delphi.

Remerciements
Auteur : Gysmo Remerciements tous ceux qui ont contribu de prs ou de loin l'laboration de cette F.A.Q.

-6Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Remerciements l'quipe des rdacteurs du forum F.A.Q. Delphi, qui ont grandement contribu la ralisation de cette F.A.Q. Remerciements aux correcteurs, qui nous ont bien aid corriger les fautes de franais. Enfin, un grand merci Clment Cunin, auteur originel du cadre de cette F.A.Q. et auteur de la F.A.Q. Java. lien : Les contributeurs de la rubrique Delphi

-7Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gnralits

-8Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gnralits > Installation et informations O trouver des cours et des tutoriels en franais pour Delphi ?
Auteur : Gysmo Vous trouverez sur la page Cours Delphi et Pascal un rfrencement des meilleurs cours et tutoriels Delphi consulter ou tlcharger gratuitement.

O trouver des composants et outils freeware pour Delphi ?


Auteur : Gysmo Sur la page Freewares Delphi une slection des meilleurs composants VCL avec source et outils pour Delphi vous attend, ainsi que des liens vers d'autres sites aussi complets. lien : Composants VCL et outils freewares pour Delphi

Peut-on installer plusieurs versions de Delphi sur un mme systme ?


Auteurs : Gysmo - Laurent Dardenne Bien sr, lors de l'installation le setup vous propose par dfaut d'installer Delphi dans le rpertoire 'C: \Program Files\Borland\Delphi X', le X correspondant la version de Delphi ; ainsi vous aurez autant de rpertoires que de versions. Nanmoins, deux versions identiques mais en ditions diffrentes ne peuvent pas cohabiter sur un mme systme : cela n'a pas d'intrt. Il est important d'installer la version la plus rcente en dernier, ou la plus utilise en dernier. En effet Windows ouvrira les fichiers propres Delphi avec la dernire version installe. Vous pouvez toutefois modifier ceci dans l'explorateur, menu Outils|Options des dossiers|Type de fichiers, slectionnez les fichiers Delphi (.dpr, .pas, .dfm, .dpk) (.bdsproj, .nfm pour Delphi 2005 et suprieure) et modifiez le nom de l'excutable qui ouvrira ces fichiers.

Comment automatiser l'installation du SP1 pour Delphi 2005 ?


Auteur : Laurent Dardenne Cette procdure concerne Delphi 2005 Architecte FR. Dans les exemples fournis : le lecteur C reprsente le disque sur lequel Delphi 2005 a t install, le lecteur E reprsente le lecteur de CD-ROM/DVD-ROM dans lequel vous insrez les CD d'origines de Delphi 2005, le lecteur D reprsente le disque sur lequel vous recopier les CDs d'origines de Delphi 2005.

Copiez l'intgralit du premier CD de Delphi 2005 dans un rpertoire, si possible sur un second disque :
D:\Delphi2005

soit par l'explorateur soit dans une console par la commande :


XCopy /S /E /V E:\*.* D:\Delphi2005

-9Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Une fois la copie du premier CD effectu, insrez le second CD puis dans une console, surtout n'utilisez pas l'explorateur de fichier, excutez la commande suivante :
XCopy /S /E /V E:\*.* D:\Delphi2005

Rpondez non aux 5 questions demandant de remplacer les fichiers dj existant qui sont : D:\Delphi2005\readme.htm D:\Delphi2005\bdn.html D:\Delphi2005\deploy.htm D:\Delphi2005\install.htm D:\Delphi2005\MSDEInfo.htm

Une fois la copie du second CD termin, excutez le patch 1 pour Delphi 2005
D:\backup\Delphi\d2005_ARCH_upd1.exe

Note : Si vous souhaitez obtenir la liste des paramtre de lancement utilisez


D:\backup\Delphi\d2005_ARCH_upd1.exe /?

Le paramtre /S permet, une fois les cls de registre modifies d'automatiser son excution (Voir en fin de document) . Ensuite le programme de patch vous demande d'insrer le premier CD, nomm "Delphi2005Disk1", dans le lecteur. Indiquez ici le nom du rpertoire dans lequel vous avez recopi les CD d'origines, vous pouvez utiliser le bouton 'Parcourir'.
D:\Delphi2005\Borland Delphi 2005 Architect Edition.msi

Cliquez sur Ok. L'installation du patch dmarre. Cliquez sur Ok pour fermer le programme de patch. Vous pouvez vrifier les informations de version dans le menu "Aide -> A propos de Borland Studio Developpeur pour Windows". Note : Le nom du rpertoire source est mmoris dans la cl de registre suivante :
[HKEY_CLASSES_ROOT\Installer\Products\653A05086F36402448CD722277F64E77\SourceList] "PackageName"="Borland Delphi 2005 Architect Edition.msi" "LastUsedSource"="n;1;D:\\Delphi2005\\Install\\"

- 10 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gnralits > Utilisation de l'EDI, toutes versions Comment chercher de l'aide dans Delphi ?
Auteur : Delphi-fan Ce sujet a pour but d'indiquer quelques techniques efficaces pour obtenir de l'aide dans Delphi, avant d'interroger le forum et le Net... 1- A l'intrieur de l'IDE Delphi - Dans l'explorateur de code, si on positionne le curseur sur un mot cl (fonction, type) , un message rectangulaire apparat qui prcise l'unit (.pas) et la ligne dans laquelle le terme est dfini. exemple : Trunc -> func System.Trunc: - system.pas ( 18 ) - Sur un mot cl, F1 lance l'aide Delphi si elle est disponible et si le fichier d'aide a t ajout l'aide en ligne gnrale. - Aprs saisie du nom d'un composant, si on rajoute '.' , une liste des proprits et mthodes du composant apparat. exemple : Edit1. -> property constraints , Font ... - Dans l'inspecteur de proprits, F1 dans une proprit lance l'aide sur le composant et la proprit courante. - Pour obtenir la liste des identificateurs accessibles au moment de la frappe il suffit de faire CTRL-ESPACE. La liste des variables, fonctions et procdures utilisables est alors affiche. Cette liste est filtre par le dbut du mot dj tap 2- De manire directe - Aller dans le Menu Dmarrer / programmes / delphi / aide et choisir l'aide spcifique ce que l'on recherche : a) tout ce qui concerne les composants figure dans l'aide sur la "bibliothque de composants visuels" (VCL) b) pour des infos sur la base de la programmation Delphi, aller dans "Rfrence du pascal objet" c) si on ne trouve pas ce qu'on cherche, voir les aides spcifiques et plus particulirement l'aide sur les API Windows (SDK Win32). - Des exemples de code sont fournis dans Delphi : c:\program files\borland\delphi..\demos et : c:\program files\borland\delphi..\Help\Examples

Comment bien prsenter son code ?


Auteur : Nono40 Il y a un nombre important de programmeurs Delphi. Pour que le code puisse tre lisible par tous sans difficults, il convient de suivre des rgles d'criture communes. Ces rgles sont dfinies par Embarcadero ici : http://docwiki.embarcadero.com/RADStudio/ XE4/en/Formatting_Source_Code lien : DelForExp Formatteur de code Delphi lien : Rgles d'indentation en Pascal par Philippe Gormand

Comment rechercher de l'aide sur les API Windows ?


Auteurs : Nono40 - Pierre Castelain Il existe deux sources principales d'information sur les fonctions de l'API Windows : La premire est le fichier d'aide Win32 fourni avec toutes les versions de Delphi. Celui-ci est accessible directement depuis le menu Aide de Delphi dans certaines versions. Il est toujours accessible depuis le menu Dmarrer dans la rubrique Aide (ou Help) de Delphi. Cependant ce fichier correspond une version ancienne de l'aide de Microsoft et n'inclut que les systmes Windows 95, Windows NT4 et Win32s.

- 11 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

La deuxime source d'information, plus complte, est le site Microsoft Developer's Network ou MSDN. Vous trouverez sur ce site toutes les documentations de toutes les API Windows. Ce site est accessible tous l'adresse : http://msdn.microsoft.com/en-us/default.aspx Si vous cherchez de l'aide sur une fonction ou une message d'une API windows, la page de recherche est ici : http://msdn.microsoft.com/library/ Il est aussi possible de tlcharger le SDK entier de Microsoft l'adresse suivante : http:// msdn.microsoft.com/en-US/windows/apps/br229516 Il faut prendre le SDK de la version de Windows la plus rcente (2003 serveur en ce moment) et n'installer que l'aide. Vous disposez alors de l'aide complte accessible bien plus facilement que sur le net. Pour tlcharger c'est ici : Windows Server 2003 SP1 Platform SDK Web Install Windows Server 2003 SP1 Platform SDK ISO Install Windows Server 2003 SP1 Platform SDK Full Download

Comment dsactiver l'affichage des exceptions ?


Auteur : sjrd Vous avez beau grer les exceptions via un bloc try..except..end et les messages d'erreurs sont toujours prsents ! C'est parce que Delphi intercepte les exceptions avant vous, au moment mme du raise. Pour dsactiver cette option, faites ceci : Menu Outils\Options du dbogueur ; Onglet Exceptions du langage ; Dcocher la case Arrter sur exception Delphi.

Comment modifier la liste des raccourcis propose dans la fentre 'Ouvrir' ?


Auteur : Laurent Dardenne Il est parfois fastidieux de devoir slectionner une suite de rpertoires pour accder un projet. Windows offre la possibilit, au travers de la cl de registre HKEY_CURRENT_USER\Software\Microsoft\Windows \CurrentVersion\Policies\comdlg32\PlacesBar de modifier la liste des raccourcis proposs. Vous pouvez pour ce faire utiliser soit un fichier de registry soit les Power Toys Tweak UI-XP (Common Dialogs->Places Bar). Si on ajoute une entre, dans la base de registre, les raccourcis par dfaut ne sont plus affichs mais la suppression de cette nouvelle entre rtablit l'affichage des raccourcis par dfaut. Les modifications sont dynamiques, vous pouvez donc modifier les raccourcis ' la vole'.

Comment utiliser un programme externe via l'EDI ?


Auteur : Laurent Dardenne L'utilisation du menu Outils permet l'excution de programme tiers ou d'un script console. Voici un exemple qui permet d'ouvrir une console dans le rpertoire du projet en cours dans l'EDI. Dans le menu Outils faite Ajouter puis renseigner les champs suivant : Titre : Ouvrir une console dans le rpertoire du projet Programme : C:\WINDOWS\system32\cmd.exe Rpertoire de travail : C:\WINDOWS\system32 Paramtres : /K cd $PATH($EXENAME) Le menu Macro vous permet de slectionner un ou plusieurs paramtres comme $PATH et $EXENAME. A noter que la commande $PROMPT() permet la saisie de paramtres avant l'excution du script.
- 12 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

L'appel d'un script DOS se fait, par exemple, en renseignant Paramtres avec :
/K call "FullPath\NomScript.cmd" ParamtresDuScript

o ParamtresDuScript peut tre un des noms de macros.

Comment crer ses propres modles de code dans Delphi ?


Auteur : Skywaukers Il existe dans l'EDI de Delphi une fonctionnalit bien intressante, c'est la possibilit d'avoir des modles de code. Avec cette fonctionnalit la saisie de code peut s'avrer beaucoup plus rapide. Par exemple chaque fois que je veux insrer une boucle dans mon code, je tape :
//On tape forb puis on fait CTRL + J dessus forb + ctrl + J

et l'EDI remplace ce que je viens de taper par :


for := begin end; to do

Il existe ainsi toute une liste de raccourcis prdfinis dans l'EDI. Mais ce n'est pas tout, nous pouvons galement crer nos propres raccourcis. Pour cela voici comment procder: Pour aller dans le paramtrage des modles de code, il faut choisir dans le menu 'outils', l'onglet 'Options de l'diteur'. Dans la fentre qui apparat, choisir l'onglet 'Options du source'. Dans l'onglet qui apparat, cliquez sur le bouton qui s'intitule : 'Modifier modles de code...' Sur la fentre intitule 'Modles de codes' qui vient de s'ouvrir, vous voyez sur la partie haute, la liste des modles existants dans l'EDI. Cette liste a deux colonnes, la premire contenant le raccourci correspondant et la deuxime une brve description du modle. En cherchant dans la liste, nous retrouvons notre modle 'forb'. Cliquons dessus. Nous voyons apparatre dans la partie basse de la fentre le source qui est gnr par l'EDI lorsque nous invoquons le modle. Nous pouvons voir galement des boutons permettant la gestion de ces modles (Ajouter..., Modifier..., Supprimer...). Nous cliquons donc sur 'Ajouter...'. Une bote de dialogue nous demande alors de saisir le raccourci et la brve description de celui-ci. Pour l'exemple, nous allons crer un raccourci qui permet d'instancier un TSQLQuery sans variable d'instance, code qui me sert trs souvent dans mes applications. Nommons-le tsql. Dans la description, inscrivons SQLQuery sans variable d'instance et validons. Nous sommes revenu l'cran de gestion des modles avec notre nouveau modle en bas de liste et la zone de code vierge. C'est ici que nous allons saisir notre modle. Saisissons le code suivant :
with TSQLQuery.Create(nil) do begin try SQLConnection := | SQL.Clear; finally Free;

- 13 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end; end;

Remarquez le caractre Pipeline (trait vertical) sur la 4me ligne : il indique quel endroit l'IDE doit placer le curseur aprs avoir crit le modle. Il ne reste plus qu' cliquer sur 'Ok', notre modle est prt. Il suffit maintenant de taper :
tsql + ctrl + j

pour que Delphi accole notre modle cet endroit.

Comment viter de rinstaller ses composants aprs une rinstallation de Delphi ?


Auteurs : Olivier Lance - Laurent Dardenne Delphi tient une liste des paquets qu'il charge son dmarrage dans la base de registre, aux clefs suivantes : HKCU\Software\Borland\Delphi\7.0\Known Packages jusqu' Delphi 7 (en remplaant 7.0 par 6.0 par exemple) HKCU\Software\Borland\BDS\2.0\Known Packages partir de Delphi 8 (3.0 pour Delphi 2005)

Pour viter d'avoir rinstaller vos composants en rinstallant Delphi, commencez par sauvegarder dans un rpertoire vos paquets compils (*.bpl, dans <DELPHI>\Projects\Bpl) dans un rpertoire de votre choix. Ensuite dsinstallez et rinstallez Delphi. Pour terminer, ajoutez dans la clef registre correspondant votre version une valeur chane par paquet rfrencer. Le nom de cette valeur doit tre le chemin du paquet charger. Le contenu est utilis par Delphi pour la description du paquet, vous pouvez donc y stocker le texte de votre choix. A son prochain lancement, Delphi chargera les paquets que vous lui avez indiqus. Dans le cadre d'un dveloppement en quipe, il est souhaitable d'automatiser la configuration ou le dploiement ponctuel d'informations identiques pour chaque poste des membres de l'quipe. Avant d'effectuer vos tests il est prfrable d'effectuer une sauvegarde de la cl de registre \Known Packages. Le batch suivant permet d'automatiser cette opration. Il fonctionne uniquement sous XP, pour Windows 2000 ou NT il vous faudra l'adapter avec un outil tiers issu par exemple du kit de ressource NT. Les informations des nouvelles entres sont extraites d'un fichier ASCII puis parses dans une boucle For.
@echo on rem Ajout de package Delphi rem REG.exe est natif sous XP rem Pour Delphi 2005 la cl se nomme rem Set KeyPackage=HKEY_CURRENT_USER\Software\Borland\BDS\3.0\Known Packages rem Pour Delphi 7 la cl se nomme Set DelphiPackagesKey=HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Known Packages rem Pour les versions infrieures remplacer 7.0 par le numro de votre version : rem 6.0 ou 5.0 ou 4.0 rem Lit un fichier Ascii, chaque ligne est spare par un retour chariot. rem Le format d'une ligne correspondant : Path du package*@Description du package rem Exemple : rem C:\Delphi\unit\LMD70SE\LIB\D9\lmd70se_D9.BPL@*@LMD-Tools 7.0 Special Edition rem Parcourt le fichier ligne par ligne, le dlimiteur est la suite de caractres @*@ rem La variable %PckPath% contient le path complet du package rem La variable %PckDesc% contient la description du package
- 14 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

For /F "tokens=1,2 delims=@*@" %%A in (Packages.txt) do Set PckPath=%%A&amp;Set PckDesc=%%B&amp; Call :ADD goto end :ADD rem Ajoute un nouveau package ou remplace la description si la cl ?lphiPackagesKey% existe dj REG ADD "?lphiPackagesKey%" /v "%PckPath%" /t REG_SZ /d "%PckDesc%" /f Goto :eof :end

lien :

Comment configurer les entres du menu Tools ?

Comment effectuer des tches d'criture ou de mise en forme rptitives dans l'EDI ?
Auteur : anapurna Pour rpter plusieurs fois la mme opration dans l'EDI, vous pouvez utiliser l'enregistrement de macros : Appuyez sur les touches [CTRL][SHIFT][R] pour lancer la squence d'enregistrement. Effectuez les oprations rpter (une fois). Utilisez nouveau [CTRL][SHIFT][R] pour finir l'enregistrement. Enfin, utilisez [CTRL][SHIFT][P] pour rpter l'operation que vous venez d'enregistrer

Description des diffrents fichiers d'un projet Delphi


Auteur : Laurent Dardenne Lors de la cration et de la compilation d'une application sous Delphi, des fichiers portant diffrentes extensions sont gnrs automatiquement. Voici leur signification : BPL : Borland Package Library (Librairie de package Borland) : Le package compil et chargeable. Ce fichier est une librairie partage (DLL) contenant des spcificits propres Borland. Le nom de base du package est le mme que le fichier de source dpk. CAB : C'est le format de fichier que Delphi propose aux utilisateurs dployant sur le WEB. Ce format compress est une manire efficace d'empaqueter de multiples fichiers. DBI : Ce fichier texte contient les informations d'initialisation pour l'exporateur de base de donnes. Ce fichier ne doit pas tre dit except par l'explorateur de base de donnes. DCI Ce fichier texte contient le code des templates clavier prdfinis et ceux dfinis par l'utilisateur l'utilisateur de code pour l'usage dans l'EDI. DCP : Fichier de symbole d'un package : Une image binaire contenant le header du package ainsi que la concatnation de l'ensemble des fichiers dcu (Windows) ou dcu(Linux) du package. Un seul fichier dcp est cr/compil pour chaque package. Le nom de base du fichier dcp est le mme que celui du fichier source dpk. DCT : Ce fichier binaire propritaire contient les informations de template des composants dfinis par l'utilisateur. Ce fichier ne doit pas tre dit except par l'EDI. Depuis que ce fichier est propritaire, le format et la compatibilit avec les futures versions de Delphi peuvent changer quelque peu. DCU : Un fichier par fiche (TForm) ou par unit. Il contient le code compil correspondant la fiche ou l'unit de mme nom.

- 15 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Delphi utilise ces fichiers lors de la compilation. Ils ne sont recompils que si le fichier .PAS ou DFM a t modifi. Dans le cas d'une distribution de composants sans les sources il sont obligatoires. DDP : Un fichier par fiche (TForm) ou par unit. Il s'agit du diagramme de conception associ, dans le cas d'une fiche il porte le mme nom. DEM : Ce fichier texte contient les quelques formats standards spcifiques un pays pour un composant TMaskEdit. DFM : Un fichier par fiche (TForm). Ce fichier contient les dtails des composants contenus dans une fiche. Il peut tre visualis comme un fichier texte par un clic-droit sur la la forme et en choisissant le menu contextuel "voir comme texte" ou converti l'aide de l'outil Delphi\Bin\convert.exe ( utiliser avec prcaution). DLL : Un fichier par Projet. Il s'agit de la version compile de votre projet DLL. DMT : Ce fichier binaire propritaire contient les informations de template des menus transports et dfinis par l'utilisateur. Ce fichier ne doit pas tre dit except par l'EDI. Depuis que ce fichier est propritaire, le format et la compatibilit avec les futures versions de Delphi peuvent changer quelque peu. DPK : Fichier source d'un package : Dtermine quelles units sont contenues dans le package et quels autres packages sont requis. Analogue au fichier .DPR d'un projet Delphi standard. DOF : Ce fichier texte contient les options courantes du projet associ, telles que les options de compilation et de l'diteur de liens, des divers rpertoires, les directives de compilation conditionnelles... A partir de Delphi 2005 ce fichier a t remplac par le fichier .bdsproj DRO : Ce fichier texte contient des informations sur le rfrentiel d'objets (repository). Chaque entre de ce fichier contient des informations spcifiques sur chaque lment disponible dans le rfrentiel. Bien que ce dossier soit un fichier de texte d'objets vitez de le modifer dans un diteur. Utiliser de prfrence le menu de Outils|Rfrentiel dans l'IDE. DSK : Un fichier par Projet. Il contient la description de l'environnement visuel du projet (Affichages par dfaut, positionnement des palettes d'outils, ...). DSM : Un fichier par Projet. Si dans les options de projet vous avez coch l'option enregistrement->bureau et symboles, il permet d'optimiser le chargement de Delphi et de conserver votre environnement de travail, les points d'arrts, les fichiers chargs,... EXE : Un fichier par Projet. Il s'agit de la version compil correspondant votre application. MAP : Un fichier par Projet. Contient la description de l'implmentation mmoire des objets et units de votre projet. OCX : Un fichier OCX est une DLL spcialise qui contient tout ou parties des fonctions associes un contole ActiveX. OPT : Un fichier par Projet. Il contient la description des options de compilation, lieur, dbogage, rpertoires par dfaut,... PAS :

- 16 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Un fichier par fiche (TForm) ou par unit. Il s'agit du fichier source, dans le cas d'une fiche il porte le mme nom. Note : L'dition d'un fichier associ une fiche en dehors de l'EDI peut avoir comme consquence la perte d'informations entre le fichier .DFM et le .PAS. RES : Un fichier par ressource externe (possibilit de les regrouper). Ce sont les ressources externes utilises par l'application (Bitmap, icnes, dialogues imports, ...) . Il est cr/recr lors d'une compilation. RSM : Ce type de fichier est gnr par le compilateur (Dcc32- VR) et est utilis pour le dbogage distance. Le fichier est plac sur la machine distante et ce dans le rpertoire de l'application. TLB : Le fichier binaire d'une librairie de type. Permet d'identifier les types d'objets et d'interfaces disponibles dans un serveur ActiveX. Note : Les fichiers nomms (~xx) sont des versions de Back-up, ils sont crs lors de l'enregistrement d'une nouvelle version par l'EDI. Certains fichiers peuvent ne pas exister sur toutes les versions de Delphi. lien : Fichiers pour Delphi 2005

Comment convertir automatiquement les DFM binaire d'un projet en DFM texte ?
Auteurs : gbegreg - Korntex5 - Pedro Il est parfois utile de convertir de nombreux fichiers binaire .DFM en texte, puis aprs traitement de ces fichiers texte de les convertir nouveau en .DFM. Delphi propose pour ce faire le programme en ligne de commande nomm convert.exe qui se trouve dans le rpertoire d'installation de Delphi. Pour l'utiliser, il suffit de saisir la commande :
convert.exe -t -i c:\nom_fichier.dfm

Dans cet exemple, on force la conversion d'un .DFM binaire en texte. Pour afficher les options disponibles , excuter convert.exe sans paramtre. Vous trouverez, dans la section Lien, un outil gratuit -et ses sources- permettant cet automatisme en mode graphique. lien : DFM Binary to Text

- 17 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gnralits > Utilisation de l'EDI, Delphi 2005 Comment crer des sections de code 'pliable' ?
Auteur : Laurent Dardenne Sous Delphi 2005 la notion de 'Pliage du code' a fait son apparition. Il s'agit de masquer des sections de code dans l'diteur. Le pliage du code vous permet de crer une vue hirarchique facilitant ainsi la naviguation et la lecture du code. Les mthodes contenues dans une rgion pouvant tre plies ou dplies selon la visibilit souhait. Le code repli n'est pas supprim mais seulement masqu. On utilise la directive REGION pour raliser cette hirarchie, l'insertion du code suivant :
{$REGION 'Test de pliage de code'} {$REGION 'Mthodes globales'} {$ENDREGION} {$REGION 'Mthodes spfiques et en phase de test'} {$ENDREGION} {$ENDREGION}

Affichera dans l'diteur le code suivant +'Test de pliage de code' Pour utiliser cette fonctionnalit, cliquez sur les symboles '+' et '-' situs ct du code. Le menu contextuel de l'diteur proposant les menus 'Plier' et 'Dplier'. Vous pouvez aussi utiliser les raccourcis clavier ( texte issu de la documentation Borland ) : Pour dsactiver le pliage de code pour la session d'dition en cours, maintenez enfonces les touches Ctrl+Maj puis appuyez sur K puis sur O. Pour replier le bloc de code le plus proche, maintenez enfonces les touches Ctrl+Maj puis appuyez sur K puis sur E. Pour tendre le bloc de code le plus proche, maintenez enfonces Ctrl+Maj puis appuyez sur K puis sur U. Pour tendre tout le code, maintenez enfonces Ctrl+Maj puis appuyez sur K puis sur A.

Comment acclrer le lancement de Delphi 2005 en se crant des configurations spares ?


Auteur : Pascal Jankowski L'environnement de dveloppement (EDI) fournit maintenant un support au dveloppement d'applications Delphi pour .NET, Delphi pour Win32, et C#, mais il rare que nous ayons d'utiliser les trois dans une mme session de travail. Le soft Delphi Configuration Manager vous permettra de configurer votre session de delphi en choisissant par exemple de lancer uniquement l'environnement de travail Win32, ou C# builder. Cela permet une conomie non ngligeable des ressources et un gain de temps lors du lancement de Delphi. Vous trouverez le soft cet endroit et il est libre d'utilisation. Vous trouverez le guide d'utilisation et de configuration de ce soft cet endroit.

- 18 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Remarque : ce soft fonctionne galement avec les versions 6,7,8 de Delphi.

Comment revenir l'interface classique style Delphi 7 avec Delphi 2005 ?


Auteur : Nono40 Pour ceux qui prfre l'interface classique de Borland, il est possible d'y revenir facilement dans Delphi 2005. - Menu outils->Options... - Dans la zone de droite choisir Options d'environnement->Options Delphi->Concepteur VCL - Dcocher l'option Concepteur incorpor - OK, OK. - Redmarrer Delphi 2005

Quelles sont les nouveauts dans l'diteur de Delphi 2005 ?


Auteur : Pierre Castelain Beaucoup de nouveaut ont t ajoutes dans l'diteur : - Refactoring - Sync Edit - Error Insight - Help Insight - etc

Dcouvrez toutes ces nouveauts ici : Premier contact avec le futur de Delphi par Pierre Castelain. lien : Premier contact avec le futur de Delphi

Quelles sont les nouveauts du langage dans Delphi 2005 ?


Auteur : Laurent Dardenne Afin de respecter les convention objet sous .NET, le langage Pascal Objet pour les applications .NET a t adapt. Pour connatre les nouveauts du langage sous Win32 et .NET, consultez cet article : Les volutions du langage Delphi sous Delphi 2005 par Laurent Dardenne. Consultez aussi la FAQ .NET lien : lien : Les volutions du langage Delphi sous Delphi 2005 FAQ .NET

Comment corriger les violations d'accs lors de l'affichage de l'aide dans Delphi 2005 ?
Auteurs : doustij - Laurent Dardenne Il se peut que vous n'arriviez plus accder l'aide Delphi partir de l'IDE; l'appui sur F1 vous affiche un message d'erreur (avec ventuellement des violations d'accs dans les modules coreide90.bpl ou htmlhelp290.bpl) :
- 19 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Aucun systme d'aide bas sur des rubriques n'est install.

Il s'agit d'un bug connu et rsolu par le support technique de Borland. Il suffit de : - crer la cl HKEY_CLASSES_ROOT\AppID\DExplore.exe - donner celle-ci la valeur par dfaut 'Microsoft Document Explorer' (sans quotes) - ajouter ensuite une valeur chaine appele AppID valant {4A79114D-19E4-11d3-B86B-00C04F79F802} A prsent, vous pourrez accder normalement l'aide. Delphi 2005 utilise DExplore.exe version 7
HKEY_CLASSES_ROOT\CLSID\{4A79114D-19E4-11d3-B86B-00C04F79F802}

Delphi 2006 utilise DExplore.exe version 8:


HKEY_CLASSES_ROOT\CLSID\{639F725F-1B2D-4831-A9FD-874847682010}

La cl HKEY_CLASSES_ROOT\AppID\dexplore.exe contient une rfrence vers la dernire version install de DExplore.exe Il est aussi possible d'utiliser un programme freeware de visualisation des espaces de nom relatif au fichier d'aide disponible sur: http://helpware.net/mshelp2/h2viewer.htm. Pour les postes ayant Delphi 2005 et Delphi 2006 d'install on peut avoir l'aide en ligne pour les 2 versions. Il suffit de modifier la cl HKEY_CLASSES_ROOT\AppID\dexplore.exe\AppID AVANT de charger Delphi.

Erreur "Aucune aide contextuelle installe" avec Application.HelpContext dans Delphi 2005+
Auteur : sjrd Cette erreur est due au fait que le systme d'aide interfaant WinHelp n'a pas t install. C'est l'unit WinHelpViewer qui se charge d'installer celui-ci. Il suffit donc de rajouter cette unit dans les uses de votre fichier projet ou de votre unit principale :
program MonProgramme; uses Forms, WinHelpViewer, // <== la solution est ici MonProgMain in 'MonProgMain.pas' {FormMain}; {$R *.res} begin Application.Initialize; Application.HelpFile := MonFichierDAide.hlp'; Application.CreateForm(TFormMain, FormMain); Application.Run; end.

- 20 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gnralits > Utilisation de l'EDI, Delphi 2006 Pourquoi les modles de code ne s'affichent plus dans la fentre Templates ?
Auteur : Olivier Lance Ce problme peut avoir plusieurs causes. La premire et la plus vidente est que vous n'avez peut-tre pas de modles de code dfinis pour le langage du fichier que vous ditez actuellement. Par dfaut ce sera par exemple le cas pour les pages HTML, XML etc. Pour vous assurer de la prsence ou non de modles de code pour le langage de votre document actif, effectuez un clic droit dans la fentre Templates et dsactivez l'item "Filtrer" : toutes les catgories de modles s'affichent. Vrifiez alors si une catgorie correspond votre langage ou non. S'il existe une catgorie pour votre langage et qu'elle ne s'affiche pas lorsque vous activez le filtrage, alors vous avez srement un modle de code de votre propre confection qui empche le filtrage de s'effectuer. Cela arrive si votre fichier XML dfinissant le modle contient une ou plusieurs erreurs. Il est par exemple important de vrifier la casse dans l'attribut language de vos balises script ou de votre balise code. D'autre part certains attributs sont requis et non facultatifs. Ils sont mis par dfaut lorsque vous crez un nouveau modle par le biais de l'interface de BDS et il ne faut pas les supprimer. Vrifiez la validit de vos fichiers XML, enregistrez-les en cas de modification et revenez sur votre fichier. Si le problme est rgl, les modles devraient s'afficher immdiatement.

- 21 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gnralits > Utilisation de l'EDI, Turbo Delphi 2006 Comment rsoudre les bugs des menus 'Importer un composant' et 'Librairie de type'?
Auteur : CodeGear Les menus Composant>Importer un composant et Voir>Librairie de type sont manquants suite un bug. Voici comment contourner ce problme : Crez le rpertoire suivant : $(BDS)\include\atl\ Crez dans ce rpertoire un fichier vide nomm : ATLBASE.H

Dsormais les 2 menus manquants sont accessibles sous Turbo Delphi Pro.

Comment obtenir un compilateur en ligne de commande sous Turbo Pro?


Auteur : Philton Dans sa version initiale, Turbo Professionnel n'offre pas la possibilit de compiler en ligne de commande. Cela se rvle vraiment problmatique par exemple lorsque vous dsirez installer automatiquement une collection de composants comme ceux de la JVCL. Pour rgler ce problme, tlchargez ici: http://edn.embarcadero.com/fr/article/33704 le compilateur en ligne chez CodeGear.

- 22 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gnralits > Automatisation de la configuration de Delphi Comment configurer les entres du menu Tools ?
Auteur : Laurent Dardenne Delphi maintient une liste des entres du menu Tools/Outils dans la base de registre. Il les charge lors de son excution et les sauvegarde en fin d'excution, lors de l'appel du menu Fichier-Quitter. Dans le cadre d'un dveloppement en quipe, il est souhaitable d'automatiser la configuration ou le dploiement ponctuel d'informations identiques pour chaque poste des membres de l'quipe. Avant d'effectuer vos tests il est prfrable d'effectuer une sauvegarde de la cl de registre \Transfert. Le batch suivant permet d'automatiser cette opration. Il fonctionne uniquement sous XP, pour Windows 2000 ou NT il vous faudra l'adapter avec un outil tier issu par exemple du kit de ressource NT. Les informations des nouvelles entres sont extraites d'un fichier ASCII puis parser dans une boucle For.
@echo off rem Ajout d'entres au menu Tools/Outils de Delphi rem REG.exe est natif sous XP rem Pour Delphi 2005 la cl se nomme rem Set DelphiToolsKey=HKEY_CURRENT_USER\Software\Borland\BDS\3.0\Transfer rem Pour Delphi 7 la cl se nomme Set DelphiToolsKey=HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Transfer rem Pour les versions infrieures remplacer 7.0 par le numro de votre version : rem 6.0 ou 5.0 ou 4.0 Set Count= rem Obtient le nombre actuel d'entres du menu Tools rem Lit la cl 'Count' qui contient le nombre d'entres du menu Tools (voir :REG QUERY ) rem rcupre la 3me ligne renvoye par le programme REG.exe, elle contient 'Count' (voir : Find) rem Delims dcoupe la ligne en 2 parties, ici '0x' est utilis comme sparateur (voir :FOR /F "delims=0x") rem on rcupre la seconde partie,%%J, dans une variable d'environnement numrique. (voir :"tokens=1,2") For /F "tokens=1,2 delims=0x" %%I in ('REG QUERY ?lphiToolsKey% /v Count^|find /I "Count"') do Set / A Count=0x%%J rem rem rem rem rem Count Titre du menu Path complet de l'excutable Rpertoire de lancement Paramtre de l'excutable : : : : : Count+1 "Title5"="Titre Test" "Path5"="PathTest" "WorkingDir5"="c:\temp" "Params5"="$NAMEONLY()"

rem Nombre courant de menu Set KeyCount=Count rem Titre du menu Set KeyTitre=Title rem Path complet de l'excutable Set KeyPath=Path rem Rpertoire de lancement Set KeyWorkingDir=WorkingDir rem Paramtre de l'excutable Set KeyParams=Params rem Lit un fichier Ascii, chaque ligne est spare par un retour chariot. rem Le format d'une ligne correspondant : Titre Test@-@PathTest@-@c:\temp@-@$NAMEONLY() rem Parcourt le fichier ligne par ligne, le dlimiteur est la suite de caractres @-@ For /F "tokens=1,2,3,4 delims=@-@" %%A in (Tools.txt) do Set Titre=%%A&amp;Set myPath=%%B&amp;Set WorkingDir=%%C&amp;Set Params=%%D&amp; Call :ADD goto end

- 23 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

:ADD rem Ajoute une nouvelle entre au menu Tools REG ADD "?lphiToolsKey%" /v "%KeyTitre%%Count%" /t REG_SZ /d "%Titre%" /f REG ADD "?lphiToolsKey%" /v "%KeyPath%%Count%" /t REG_SZ /d "%myPath%" /f REG ADD "?lphiToolsKey%" /v "%KeyWorkingDir%%Count%" /t REG_SZ /d "%WorkingDir%" /f REG ADD "?lphiToolsKey%" /v "%KeyParams%%Count%" /t REG_SZ /d "%Params%" /f rem Incrmente Count, aprs l'insertion il dbute Zro Set /A Count +=1 REG ADD "?lphiToolsKey%" /v "%KeyCount%" /t REG_DWORD /d "%Count%" /f Goto :eof :end

A son prochain lancement, Delphi chargera les nouvelles entres que vous avez renseign.

- 24 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gnralits > Dbogage Comment viter de tracer du code d'une unit lors du dbogage ?
Auteur : rv66 Pour viter de passer dans une unit pendant le dbogage, il suffit de placer la directive {$D-} en dbut de cette unit. Par exemple pour ne pas passer dans l'unit unit1.pas :
{$D-} // Pour empcher d'entrer en dbogage unit Unit1; interface ... implementation ... end.

Il faut par ailleurs noter que cette directive est globale toute l'unit.

- 25 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gnralits > Divers Comment convertir du code C vers Delphi ?
Auteur : Laurent Dardenne Vous trouverez des tutoriels sur : http://turbo-pascal.developpez.com/tutoriel/convertion_pascal_c/ Et un outil de conversion de Header C vers le Pascal sur : http://www.freepascal.org/tools/h2pas.html

Qu'est-ce qu'un compilateur natif ?


Auteur : Mac LAK Les diffrents types de compilateur sont un sujet extrment vaste, impossible rsumer ici. Cependant, le terme de "compilateur natif" revient assez souvent : il reprsente un compilateur qui traduit un code source d'un langage donn directement en instructions de langage machine, excutables nativement (d'o le nom) sur le processeur cible. Habituellement, ce type de compilateur s'appuie galement sur un systme d'exploitation pour des fonctions volues. Un compilateur natif est donc spcifique un triplet (Langage, Processeur, Systme d'exploitation) : un compilateur Pascal pour Linux est galement un compilateur natif, mais il ne produit pas le mme code qu'un compilateur Pascal pour DOS, ce dernier ne produisant pas le mme code qu'un compilateur Pascal pour Windows. La plupart des compilateurs natifs fonctionnent pour une classe de processeurs donns (exemple : processeurs architecture Intel x86, incluant donc les processeurs AMD), et sur une classe de systmes d'exploitation (exemple : plate-forme Win32 (de Win95 WinXP, donc), Unix/Posix (quasiment toutes les versions de Linux), etc...). Le compilateur Delphi est natif jusqu' la version 7, que ce soit sur Windows ou sur Linux (Kylix). A l'arrive de Delphi 8, la plate-forme .NET est supporte par Delphi : or, sur cette plate-forme, le code produit n'est plus natif, mais manag. En clair, il ressemble plus un pseudo-langage machine interprt qu' un vritable code machine. C'est galement le cas du langage Java. Cependant, il est toujours possible de compiler en mode natif : c'est le cas ds que l'on utilise la VCL ou la CLX. En gnral, un code natif est beaucoup plus rapide qu'un code manag, mais il n'est pas portable, et pire, peut ne plus fonctionner du tout sans recompilation sur la prochaine version de Windows. Un code manag le sera forcment, et sans recompilation. Le dbat entre code natif et code manag n'a pas sa place ici cependant : les deux principes doivent plus tre vus comme complmentaires qu'opposs. Note : Les langages interprts sont hors-sujet, car ils ne possdent pas de compilateur mais simplement un interprteur. lien : lien : lien : lien : Wikipedia en Franais Wikipedia en Anglais (plus complet). Qu'est-ce que la VCL ? Qu'est-ce que la CLX ?

- 26 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur

- 27 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Gestion excution Comment raliser un splash screen ?
Auteur : hachesse Un Splash Screen est un cran qui apparat pendant le chargement d'une application. Pour raliser un tel cran, il suffit de faire apparatre la fentre voulue ds l'initialisation de l'application et ce jusqu' l'affichage de la fentre principale, c'est dire jusqu'au chargement complet de l'application.
begin Application.Initialize; SplashScreen := TSplashScreen.Create(Application); { Cration la fentre de Splash SplashScreen.Show; { Affichage de cette fentre SplashScreen.Update; { forage de l'affichage de la fentre { sinon elle n'apparat que partiellement Application.CreateForm(TForm1, Form1); { Cration des autres fiches de l'application SplashScreen.Close; { Fermeture la fentre de Splash SplashScreen.Release; { Destruction de la fentre Application.Run; end.

} } } } } } }

lien : Comment mettre une image en fond de fiche ? splashscreen [11,4 ko]

Comment raliser un splash screen transparent ?


Auteur : MD Software La premire chose faire consiste crer un splash screen. Pour cela, Hachesse a dj rpondu la question ici. Pour ajouter la transparence, il suffit de passer true la proprit Transparent de la fentre faisant office de splash screen et de positionner la proprit BorderStyle bsNone. Sur des systmes prcdant Windows ME, la proprit Transparent n'a pas d'effet. Dans ce cas, il suffit de remplacer le fond de la fentre par l'image de l'cran. Ainsi, la fentre n'est pas rellement transparente, mais elle donne l'illusion de la transparence. Voici le code de la fentre faisant office de splash screen :
{...} type TSplashForm = class(TForm) {...} // Les composants de votre form procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormDestroy(Sender: TObject); {...} private FImageDeFond : TBitmap; {...} end; var SplashForm: TSplashForm; implementation {$R *.dfm} {...} procedure TSplashForm.FormCreate(Sender: TObject); begin //Pour connatre la version de Windows, il faut utiliser Win32MajorVersion et Win32MinorVersion
- 28 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

//Dans ce cas, il suffit d'utiliser Win32MajorVersion Win95, 98 et ME ont tous pour version majeure 4 if Win32MajorVersion = 4 then begin FImageDeFond := TBitmap.Create; FImageDeFond.width := Screen.width; FImageDeFond.height := Screen.height; FImageDeFond.canvas.CopyRect(ClientRect, Canvas, ClientRect); end; end; procedure TSplashForm.FormPaint(Sender: TObject); begin //Remplacement du fond de la fentre par l'image capture if Win32MajorVersion = 4 then 4 : canvas.CopyRect(ClientRect, FImageDeFond.Canvas, ClientRect); end; procedure TSplashForm.FormDestroy(Sender: TObject); begin //TOUJOURS dtruire ses objets if Win32MajorVersion = 4 then FImageDeFond.Free; end; {...}

lien :

Comment obtenir la version de Windows ?

Comment n'instancier qu'une seule fois un programme ?


Auteur : hachesse Il existe de nombreuses mthodes pour n'autoriser qu'une seule instance d'un mme programme. La plus lgante tant sans aucun doute l'utilisation des Mutex. Les Mutex sont en fait des variables globales qui gnrent un message d'erreur lorsque l'on tente de les instancier alors que cela a dj t fait. Pour interdire de lancer 2 fois une mme application, il suffit donc de tester si une erreur est produite lors de la cration d'un Mutex pour notre application. Cela se fait ds le lancement de l'application, c'est dire dans le code de base du projet accessible par le menu Projet| Voir la source. Le code source d'un nouveau projet tant :
program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.

Toutes les fonctions relatives aux Mutex se trouvant dans l'unit Windows, il est donc ncessaire de l'ajouter dans la clause uses. Afin d'tre totalement sr qu'une autre erreur ne vienne perturber le lancement de notre programme, il est prfrable d'effacer toute trace de la dernire erreur survenue dans le systme. On utilise pour cela la commande SetLastError(NO_ERROR). Il est prsent temps de crer le Mutex pour l'application. On utilise pour ce faire la commande CreateMutex(lpMutexAttributes: PSecurityAttributes, bInitialOwner:

- 29 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

LongBool, lpName: PChar): Cardinal o les paramtres correspondent respectivement aux attributs de scurit du Mutex, au thread qui en est le propritaire et au nom du Mutex. Si le Mutex existe dj, l'erreur ERROR_ALREADY_EXISTS ou ERROR_ACCESS_DENIED sera alors dclenche. Il faut donc tester la dernire erreur intervenue dans le systme et lancer ou non une instance de l'application. Le code de base du projet tant donc :
program Project1; uses Windows, Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} var H : THandle; Erreur: Integer; begin SetLastError(NO_ERROR); H := CreateMutex (nil, False, 'Nom de l application'); Erreur := GetLastError; if ( Erreur = ERROR_ALREADY_EXISTS ) or ( Erreur = ERROR_ACCESS_DENIED ) then Exit; Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; CloseHandle(H); end.

ERROR_ACCESS_DENIED implique l'existence du Mutex mais avec un accs interdit (session windows diffrente, service tournant sous un autre login utilisateur...). L'important, dans notre cas, est qu'il existe et donc que le programme (ou service) est bien actif et a verrouill le mutex. lien : Lien MSDN : fonction CreateMutex lien : Comment passer au premier plan une application instancie une seconde fois ?

Comment passer au premier plan une application instancie une seconde fois ?
Auteur : hachesse 1re mthode : en utilisant le nom de la classe L'ide est de chercher une fentre de mme classe que TApplication avec le mme titre. Et de mettre en avant plan une telle fentre si elle existe. Le code du projet ( .DPR ) devient le suivant :
begin if IsPrevInstance = 0 then begin Application.Initialize; Application.CreateForm(TMDIForm, MDIForm); //[...] Application.Run; end else AfficherInstance(IsPrevInstance); end.

- 30 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Les deux fonctions IsPrevInstance et AfficherInstance peuvent tre mises directement dans le code du projet ou dans une autre unit. Leur implmentation est la suivante :
function IsPrevInstance: HWND; var ClassName: array[0..255] of char; Title: string; begin Title := Application.Title; Application.Title := ''; { On change le titre, car on trouverait toujours une application lance, (la notre). } try GetClassName(Application.Handle, ClassName, 255); { Met dans ClassName le nom de la classe de l'application. } Result := FindWindow(ClassName, PChar(Title)); { Renvoie le Handle de la 1re fentre de Class (Type) ClassName, et le titre de l'application. } finally Application.Title := Title; { Restauration du vrai titre. } end; end; procedure AfficherInstance(InstHandle: HWND); begin { Restaurer l'application si minimise } ShowWindow(InstHandle, SW_RESTORE); { Mettre la premire instance en premier plan : } SetForegroundWindow(InstHandle); { Fin de la deuxime instance } Application.Terminate; end;

2me mthode : en utilisant la base de registre. La premire chose faire est de tester si l'application est dj instancie. Pour ce faire, on utilise les Mutex comme dcrits Comment n'instancier qu'une seule fois un programme ?. Ce test amne donc 2 cas de figures : L'application n'est pas lance Si l'application n'est pas instancie, il faut le faire, pour cela, le droulement classique du lancement d'une programme suffit. Il faudra tout de mme rcuprer certaines informations sur l'application. Ces information servirons faire repasser l'application au premier plan dans le cas d'un second lancement du programme. Pour cela, nous avons besoins de 2 handles : celui du programme lui mme et celui de la form principale. Ces 2 valeurs qui devront tre accessibles en dehors du programme seront stockes dans la base de registres de Windows sous la cl HKEY_CLASSES_ROOT\software\nom_de_la_cl et sous les noms FirstApplicationHandle et FirstFormHandle.
Application.Initialize; Application.CreateForm(TForm1, Form1); Registre := TRegistry.Create; try Registre.RootKey := HKEY_CLASSES_ROOT; Registre.OpenKey('\Software\nom_de_la_cl', True); Registre.WriteInteger('FirstApplicationHandle', Application.Handle); Registre.WriteInteger('FirstFormHandle', Form1.Handle); Registre.CloseKey; Registre.Free; except MessageDlg('Une erreur est survenue lors de l''criture dans la base de registre.', mtError, [mbOk], 0); Registre.Free;
- 31 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end; Application.Run;

L'application est dj lance Si l'application est dj lance, rien ne sert de la faire une seconde fois, c'est-dire que le chargement de l'application sera tout simplement stopp. Mais avant de quitter le lancement de l'application, il faut redonner le focus la premire instance du programme. C'est l que les donnes qu'il aura dposes dans la base de registres seront utiles pour l'identifier. La premire chose faire est donc d'aller chercher les 2 handles voulus dans la base de registre. Une fois que le programme aura le handle de l'application et celui de la fentre principale il pourra donner le focus cette dernire. Cela se fait grce 2 fonctions de l'API Windows ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL et SetForegroundWindow(hWnd: HWND): BOOL.
Registre := TRegistry.Create; try Registre.RootKey := HKEY_CLASSES_ROOT; Registre.OpenKey('\Software\nom_de_la_cl', True); FirstApplicationHandle := Registre.ReadInteger('FirstApplicationHandle'); FirstFormHandle := Registre.ReadInteger('FirstFormHandle'); ShowWindow(FirstApplicationHandle, SW_NORMAL); SetForegroundWindow(FirstFormHandle); Registre.CloseKey; Registre.Free; except MessageDlg('Une erreur est survenue lors de la lecture dans la base de registre.', mtError, [mbOk], 0); Registre.Free; end;

PS: il est prfrable de nettoyer la base de registres la fin de l'excution du programme. lien : Comment n'instancier qu'une seule fois un programme ? 1instance [2,77 ko] registre [3 ko]

Comment imposer une pause au programme ?


Auteur : Al-Yazdi Il existe deux manires pour faire cela : 1. La mthode Sleep Il suffit de mettre Application.Sleep(duree_voulue) o duree_voulue est exprime en millisecondes. Cette mthode prsente le dsavantage de ne pas traiter les messages. 2. La mthode GetTickCount La procdure GetTickCount nous informe sur le nombre de millisecondes coules depuis l'allumage du PC. Le problme est que cette quantit est stocke sur un DWord et que forcment un jour (49,7 jours aprs l'allumage du PC), elle va revenir zro. Pour corriger ce problme, nous allons donc utiliser des cardinaux.
var Tc: Cardinal; begin Tc := GetTickCount; repeat Application.ProcessMessages; until Cardinal(GetTickCount - Tc) > {Temps d'attente en ms}; end;

- 32 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Cette mthode est prfrer, car elle ne bloque pas la distribution des messages extrieurs.

Comment ne pas bloquer une application pendant un traitement long ?


Auteur : Nono40 C'est un problme courant dans de grand traitements en boucle, les fentres des applications ne peuvent tre rafrachies par Windows tant que le traitement est en cours. La solution est d'appeler la mthode Application.ProcessMessages rgulirement afin que les messages de mise jour de Windows puissent tre traits. Ceci permet aussi de programmer un bouton "Stop" sur le traitement sans en venir au AltCtrl-Sup. Dans le code ci-dessous, la variable Stop indique que le bouton "Stop" t appuy et que la procdure doit tre stoppe. L'appel de Application.ProcessMessages permet de mettre jour normalement la fentre pendant l'excution de la boucle.
type TForm1 = class(TForm) ... private { Dclarations prives } Stop : Boolean; ... end; ... procedure TForm1.BoutonMarcheClick(Sender: TObject); Var i:Integer; begin { Mise faux de l'arrt } Stop := False; I := 0; { Traitement long } Repeat Inc(i); Label1.Caption := IntToStr(i); { Mise jour des vnements en attente } Application.ProcessMessages; Until (i>=100000000)Or Stop; end; procedure TForm1.BoutonStopClick(Sender: TObject); begin { Demande d'arrt de la boucle } Stop:=True; end;

Comment rcuprer les paramtres passs au programme ?


Auteur : Al-Yazdi Delphi possde dans ce but deux fonctions : ParamCount: Integer et ParamStr(Index: Integer): String La premire nous indique combien de paramtres on t passs au programme, et la seconde nous indique quels sont-ils. Ainsi ParamStr(0) nous renseigne sur le nom du programme et son chemin, ParamStr(1) nous donne le premier paramtre reu et ainsi de suite. Exemple : On a lanc notre application en faisant glisser des fichiers sur l'icne. On va remplir une ListBox des chemins de tous les fichiers.
var
- 33 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

i: Integer; begin for i := 1 to ParamCount do MyListBox.Items.Append(ParamStr(i)); end;

Comment excuter une application extrieure ?


Auteurs : Laurent Dardenne - Mac LAK - Nono40 Pour excuter une application extrieure au programme il suffit d'utiliser la fonction suivante de l'API :
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; stdcall;

Il faut ajouter l'unit ShellApi dans la clause uses de l'unit contenant la fonction. Par exemple :
uses [...], ShellApi;

Tous les paramtres chanes doivent tre des PAnsiChar ou PChar. Rappel : Pour les versions 1 4 de Delphi, Il faut toujours transtyper explicitement les chanes constantes :
ShellExecute(0,PChar('open'),...)

A partir de Delphi 5, le transtypage est inutile :


ShellExecute(0,'open',...)

Dtail des paramtres : hwnd : est le Handle de la fentre qui servira de parent pour les messagesbox de l'application. Toujours passer Application.Handle en cas de doute, 0 sinon. Operation : Type d'opration effectue sur le fichier, a moins de savoir ce que l'on fait, passer 'open'. Ce paramtre peut prendre les valeurs suivantes : 'OPEN' ouvrir un document, ou excuter une application 'PRINT' pour imprimer un document 'EXPLORE' pour utiliser l'explorateur Windows en utilisant le chemin donn par FileName 'FIND' pour appeler la fentre de recherche en utilisant le chemin donn par FileName FileName : Nom de l'application lancer, du document ouvrir/imprimer, du rpertoire explorer, etc. Chemin complet requis, sauf si Directory est correctement renseign. Parameters : Liste des paramtres dans le cas ou FileName dsigne une application. Pour un document ou dans le cas o il n'y a pas de paramtres, mettre Nil Directory : Rpertoire par dfaut utilis dans le cas o FileName dsigne une application. Correspond en gnral au chemin de l'lment excut, ou nil si le chemin est absolu ou si le chemin de dmarrage n'a pas d'importance. ShowCmd : Dcrit comment la nouvelle fentre doit tre ouverte. Les plus utiles sont SW_SHOW pour afficher l'lment excut, SW_SHOWMINIMIZED pour l'excuter en fentre rduite et SW_HIDE pour cacher la fentre d'excution. Voir l'aide en ligne pour plus d'informations.

Quelques exemples d'utilisations :


- 34 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Lancer une application simplement :


ShellExecute(0,'OPEN','Wordpad.exe', Nil, Nil, SW_SHOW);

Lancer une application avec des paramtres :


ShellExecute(0,'OPEN','Wordpad.exe','C:\temp\essai.txt',Nil, SW_SHOW); // Excution de la commande systme "ipconfig /all" ShellExecute(Application.Handle,'open','ipconfig','/all',nil,SW_SHOW);

Lancer l'explorateur sur un rpertoire prcis :


ShellExecute(0,'EXPLORE','C:\MonRpertoire\', Nil, Nil, SW_SHOW);

Ouvrir un document :
ShellExecute(0,'OPEN','C:\Temp\Monfichier.txt', Nil, Nil, SW_SHOW);

Imprimer un document :
ShellExecute(0,'PRINT','C:\Temp\Monfichier.doc', Nil, Nil, SW_SHOW);

Appeler la fentre de recherche de Windows :


ShellExecute(Application.handle, 'find', 'c:\temp', Nil, Nil, SW_SHOWNORMAL);

Excuter un fichier Batch : Pour excuter un fichier Batch, il faut passer le nom du fichier l'interprteur de commande. Pour ceci, le paramtre FileName doit tre gal PChar(GetEnvironmentVariable('ComSpec')), et le paramtre Parameters doit tre gal '/C FichierBatch.bat ParamtresDuBatch'. Cette mthode permet d'excuter un batch sans erreurs, de Windows 95 Windows XP. Excution du batch "C:\bin\batch.bat", ayant les paramtres "-param1 -param2" :
ShellExecute( Application.Handle, 'open', PChar(GetEnvironmentVariable('ComSpec')), '/C batch.bat -param1 -param2', 'c:\bin', SW_SHOW);

Excution d'un batch "c:\bin\batch.bat" comme s'il tait excut depuis le rpertoire "c:\travail", avec les paramtres "-param1" :
ShellExecute( Application.Handle, 'open', PChar(GetEnvironmentVariable('ComSpec')),
- 35 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

'/C c:\bin\batch.bat -param1', 'c:\travail', SW_SHOW);

Rcupration et conversion des informations d'un raccourci Windows : - Clic droit sur le raccourci, puis "Proprits". - Pour la commande ShellExecute, les paramtres seront : hwnd : Application.Handle Operation : 'open' FileName : Le contenu de la ligne "Cible". Parameters : S'il y a des paramtres aprs l'excutable dans "Cible", mettez-les ici et pas dans FileName. Directory : Le contenu de la ligne "Dmarrer dans". ShowCmd : Suivant la liste "Excuter" : Fentre normale : mettre SW_SHOW. Rduite : mettre SW_SHOWMINIMIZED. Agrandie : mettre SW_SHOWMAXIMIZED.

Exemple de raccourci : Cible = "C:\Program Files\Microsoft IntelliPoint\dplaunch.exe" Mouse CPL Dmarrer dans = "C:\Program Files\Microsoft IntelliPoint\" Excuter : Fentre normale L'appel sera :
ShellExecute( Application.Handle, 'open', 'C:\Program Files\Microsoft IntelliPoint\dplaunch.exe', 'Mouse CPL', 'C:\Program Files\Microsoft IntelliPoint\', SW_SHOW);

Excuter un programme console en utilisant les redirections.


ShellExecute(0,nil, PChar(GetEnvironmentVariable('ComSpec')), PChar('/ C Net View > Resultat.txt'), nil, 0);

Le rsultat de la fonction ShellExecute est un entier. S'il est infrieur ou gal 32, l'excution a chou. S'il est strictement suprieur 32, le processus a t lanc correctement. Pour surveiller la fin du processus engendr, il est conseill d'utiliser CreateProcess au lieu de ShellExecute. Les codes d'erreur de ShellExecute sont symboliques. Ils correspondent ceci sur une cible Win32 : 0 : Erreur critique (mauvais paramtres en gnral, les vrifier tous). Si les paramtres sont corrects, un crash systme est imminent. ERROR_BAD_FORMAT : Le fichier n'est pas un excutable (vrifier FileName). SE_ERR_ACCESSDENIED : Accs au fichier refus (vrifier les droits de l'utilisateur). SE_ERR_ASSOCINCOMPLETE : Le type de document n'est pas correctement gr (vrifier Filename ou rinstaller l'application grant le document). SE_ERR_DDEBUSY : Serveur DDE occup. Ressayer plus tard. SE_ERR_DDEFAIL : La transaction DDE a chou. Demander s'il faut refaire un essai ou pas. SE_ERR_DDETIMEOUT : La transaction DDE a t trop longue. Demander s'il faut refaire un essai ou pas. SE_ERR_DLLNOTFOUND : Une DLL requise n'a pas t trouve (vrifier FileName et Directory).

- 36 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

SE_ERR_FNF : Le fichier n'a pas t trouv (vrifier FileName et Directory). SE_ERR_NOASSOC : L'extension du fichier n'est pas gre (il manque une application l'utilisateur, lui demander de l'installer). SE_ERR_OOM : Plus assez de mmoire pour effectuer l'opration (demander l'utilisateur de fermer des applications, ou librer de la mmoire). SE_ERR_PNF : Chemin non-trouv (vrifier Directory, parfois aussi FileName). SE_ERR_SHARE : Une erreur de partage s'est produite (le fichier est utilis par quelqu'un d'autre, ou par un autre programme, en mode exclusif).

On peut tester directement le code d'erreur :


Var Code : Cardinal ; Begin // On appelle ShellExecute "normalement". Code := ShellExecute (.....) ; // Ensuite, on vrifie si l'excution a t correcte : // Deux mthodes possibles : avec ou sans exceptions. If (Code<=32) Then // Affichage du message d'erreur "propre", sans exceptions. // Le rsultat de SysErrorMessage est une chane normale, dans la langue de l'OS. ShowMessage(SysErrorMessage(Code)); If (Code<=32) Then // Affichage du message d'erreur "hard", AVEC leve d'exception. // Remplacer par RaiseLastWin32Error sur les anciennes versions de Delphi. RaiseLastOSError; End;

Remarque : la fonction WinExec ne doit plus tre utilise, elle n'est prsente que pour des soucis de compatibilit. lien : Lien MSDN : fonction ShellExecute lien : http://delphi.developpez.com/telecharger/detail/id/3222/Comment-executer-une-applicationexterieure-et-rediriger-les-entres-sorties lien : http://delphi.developpez.com/telecharger/detail/id/3218/Capture-de-la-sortie-d-une-applicationconsole

Comment lancer et contrler une application extrieure ?


Auteur : Nono40 Pour lancer une application tout en rcuprant son handle de process, il faut utiliser la fonction API CreateProcess. Cette fonction permet d'excuter une ligne de commande avec un grand nombre d'options. Elles ne seront pas dcrites ici car ce n'est pas le but de cette QR. Cette fonction retourne aussi les handle des process et thread principaux de l'application lance. Cette particularit va tre utilise pour garder un contrle sur l'application. La ligne de commande passe CreateProcess ne doit pas contenir d'espace dans les noms de fichiers, ou alors il faut que les noms de fichiers soient entre " ". Par dfaut il est donc conseill de mettre les " " systmatiquement pour limiter les erreurs.
procedure TForm1.Button2Click(Sender: TObject); Var StartInfo : TStartupInfo; ProcessInfo : TProcessInformation; Fin : Boolean;
- 37 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin { Mise zro de la structure StartInfo } FillChar(StartInfo,SizeOf(StartInfo),#0); { Seule la taille est renseigne, toutes les autres options } { laisses zro prendront les valeurs par dfaut } StartInfo.cb := SizeOf(StartInfo); { Lancement de la ligne de commande } If CreateProcess(Nil, '"Notepad.exe"', Nil, Nil, False, 0, Nil, Nil, StartInfo,ProcessInfo) Then Begin { L'application est bien lance, on va en attendre la fin } { ProcessInfo.hProcess contient le handle du process principal de l'application } Fin:=False; Repeat { On attend la fin de l'application } Case WaitForSingleObject(ProcessInfo.hProcess, 200)Of WAIT_OBJECT_0 :Fin:=True; { L'application est termine, on sort } WAIT_TIMEOUT :; { elle n'est pas termine, on continue d'attendre } End; { Mise jour de la fentre pour que l'application ne paraisse pas bloque. } Application.ProcessMessages; Until Fin; { C'est fini } ShowMessage('Termin'); End Else RaiseLastOSError; End;

Ici l'exemple ne fait qu'attendre la fin de l'application, mais le handle retourn dans ProcessInfo.hProcess peut tre utilis dans toutes les fonctions API sur les process. Pour lancer une application avec des paramtres, il faut les insrer dans la ligne de commande :
CreateProcess(Nil,'"Notepad.exe" "c:\temp\essai.txt"' , Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo)

CreateProcess recherche l'excutable dans le rpertoire en cours puis les rpertoires par dfaut de Windows, mais il est possible de spcifier le rpertoire :
CreateProcess(Nil, '"C:\MesProg\MonAppli.exe"' , Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo)

lien : Comment excuter une application extrieure ? lien : Lien MSDN : fonction CreateProcess

Comment fermer une application externe ?


Auteur : Atlantis Pour pouvoir fermer une application extrieure (par exemple la calculatrice de Windows), nous avons besoin dans un premier temps de connatre son Handle de fentre. Pour cela nous allons utiliser la fonction FindWindow. Ensuite une fois que l'on connat le handle de cette fentre, il ne nous reste plus qu' lui envoyer le message WM_CLOSE par le biais de la procdure SendMessage.
var monhandle : THandle; Begin //Le second paramtre de FindWindow est le titre de la fentre!

- 38 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

monhandle := FindWindow(nil,'Calculatrice'); SendMessage(monhandle,WM_CLOSE,0,0); end;

Comment modifier le titre dans la barre des tches ?


Auteur : Nono40 Par dfaut le titre de l'application dans la barre des tches est le nom de l'excutable. Il est cependant possible de le modifier. A la conception Aller dans le menu Projet | Options... Puis dans l'onglet Application, modifier la valeur de "titre". A l'excution Modifier simplement la valeur de Application.Title

Comment lancer automatique une application au dmarrage de Windows ?


Auteur : Laurent Dardenne Si vous souhaitez excuter une application particulire au dmarrage d'une session utilisateur ajoutez une entre dans la cl \Software\Microsoft\Windows\CurrentVersion\Run de la base de registre.
procedure RegWriteRunApp(Path: string); var Reg: TRegistry; begin Reg := TRegistry.Create; try with Reg do begin RootKey := HKEY_CURRENT_USER; // A l'ouverture d'une session d'un utilisateur // RootKey := HKEY_LOCAL_MACHINE; // A l'ouverture d'une session de chaque utilisateurs if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False) then WriteString('MonAppli', Path); end; finally Reg.Free; end; end;

La cl Run est persistante la diffrence de la clef RunOnce, qui peut tre employ pour indiquer les commandes que le systme excutera une fois et puis supprimera. lien : Lien MSDN : Les des clefs Run et RunOnce

Comment savoir si une application est en cours d'excution ?


Auteur : Laurent Dardenne Pour retrouver le nom d'une application en cours d'excution on utilisera la fonction CreateToolhelp32Snapshot qui renvoie la liste des process. Ensuite on parcourra cette liste en utilisant la fonction Process32Next qui renvoi les informations d'un process dans un enregistrement de type TProcessentry32:

- 39 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

tagPROCESSENTRY32 = packed record dwSize: DWORD; // taille de l'enregistrement cntUsage: DWORD; // Compteur de rfrence du process, si zro le process se termine. th32ProcessID: DWORD; // Identifiant du process th32DefaultHeapID: DWORD; // Identifiant de la pile par dfaut du process th32ModuleID: DWORD; // Identifiant du module du process cntThreads: DWORD; // Nombre de thread du process th32ParentProcessID: DWORD; // Identifiant du process parent ( 'son crateur' ) pcPriClassBase: Longint; // Priorit de base des threads cre par ce process dwFlags: DWORD; // Rserv szExeFile: array[0..MAX_PATH - 1] of Char; // le nom de l'excutable. end;

Vous devez ajouter l'unit TLHelp32 dans la clause uses.


uses TLHelp32; function ExeRunning(NomApplication : string; StopProcess:Boolean):Boolean; //Test si une application est en cours d'excution // StopProcess indique si on termine l'application 'NomApplication' // Code propos par Thunder_nico var ProcListExec : TProcessentry32; PrhListExec : Thandle; Continu : Boolean; isStarted : Boolean; HandleProcessCourant : Cardinal; PathProcessCourant : string; ProcessCourant :String;

begin // Liste des applications en cours d'excution // Initialisation des variables et rcuperation de la liste des process ProcListExec.dwSize:=sizeof(ProcListExec); Continu := True; isStarted := False; Try // Rcupre la liste des process en cours d'xcution au moment de l'appel PrhListExec:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); if (PrhListExec <> INVALID_HANDLE_VALUE) then begin //On se place sur le premier process Process32First(PrhListExec,ProcListExec); // Tant que le process recherch n'est pas trouv et qu'il reste // des process dans la liste, on parcourt et analyse la liste while Continu do begin ProcessCourant := Uppercase(ExtractFileName(ProcListExec.szExeFile)); ProcessCourant := ChangeFileExt(ProcessCourant,''); isStarted := (ProcessCourant = Uppercase(NomApplication)); if isStarted then begin HandleProcessCourant := ProcListExec.th32ProcessID; PathProcessCourant := ExtractFilepath(ProcListExec.szExeFile); Continu := False; end else // Recherche le process suivant dans la liste Continu := Process32Next(PrhListExec,ProcListExec); end;
- 40 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

if StopProcess then if isStarted then begin // Termine le process en indiquant le code de sortie zro TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,HandleProcessCourant),0); Sleep(500); // Laisse le temps au process en cours de suppression de s'arrter end; end; Finally CloseHandle(PrhListExec); // Libre les ressources Result := isStarted; end; end;

Comment interdire la mise en veille d'une machine sous Windows ?


Auteur : Laurent Dardenne Solution propose par Keke des iles. Dans certain cas la mise en veille de la machine peut rendre impossible l'excution d'un traitement programm. Il convient donc dans ce cas d'empcher le systme de se mettre en veille. Lorsque le systme se charge de placer la machine en veille, il envoie le message WM_POWERBROADCAST toutes les applications actives. Ces applications pouvant ou non traiter ce message. Voici sa mise en oeuvre :

type TForm1 = class(TForm) private { Dclarations prives } public procedure WMPowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WMPowerBroadcast(var Msg: TMessage); const PBT_APMQUERYSUSPEND = $0000; begin if Msg.wParam = PBT_APMQUERYSUSPEND then Msg.Result := BROADCAST_QUERY_DENY; end; end.

- 41 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Ainsi, ds que votre application recoit le message WM_POWERBROADCAST, la procdure WMPowerBroadcast est appele et informe le systme de ne pas placer la machine en veille. Le systme ritrera cette demande de mise en veille ultrieurement.

Comment remettre son application en avant plan ?


Auteur : Nono40 La fonction SetForeGroundWindow permet de mettre une fiche en avant-plan directement. Mais depuis Windows 98 et Windows 2000 elle ne place plus la fentre en avant-plan mais se contente de la faire clignoter dans la barre des tches. Windows limite la possibilit de passer la fentre en avant-plan. Tant que l'application n'est pas elle-mme en avant-plan, il n'est pas possible de mettre une fentre en avant-plan, ce qui en limite beaucoup l'intrt. La solution propose par la MSDN est de changer la base de registre afin de supprimer cette limitation. Ce n'est pas la meilleure mthode mon avis. Une autre mthode est d'attacher trs provisoirement l'application au processus actuellement en avantplan. Ainsi, Windows va croire que notre application est en avant-plan et autoriser d'y mettre la fentre. Ceci peut se faire en quelques lignes :
procedure TForm1.Devant; Var Proc,Nous:Integer; begin Proc:=GetWindowThreadProcessId(GetForeGroundWindow); Nous:=GetCurrentThreadID; If Proc<>Nous Then Begin // Nous ne sommes pas l'application en premier plan AttachThreadInput(Nous,Proc,True); SetForeGroundWindow(Handle); AttachThreadInput(Nous,Proc,False); Application.BringToFront; End Else Begin // Nous sommes dj en premier plan SetForeGroundWindow(Handle); End; end;

lien :

Lien MSDN : fonction SetForeGroundWindow

Comment envoyer du texte au debugger ?


Auteur : Mac LAK Il existe une fonction de l'API Win32, OutputDebugString, permettant d'envoyer du texte vers le debugger de Delphi, ces messages tant visibles dans le "Journal d'vnements" (menu "Voir -> Fentres de dbogage -> Journal d'vnements" ou Ctrl+Alt+V). Cependant, cette fonction n'est pas trs pratique utiliser, car elle n'autorise que l'envoi d'une chane PAnsiChar "telle quelle". Une petite fonction de formatage s'avre rapidement ncessaire :
//La syntaxe de la fonction est strictement identique celle de la procdure "Format". Procedure DebugPrintFmt ( Const FmtString : String ; Const Args : Array Of Const ) ; Begin OutputDebugString(PAnsiChar(Format(FmtString,Args))); End;

- 42 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

A noter qu'il existe de nombreux utilitaires capables d'afficher ces chanes, et ceci mme si le programme n'est pas en cours de debug avec Delphi. Un des plus connus est le freeware DebugView. D'autres debuggers, comme OllyDbg ou Win32DASM, sont galement capables d'afficher ces chanes. Ne fonctionne qu'avec des applications Win32 lien : Lien MSDN : fonction OutputDebugString lien : Page de l'utilitaire DebugView

Comment tuer un processus partir de son nom ?


Auteur : sjrd Il est tout fait possible de tuer un processus directement partir de son nom de fichier excutable (par exemple notepad.exe). Pour cela, il suffit d'utiliser cette procdure (il faut rajouter les units Windows, SysUtils et TlHelp32 la clause uses) :
function KillProcess(const ProcessName : string) : boolean; var ProcessEntry32 : TProcessEntry32; HSnapShot : THandle; HProcess : THandle; begin Result := False; HSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if HSnapShot = 0 then exit; ProcessEntry32.dwSize := sizeof(ProcessEntry32); if Process32First(HSnapShot, ProcessEntry32) then repeat if CompareText(ProcessEntry32.szExeFile, ProcessName) = 0 then begin HProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry32.th32ProcessID); if HProcess <> 0 then begin Result := TerminateProcess(HProcess, 0); CloseHandle(HProcess); end; Break; end; until not Process32Next(HSnapShot, ProcessEntry32); CloseHandle(HSnapshot); end;

Cette fonction renvoie True si elle a russi, et False dans le cas contraire. Tout d'abord, on appelle l'API CreateToolhelp32Snapshot pour dresser une liste des processus. Le paramtre TH32CS_SNAPPROCESS indique qu'il faut rcuprer tous les processus. Le second paramtre 0 est ignor : il est utilis avec d'autres valeurs du premier paramtre. Le handle ainsi renvoy pourra tre pass aux routines Process32First et Process32Next. Ensuite, il faudra le librer avec CloseHandle. Puis, au moyen de Process32First et Process32Next, on numre tous les processus du snapshot en plaant leurs informations dans la variable ProcessEntry32. Pour chaque processus, on teste son nom (nom du fichier excutable) : s'il est identique, la casse prs, au paramtre ProcessName, alors il faut le tuer. Pour ce faire, on ouvre un handle de processus avec les droits de terminaison (PROCESS_TERMINATE). On passe ce handle la routine TerminateProcess pour tuer le processus. Ensuite, on le libre avec CloseHandle. Cette version de la routine ne termine que le premier processus dont le nom est pass en paramtre. Une variante peut tre crite pour tuer tous les processus portant ce nom. Il suffit de modifier un peu le contenu
- 43 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

de la boucle, en supprimant le Break et en s'assurant que Result n'est pas remis False aprs avoir dj tu un processus mais ne pas avoir pu tuer un autre. Dans ce cas, la fonction retourne True si elle a tu au moins un processus.
HProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry32.th32ProcessID); if HProcess <> 0 then begin Result := TerminateProcess(HProcess, 0) or Result; CloseHandle(HProcess); end;

Attention ! Il est impratif de placer le or Result aprs l'appel TerminateProcess, sinon l'optimisation de l'valuation des or va viter l'appel TerminateProcess ! La version dans le zip accepte un paramtre All de type boolean indiquant s'il faut tuer tous les processus trouvs ou seulement le premier. killprocess.zip [ 1 Ko ]

Comment lancer un programme sous un autre contexte de securite ?


Auteur : chavers Il est trs frquent d'avoir lancer une application en tant qu'un autre utilisateur. Gnralement , on utilise (pour les versions de Windows suprieures Windows ME) le menu contextuel permettant "d'excuter en tant que...". Nous allons ici prsenter une solution qui permet de faire de mme mais cette fois directement partir de Delphi. Avant tout, il faut dfinir les constantes suivantes :
const LOGON_WITH_PROFILE = 1; LOGON_NETCREDENTIALS_ONLY = 2; procedure runas(sUser, sDomain, sPassword : WideString); var wUsername, wDomain, wPassword, wApplicationName: WideString; pwUsername, pwDomain, pwPassword, pwApplicationName: PWideChar; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin wUsername := sUser ; wDomain := sDomain; wPassword := Spassword; wApplicationName := sExecutable ; pwUsername := Addr(wUsername[1]); pwDomain := Addr(wDomain[1]); pwPassword := Addr(wPassword[1]); pwApplicationName := Addr(wApplicationName[1]); FillChar(StartupInfo, SizeOf(StartupInfo), 0); StartupInfo.cb := SizeOf(StartupInfo); try if not CreateProcessWithLogon(pwUsername,pwDomain,pwPassword,LOGON_NETCREDENTIALS_ONLY, nil,pwApplicationName,CREATE_DEFAULT_ERROR_MODE, nil,nil,StartupInfo,ProcessInfo) then RaiseLastOSError; //En cas d'erreur, donne des dtails sur l'erreur end;

La fonction CreateProcessWithLogon est dfinie dans advapi32.dll. Il faudra donc, pour l'utiliser, la dclarer par :
- 44 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

function CreateProcessWithLogon; external 'advapi32.dll' name 'CreateProcessWithLogonW';

Comment dsactiver la combinaison de touches CTRL-ALT-SUPPR ?


Auteur : tiki06 Voici un code qui vous permet de le faire. Il faut noter tout d'abord que l'action effectuer dpend de la version de Windows. Nous allons donc au pralable utiliser une fonction pour dterminer celle-ci :
(******************************************************************************) (* Fonction pour determiner la version de Windows *) (* Renvoi True si version Windows NT,2000,XP, sinon renvoit False *) (******************************************************************************) Function DetermineVersionWindows: Boolean; begin //Fonctionne pour les versions de Windows autre que 95, 98 et Millenium Result := True; case Win32MajorVersion of // 3: Microsoft Windows NT 3.51 4: case Win32MinorVersion of 0: case Win32Platform of // 1: Microsoft Windows 95 ou Microsoft Windows 95 OSR2 2: Result:= True; else Result:= False; end; 10, 90: Result := False; else Result:= False; end; 5: case Win32MinorVersion of //2000, XP et 2003 0, 1, 2: Result:= True; else Result:= False; end; else Result:= False; end; end;

A prsent, suivant la valeur du paramtre Desactiver, nous allons dsactiver ou activer le gestionnaire de tches :
(******************************************************************************) (* Fonction pour dsactiver ou activer le gestionnaire de tches lors de *) (* l'appui sur CTRL + ALT + SUPPR *) (* Passer TRUE dans le paramtre Desactiver pour dsactiver le gestionnaire *) (* de tches et sinon passer FALSE pour le ractiver *) (******************************************************************************) procedure ActiverDesactiverTaskManager(Desactiver: Boolean); var OldVal : Longint; Reg : Tregistry; begin if Desactiver = True then // Dsactiver le gestionnaire de tache begin if DetermineVersionWindows then // Cas des versions Windows NT,2000,XP

- 45 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin reg := TRegistry.Create; reg.RootKey := HKEY_CURRENT_USER; // Test pour savoir si la cl de l'utilisateur courant existe if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System', False) then begin reg.WriteString('DisableTaskMgr', '1'); end else // Sinon cration dans la cl Machine. begin reg.RootKey := HKEY_CURRENT_USER; reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System', True); reg.WriteString('DisableTaskMgr', '1'); end; reg.CloseKey; end else // Cas des versions Windows 95,98,Me begin SystemParametersInfo(SPI_SCREENSAVERRUNNING, word(True), @OldVal, 0); end; end else // Ractiver le gestionnaire de tache begin if DetermineVersionWindows then // Cas des versions Windows NT,2000,XP begin reg := TRegistry.Create; reg.RootKey := HKEY_CURRENT_USER; // Test pour savoir si la cl de l'utilisateur courant existe if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System', False) then begin reg.DeleteValue('DisableTaskMgr'); end else // Sinon cration dans la cl Machine. begin reg.RootKey := HKEY_CURRENT_USER; reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System', True); reg.DeleteValue('DisableTaskMgr'); end; reg.CloseKey; end else // Cas des versions Windows 95,98,Me begin SystemParametersInfo(SPI_SCREENSAVERRUNNING, word(False), @OldVal, 0); end; end; end;

lien :

Comment obtenir la version de Windows ?

Comment ne pas afficher l'icne d'une fiche dans la barre des tches ?
Auteur : Smortex Lorsqu'on affiche une fiche contenue dans une dll, un second bouton de l'application apparat dans la barre des tches. Une astuce pour l'viter consiste transmettre le Handle de l'application la dll. Dans l'exe :
AfficheForm(Application.Handle);
- 46 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Dans la dll :
procedure AfficheForm(AppHandle: THandle); begin Application.Handle := AppHandle; // Code de la procdure end;

Comment centrer la fentre sur l'cran ?


Auteurs : Smyley - Xenos On utilise pour ce faire l'option Position de la form, laquelle on peut mettre plusieurs valeurs : poDesigned : la fentre apparait avec la mme taille et la mme position que lors de sa conception. poDefault : c'est le systme d'exploitation qui dfini la taille et la positon de la fentre. poDefaultPosOnly : la fentre apparat avec la taille de sa conception, mais c'est le systme d'exploitation qui dfinit sa position. poDefaultSizeOnly : la fentre apparat avec la position dfinie lors de la conception, mais c'est le systme d'exploitation qui dfinit la taille. poScreenCenter : la fentre apparat avec la taille de sa conception et est place au centre de l'cran. Un ajustement peut se faire dans le cas d'utilisation de plusieurs crans, suivant les paramtres indiqus. poDesktopCenter : la fentre apparat avec la taille de sa conception et est place au centre de l'cran. Aucun ajustement ne se fait lors de l'utilisation du plusieurs crans la fois. poMainFormCenter : la fentre apparat avec la taille de sa conception et est centre suivant la fentre principale de l'application. poOwnerFormCenter : la fentre apparat avec la taille de sa conception et est centre sur la fentre que l'on choisit.
procedure TForm1.FormCreate(Sender: TObject); begin Form1.Position := poScreenCenter; end;

On peut aussi utiliser la fonction suivante pour centrer une fentre avec uniquement son Handle :
procedure CenterWnd(const Wnd: HWND); var R: TRect; SW, SH, W, H: Integer; begin SW := GetSystemMetrics(SM_CXSCREEN); SH := GetSystemMetrics(SM_CYSCREEN); GetWindowRect(Wnd, R); W := R.Right - R.Left; H := R.Bottom - R.Top; R.Left := (SW - W) div 2; if R.Left < 0 then R.Left := 0; R.Top := (SH - H) div 2; if R.Top < 0 then R.Top := 0; MoveWindow(Wnd, R.Left, R.Top, W, H, True); end;

De mme, on peut faire varier l'apparition de la fentre avec l'option WindowState, pour laquelle il existe aussi quelques variantes :

- 47 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

wsMaximized : agrandit la fentre au maximum. wsMinimized : rduit la fentre. wsNormal : la fentre a les mmes dimensions et la mme position que lors de sa conception.
procedure TForm1.FormCreate(Sender: TObject); begin Form1.WindowState := wsMaximized; end;

Comment connatre l'tat des touches du Clavier ?


Auteur : Bloon Pour connatre l'tat des touches, on peut utiliser les fonctions GetKeyState et/ou GetAsyncKeyState. Le code suivant permet l'aide de GetKeyState de savoir si le clavier est en mode majuscule (CAPS LOCK activ) :
if (GetKeyState(VK_CAPITAL) and 1) = 0 then begin //Traitement... end;

Vous pouvez avoir un exemple pratique d'utilisation de GetAsyncKeyState dans ce source de Nono40 disponible ici.

Comment imprimer un fichier PDF partir de son application sans l'ouvrir ?


Auteurs : Olivier Lance - Eric.H Pour imprimer un fichier PDF, on peut passer par la fonction ShellExecute comme cela est montr dans le code ci-dessous :
IF ShellExecute(Handle,'print','MON_FICHER.PDF',nil,nil,SW_HIDE) <=32 THEN ShowMessage(SysErrorMessage(GetLastError));

Il faudra installer Acrobat au pralable. Windows imprimera avec le programme rattach aux extension .pdf. (Donc Acrobat). Pour les utilisateurs d'Acrobat Reader, il faut plutt utiliser le code suivant (si par exemple nous souhaitons imprimer le fichier D:\DOCUMENTATIONS\fortran.pdf) :
IF ShellExecute(Handle, nil,'acrord32.exe', '/t "D:\DOCUMENTATIONS\fortran.pdf"',nil,SW_HIDE) <= 32 THEN ShowMessage(SysErrorMessage(GetLastError));

Comment piloter une application tierce ?


Auteur : petitcoucou31 Pour ce faire il faut trouver le handle du contrle de l'application tierce et lui envoyer un message.

- 48 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

La procdure ci-dessous intercepte les coordonnes de la souris en utilisant l 'API GetCursorPos, quelle que soit l'application qui se trouve sous le curseur , excepts le bureau et la barre des tches. L 'API WindowFromPoint retourne le handle du contrle qui se trouve aux coordonnes interceptes. La combinaison des touches "Shift"+ "Bouton gauche" de la souris stocke le handle du contrle dans une listBox. Remarque : Les handles selectionns sont valides tant que l'application tierce n'est pas ferme. Identification des variables : KeyIndex : Etat des touches (enfonces ou relaches). NewMousePos,MousePos : Coordonnes souris. HD : Handle du controle Actif. P : Variable de boucle. Capt : dtermine que la touche de la souris a t relache et autorise une nouvelle capture. Fin : Variable Globale de contrle de la boucle de traitement
procedure TForm1.CapteInfoControl; var WText,ClassName : Array[0..255] of Char; KeyIndex : array [0..255] of boolean; NewMousePos,MousePos : Tpoint; HD : Hwnd; P : Integer; Capt : boolean; begin // initialisation Fin:=false; Capt:=true; for P:=0 to 255 do KeyIndex[P]:=false; // boucle de traitement repeat // rcupration des coordonnes souris if (GetCursorPos(NewMousePos)) and ((NewMousePos.X <> MousePos.X) or (NewMousePos.Y <> MousePos.Y)) then begin MousePos:=NewMousePos; //rcupration des information du contrle Hd:=WindowFRomPoint(NewMousePos); GetWindowText(hd,WText,SizeOf(WText)); GetClassName(hd,ClassName,SizeOf(ClassName)); //Affichage label1.caption:=strfmt('Handle du contrle : %g - Texte du contrle: %s [Hd,String(WText), String(ClassName)]); Application.ProcessMessages; end; // rcupration des tats des touches for P:=0 to 255 do KeyIndex[P]:=GetAsyncKeyState(P) <> 0; // stocke les informations du contrle [ClickGauche(1)]+[shift(16)] if KeyIndex[1] and KeyIndex[16] and Capt then begin ListBox2.Items.Add(IntToStr(Hd)+' : '+String(WText)+' - '+String(ClassName)); Capt:=false; end; // autorise une capture des informations // autre que celle la touche de la souris a t relache Capt:=Not(KeyIndex[1]); Application.ProcessMessages;
- 49 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

- Classe du contrle : %s',

http://delphi.developpez.com/faq/

FAQ Delphi

until Fin=true; end;

Dans les exemples suivants le paramtre HD est le Handle stock avec la procdure ci-dessus. Exemple pour cliquer sur un bouton d'une application tierce :
procedure TForm1.BoutonClick(HD:Hwnd); begin SendMessage(HD,BM_CLICK, 0, 0); end;

Exemple pour la recopie d'un TEdit d'une application tierce dans son application:
function TForm1.CopyEdit(HD:Hwnd):string; var Size : integer; begin Result:=''; SendMessage(HD,WM_SETFOCUS, 0, 0); Size:=SendMessage(HD,WM_GETTEXTLENGTH,0,0)+1; SetLength(Result,Size); SendMessage(HD,WM_GETTEXT,Size,Integer(@Result[1])); SendMessage(HD,WM_KillFOCUS, 0, 0);

end;

API permettant de dterminer si un contrle est visible ou pas dans une application tierce
function IsWindowVisible(hWnd: HWND): BOOL; stdcall;

Pourquoi CreateProcess ne fonctionne-t-il pas dans certains cas sous Vista ?


Auteur : Pedro Lorsqu'un excutable est lanc sous Vista, si le nom du fichier contient des mot cls de ce style: "install", "patch", "setup", ou encore "update", son lancement ncessite des droits d'administrateur. Et dans ce cas-l, CreateProcess est tout simplement annul sans aucun avertissement. Donc le "problme" vient du systme d'administration de Vista. Voici quelques solutions: Utiliser ShellExecute en lieu et place de CreateProcess. ShellExecute pourra alors lancer le programme et, le cas chant, afficher la boite de dialogue systme de validation du lancement. Renommer l'excutable. C'est encore plus simple. Dsactiver les droits d'administration (UAC)

En ce qui concerne les droits d'administration, il est trs simple de vrifier qu'un excutable peut tre lanc avec CreateProcess ou non: Vous remarquerez que lorsque ces fichiers ont un nom de fichier contenant les mots-cls cits plus haut, un petit cusson apparait sur son icone.

- 50 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Cet cusson signifie qu'il faut les droits admin sur la machine pour le lancer. Il suffit alors de le renommer pour faire disparaitre l'cusson... lien : lien : Comment excuter une application extrieure ? FAQ Windows: User Access Control

- 51 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Application Comment mettre une image en fond de fiche ?
Auteur : Al-Yazdi On va crer une bitmap et dire notre fiche de l'afficher dans le coin en haut gauche. Si notre image est trop grande, elle sera tronque, et si elle est petite, le reste de la fiche sera rempli par la couleur de fond.
var Bitmap: TBitmap; procedure TMyForm.FormPaint(Sender: TObject); begin Canvas.Draw(0, 0, Bitmap); end; procedure TMyForm.FormCreate(Sender: TObject); Bitmap := TBitmap.Create; Bitmap.LoadFromFile('MyBitmap.bmp'); end; procedure TMyForm.FormDestroy(Sender: TObject); begin Bitmap.Free; end;

lien :

Comment mettre une image dans le fond d'une application MDI en Delphi ?

Comment mettre une image en fond d'une fiche MDI ?


Auteur : MD Software
type TMDIChild=class(TForm) private FBack:TBitmap; //Contient l'image qui sera charge en fond d'cran FFileName:string;//l'adresse de cette image procedure SetFileName(Value:string); protected procedure Paint;override; published property FileName:string read FFileName write SetFileName; end; ... procedure TMDIChild.MDIChildCreate(Sender: TObject); begin FBack:=TBitmap.Create;//on cre l'objet Bitmap qui contiendra l'image de fond FFileName:=''; end; procedure TMDIChild.MDIChildDestroy(Sender:TObject); begin FBack.Free; end; procedure Paint; begin if FFileName<>'' then Canvas.Draw(0,0,FBack); end;

- 52 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

procedure SetFileName(Value:string); begin if (Value<>FFileName) and (FileExists(Value)) then begin FFileName:=Value; FBack.LoadFromFile(Value); Invalidate; end; end;

Une solution simple serait de mettre au fond de la fentre un TImage align alClient et d'y affecter une image lors de sa cration. Mais pourquoi superposer un dessin sur un dessin ? En effet, le fond de la fentre est lui aussi un dessin, mais par dfaut, c'est un simple cadre la couleur clBtnFace [Couleur de fond de fentre Windows]. Donc, l'ide, est de remplacer ce dessin par le dessin d'une image. On oublie donc le TImage, et on met un petit peu les mains dans le cambouis. Voici le code de la fentre MDI. Dans ce code, j'ai modifi le constructeur de la fentre. Ainsi, chaque fois qu'il faut en crer une, il est ncessaire de passer le chemin d'accs une image. Ceci n'est pas une obligation de bon fonctionnement. L'important est que la fentre reoive, d'un moyen comme d'un autre, le chemin l'image qu'elle doit afficher.
{...} type TFS_FicheMDI = class(TForm) procedure FormDestroy(Sender: TObject); procedure FormResize(Sender: TObject); procedure FormPaint(Sender: TObject); private FFond : TGraphic; public constructor Create(AOwner : TComponent;Chemin : String);reintroduce; end; implementation {$R *.dfm} constructor TFS_FicheMDI.Create(AOwner : TComponent;Chemin : String); begin //Cration de la fiche inherited Create(AOwner); //Initialisation FFond := nil; //Si le chemin existe if (FileExists(Chemin)) then begin //Si c'est une image jpeg if ((ExtractFileExt(Chemin) = '.jpg') or (ExtractFileExt(Chemin) = '.jpeg')) then FFond := TJPEGImage.Create //Si c'est un bmp else if (ExtractFileExt(Chemin) = '.bmp') then FFond := TBitmap.Create; //D'autres tests sont possibles {...} //Si un format a correspondu if (Assigned(FFond)) then FFond.LoadFromFile(Chemin); end;

end;

procedure TFS_FicheMDI.FormDestroy(Sender: TObject); begin //Penser librer ! TOUJOURS ! FFond.Free; end;


- 53 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

procedure TFS_FicheMDI.FormResize(Sender: TObject); begin //Lorsque l'on redimensionne la fentre, Windows redessine le fond de la //fentre, mais uniquement la partie qui a t modifie. //L'image tant tire sur toute la fentre, il faut la redessiner //compltement. FormPaint(Sender) end; procedure TFS_FicheMDI.FormPaint(Sender: TObject); begin //Dessin de l'image sur toute la taille de la fentre Canvas.StretchDraw(ClientRect, FFond); end; end.

Dans ce code, la form ne peut pas tre cre automatiquement au lancement de l'application [par Application.CreateForm], et cela impose de la crer manuellement. Voici le code d'un bouton de la fentre principale. Il affiche une bote d'ouverture d'image, et cre une fiche MDI.
procedure TFP_FormMDI.BP_CreerClick(Sender: TObject); var uneFiche : TFS_FicheMdi; begin if (BD_OuvrirImage.Execute) then uneFiche := TFS_FicheMDI.Create(Application,BD_OuvrirImage.FileName); end;

Comment rcuprer le numro de version de mon application ?


Auteur : Gysmo Voici une fonction qui rcupre cette information :
function ApplicationVersion: String; var VerInfoSize, VerValueSize, Dummy: DWord; VerInfo: Pointer; VerValue: PVSFixedFileInfo; begin VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy); {Deux solutions : } if VerInfoSize <> 0 then {- Les info de version sont inclues } begin {On alloue de la mmoire pour un pointeur sur les info de version : } GetMem(VerInfo, VerInfoSize); {On rcupre ces informations : } GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize); {On traite les informations ainsi rcupres : } with VerValue^ do begin Result := IntTostr(dwFileVersionMS shr 16); Result := Result + '.' + IntTostr(dwFileVersionMS and $FFFF); Result := Result + '.' + IntTostr(dwFileVersionLS shr 16); Result := Result + '.' + IntTostr(dwFileVersionLS and $FFFF); end; {On libre la place prcdemment alloue : } FreeMem(VerInfo, VerInfoSize);
- 54 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end else {- Les infos de version ne sont pas inclues } {On dclenche une exception dans le programme : } raise EAccessViolation.Create('Les informations de version de sont pas inclues'); end;

Il faut pour que cela fonctionne que vous spcifiez l'option Inclure les informations de version dans le projet dans menu Projet|Option|Information de version, ainsi la fonction retournera '1.0.0.0' par exemple, sinon la fonction dclenchera une erreur EAccessViolation.

Comment raliser une interface style Outlook ?


Auteur : Didier Largange Des solutions base de TPanel ou de TPageControl existent, mais elles posent le problme de l'organisation du code et de la rutilisabilit. Nous utiliserons donc les objets TFrame (cadres) qui sont une spcificit Delphi 5 et suprieur, lgants compromis entre TForm et TPanel. 1/ Cration du modle La technique principale utilise est celle de l'hritage : Aprs avoir cr le modle de base FrmModele "menu Fichier -> Nouveau cadre", dfinissez-y les caractristiques communes tous les crans: - proprits : barre de titre, couleurs, alignement, grilles, etc. - mthodes : Afficher Vous pouvez maintenant associer ce modle votre application "menu Projet -> Ajouter au projet" 2/ Cration des crans (Frames) par hritage "menu Fichier -> Nouveau -> onglet 'Nom du projet' -> icne FrmModele (hriter)" Personnalisez les crans en fonction des besoins, notamment en surchargeant la mthode Afficher pour mettre jour les donnes.
procedure Afficher; override;

3/ Gestion du fentrage Rservez un espace, gnralement TPanel, pour servir de zone d'affichage des crans. Prparez vos menus de navigation et centralisez la gestion dans une seule procdure d'aiguillage. Notre gestion tant dynamique, nous ne placerons donc pas de Frame dans la fentre principale la conception. Cependant n'oubliez pas d'ajouter leur unit la clause uses de l'implmentation. "menu Fichier -> Utiliser l'unit ..." Une variable de la fentre principale
select_frame : TFrmModele

vous permettra de manipuler les crans en tant que descendants du mme anctre. L'aiguillage l'affichage est illustr par le code ci-dessous :
{ { { { destruction du frame courant } cration de l'cran avec le constructeur de la classe souhaite } positionnement du frame dans le panel rserv } initialisation de son contenu }

FreeAndNil(select_frame);
- 55 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

if Sender = Button1 then select_frame := TFrmEcran1.Create(self) else if Sender = Button2 then select_frame := TFrmEcran2.Create(self) else if ... else Exit; select_frame.Parent := PanelFrame; select_frame.Afficher;

Enfin, la sortie de l'application, le frame actif ayant t cr dynamiquement, il est dtruit manuellement.
procedure TFPrincipal.OnDestroy; begin FreeAndNil(select_frame); end;

4/ Cration d'autres crans Comme l'tape 2, drivez un cran de TFrmModele "menu Fichier -> Nouveau -> onglet 'Nom du projet' -> icne FrmModele (hriter)" Puis, ajoutez son unit la fentre principale. Branchez son vnement d'appel sur la procdure commune d'aiguillage. Insrez enfin la ligne de code suivante en l'adaptant l'unit que vous souhaitez rajouter.
else if Sender = ButtonN then select_frame := TFrmEcranN.Create(self)

Voila, ce n'est pas plus compliqu, et en fait, plus vous approfondirez cette mthode, moins vous crirez de code redondant ! Le fichier zip contient 2 exemples d'applications : L'exemple 1 illustre les explications ci-dessus, L'exemple 2 apporte des lments complmentaires : - fermeture du frame en utilisant un message Windows - ajout d'un 2me niveau d'hritage pour encore plus de rutilisabilit. Frames.zip [26Ko]

Comment personnaliser la forme de sa fiche ?


Auteur : Al-Yazdi Cette mthode permet d'obtenir des fiches qui ne sont plus rectangulaires, Il nous faut procder en deux parties. 1.Crer une zone affichable : A l'aide des diffrentes fonctions suivantes, nous devons d'abord crer une zone.
CreateEllipticRgn(X1,Y1,X2,Y2 : integer); CreateEllipticRgnIndirect(Rect : TRect);

Ces deux fonctions crent une rgion elliptique dont les paramtres sont ceux de base pour crer une ellipse : un rectangle englobant dont les coordonnes sont donnes par rapport la fiche. Les procdures pour gnrer des zones rectangulaires et rectangulaires au coins arrondis(RoundRect) fonctionnent pareil. l'aide des fonctions :
CreateRectRgn(X1,Y1,X2,Y2 : integer); CreateRoundrectRgn(X1,Y1,X2,Y2,rayonarrondihor,rayonarrondivert : integer);

On peut aussi gnrer des zones polygonales l'aide de :


- 56 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

CreatePolygonRgn(lppt : Array Of TPoint, cPoints : integer, PolyFillMode : integer);

O : lppt est un tableau regroupant les points de notre polygone cPoints indique le nombre de points dans notre polygone PolyFillMode est une constante correspondant au mode de remplissage de notre polygone. Notre polygone est dfinit comme ferm : le point 0 et dernier point seront relis.
Var T : ARRAY [0..2]Of TPoint; i : Integer; begin For i := 0 to 2 do T[i] := Point(Random(Width),Random(Height)); { on remplit notre tableau } Rgn := CreatePolygonRgn(T,3,WINDING); { on cre notre rgion } end;

2.Dfinir cette zone d'affichage comme zone de notre fiche : Nous avons besoin ensuite de dire notre fiche d'utiliser cette rgion. Pour cela, nous avons :
SetWindowRgn(hWnd: HNWD, hRng: HRNG, bRedraw: LongBool): Integer

O : hWnd correspond au handle de notre fiche hRng la rgion o afficher notre fiche bRedraw pour dire si on veut redessiner notre fiche immdiatement ou pas. Tout ce qui sera dans cette zone sera affich et tout ce qui en dpassera ne le sera pas. A rajouter dans le OnCreate de la Fiche :
Var Rgn : Hrgn; ... begin ... Rgn := CreateEllipticRgn(1,1,100,50); {Une ellipse allonge { On peut retravailler la rgion ici pour personnaliser} SetWindowRgn(Handle, Rgn, true); ... end;

Comment modifier l'aspect des contrles d'une fentre en fonction d'un tat ?
Auteur : Bloon A utiliser pour indiquer qu'une fiche est modifiable ou pas (en changeant la couleur des composants et leur readonly ou enabled) Exemple d'appel, dans le FormShow d'une fentre :
setAspectsControles(self,true);

Code de la fonction :
- 57 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

uses Graphics, Controls, StdCtrls, TypInfo; { Paramtres : { container : Les controles contenus dans container vont { tre modifis en fonction de etat { etat : si vrai, les controles de container seront modifiables { si false, les controles de container seront en lecture seule { trueColor : couleur attribue aux controles de Container si etat est vrai { falseColor : couleur attribue aux controles de Container si etat est faux { testTagValue: si vrai, seuls les controls ayant leur Tag 0 seront traits { si false, tous les controls seront traits procedure setAspectControles(container: TWinControl; etat: boolean; trueColor : TColor = clWindow; falseColor : TColor = clBtnFace; testTagValue : boolean = true); var i : integer; couleur : array[boolean] of TColor; begin couleur[false] := falseColor; couleur[true] := trueColor; } } } } } } } } }

for i:= 0 to container.ControlCount - 1 do begin { si testTagValue, seuls les contrles dont le tag est 0 sont modifis } { ceci permet de ne pas traiter certains contrles en modifiant leur tag } if (not (container.Controls[i] is TLabel)) and ((not testTagValue) or (container.Controls[i].Tag = 0)) then begin { si le contrle contient d'autres contrles, on fait un appel rcursif } if (container.Controls[i] is TWinControl) and ((container.Controls[i] as TWinControl).ControlCount > 0) then begin setAspectControles(container.Controls[i] as TWinControl, etat, trueColor, falseColor, testTagValue) end else begin { Modification de ReadOnly ou Enabled } if GetPropInfo(container.Controls[i].ClassInfo,'readonly') <> nil then setPropValue(container.Controls[i],'readonly',not etat) else if GetPropInfo(container.Controls[i].ClassInfo,'enabled') <> nil then setPropValue(container.Controls[i],'enabled',etat); { Modification de la couleur } if not (container.controls[i] is TButtonControl) and (GetPropInfo(container.Controls[i].ClassInfo, 'color') <> nil) then setPropValue(container.Controls[i],'color',couleur[etat]); end; end; { test sur le Tag } end; end;

demoAC [7Ko]

Comment empcher la fermeture d'une fentre par Alt-F4 ou Close ?


Auteur : Nono40 Il souvent prfrable d'imposer l'utilisateur de fermer une fentre par le bouton "Fermer" ou "Quitter" que de le laisser fermer la fentre par Alt-F4 ou la croix en haut droite. Pour bloquer cette fermeture il faut
- 58 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

utiliser l'vnement OnCloseQuery de la fiche : mettre CanClose False par dfaut sauf si l'utilisateur vient d'appuyer sur un bouton "Fermer". Dans le code ci-dessous, une variable intermdiaire va conserver l'appui sur le bouton "Fermer".
TForm1 = class(TForm) ... private { Dclarations prives } PeutFermer : Boolean; ... end; { A l'ouverture de la fiche on met PeutFermer faux. } procedure TForm1.FormShow(Sender: TObject); begin PeutFermer:=False; end; {Lors de l'appui sur le bouton "Fermer" la variable PeutFermer est mis Vrai. } procedure TForm1.BoutonFermerClick(Sender: TObject); begin PeutFermer:=True; Close; end; {A la fermeture de la fiche on teste si la fermeture est autorise. } procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=PeutFermer; end;

Comment masquer la fentre principale ?


Auteur : Nono40 Pour ne pas afficher la fentre principale, il faut ajouter la ligne suivante dans le fichier .DPR ( source du projet )
program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; { Ne pas afficher la fiche principale } Application.ShowMainForm:= False; Application.CreateForm(TForm1, Form1); Application.Run; end.

- 59 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Ceci masque galement l'application dans la barre des tches et dans Alt-Tab tant qu'aucune autre fentre n'est affiche.

Comment masquer l'application dans la barre des tche ?


Auteur : Nono40 Pour masquer l'application dans la barre des tches, il faut rendre la fentre 'application' invisible. Il faut utiliser la fonction ShowWindow.
ShowWindow(Application.Handle, SW_HIDE);

Notez que pour rendre de nouveau l'application visible, il faut faire :


ShowWindow(Application.Handle, SW_SHOW);

lien :

Windows SDK - Fonction ShowWindow

Comment ajouter une icone dans le systray ?


Auteurs : Olivier Lance - Nono40 Delphi ne propose pas en standard de mthode pour ajouter une icne dans la barre des tches de Windows. Utilisation de composants ddis Il existe nombre de composants permettant de grer une icone dans la barre des tches. Le librairie Rx en propose aussi un, cette librairie est tlchargeable ici : http://delphi.developpez.com/freewares/ Utilisation de l'API Il est cependant possible de grer soi-mme cette icne en utilisant la fonction API suivante :
function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;

Cette fonction permet d'ajouter, de modifier ou de supprimer une icone de la barre des tches. Cette fonction prend en paramtre un enregistrement de description de l'icone. Pour crer une nouvelle icone il convient de remplir convenablement cet enregistrement :
Uses ShellApi, ... ; ... Procedure TForm1.AjouteIcone; Var Info:TNotifyIconData; begin { If faut tout d'abord remplir la structure Info} { avec ce que l'on veut faire} { cbSize doit contenir la taille de la structure} Info.cbSize := SizeOf(Info); { Wnd doit contenir le Handle de la fentre qui recevra les messages de} { notification d'vnement de la souris} Info.Wnd := Handle; { uID Numro d'icone, c'est utile si plusieurs icones sont affiches en} { simultan dans la barre des tches. Car c'est ce numro qui permettra} { ensuite de modifier celle que l'on veut.} Info.uID := 1; { szTip contient le texte de l'info bulle affich au dessus de l'icone} Info.szTip := 'Exemple d''icones par Nono40';
- 60 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

{ hIcon contient le handle de l'icne qui doit tre affiche} {Ici nous affichons l'icone de l'application} Info.hIcon := Application.Icon.Handle; { uCallBackMessage contient le message qui sera retourn la fentre} { donne par Wnd quand un vnement de souris apparat sur l'icone} Info.uCallbackMessage := WM_MONICONE; { uFlags doit contenir la liste des champs utiliss dans la structure} { parmi les champs szTip,hIcon et uCallBackMessage} Info.uFlags := NIF_TIP Or NIF_ICON Or NIF_MESSAGE; { Appel de la fonction API ajoutant l'icone} Shell_NotifyIcon(NIM_ADD,@Info); End;

Pour la suppression, il suffit juste d'indiquer le numro de l'icone :


Procedure TForm1.SupprimeIcone; Var Info:TNotifyIconData; begin { Dans le cas de la suppression d'une icone, seuls les champs ci-dessous} { sont ncessaires} Info.cbSize := SizeOf(Info); Info.Wnd := Handle; Info.uID := 1; Shell_NotifyIcon(NIM_DELETE,@Info); End;

Il est possible aussi de grer les messages lors de click (gauche/droit/double) sur l'icone. La mthode est dtaille dans le source joint cette QR. lien : http://delphi.developpez.com/freewares/ lien : Windows SDK - Shell_NotifyIcon iconetray.zip [ 6Ko ]

Comment dplacer une fiche sans barre de titre ?


Auteur : Nono40 Sans barre de titre l'utilisateur ne peut dplacer simplement la fentre l'aide de la souris. Il est cependant possible de simuler ce fonctionnement lors d'un click sur la surface de la fiche. Cette mthode doit tre utilise dans le cas d'un fiche ayant BorderStyle=bsNone. Le code suivant doit tre ajout dans l'vnement OnMouseDown de la fiche :
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; Perform(WM_SysCommand, SC_MOVE, 0); end;

Cette mthode peut aussi tre applique tous les descendants de TWinControl. Une autre technique utilise le message WM_NCHITTEST envoy par Windows votre fentre lorsque l'utilisateur bouge la souris. La rponse ce message est utilise par Windows pour dterminer dans quelle zone se trouve la souris : dans la partie cliente, sur un bouton systme, sur un des bords, etc. Une de ces rponses nous intresse particulirement, il s'agit de la valeur HTCAPTION qui indique Windows que le curseur se trouve sur la barre de titre. Dans ce cas, Windows interprtera le dplacement de la souris avec le bouton gauche enfonc comme un dplacement de la fentre. C'est exactement ce qu'il nous faut. Nous allons donc ajouter un gestionnaire de message pour WM_NCHITTEST notre fentre et retourner la valeur
- 61 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

HTCAPTION. L'exemple suivant autorise le dplacement si le curseur se trouve dans la bande de 20 pixels de haut situe en haut de la fentre, ce qui nous permet de simuler notre propre barre de titre.
interface uses Windows, Messages, Classes, Forms; type TForm1 = class(TForm) private { Dclarations prives } public { Dclarations publiques } procedure WMNCHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMNCHitTest(var msg: TWMNCHittest); var pt: TPoint; begin inherited; pt:= ScreenToClient(Point(msg.XPos, msg.YPos)); if PtInRect(Rect(0, 0, ClientWidth, 20), pt) then msg.Result:= HTCAPTION; end;

lien :

Windows SDK - Message WM_SYSCOMMAND

Comment redimensionner une fiche sans bordure ?


Auteur : Manopower En partant du mme principe que pour le dplacement de la fentre, nous allons simuler la prsence de bordures sur une fentre ayant sa proprit BorderStyle = bsNone. Le message WMHitTest se produit comme un MouseMouve et renvoie la position de la souris sur la fiche. Il suffit donc de choisir une zone, par exemple droite de la fiche pour laquelle on enverra le message "La souris est sur la bordure droite, redimensionnement possible". Dclaration :
{public} procedure WMNCHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST;

Implementation (extrait) :
procedure TForm1.WMNCHitTest(var msg: TWMNCHittest); var pt: TPoint; begin //Stockage de la position de la souris pt := ScreenToClient(Point(msg.XPos, msg.YPos));
- 62 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

//On teste si la souris est sur l'un des cots //****Ct DROIT**** if PtInRect(Rect(ClientWidth-5, 0, ClientWidth, ClientHeight), pt) then begin msg.Result:= HTRIGHT; exit; end; end;

Ce code permet donc le redimensionnement du ct droit de notre fiche quand la souris est 5 pixels du bord. Notes : Pour recrer un redimensionnement classique il faut faire un test pour chaque cot et chaque coin de la fiche. Attention tester les coins avant les bords et bien utiliser l'instruction Exit. (Sinon on se trouve dans un coin ET sur les bords) Quelques rsultats utiliser : Bordure du bas : HTBOTTOM Bordure gauche : HTLEFT Bordure droite : HTRIGHT Bordure du haut : HTTOP

Toutes les constantes peuvent tre trouves l'endroit ci-dessous : Hit Test Return Values Dernier point : cette procdure ne fonctionne que quand la souris passe sur la fiche. Si vous avez par exemple une DBGrid avec align = alclient alors on ne passera pas dans notre WMNCHitTest. La solution : crer des panels Enabled = False tout autour de la fiche (avec Align = AlLeft, AlRight etc.) de 2 ou 3 pixels de large.

Comment utiliser les contrles XP dans une application ?


Auteur : Pierre Castelain Vous l'avez sans doute remarqu, Windows XP a introduit de nouvelles versions des contrles graphiques habituels. Si vous crez une application quelconque et que vous l'excutez sous Windows XP vous vous rendrez compte que celle-ci n'utilise pas ces nouveaux contrles. Pour quelle raison ? Tout simplement pas souci de compatibilit. Pour qu'une application utilise les contrles XP, elle doit le signaler au systme d'exploitation. La faon la plus simple de le faire sous Delphi 7 est d'ajouter un composant TXPManifest n'importe quelle fentre du projet. Si vous avez la curiosit d'aller voir le code de ce composant, vous serez certainement surpris de voir que celui-ci ne fait strictement rien : il ne possde ni mthode ni proprit. Alors comment cela peut-il fonctionner ? En y regardant de plus prs, nous nous apercevons qu'il existe une ligne inhabituelle dans le code source de l'unit XPMan :
{$R WindowsXP.res}

Cette ligne sert ajouter le fichier WindowsXP.res aux ressources de l'application. Car c'est de cette faon que l'on signale Windows XP que l'application doit utiliser les nouveaux contrles. Cela permet au programme de fonctionner normalement sur les versions plus anciennes du systme puisque seul Windows XP vrifie la prsence de ce fichier particulier en ressources. Ce fichier contient un fichier XML appel manifeste XP. Celui-ci a la forme suivante :

- 63 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="NomSocit.NomProduit.NomApplication" type="win32" /> <description>Un descriptif de votre application ici.</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>

Vous pouvez modifier les parties du fichier en franais pour l'adapter votre application. L'incorporation de ce fichier aux ressources se fait par l'intermdiaire d'un fichier .rc qui une fois compil vous donnera un fichier .res que vous pourrez recenser directement par la directive $R de Delphi. Nous ne dcrirons pas ici le processus complet de cration de fichier ressource, mais sachez que le fichier .rc devra contenir une ligne de la forme :
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "VotreFichierManifeste.xml"

Le mme processus pourra tre utilis pour une application du panneau de configuration ou une dll devant tre charg par RunDLL32 comme vous pourrez le lire dans l'article suivant : Utilisation des contrles XP dans une application du panneau de configuration (cpl) lien : Utilisation des contrles XP dans une application du panneau de configuration (cpl)

Comment rduire toutes les fentres ?


Auteur : Laurent Dardenne Pour rduire toute les fentres il suffit de simuler l'appui simultanes de la touche Windows et de la touche M.
procedure TForm1.BitBtn1Click(Sender: TObject); begin // Simule l'appui de la touche Windows Keybd_event(VK_LWIN,0,0,0); // Simule l'appui sur la touche M Keybd_event(VKKeyScan('m'),0,0,0); // Simule le relchement de la touche Windows Keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0); // Simule le relchement de la touche M Keybd_event(VKKeyScan('m'),0,KEYEVENTF_KEYUP,0); end;

La procdure Keybd_event est dclare dans l'unit Windows sous D5.

- 64 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Une autre mthode permet de raliser cette fonction :


uses ComObj;... var Shell : OleVariant; begin Shell := CreateOleObject('Shell.Application') ; // Minimise toutes les fentres Shell.MinimizeAll; // Maximise toutes les fentres Shell.UndoMinimizeAll; end;

Comment faire clignoter la fentre de l'application ?


Auteur : reisubar Pour notifier l'utilisateur que l'application attend quelque chose de sa part (confirmation d'un message, vnement valider, etc.) alors qu'elle n'a pas le focus, on peut faire clignoter une fentre en utilisant l'API FlashWindow . Le premier paramtre attendu est le handle de la fentre flasher, le second un boolen indiquant si le clignotement doit tre effectu ou la fentre doit revenir son tat initial. Dans un timer dont la proprit Interval est rgle 500ms, la ligne suivante dans OnTimer :
FlashWindow(Form1.Handle,True);

...fait clignoter en boucle la fentre "Form1" de l'application. On peut utiliser un objet encapsulant l'API :
TFlasher = class private FTimer : TTimer; FHandle : Cardinal; procedure DoFlash(Sender : TObject); public procedure StartNotify; procedure EndNotify; constructor Create(ObjectToFlash : TWinControl; AInterval : Cardinal = 500); destructor Destroy; end; { TFlasher } procedure TFlasher.DoFlash(Sender : TObject); begin FlashWindow(FHandle,True); FlashWindow(Application.Handle,True); end; constructor TFlasher.Create(ObjectToFlash : TWinControl; AInterval: Cardinal); begin FTimer := TTimer.Create(nil); FTimer.Enabled := False; FTimer.Interval := AInterval; FTimer.OnTimer := DoFlash; FHandle := ObjectToFlash.Handle; end; destructor TFlasher.Destroy; begin

- 65 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

FTimer.Free; end; procedure TFlasher.EndNotify; begin FTimer.Enabled := False; FlashWindow(FHandle,False); end; procedure TFlasher.StartNotify; begin FTimer.Enabled := True; DoFlash(nil); end; Function TFlasher.Actif:Boolean; begin Result:=FTimer.Enabled; end;

Aprs l'avoir cre, on dmarrera la processus de notification en appellant la mthode StartNotify et on arrtera avec EndNotify.

Comment excuter une application distante ?


Auteur : Laurent Dardenne On peut utiliser 2 techniques "simples" : lien MSDN : Architecture DCOM DCOM permet d'instancier et d'excuter une application (serveur automation) sur une machine distante la condition que l'application ait t correctement enregistre sur les 2 machines. MSDN : Informations sur ORPC RPC, ce protocole permet d'excuter des commandes sur une machine distante mais ncessite que le client soit sous NT et que le service soit actif/dmarr. "Il existe de nombreux protocole RPC et Microsoft a choisi d'en adopter un plutt que d'en crer un nouveau. Emprunt au DCE ( Distributing Computing Environment) de l'OSF ( Open Software Fundation ). Microsoft le nomme MS RPC ( En fait Microsoft n'a pas repris l'implmentation du protocole de l'OSF, mais rimplment le RPC du DCE partir des spcifications publies). Ce protocole ansi que son adpatation DCOM connue sous le nom de RPC Objet ( ORPC), envoie sur le rseau des informations de mme format que le RPC du DCE (les mmes structure de paquet)" Extrait du livre Au coeur d'ActiveX et OLE de David Chapell chez MS-Press (c) 1996.

Comment mettre une console dans une application GUI ?


Auteur : Smortex Il est possible d'associer une console une application GUI pour, par exemple, y afficher des informations de debug... Dans ce cas, l'utilisation des directives de compilation prend tout son intrt :
{$IFDEF DEBUG} AllocConsole; WriteLn(DateTimeToStr(Now),': ',CmdLine); {$ENDIF} [...] {$IFDEF DEBUG} WriteLn('Entre dans la procdure de sauvegarde');
- 66 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

{$ENDIF}

Notes : si on ferme la console, l'application est galement ferme !! On ne peut pas associer plusieurs consoles une seule et mme application

Si on veut grer les saisie dans cette fentre console, il faut utiliser un thread afin de ne pas bloquer le reste de l'application :
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMonThread = class(TThread) AChar: Char; private procedure PutChar; public ConHan: THandle; procedure Execute; override; end; TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Dclarations prives } public { Dclarations publiques } end; var Form1: TForm1; MonThread: TMonThread; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin AllocConsole; MonThread := TMonThread.Create(True); MonThread.FreeOnTerminate := True; MonThread.ConHan := GetStdHandle(STD_INPUT_HANDLE); ; MonThread.Resume; end; { TMonThread } procedure TMonThread.Execute; var Buffer: TInputRecord; Read: DWORD; begin inherited; while not Terminated do begin ReadConsoleInput(ConHan,Buffer,1,Read);
- 67 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

if (Buffer.EventType = KEY_EVENT) and (Buffer.Event.KeyEvent.bKeyDown) then begin AChar := Buffer.Event.KeyEvent.AsciiChar; Synchronize(PutChar); end; end; end; procedure TMonThread.PutChar; begin Form1.Memo1.SelText := AChar; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin MonThread.Terminate; end; end.

Comment insrer un fichier dans un excutable ?


Auteur : Olivier Lance Parfois pour des raisons de simplification de dploiement d'une application, il peut tre judicieux d'insrer un second excutable dans son propre programme. Son extraction se faisant par celui-ci, on simule donc le principe d'une archive auto-extractible suivi d'une excution de code. L'ide est de crer un fichier de ressources contenant les donnes du fichier inclure puis de dclarer, dans le fichier source du programme principal, une directive de compilation de type {$R nom.res}. Sa prsence informe le compilateur d'ajouter le fichier de ressources nom.res l'excutable gnr la compilation. Cette opration est similaire au principe d'une concatnation de fichiers via la commande :
Copy /B Fichier1.exe+Fichier2.exe

Bien qu'ici la difficult est de savoir o se termine Fichier1.exe et o commence Fichier2.exe, et ce afin de bien distinguer les deux fichiers, Delphi nous permet de rsoudre ce problme. Voici les tapes suivre pour crer le fichier de ressources, l'inclure et l'extraire de l'excutable : 1- Dans le dossier qui contient le fichier inclure, crez un nouveau document texte avec un diteur ASCII. 2- Dans ce document texte, saisissez la ligne :
NomDeRessource RCDATA NomDeExcutable

Exemple : Pour le bloc-notes, nomm notepad.exe, inclus dans les distributions de Windows cela nous donne :
BlocNotes RCDATA "notepad.exe"

3- Enregistrez ce fichier texte en le renommant en nom.rc. Ici le nom doit correspondre au nom indiqu dans la directive de compilation insre dans le code source. Seule l'extension change, le fichier nom.res tant gnr partir de nom.rc. 4- Ensuite dans une console (interface utilisateur en ligne de commande, cf. cmd.exe pour Windows NT et suprieur, command.com pour Windows 98 ), placez-vous dans le dossier hbergeant le fichier texte cr prcdemment. Excutez la commande suivante :
brcc32 nom.rc

- 68 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Le programme brcc32.exe est en fait le compilateur de ressources fourni avec Delphi. Une fois ce fichier de ressources cr, dplacez-le, si besoin est, dans le mme rpertoire hbergeant les sources de votre programme principal. 5- Maintenant, dans l'unit principale de votre programme, insrez la directive de compilation "{$ nom.res}". Ainsi, lors de chaque compilation, la ressource (ici un fichier .exe) sera incluse avec votre programme principal. 6- Dsormais pour pouvoir utiliser cette ressource il faut crer deux stream : un TFileStream et un TResourceStream. Crez le TResourceStream en lui passant en paramtres les informations ncessaires l'ouverture de la ressource que vous avez incluse :
MonResourceStream := TResourceStream.Create(hInstance, Nom, RT_RCDATA);

hInstance est le numro d'instance de votre application. Il sert au systme pour retrouver en mmoire l'image de votre application et ainsi naviguer dans les enttes afin de rcuprer la ressource qui vous intresse. Nom est une string contenant le nom de la ressource que vous souhaitez extraire. Si l'on reprend l'exemple plus haut, on a Nom = 'BlocNotes' RT_RCDATA indique le type de la ressource, comme vous l'avez spcifi dans votre fichier nom.rc.

Ensuite crez le TFileStream en mode cration de fichier (option fmCreate) en lui donnant le nom de fichier que vous voulez, et excutez l'instruction :
MonFileStream.CopyFrom(MonResourceStream, 0);

Cette opration extrait le fichier inclus en ressources dans le rpertoire dsir, vous pouvez ds lors l'utiliser. Pour plus de dtails sur l'utilisation des ressources avec votre application, rfrez-vous cet article de DelphiCool. Il existe un composant shareware, TRCData, qui permet cette opration en mode conception.

Comment intercepter les touches clavier sur la fiche ?


Auteur : Mac LAK Tout d'abord, mettre la proprit KeyPreview de la fiche True. Ensuite, il est possible d'implmenter les gestionnaires d'vnement suivants : - OnKeyDown / OnKeyUp : pour voir toutes les touches (y compris tendues), et mme les clics souris. - OnKeyPress : Pour les touches simples, y compris la touche ESC. Exemple d'un gestionnaire OnKeyPress permettant de fermer la fiche sur appui de la touche ESC :
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin // Un appui sur ESC met un caractre #27. If (Key=Char(VK_ESCAPE)) Then Close ; end;

Ce gestionnaire rduit la fentre si l'on appuie sur Ctrl+Alt+M :


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin

- 69 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

// On ne veut pas autre chose que ces 2 touches. If Shift=[ssCtrl,ssAlt] Then // Pour les caractres alphanumriques, utiliser la fonction Ord // pour le test du code. If Key=Ord('M') Then Close ;

Pour les touches tendues (F1, F2, etc...), des constantes sont dfinies dans l'unit Windows.pas, qui commenent toutes par "VK_". Par exemple, le code pour la touche F1 est VK_F1. L'aide Delphi recense tous ces codes dans la section "Codes de touches virtuelles", accessible notamment depuis l'aide des vnements OnKeyDown et OnKeyUp.

Comment compresser un excutable ?


Auteur : Mac LAK Il est parfois difficile de compresser un excutable Win32 de manire efficace. Il est encore plus pnible de devoir compresser manuellement ses ressources pour rduire la taille de l'excutable. Une solution peut tre d'utiliser UPX : ce compresseur est freeware, ses sources sont disponibles si besoin, et il peut compresser un excutable tout en le laissant excutable. Une ligne de commande simple et efficace est :
upx -9 --best -v MonProgramme.exe

Il existe bien d'autres options de compression pour UPX, permettant d'avoir un meilleur taux de compression, mais celles-ci fonctionnent en gnral plutt bien. lien : Le site d'UPX

Comment raliser des animations graphiques ?


Auteur : Pierre Castelain La ralisation de ce genre de programme dpasse le cadre de cette FAQ mais vous pouvez utiliser ou vous inspirer des articles et programmes disponibles aux adresses suivantes : => Utilisation de la proprit TBitMap.ScanLine => Introduction DirectX 9 en Delphi => Effet Matrix

Comment avoir une seule instance d'une fenetre fille dans une application ?
Auteur : Nono40 Pour n'avoir qu'une instance d'une fentre fille dans notre application, il faut, avant de crer une nouvelle instance, s'assurer qu'il n'y en a pas dj une. Pour le faire, nous pouvons parcourir le tableau contenant les rfrences vers les fentres filles existantes comme cela est montr dans le code ci-dessus (code issu du projet exemple AppMDI) :
procedure TMainForm.CreateMDIChild(const Name: string); var Child: TMDIChild; //<- TMDIChild est la classe de la fentre fille Nbr : Integer; i : Integer;
- 70 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin Nbr:=0; //On parcourt le tableau des fentres filles For i:= 0 To MDIChildCount-1 Do If MDIChildren[i] is TMDIChild Then Inc(nbr); { cre une nouvelle fentre MDI enfant } If Nbr<2 Then Begin Child := TMDIChild.Create(Application); Child.Caption := Name; //Traitement.... End; end;

Comment insrer une ressource dans un excutable ?


Auteur : Olivier Lance Une ressource consiste en un fichier binaire, typiquement d'extension .res, qui est inclus la compilation dans votre EXE final. Afin de gnrer ce fichier de ressources, il faut utiliser un compilateur de ressources, qui prend en entre un fichier texte (d'extension .rc) de dfinition indiquant au compilateur quels donnes/fichiers compiler. La syntaxe (minimale) d'un tel fichier est la suivante :
IDRessource TYPE DonneOuCheminDeFichier

IDRessource est un nom unique ou un entier non sign de 16 bits (de 0 65535) qui servira identifier votre ressource au sein des autres ressources de votre excutable. TYPE reprsente le type de ressource que vous souhaitez inclure. Les possibilits sont multiples : BITMAP, ICON, CURSOR, RCDATA... Ce dernier type vous permet par exemple d'inclure le fichier de votre choix en ressource. Rfrez vous la librairie MSDN pour la liste exhaustive des types de ressources disponibles. DonneOuCheminDeFichier est la donne compiler dans le fichier de ressources. Pour un type BITMAP ou ICON il s'agit du chemin complet entre guillemets de l'image inclure (ou simplement le nom du fichier s'il se trouve dans le mme rpertoire que le fichier .rc). Pour le type RCDATA cela peut tre un fichier, une chane de caractres, un nombre etc. Rfrez-vous la librairie MSDN pour plus d'informations.

Voici un exemple de fichier .rc :


FichierQuelconque RCDATA MonFichier.xyz SplashScreen BITMAP splash.bmp UneIcone ICON icone.ico

Ces trois ressources seront incluses dans le mme fichier de ressources. Pour gnrer ce fichier, vous pouvez utiliser le compilateur brcc32 fourni avec Delphi. En ligne de commande, placez-vous dans le rpertoire de votre fichier .rc et excutez :
brcc32 fichier.rc

Cela vous gnrera le fichier .res, qu'il vous reste alors inclure votre projet Delphi.

- 71 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Pour ce faire, ditez le fichier .dpr de votre projet et ajoutez-y cette directive de compilation en vous assurant que FichierDeRessource.res se trouve dans le rpertoire de votre projet :
{$R FichierDeRessources.res}

Il ne vous reste plus qu' recompiler : les donnes de FichierDeRessource.res seront incluses dans votre EXE. lien : lien : lien : Lien MSDN : Resource-Definition Statements Lien MSDN : RCDATA Resource Tutoriel de DelphiCool

Comment modifier le texte des boutons d'un MessageDlg ?


Auteurs : Pedro - waskol Il est possible de le faire de 2 faons diffrentes. La premire mthode renomme directement les variables.
procedure ChangeResourceString(ResString: PResStringRec;NewText:string); var I: Integer; OldProtect, Rien: DWORD; begin //On change les autorisations d'accs notre variable //(Restring est un pointeur sur notre chane de resource) //qui est cense tre en lecture seule (notre pointeur sur la chane de //resources est une constante) Win32Check(VirtualProtect(ResString, SizeOf(TResStringRec),PAGE_READWRITE, OldProtect)); //maintenant, le pointeur sur la chane de resources est devenu une variable try //On change le pointeur sur la chane de resources pour qu'il pointe //sur notre texte ResString^.Identifier:=Integer(PChar(NewText)); finally //Pour tre cohrent avec Windows, on retransforme notre "variable" en "constante" VirtualProtect(ResString, SizeOf(TResStringRec), OldProtect,Rien); end; end;

Exemple d'appel :
procedure TForm1.Button1Click(Sender: TObject); begin ChangeResourceString(@SMsgDlgYes,'Peut-tre'); ChangeResourceString(@SMsgDlgNo,'Bof'); ChangeResourceString(@SMsgDlgIgnore,'Ca dpend'); MessageDlg('Ma boite de dialogue', mtWarning, [mbYes,mbNo,mbIgnore], 0); end;

L'autre mthode consiste crer la bote de dialogue l'aide de CreateMessageDialog, de rcuprer le bouton puis de modifier son Caption:
var i:integer; FicheMessage:TForm; begin

- 72 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

// on cre la fiche de dialogue la main FicheMessage:=CreateMessageDialog('Ma boite de dialogue', mtWarning,[mbYes,mbNo,mbIgnore]); // pour chaque bouton de la fiche ainsi cre on change (si on le souhaite) son modalresult et son caption for i := 0 to FicheMessage.ComponentCount - 1 do if ( FicheMessage.Components[i] is TButton ) then with ( FicheMessage.Components[i] as Tbutton ) do begin //on change ici selon son humeur, la valeur dj prsente dans Caption, etc.. //Caption := ... ; //ModalResult := ...; If Caption=SMsgDlgYes then Caption:='Ouais !'; end; //On montre la boite de dialogue FicheMessage.ShowModal; FicheMessage.Release; //on libre la mmoire occupe par la fiche end;

Comment enlever la croix de fermeture en gardant les autres icnes d'une fentre ?
Auteurs : sofiane44 - waskol Il existe deux mthodes assez simples pour enlever la croix de fermeture des fentres tout en gardant les autres boutons (rduire, maximiser, etc.). Toutes les fonctions et types de variables dclars ci-dessous sont implments dans l'unit Windows. Premire mthode :
var HD:HMENU; begin HD:=GetSystemMenu(HANDLE,false);//On rcupre le menu systme //On enlve le menu associ SC_CLOSE if (HD<>null)then RemoveMenu(HD, SC_CLOSE,0); SetWindowPos(HANDLE,0,0,0,0,0,swp_nosize or swp_nomove or swp_nozorder or swp_drawframe); end;

Seconde mthode : Cette seconde mthode remplace SetWindowPos par DrawMenuBar qui permet de redessiner la barre de menus :
var HD:HMENU; begin HD := GetSystemMenu(HANDLE, false); if (HD<>null) then RemoveMenu(HD, SC_CLOSE, 0); DrawMenuBar(HANDLE); //Redessine la barre de menus end;

- 73 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Note : ces mthodes permettent d'enlever aussi les autres boutons en remplaant SC_CLOSE par SC_MINIMIZE, SC_MAXIMIZE, SC_SIZE ou SC_MOVE. lien : http://vcallies.developpez.com/delphi/astuces/

Comment crer des fichiers d'aide ?


Auteurs : Giovanny Temgoua - Laurent Dardenne Vous trouverez ici quelques liens concernant la cration de fichiers d'aide .HLP ou .CHM : Tutoriels Delphi http://delphi.developpez.com/cours/?them=Aide Tutoriel VB : http://thierryaim.developpez.com/tutoriel/chm/ Outils de gnration de documentation : http://delphi.developpez.com/freewares/outils/#Documentation FAQ C : http://cpp.developpez.com/faq/vc/?page=IDE US Un site complet sur les diffrents systmes d'aide : http://helpware.net/ Vous y trouverez par exemple un outil permettant d'utiliser la documentation de Delphi 2005 en dehors de l'IDE : http://www.helpware.net/mshelp2/dexplore/dexplorer.htm

Comment temporiser, de manire non-bloquante, certaines actions?


Auteurs : Dry - Lung Pour cela, il suffit d'utiliser la mthode TApplication.ProcessMessages et la fonction GetTickCount pour contrler le temps de pause.
procedure Pause(const nDuree: Cardinal); var Tc: Cardinal; begin Tc := GetTickCount; //Rcupre le nombre de Ticks (de millisecondes) repeat Application.ProcessMessages;//Traite les messages Sleep(1); //Le Sleep sert ici uniquement dlester le CPU //Plus la valeur sera faible, plus le processus sera prioritaire until Cardinal(GetTickCount - Tc) > nDuree; end;

Comment ajouter un contrle dans un MessageDlg ?


Auteur : waskol Nous nous proposons ici de crer une boite de dialogue en y intgrant un ou plusieurs contrles (visuels ou non). Nous verrons aussi comment les contrles crs peuvent rpondre des vnements (lien internet, fermeture automatique grace un Timer) Le principe : Nous crons une boite de dialogue en utilisant CreateMessageDialog Cette fonction renvoie un objet fiche de type TForm.

- 74 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Dans cette fiche, tout comme dans n'importe quelle fiche, nous pouvons y crer dynamiquement un contrle (on peut mme dplacer les contrles qui s'y trouvent dj comme les boutons), en prenant soin de renseigner les proprits Owner (lors du Create), Parent et Name. Nous appelons notre boite de dialogue avec sa mthode ShowModal. Nous dtruisons la boite de dialogue avec sa mthode Free.

Si nous souhaitons utiliser un vnement de ce contrle (OnClick, OnTimer, etc...) : Nous codons l'vnement dans la fiche qui appelle la boite de dialoque

Si nous souhaitons mettre jour le contenu de ce contrle suite l'vnement cod : Nous recherchons depuis le code de l'vnement le contrle mettre jour grace son nom que nous aurons pralablement pris soin de renseigner.

Nous allons tenter de couvrir tous ces aspects en 4 exemples, en partant du plus simple, au plus labor. Exemple 1 : afficher un Logo commercial, une image de fond, etc...
var

AMsgDialog : TForm; UneImage : TImage; begin AMsgDialog := CreateMessageDialog('Le message', mtWarning, [mbYes, mbNo]) ; UneImage := TImage.Create(AMsgDialog); try AMsgDialog.Caption := 'Un exemple de logo'; with UneImage do begin Name := 'MonImage'; Parent := AMsgDialog; //Ligne importante : si absente, le contrle ne s'affichera pas Align:=alclient; SendToBack; //placer l'image en arrire plan Picture.LoadFromFile('MonLogo.bmp'); end; AMsgDialog.ShowModal; finally //Libration de la boite de dialogue AMsgDialog.Free; end; end;

Exemple 2 : Placer un Label, lien vers un site web Il est possible de redimensionner la boite de dialogue, changer sa hauteur par exemple, afin de placer des composants sous les boutons. Dans le projet suivant, nous avons plac un TButton sur une fiche vierge
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject);
- 75 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

private { Dclarations prives } procedure LabelClick(Sender: TObject) ; public { Dclarations publiques } end; var Form1: TForm1; implementation uses ComCtrls,ExtCtrls,ShellApi; {$R *.dfm} //Code de l'vnement OnClick du Label procedure TForm1.LabelClick(Sender: TObject); begin ShellExecute(Handle, 'OPEN', 'http://www.Developpez.com', Nil, Nil, SW_SHOW); end; //Bouton qui affiche la boite de dialogue procedure TForm1.Button1Click(Sender: TObject); var AMsgDialog : TForm; UnLabel : TLabel; begin AMsgDialog := CreateMessageDialog('Le message', mtWarning, [mbYes, mbNo]) ; UnLabel := TLabel.Create(AMsgDialog); try AMsgDialog.Caption := 'Evnement utilisateur'; //On peut redimmensionner la boite de dialogue comme ceci : AMsgDialog.Height := AMsgDialog.Height+15; with UnLabel do begin Name := 'MonLien'; Parent := AMsgDialog; Align:=albottom; Alignment:=taCenter; //Imitation d'un lien internet Caption := 'http://www.Developpez.com'; Cursor := crHandPoint; Font.Style := [fsUnderline]; Font.Color := clBlue; //On relie l'vnement OnClick du Label la procdure LabelClick de notre fiche appelante UnLabel.OnClick:=LabelClick; end; //Affichage de la boite de dialogue AMsgDialog.ShowModal; finally //On dtache la procdure de l'vnement UnLabel.OnClick:=nil; //Libration de la boite de dialogue AMsgDialog.Free; end; end; end.

Exemple 3 : Fermeture automatique d'un MessageDlg sans bouton


unit Unit1; interface

- 76 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Dclarations prives } procedure DlgTimer(Sender: TObject); public { Dclarations publiques } end; var Form1: TForm1; implementation uses ComCtrls,ExtCtrls,ShellApi; {$R *.dfm} //Code de l'vnement OnClick du Label procedure TForm1.DlgTimer(Sender: TObject); begin if ((Sender as TTimer).Owner) is TForm then with ((Sender as TTimer).Owner) as TForm do ModalResult := mrCancel; //Provoque la fermeture de la boite de dialogue end; //Bouton qui affiche la boite de dialogue procedure TForm1.Button1Click(Sender: TObject); var AMsgDialog : TForm; ATimer : TTimer; begin AMsgDialog := CreateMessageDialog('Fermeture automatique dans 5 secondes', mtInformation, []) ; ATimer := TTimer.Create(AMsgDialog); try AMsgDialog.Caption := 'Fermeture automatique'; AMsgDialog.Cursor:=crHourGlass; with ATimer do begin Interval := 5000; //5 secondes //On relie l'vnement OnTimer la procdure DlgTimer de notre fiche appelante ATimer.OnTimer:=DlgTimer; end; //Affichage de la boite de dialogue AMsgDialog.ShowModal; finally //Libration de la boite de dialogue ATimer.OnTimer:=nil; AMsgDialog.Free; end; end; end.

Exemple 4 : Afficher l'heure dans le MessageDlg


unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- 77 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Dclarations prives } procedure DlgTimer(Sender: TObject) ; public { Dclarations publiques } end; var Form1: TForm1; implementation uses ComCtrls,ExtCtrls,ShellApi,DateUtils; {$R *.dfm} procedure TForm1.DlgTimer(Sender: TObject); var UnLabel:TLabel; begin if ((Sender as TTimer).Owner) is TForm then with ((Sender as TTimer).Owner) as TForm do begin //Recherche du Label sur la boite de dialogue UnLabel:=TLabel(FindComponent('MonHorloge')); UnLabel.Caption:=FormatDateTime('dddd d mmmm yyyy, h"h"mm"mn"ss"s"',Now); end; end; procedure TForm1.Button1Click(Sender: TObject); var AMsgDialog : TForm; ATimer : TTimer; ALabel:TLabel; begin AMsgDialog := CreateMessageDialog('', mtInformation, [mbOK]) ; ATimer := TTimer.Create(AMsgDialog); ALabel:=TLabel.Create(AMsgDialog); try AMsgDialog.Caption := 'Exemple de mise jour d''un contrle'; //On agrandit la fiche AMsgDialog.Width:=300; with ALabel do begin Name:='MonHorloge'; Parent:=AMsgDialog; Left:=50; Top:=5; end; with ATimer do begin Interval := 1000; //Dclenchement du timer chaque seconde //On relie l'vnement OnTimer la procdure DlgTimer de notre fiche appelante ATimer.OnTimer:=DlgTimer; end; //Affichage de la boite de dialogue AMsgDialog.ShowModal; finally //Libration de la boite de dialogue ATimer.OnTimer:=nil; AMsgDialog.Free; end; end;

- 78 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end.

Comment renommer une section dans un fichier INI ?


Auteur : waskol Il faut savoir que le fichier INI n'est rien d'autre qu'un fichier texte avec une structure dfinie. Du coup, remplacer une section revient charger le fichier comme n'importe quel autre fichier texte, rechercher la position de la section dans le fichier, puis la remplacer par la nouvelle.
function RenommerSection(NomFichier,AncienNom,NouveauNom:string):boolean; var i:integer; AStringList:TStringList; begin Result:=false; AStringList:=TStringList.Create; try AStringList.LoadFromFile(Fichier); i:=AStringList.IndexOf('['+AncienNom+']'); if i>-1 then begin AStringList.Strings[i]:='['+NouveauNom+']'; AStringList.SaveToFile(NomFichier); Result:=True; end; finally AStringList.Free; end; end;

Exemple d'utilisation :
if RenommerSection('MonFichier.ini','Section1','SectionA') then Showmessage('Section renomme avec succs !') else Showmessage('Ca n''a pas march...');

Il est noter qu'il est aussi possible de supprimer la section en utilisant la mthode EraseSection de TIniFile. Il suffit alors de recrer la section avec le nouveau nom et de rtablir les cls que contenait cette section.

Comment manipuler Flash avec Delphi ?


Auteur : Laurent Dardenne Vous trouverez sur ce site de nombreuses informations concernant l'utilisation d'animations Flash dans vos applications Delphi. L'activeX se nomme: flash.ocx pour Macromedia Flash Player >=6 swflash.ocx pour Macromedia Flash Player <=5.

Vous pouvez le tlcharger sur Adobe Flash Player Centre de Tlchargement Windows

- 79 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Applications console Qu'est-ce qu'une application console ?
Auteur : Al-Yazdi Une application console est une application Windows sans interface graphique. L'interface utilisateur est rduite une fentre texte affich par Windows au moment du lancement de l'application. Les fichiers texte standard Input et Output sont automatiquement associs cette fentre. Bien qu'il n'y ai pas de partie graphique, une application console n'est pas une application DOS. Elle doit tre lance sous Windows comme n'importe quelle autre application.

Comment ajouter les informations de version dans une application console ?


Auteur : Laurent Dardenne La cration d'un nouveau projet de type Application console ne propose pas d'origine la possibilit de lier des informations de version l'excutable. L'ajout la directive {$R *.RES} le permet. Une fois le projet Application console cr, la fentre d'dition contient :
program Project1; {$APPTYPE CONSOLE} uses sysutils; begin // Insrer le code utilisateur ici end.

Vous devez donc insrer la directive {$R *.RES} :


program Project1; {$APPTYPE CONSOLE} uses sysutils; {$R *.RES} // Ligne ajouter

begin // Insrer le code utilisateur ici end.

Si vous ajoutez cette directive un projet existant, Delphi affiche un message d'erreur vous indiquant qu'il ne peut trouver le fichier ressource associ votre projet et vous demande de le recrer. Cliquer sur oui pour confirmer sa cration. Une fois ceci fait, il vous reste cocher l'option "Inclure les informations de version au projet" en utilisant le menu Projet->Option-> onglet "Information de version". Renseigner ces informations et enfin recompiler votre projet. lien : Comment obtenir les informations de version d'un programme ?

Comment utiliser les redirections dans une application console ?


Auteur : Laurent Dardenne Il s'agit de crer une application console qui puisse grer les redirections et ce sans passer par les API. Cela permet de crer et d'utiliser des routines spcialises dans des scripts NT. L'utilisation de INPUT et OUTPUT est "un hritage" du turbo pascal mais reste valide sous Delphi 3-4-5.
- 80 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

program Upper; {$APPTYPE CONSOLE} // Redirection de type 'PIPE', comportement similaire au programme FIND.EXE ou SORT.EXE // Renvoie une chane reue en entre ( input) en majuscules sur la sortie (output) uses sysutils; Var Chaine: String; procedure CloseFile; begin Close(INPUT); Close(OUTPUT); end; Begin try Assign(INPUT,''); Reset(INPUT); Assign(OUTPUT,''); Rewrite(OUTPUT);

{ Entre standard } { Le fichier existe; reset en lecture seule} { Sortie standard} { Le fichier n'existe pas ; rewrite en criture seule}

While not(Eof) Do Begin Readln(INPUT,Chaine); Writeln(OUTPUT,UpperCase(chaine)); end Finally CloseFile; end; end.

Sous NT/Win9x, on peut utiliser cette application console de cette manire


@echo off rem Convertir en majuscule le contenu du fichier minuscule.txt Type Minuscule.txt|Upper>Majuscule.txt

Notes sur les redirections : Une redirection en sortie permet d'enregistrer les donnes obtenues en rsultat d'une commande dans un fichier ou de les diriger vers un priphrique, tel qu'une imprimante, au lieu de les afficher dans la fentre de l'invite de commandes.
Dir> rsultat.txt

Une redirection en entre permet de rcuprer l'entre d'une commande partir d'un fichier au lieu de la saisir sur le clavier.
Ftp<Send.txt

O le fichier Send.txt contient les commandes excuter, chaque ligne contient une commande et est spare par un retour chariot. Un PIPE ou filtre permet de lire les donnes obtenues en sortie d'une commande et de les crire en tant que donnes d'entre dans une autre commande.

- 81 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Echo.|Time

Comment associer un handle une console ?


Auteur : Smortex Afin d'utiliser dans une application console les API Windows, nous devons d'abord rcuprer un des handles de la console. Pour cela, on peut utiliser le code source suivant :
program Project1; {$APPTYPE CONSOLE} uses sysutils, Windows; var Han: THandle; begin Han := GetStdHandle(STD_OUTPUT_HANDLE); if (Han <> INVALID_HANDLE_VALUE) then begin // Insrer le code utilisateur ici end else begin Write('Erreur lors de l''initialisation de l''application !'); ReadLn; end; end.

On peut par la suite utiliser ce handle dans un appel API, par exemple en renseignant le paramtre hTemplateFile de la function CreateFile. Le handle rcupr pouvant tre : STD_INPUT_HANDLE : handle de l'entre standard (CONIN$). STD_OUTPUT_HANDLE : handle de la sortie standard (CONOUT$). STD_ERROR_HANDLE : handle de la sortie d'erreur standard. (permet par exemple de rediriger les erreurs/ Log dans un fichier spcifique. )

Comment demander l'utilisateur d'appuyer sur une touche ?


Auteur : Smortex Il faut utiliser l'API Windows ReadConsoleInput, aprs avoir rcupr le handle de la console.
program Project1; {$APPTYPE CONSOLE} uses SysUtils, Windows; var han: THandle; dw: DWord; buf: TInputRecord; begin han := GetStdHandle(STD_INPUT_HANDLE); Write('Continuer [O/N] ?');
- 82 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

repeat FlushConsoleInputBuffer(han); dw := 0; ReadConsoleInput(han, buf, 1, dw); until (buf.EventType = KEY_EVENT) and (buf.Event.KeyEvent.AsciiChar in ['o','O','n','N']); WriteLn(buf.Event.KeyEvent.AsciiChar); case buf.Event.KeyEvent.AsciiChar of 'o','O': WriteLn('OUI !!'); 'n','N': WriteLn('NON !!'); end; ReadLn; end.

lien :

Lien MSDN : fonction ReadConsoleInput

Comment dterminer si la sortie standard est redirige ?


Auteur : Laurent Dardenne Il est parfois utile de savoir si l'xcution d'une application console redirige ou non ses entre/sortie standard. Pour dterminer si c'est le cas, nous utiliserons la fonction Getfiletype, elle renvoie le type du fichier du handle pass en paramtre:
program TestIO; {$APPTYPE CONSOLE} uses sysutils, Windows; var ConsoleHandle : THandle; Function GetHandleType(Handle:THandle): String; begin case GetFileType(Handle)of FILE_TYPE_UNKNOWN : Result:='type inconnu ou erreur.'; FILE_TYPE_DISK : Result:='fichier disque.'; FILE_TYPE_CHAR : Result:='fichier caractre.'; FILE_TYPE_PIPE : Result:='socket, un pipe nomm, ou un pipe anonyme.'; //FILE_TYPE_REMOTE inutilis end; end; begin ConsoleHandle := GetStdHandle(STD_OUTPUT_HANDLE); WriteLn('Sortie standard : '+ GetHandleType(ConsoleHandle)); Readln; ConsoleHandle := GetStdHandle(STD_INPUT_HANDLE); WriteLn('Entre standard : '+ GetHandleType(ConsoleHandle)); end.

Le type retourn pouvant tre : FILE_TYPE_CHAR : signale un type de fichier caractre, typiquement une imprimante ou la console . FILE_TYPE_DISK : signale un type de fichier disque. FILE_TYPE_PIPE : signale un type de fichier socket, un pipe nomm, ou pipe anonymous. FILE_TYPE_REMOTE : inutilis FILE_TYPE_UNKNOWN : Soit le type de fichier est inconnu soit la fonction a choue. Le script suivant vous permettra de visualiser les diffrents cas de figure :

- 83 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

@Echo Off Set DirPrgName= Set PrgName=%DirPrgName%TestIO.exe Rem Diffrent cas de figure Echo Test avec : %PrgName% %PrgName% pause&Echo. Echo Test avec : %PrgName%^>Result1.txt %PrgName%>Result1.txt Type Result1.txt pause&Echo. Echo Test avec : %PrgName%^|more %PrgName%|more pause&Echo. Echo Test avec : %PrgName%^|more^>Result2.txt %PrgName%|more>Result2.txt Type Result2.txt pause&Echo. Echo Test avec : %PrgName%^>Result1.txt %PrgName%<Result1.txt pause&Echo. Echo Test avec : %PrgName%^<Result1.txt^>Result3.txt %PrgName%<Result1.txt>Result3.txt Type Result3.txt pause&Echo.

Comment mettre des couleurs dans une console ?


Auteur : Smortex Aprs avoir rcupr le handle d'une console, on peut y mettre des couleurs ! Pour cela, on utilise l'API SetConsoleTextAttribute. On peut alors combiner les couleurs d'avant et d'arrire plan...
program Test1Console; {$APPTYPE CONSOLE} uses sysutils, Windows; var ConsoleHandle: THandle; ConsoleScreenBufferInfo: _CONSOLE_SCREEN_BUFFER_INFO; begin ConsoleHandle := GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(ConsoleHandle,ConsoleScreenBufferInfo); // Afficher le texte en bleu : SetConsoleTextAttribute(ConsoleHandle,FOREGROUND_BLUE); WriteLn('Ce texte est Bleu !!!'); // Afficher le texte en jaune (Avec Luminosit + Rouge + Vert = Jaune) : SetConsoleTextAttribute(ConsoleHandle,FOREGROUND_GREEN or FOREGROUND_RED or FOREGROUND_INTENSITY); ReadLn; // Rtabli les couleurs d'origine SetConsoleTextAttribute(ConsoleHandle,ConsoleScreenBufferInfo.wAttributes);

- 84 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end.

lien :

Lien MSDN : fonction SetConsoleTextAttribute

Comment intercepter la fin d'un programme console


Auteur : Laurent Dardenne Dans une application console le code de la section Finalization est xcut si l'application se termine normalement. Par contre si l'utilisateur quitte la console en cliquant sur la croix de fermeture de fentre par exemple, le code de la section Finalization n'est pas excut. L'utilisation de l'API SetConsoleCtrlHandler remdie ce problme. On dportera dans ce cas le code de finalisation dans la fonction mise en place.
program console; {$APPTYPE CONSOLE} uses Windows, SysUtils; function ConProc(CtrlType : DWord) : Bool; stdcall; far; var S : String; begin case CtrlType of CTRL_C_EVENT : S := 'CTRL_C_EVENT'; CTRL_BREAK_EVENT : S := 'CTRL_BREAK_EVENT'; CTRL_CLOSE_EVENT : S := 'CTRL_CLOSE_EVENT'; CTRL_LOGOFF_EVENT : S := 'CTRL_LOGOFF_EVENT'; CTRL_SHUTDOWN_EVENT : S := 'CTRL_SHUTDOWN_EVENT'; else S := 'UNKNOWN_EVENT'; end; // Code de finalisation MessageBox(0, PChar(S + ' dtect'), 'Win32 Console', MB_OK); Result := True; end; begin SetConsoleCtrlHandler(@ConProc, True); Writeln('entre pour terminer'); Readln; // Dsactive le Handler // SetConsoleCtrlHandler(@ConProc, False); end.

Note : Sous l'IDE, la fin de ce programme console peut provoquer une fin anormale de l'IDE.

Comment excuter une application extrieure et rediriger les entrs/sorties


Auteur : Laurent Dardenne Il est parfois utile d'excuter un programme console et de recuprer les informations rsultantes sous Delphi. On peut ainsi rutiliser facilement des programmes spcialiss tel que NET.EXE qui permet de rcuprer un nombre important d'informations sur le poste local et les postes du rseau. L'utilisation de la redirection des entres/sorties d'une application console se fait via l'API CreateProcess en ayant pris soin de crer 2 handles de fichier avant son Appel.

- 85 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Le process ne lira plus les informations en entres partir du clavier mais partir du fichier hInputFile et crira les rsultats dans le fichier hOutputFile et pas sur l'cran. Dans cet exemple on rcupre les informations en fin d'excution de l'application externe. Le composant TDosCommand permet de rediriger la sortie standard d'une application console vers un TMEMO par exemple. Il affiche le rsultat au fur et mesure de l'excution et non pas en fin de process.

Comment cacher la fentre d'une application console ?


Auteur : Laurent Dardenne Sous W9x et NT on utilise la fonction ShowWindow en association avec la fonction FindWindows de l'API. ShowWindow dans ce cas cache la fentre de la console l'cran, dans la barre de tche et dans le gestionnaire de tches. Dans un environnement NT utilisant les stratgies (policies) cela suffit pour viter qu'un utilisateur puisse supprimer cette application console.
Var NouveauTitre : String; AncienTitre : Array[0..512]of char; begin // Mmorise le titre courant de la fentre GetConsoleTitle(PChar(@AncienTitre),SizeOf(AncienTitre)); // Construit un nom unique NouveauTitre:=Format('%d%d', [GetTickCount,GetCurrentProcessId]); // On donne un titre unique la console SetConsoleTitle(Pchar(NouveauTitre)); Writeln('masque la fentre'); // Dlai pour s'assurer que le titre est bien mis jour. Au minimum Sleep(40 ) Sleep(2000); // Masque la fentre // FindWindows obtient le handle. Cet appel retourne le handle ou NIL si l'opration choue. ShowWindow( FindWindow(NIL, PChar(NouveauTitre)),SW_HIDE); Writeln('Affiche la fentre'); Sleep(2000); // Affiche la fntre prcdemment masque ShowWindow( FindWindow(NIL,PChar(NouveauTitre) ),SW_SHOW); // Rattribue le titre originel SetConsoleTitle(PChar(@AncienTitre)); end.

Sous Windows XP & 2003 uniquement on peut utiliser la fonction GetConsoleWindow en lieu et place de la fonction ShowWindow.
Function GetConsoleWindow:HWnd;Stdcall; external 'Kernel32.dll'; Var Titre : Array[0..512]of char; begin // Mmorise le titre courant de la fentre GetConsoleTitle(PChar(@Titre),SizeOf(Titre)); ... ShowWindow(GetConsoleWindow, SW_HIDE); ... end.

- 86 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Il reste une autre possibilit qui est de crer un programme console puis de modifier la directive $APPTYPE. Remplacez uniquement en dbut de fichier source la directive {$APPTYPE CONSOLE} par {$APPTYPE GUI}, c'est tout. Noter que dans ce cas les handles standards utiliss par les fonctions Write et Read ne sont plus accessibles. Leur utilisation provoquera des erreurs l'excution. Code test sous Windows 98 SE, NT, W2K et XP.

Comment faire un "clear screen" dans une application console ?


Auteur : Laurent Dardenne Il n'est pas possible dans une application console d'effacer l'cran comme le faisait la procdure clrstr de Turbo Pascal. La procdure cls ci-dessous explique comment le faire :
program consolecls; {$APPTYPE CONSOLE} uses SysUtils, Windows;

procedure cls(hConsole : THandle); const coordScreen: TCoord=(X:0;Y:0); var cCharsWritten: DWord; csbi: TConsoleScreenBufferInfo; dwConSize : DWord;

// Position d'origine du curseur

begin // Obtient le nombre de caractres contenu dans le buffer courant if not GetConsoleScreenBufferInfo(hConsole, csbi ) then exit; dwConSize:=csbi.dwSize.X * csbi.dwSize.Y; // remplit la totalit de l'cran avec des espaces. if not FillConsoleOutputCharacter( hConsole,#32,dwConSize, coordScreen, cCharsWritten ) then exit; // Obtient l'attribut courant du texte. if not GetConsoleScreenBufferInfo( hConsole, csbi ) then Exit; // Affecte les attributs du buffer en consquence. if not FillConsoleOutputAttribute( hConsole, csbi.wAttributes,dwConSize, coordScreen, cCharsWritten ) then exit; // Place le curseur aux coordonnes d'origine. SetConsoleCursorPosition( hConsole, coordScreen ); end; var HandleConsole : THandle; begin HandleConsole := GetStdHandle(STD_OUTPUT_HANDLE); if (HandleConsole <> INVALID_HANDLE_VALUE) then Cls(HandleConsole)

- 87 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

else

Write('Erreur lors de l''initialisation de l''application !');

lien :

Lien MSDN : Entre/Sortie en mode console

Comment basculer un programme console en mode plein cran ?


Auteur : Laurent Dardenne Pour modifier l'affichage d'un programme console on utilise l'API SetConsoleDisplayMode.
program Fullscreen; //Bascule un programme console en mode plein cran. {$APPTYPE CONSOLE} uses SysUtils, Windows; const CONSOLE_FULLSCREEN_MODE = 1; // Mode plein cran CONSOLE_WINDOWED_MODE = 2; // Mode console ('fentr'). Function SetConsoleDisplayMode(ConsoleOutput : THandle; Flags : DWORD; NewScreenBufferDimensions : PCoord):BOOL; stdcall; external 'kernel32.dll'; Function SetConsoleScreen(Mode:Byte):Boolean; var ConsoleHandle: THandle; begin Result:=False; ConsoleHandle :=GetStdHandle(STD_OUTPUT_HANDLE); if ConsoleHandle <> INVALID_HANDLE_VALUE then Result:=SetConsoleDisplayMode(ConsoleHandle,Mode,Nil)=False end; Function SetFullScreen:Boolean; begin Result:=SetConsoleScreen(CONSOLE_FULLSCREEN_MODE); end; begin Writeln('Mode fenetre '); Readln; if SetFullScreen then Writeln('Mode plein ecran'); Readln; end.

Cette solution n'est valide qu' partir de Windows 2000, contrairement ce qu'indique la documentation sur MSDN. lien : Lien MSDN : fonction SetConsoleDisplayMode

Comment avoir une icne personnalise dans une application console ?


Auteur : Mestoph Il faut tout dabord crer un fichier .rc (avec le bloc-note par exemple) et y crire la ligne suivante:

- 88 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

MAINICON ICON "[FichierIcone].ico"

Ensuite, il faut gnrer un fichier .res utilisable par Delphi. Pour cela, on utilise la commande en ligne:
[RpertoireDelphi]\bin\brcc32.exe [MonFichierRessource].rc

Cet utilitaire va gnrer un fichier .res dans le rpertoire du fichier .rc Une fois ce fichier .res cr, il suffit alors de l'utiliser dans la source du projet en crivant:
{$R *.res}

juste avant le premier begin

- 89 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Citrix Comment corriger la gestion des fentres sous Citrix Metaframe XP ?
Auteur : Laurent Dardenne Solution propos par IgorK Les problmes suivants peuvent survenir pour une application Delphi publie sous Citrix Metaframe XP : Quand l'application s'ouvre, elle n'apparait pas dans la barre des tches, il faut minimiser l'application concerne pour qu'elle apparaisse, mais aussitt maximise elle disparait nouveau. Dans certains cas les fentres modales repassent devant la fentre active et ce malgr l'installation des derniers correctifs Citrix. Dans d'autres et de faon alatoire, lorsque l'on minimise la fentre de l'application puis la maximise, on ne peut plus la minimiser (sauf si on termine et r excute l'application).

Note : L'application sur une workstation stand alone fonctionne normalement. Une solution pour corriger ce problme est de modifier un fichier du runtime de Delphi. Dans l'unit Forms.pas, procdure TApplication.CreateHandle trouvez l'appel CreateWindow et remplacez-le par le code suivant (CreateWindowEx):
// // // // // Modification -> 02/2005 Updated to create the application form as visible (by removing WS_POPUP) but it is created transparent with 1 transparent pixel in the top left corner of the screen, which means top left corner of the application in front off for seamless applications under citrix;

FHandle := CreateWindowEx(WS_EX_APPWINDOW or WS_EX_TRANSPARENT , WindowClass.lpszClassName, PChar(FTitle) , WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU or WS_MINIMIZEBOX // or WS_POPUP //, GetSystemMetrics(SM_CXSCREEN) div 2 //, GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0 , -199, -19, 200, 20 , 0, 0 , HInstance , nil);

Comment numrer une collection sous MFCOM ?


Auteur : Laurent Dardenne Citrix propose ces API au travers d'objet COM, nommes MetaFrame COM (MFCOM). Pour numrer une collection on utilise l'interface IEnumVariant, vous devez dclarer l'unit Activex dans la clause uses pour l'utiliser. Une fois une collection rcupre, on utilise une interface IEnumVariant qui implmente des fonctions d'numration sur des donnes de type variant. Elle ncessite le transtypage suivant sur un objet de type collection, ici UneFerme de type MetaFrameFarm :
ObjSrvEnumerator := (UneFerme.Servers._NewEnum) as IEnumVariant;

La mthode Next permet une itration pour un ou plusieurs lments. Elle renvoie S_OK tant qu'il reste des lments extraire. L'lment rcupr de type OleVariant doit son tour tre transtyp pour permettre de le manipuler correctement :

- 90 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

unServeur := IUnknown(ArrayVariant) as MetaFrameServer;

Le transtypage de l'lment rcupr doit correspondre au type d'objet de la collection. Ici l'objet ArrayVariant est transtyp vers la variable unServeur de type MetaFrameServer. On peut ensuite utiliser les proprits et mthodes de la variable unServeur.
var UneFerme unServeur i

: MetaFrameFarm; : MetaFrameServer; : Integer;

ObjSrvEnumerator : IEnumVariant; ArrayVariant : OleVariant; NumberItem : LongWord; begin ListBox1.Clear; try UneFerme := CoMetaFrameFarm.Create; uneFerme.Initialize(MetaFrameWinFarmObject ); ListBox1.AddItem('Citrix Farme : '+ UneFerme.FarmName, Self

);

ObjSrvEnumerator := (UneFerme.Servers._NewEnum) as IEnumVariant; while (ObjSrvEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do begin unServeur := IUnknown(ArrayVariant) as MetaFrameServer ; ListBox1.AddItem('Serveur : '+ unServeur.ServerName , Self ); end; finally uneFerme := nil; end; end;

Note: Sous Delphi 2005 il n'est pas possible d'itrer sur une interface de type IMetaFrameServers en utilisant la syntaxe For-In-Do, car elle n'implmente pas le modle de collection propre Delphi ( cf. les mthodes publiques GetEnumerator, MoveNext, ...)

Comment rsoudre l'erreur "Handle de fentre non valide" ?


Auteur : Laurent Dardenne Dans une application Delphi sous Citrix uniquement, un message d'erreur peut apparaitre alatoirement lorsqu'on ferme une fentre se trouvant en arrire plan. Le message d'erreur tant :
Erreur Win32. Code : 1400.. Handle de fentre non valide.

En fait l'application est affiche en mode fentre transparente et il faut forcer le focus de la fentre que l'on souhaite fermer.
Interface ... maForm=class(TForm) ... private ... procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
- 91 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

... Implementation ... procedure maForm.WMMouseActivate(var Message: TWMMouseActivate); begin Message.Result := MA_ACTIVATE; if (maForm.Handle <> GetForegroundWindow) and (maForm.Handle <> Handle) and (maForm.Handle <> 0) then begin SetForegroundWindow(maForm.Handle); Windows.SetFocus(maForm.Handle); end; end; ...

On intercepte l'vnement clic de la fentre et si le handle courant ne correspond pas celui de la fentre concerne, on force la focalisation.

- 92 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > DUnit

- 93 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > DUnit > Interface graphique Comment sauvegarder le rsultat des tests (GUI) ?
Auteur : Laurent Dardenne L'interface ne proposant pas par dfaut cette fonctionnalit, vous trouverez ici une solution pour ce faire. Dans un premier temps dclarons une unit ddie la dclaration d'une classe drive de la classe TGUITestRunner.
unit ToolsDUnit; interface uses TestFramework, GUITestRunner, SysUtils, Classes, Dialogs; type // Il existe 2 types d'erreur qui nous intressent TypeErreur=(Echec,Exception); const TabTypeErreur: Array[TypeErreur] Of String[9]=('Echec','Exception'); type // La solution ncessite d'utiliser l'interface ITestListener TGUIMyTestRunner = class(TGUITestRunner,ITestListener) Procedure TestingEnds(TestResult :TTestResult); Virtual; Function TestResultToCSV(TestResult :TTestResult;Delimiteur:String): TStringList; Virtual; end; procedure RunRegisteredTestsAndSave; // Suis le principe de la classe de base implementation Function TGUIMyTestRunner.TestResultToCSV(TestResult :TTestResult;Delimiteur:String): TStringList; Var I:Integer; procedure AddLine(TypeTest:String;ATest:TTestFailure); begin With ATest do // Type :Echec,Exception;Nom de test;Nom de l'exception;Message de l'exception;Adresse de l'exception; // Localisation de l'erreur; pile d'appel Result.Add(TypeTest+Delimiteur+ FailedTest.Name+Delimiteur+ ThrownExceptionName+Delimiteur+ ThrownExceptionMessage+Delimiteur+ AddressInfo+Delimiteur+ LocationInfo+Delimiteur+ StackTrace); end; begin Result:=TStringList.Create; With TestResult do begin If ErrorCount&gt;0 then // Errors contient la liste des exceptions For I:=0 to ErrorCount-1 do AddLine(TabTypeErreur[Echec],Errors[I]); If FailureCount&gt;0 then // Failures contient la liste des cas de test en erreur For I:=0 to FailureCount-1 do With Failures[I] do AddLine(TabTypeErreur[Exception],Failures[I]);
- 94 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end; end; procedure TGUIMyTestRunner.TestingEnds(TestResult :TTestResult); Var Resultat : TStringList; begin Try if Assigned(TestResult) then if (TestResult.ErrorCount&gt;0) or (TestResult.FailureCount&gt;0) then begin Resultat:=TestResultToCSV(TestResult,';'); Resultat.SaveToFile(IncludeTrailingBackSlash(ExtractFilePath(ParamStr(0)))+ 'DUnit_Resultat.txt'); end; Finally If Assigned(Resultat) then Resultat.Free; end; end; procedure RunRegisteredTestsAndSave; Var TestRunner : TGUIMyTestRunner; begin TestRunner:=TGUIMyTestRunner.Create(nil); With TestRunner do begin try Suite := RegisteredTests; ShowModal; finally Free; end; end; end; end.

Dans un second temps l'appel des tests dans le fichier DPR devient :
begin Application.Initialize; if IsConsole then TextTestRunner.RunRegisteredTests else //Code d'origine remplac : // GUITestRunner.RunRegisteredTests; RunRegisteredTestsAndSave; end.

- 95 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants

- 96 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Gnralits et installation Qu'est-ce que la VCL ?
Auteur : Gysmo Il s'agit de la bibliothque des composants visuels (Visual Component Library, VCL). Elle est compose de classes hirarchises toutes descendantes de la classe TComponent. Tous ces composants sont accessibles sur la palette de composants de Delphi. Il est possible de crer de nouveaux composants en drivant les classes existantes. lien : Qu'est-ce que la CLX ? lien : O trouver des composants et outils freeware pour Delphi ? lien : Comment crer ses propres composants ?

Qu'est-ce que la CLX ?


Auteur : Gysmo Il s'agit de la bibliothque des composants multiplates-formes (Component Library for Cross Platform, CLX) permettant d'assurer la portabilit des applications de Windows vers Linux. Kylix utilise uniquement cette bibliothque. La CLX est similaire la VCL mais les composants Windows sont remplacs par des widgets (de window + gadget). De ce fait la hirarchie des TWinControl est remplace par la hirarchie des TWidgetControl avec des mthodes et des proprits en moins. Ces composants peuvent tre groups en parties : VisualCLX (composants graphiques), NetCLX (composants Internet), BaseCLX et DataCLX (Composants d'accs aux donnes client). Tous ces composants CLX sont disponibles partir de la version Professionnelle de Delphi. lien : Qu'est-ce que la VCL ?

Qu'est-ce qu'un TControl ?


Auteur : Al-Yazdi On rencontre souvent ce mot dans l'aide quand on clique sur le bouton "Hirarchie". Mais que signifie-til donc ? Delphi tant un langage objet, une des grandes particularits des objets est l'hritage. Sommairement, l'hritage offre la possibilit, lors de la cration d'un objet descendant, de rutiliser tout ou partie des comportement et proprits d'un "anctre" et d'ajouter ce qui fait la particularit de notre Objet. L'Objet TControl est l'anctre commun de tous les Composants Visuels. L'Objet TControl comporte toutes les proprits de bases que ses descendants peuvent publier ou non.

Qu'est-ce qu'un HANDLE ?


Auteur : Atlantis Un Handle est un nombre entier gnr par Windows permettant d'identifier de manire unique chaque objet cr par le systme d'exploitation. Le Handle est attribu automatiquement par Windows et vous ne pouvez pas le dfinir vous mme. Les handles sont souvent utiliss par les fonctions de l'API de Windows. Suivant les fonctions API la dclaration d'un Handle n'est pas toujours la mme :
{ Pour une fentre } Var Handle : HWND;

- 97 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

{ Pour un contexte de priphrique } Var Handle : HDC; { Pour un bitmap } Var Handle : HBitmap; { Pour une icne } Var Handle : HIcon; { Et si vous ne savez pas quel type utiliser : } Var Handle : THandle;

Pour tous les contrles fentrs ( descendants de TWinControl ) la proprit Handle du composant donne le Handle de fentre Windows sous-jacent au composant.

Comment installer un nouveau composant ?


Auteur : Atlantis Dans le menu "composants", choisir "Installer un composant..." Indiquer le nom de l'unit et le nom du paquet dans le quel le composant doit tre install. Valider et confirmer la construction du paquet pour installer le composant. Cliquer ici pour une dmonstration en images ! lien : Comment Installer un ActiveX ?

Comment Installer un ActiveX ?


Auteur : Atlantis Dans le menu "Composants", slectionner "Installer un contrle ActiveX..." Slectionner le Contrle installer dans la liste. Choisir la palette de destination. Cliquer sur "installer.." puis slectionner le paquet devant contenir le contrle. Valider pour compiler et installer le nouveau composant. Cliquer ici pour une dmonstration en images ! lien : Comment installer un nouveau composant ?

Comment importer des librairies de type ?


Auteur : nek_kro_kvlt La solution la plus facile mettre en oeuvre pour exporter les librairies de type est d'utiliser un "dcompileur". ResHacker est un des outils notre disposition qui nous permet d'extraire les librairies voulues. Pour le faire, il suffit d'ouvrir l'excutable dans ResHacker, choisir l'opration Export as bin file, puis nommer la destination LibExtraite.dll par exemple. Il suffit alors maintenant d'importer cette librairie

- 98 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

dans Delphi en choisissant le menu Composants. Une solution alternative est d'utiliser l'outil OleView, onglet Interface. On peux y retrouver les interfaces dclares et le fichier de librairie associ.

Comment utiliser PasswordChar sur un TEdit dans une application CLX ?


Auteur : reisubar Pour permettre la saisie d'un mot de passe sous Linux comme vous le faisiez sous Windows (c'est dire que les lettres sont substitues par des "*"), changez la proprit EchoMode du composant emPassword.

Comment distribuer et installer un contrle ActiveX pour mon application ?


Auteur : Olivier Lance Un ActiveX consiste en une dll (souvent d'extension .ocx ou .dll) qui publie ses fonctions et ses interfaces. Pour tre utilisable dans une application cet ActiveX doit tre rfrenc par Windows. Si vous utilisez un ActiveX pour votre application, il faut le dployer avec celle-ci puis l'enregistrer dans windows grce la commande :
%SYSDIR%\regsvr32 /s "%CHEMIN_ACTIVEX%\Fichier.ocx"

Le paramtre "/s" est facultatif : il active le "mode silencieux" de regsvr32 ce qui vite de voir une bote de dialogue "DllServerRegister effectu pour..." Lorsque votre application est dsinstalle vous pouvez supprimer votre ActiveX. Drfrencez-le par la mme occasion grce au paramtre "/u" :
%SYSDIR%\regsvr32 /u /s "%CHEMIN_ACTIVEX%\Fichier.ocx"

Pourquoi mon programme plante-t-il sur un PC o Delphi n'est pas install ?


Auteur : Olivier Lance Delphi est bas sur l'utilisation de paquets d'excution pour faire fonctionner les EXE qu'il compile. Ces paquets d'excution peuvent au choix tre inclus ou non dans l'EXE final. S'ils le sont l'EXE est indpendant et s'excutera correctement. Dans le cas contraire il aura besoin que les paquets soient prsents part sur le systme. Pour rgler ce problme il faut modifier les options de votre projet. Allez dans "Projet" -> "Options" puis dans l'onglet "Paquets". L il se trouve une case cocher, "Construire avec les paquets d'excution". Si elle est coche, Delphi n'incluera pas les paquets d'excution dans votre EXE et celui-ci ne fonctionnera donc pas partout. Si vous comptez dployer votre projet, pensez donc dcocher cette case ou bien fournir les paquets de Delphi sparment !

- 99 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Dans ce dernier cas, vous avez besoin de savoir quels paquets distribuer : aprs avoir recompil votre projet, choisissez "Informations pour [nom du projet]" dans le menu "Projet" afin de vrifier quels sont les paquets dployer avec votre application !

Comment associer une image mon composant dans la palette ?


Auteur : DMO Informations utiles : Le nom de l'unit contenant la procdure Register (disons par exemple UMonComposant.pas) Les noms des classes auxquelles il faut associer une image (disons par exemple TMonComposant et TMonAutreComposant)

Outils utiliser : L'diteur d'images de Delphi, accessible par le menu Outils

Mode opratoire : lien : Fichier > Nouveau > Fichier Ressource Composant (extension dcr ). Clic droit puis Nouveau > Bitmap . Prciser la taille : 24 x 24, puis Ok . Dessiner ou copier-coller l'image. Renommer Bitmap1 en TMonComposant . Rpter les 4 dernires tapes pour TMonAutreComposant . Enregistrer le fichier ".dcr" ainsi cr ct (mme dossier) de l'unit UMonComposant.pas en le nommant UMonComposant.dcr Pour que ce fichier soit pris en compte par Delphi, il doit apparatre dans le paquet o se trouvent vos composants. Pour cela, retirer UMonComposant.pas, puis l'ajouter nouveau au paquet. Reconstruire le paquet. Tutoriel de sjrd sur la cration de composants non visuels

Comment rsoudre le problme 'Dsgnintf.dcu non trouv' lors d'import de composants ?


Auteur : Nono40 L'unit Dsgnintf n'existe plus depuis la version 5 de Delphi. Elle est remplace par les deux units DesignIntf et DesignEditors. Pour plus de dtails concernant l'importation de composants de versions antrieures Delphi 5 regardez ici.

Comment ajouter une icone et un texte personnaliss dans le splash screen de BDS ?
Auteur : Pedro Vous avez sans doute remarqu, depuis l'avnement de BDS, certains packages de composants ajoutent leurs logos et leur titre dans l'cran de dmarrage (splash screen) de BDS.

- 100 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Pour cela, il faut crer un fichier ressource (.res) qui contient une image puis une unit utilisant, dans la section initialization, la classe IOTASplashScreenServices des ToolsAPI de Delphi qui contient des informations sur l'cran de dmarrage. Voici comment procder: 1. Crez un fichier de ressource La taille de l'image contenue devra tre de 24x24 pixels. Son nom dans le fichier de ressource devra tre en majuscule. 2. Crez un nouveau package design-time 3. Ajoutez-y l'unit suivante :
unit BDSSplashRegister; interface implementation uses Graphics, ToolsAPI, DesignIntf, SysUtils; //Ici, indiquez votre fichier de ressource pralablement cr. {$R MonFichierRessource.res} //fonction permettant de rcuprer un TBitmap depuis une ressource. function BitmapFromResource(const ABitmapName: string): TBitmap; begin Result := Graphics.TBitmap.Create; Result.LoadFromResourceName(hInstance, ABitmapName); end; initialization //Force l'EDI charger le package. ForceDemandLoadState(dlDisable); //Dans DesignIntf SplashScreenServices.AddProductBitmap('Le titre de ma librairie', BitmapFromResource('NOMDERESSOURCE').Handle); // Le nom de la ressource doit tre en MAJUSCULE

// Un petit Sleep pour se laisser le temps d'admirer son oeuvre. // Cette ligne peut tre supprime ou bien la valeur peut tre modifie suivant le temps que l'on veut attendr Sleep(2000); end.

Note: La mthode AddProductBitmap de IOTASplashScreenServices contient d'autres paramtres optionnels. Ainsi, il est possible de l'utiliser comme ceci:
SplashScreenServices.AddProductBitmap('Le titre de ma librairie', BitmapFromResource('NOMDERESSOURCE').Handle, true, 'Informations de license', 'texte ajout aprs le titre');

4. Compilez, installez le package et redmarrez BDS. Si tout s'est bien pass, votre logo et votre texte apparaitront dans le splash screen.

- 101 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Cration dynamique / Recherche Comment crer dynamiquement un composant visuel ?
Auteur : Nono40 Tous les composants de Delphi peuvent tre crs au moment de l'excution du programme. Pour instancier un composant, il suffit d'appeler le constructeur de la classe correspondante. Pour les composants visuels, il faut absolument dfinir la proprit Parent. Le composant donn en paramtre de Create est le propritaire du composant nouvellement cr. Il ne faut pas confondre propritaire et parent. Le propritaire est le composant qui se chargera de sa destruction quand il sera lui-mme dtruit. Le parent est le composant qui sert de rfrence d'affichage dans la fentre.
Var MonBouton:TButton; procedure TForm1.Button1Click(Sender: TObject); begin { La fentre est propritaire du nouveau bouton } MonBouton := TButton.Create(Self); { mais c'est dans Panel1 qu'il doit s'afficher } MonBouton.Parent := Panel1; { ensuite on dfinit les autres proprits } MonBouton.Caption := 'Bouton !'; MonBouton.Left := 10; end;

Si aucune rfrence directe n'est ensuite faite la variable MonBouton, il est possible de s'en passer :
procedure TForm1.Button1Click(Sender: TObject); begin With TButton.Create(Self) Do Begin Parent := Panel1; Caption := 'Bouton !'; Left := 10; End; end;

Comment ajouter un vnement un composant cr dynamiquement ?


Auteur : Nono40 Pour ajouter un vnement un composant cr dynamiquement il faut procder manuellement comme Delphi en mode conception. En premier lieu il faut dclarer l'vnement dans la dclaration de votre classe.
type TForm1 = class(TForm) ... public { Dclarations publiques } { Le nom de la procdure importe peu } { Mais il FAUT respecter les paramtres } Procedure MonClickSurBouton (Sender: TObject); end;

Puis il faut crire le code de l'vnement :

- 102 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Procedure TForm1.MonClickSurBouton Begin ShowMessage('Click !'); End;

(Sender: TObject);

Enfin il faut associer l'vnement au moment de la cration des composants :


With TButton.Create(Self) Do Begin Parent := Self; Caption := 'Un bouton !'; { ajout de l'vnement } OnClick := MonClickSurBouton; End;

Comment trouver un composant en connaissant son nom ?


Auteur : Nono40 Pour recherche la rfrence d'un composant en ne connaissant que son nom et son propritaire, il faut utiliser la fonction FindComponent du propritaire. Le rsultat de cette fonction est toujours de type TComponent, il est donc utile d'en transtyper le rsultat en fonction du type de composant attendu.
procedure TForm1.Button1Click(Sender: TObject); Var Edit:TEdit; begin Edit:=TEdit(Form1.FindComponent('Edit1')); If Edit<>Nil Then ShowMessage(Edit.Text); end;

Cette mthode est trs utile pour modifier les proprits d'une srie de composants dont les noms peuvent tre calculs en boucle. Par exemple pour effacer le contenu de Edit1.Text Edit10.Text :
procedure TForm1.Button1Click(Sender: TObject); Var Edit : TEdit; i : Integer; begin For i:=1 To 10 Do Begin Edit:=TEdit(Form1.FindComponent('Edit'+IntToStr(i))); If Edit<>Nil Then Edit.Text:=''; End; end;

Comment connatre le composant l'origine de l'vnement ?


Auteur : Nono40 Dans le cas o plusieurs composants utilisent le mme gestionnaire d'vnement. Cette affectation pouvant tre faite la conception comme l'excution, il est utile de connatre quel composant est l'origine de l'vnement. C'est le rle du paramtre Sender contenu dans tous les vnements.

- 103 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Par exemple pour connatre le nom du bouton cliqu, mme si Button1Click est associ button2, button3 etc...
procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Appui sur le bouton :'+TButton(Sender).Name); end;

Comment parcourir tous les composants d'une fiche ?


Auteur : Nono40 Pour parcourir tous les composants d'une fiche, il faut utiliser le tableau Components[] de la fiche. L'oprateur Is permet de dterminer si le composant est bien du type souhait. Par exemple pour mettre 'AAA' dans tous les labels de la fiche :
procedure TForm1.Button1Click(Sender: TObject); Var i:Integer; begin For i:=0 To ComponentCount-1 Do If Components[i] Is TLabel Then TLabel(Components[i]).Caption:='AAA'; end;

Attention, si vous utilisez la mthode Free, sur l'un des composants du tableau Components[] pendant la boucle, il faut imprativement effectuer la boucle dans le sens descendant. Par exemple pour supprimer tous les labels de la fiche :
procedure TForm1.Button1Click(Sender: TObject); Var i:Integer; begin For i:=ComponentCount-1 DownTo 0 Do If Components[i] Is TLabel Then Components[i].Free; end;

Comment retrouver le TLabel associ un contrle ?


Auteur : Mac LAK Les composants TLabel possdent une proprit FocusControl, qui permet de slectionner un contrle lorsque l'on clique sur le label. Cependant, il n'y a pas de proprit pour effectuer l'opration inverse, savoir retrouver le label associ un contrle. Le code suivant permet cette recherche :
function SearchLabel(Const Control : TObject) : TLabel ; Var Form : TForm ; I : Integer ; begin Result:=Nil; If Not Assigned(Control) Then

- 104 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Exit ; If Not (Control Is TControl) Then Exit ; Form:=OwnerForm(Control); For I:=0 To (Form.ComponentCount-1) Do If Form.Components[I] Is TLabel Then If (Form.Components[I] As TLabel).FocusControl=Control Then Begin Result:=Form.Components[I] As TLabel; Exit; End;

Si le contrle n'a aucun label associ, n'est pas dans une fiche, ou n'est pas un contrle, la fonction renverra Nil. Sinon, elle renvoie directement l'instance TLabel correspondante.

- 105 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Utilisation des fonctions des APIs Comment rcuprer le texte affich dans la barre de titre d'une fentre quelconque ?
Auteur : Pierre Castelain Il peut parfois tre utile de rcuprer le texte affich dans la barre de titre d'une fentre quelconque (en dehors de notre application). C'est trs facile raliser l'aide des fonctions de l'API Windows. Dans l'exemple qui suit, nous rcuprons le caption de la fentre active.
function GetActiveWindowCaption: string; var h : hwnd; sz: Integer; begin // Nous commenons par rcuprer le handle de la fentre // situe au premier plan h := GetForegroundWindow; // Nous changeons la dimension de la chane de retour pour qu'elle puisse // contenir le texte dont nous ne connaissons pas encore la longeur. // 255 caractres parassent suffisant dans cet exemple SetLength(result, 255); // Nous appelons la fonction afin d'obtenir le texte de la fentre sz:= GetWindowText(h, PChar(result), 255); // Nous redimensionnons la chane de retour pour liminer les caractres en trop SetLength(result, sz); end;

Comment changer la couleur d'un TProgressBar ?


Auteurs : Mac LAK - Nono40 Le composant TProgressBar ne dispose pas de proprit color. Par contre il existe un message Windows pour modifier directement le contrle : PBM_SETBARCOLOR.
Const { Dfinition du numro de message} PBM_SETBARCOLOR = WM_USER + 9; procedure TForm1.Button1Click(Sender: TObject); begin { Envoi du message avec la couleur voulue} SendMessage(ProgressBar1.Handle,PBM_SETBARCOLOR,0,clLime); end;

Note : Le code ci-dessus ne fonctionne pas avec les thmes XP activs. lien : Windows SDK - Message PBM_SETBARCOLOR

Comment crer un fichier temporaire ?


Auteur : Mac LAK L'API Win32 fournit plusieurs fonctions sur le sujet : GetTempPath pour obtenir le rpertoire temporaire du compte courant, et GetTempFileName qui permet de crer un nom de fichier unique de manire fiable.
{
- 106 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Retourne un nom de fichier absolu, alatoire, dans le rpertoire temporaire. Le fichier est cr, mais ferm. Le prfixe (3 caractres max), optionnel, sert "isoler" les fichiers temporaires de son application des autres. Si le rpertoire temporaire n'est pas trouv, ce sera le rpertoire de l'application. } Function GetScratchName ( Const Prefix : String = 'TMP' ) : String ; Var Path, Name : Array[0..MAX_PATH] Of Char ; Begin // Rcupration du rpertoire temporaire (ventuellement, celui de l'application). If (GetTempPath(MAX_PATH,@Path)=0) Then StrCopy(@Path,PChar(ExtractFileDir(Application.ExeName))); // Cration d'un fichier temporaire unique. If (GetTempFileName(@Path,PChar(Prefix),0,@Name)=0) Then Result:=EmptyStr Else Result:=String(@Name); End;

A la sortie de la fonction, le fichier dont le nom est retourn existe, est vide, et il est possible de l'ouvrir pour l'utiliser selon les besoins. Attention : Aucun lment de l'OS (ni de Delphi) n'effacera le fichier pour vous la fin du programme, vous devez vous en occuper manuellement. lien : lien : Lien MSDN : fonction GetTempPath Lien MSDN : fonction GetTempFileName

Comment effectuer des chronomtrages prcis ?


Auteur : Mac LAK Pour le faire, il faut utiliser les fonctions de compteur hautes performances (CHP) de l'API Win32. Il s'agit entre autres des fonctions QueryPerformanceFrequency et QueryPerformanceCounter (Windows.pas). La premire renvoie la frquence (en hertz) du compteur HP de la machine et la seconde renvoie la valeur courante d'un compteur libre. La rsolution est souvent de l'ordre d'une nanoseconde (un milliardime de seconde). Dclarez ces variables :
Var FFrequency : Int64 ; FStart, FStop : Int64 ; FElapsed : Extended ; // Frquence du compteur hautes performances. // Valeurs du compteur au dbut et la fin du chrono. // Dure finale, en secondes.

Pour effectuer le chronomtrage lui-mme :


// Initialisation du compteur hautes performances, et dbut du chronomtrage. If Not QueryPerformanceFrequency(FFrequency) Then Raise Exception.Create('Pas de compteur hautes performances.'); QueryPerformanceCounter(FStart) ; // Insrer ici l'opration chronomtrer, ou un appel de fonction. // Fin de chronomtrage, conversion du temps coul en secondes. QueryPerformanceCounter(FStop) ; FElapsed := (FStop-FStart)/FFrequency ;

La rsolution de ce compteur est en gnral trs leve : il n'est pas rare que ce soit la frquence du processeur qui serve de base. Sur un systme donn, elle ne change jamais, mais elle varie d'un systme
- 107 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

un autre : il est donc impratif de toujours rcuprer la frquence par un appel au systme. Cet appel peut n'tre fait qu'une seule fois dans le programme. De mme, certaines machines ne possdent pas ce compteur : il est donc ncessaire galement de tester le retour de QueryPerformanceFrequency (les tests ultrieurs peuvent souvent tre omis, car ils n'chouent normalement jamais si l'obtention de la frquence a russi la premire fois). Si la version de Delphi utilise ne dclare pas ces fonctions, insrer ces dclarations dans le code :
Uses Windows ; // Requiert Delphi 4 ou suprieur, ou de rimplmenter des entiers 64 bits. function QueryPerformanceCounter(var lpPerformanceCount: TLargeInteger): BOOL; stdcall; external kernel32 name 'QueryPerformanceCounter'; function QueryPerformanceFrequency(var lpFrequency: TLargeInteger): BOOL; stdcall; external kernel32 name 'QueryPerformanceFrequency';

lien : lien :

Lien MSDN : fonction QueryPerformanceFrequency Lien MSDN : fonction QueryPerformanceCounter

Comment obtenir le code de sortie de l'application ?


Auteur : Mac LAK Il faut utiliser la fonction GetExitCodeProcess de l'API Win32. Cette fonction demande un handle sur le processus dont on veut le code de sortie, comme celui obtenu par CreateProcess ou OpenProcess par exemple. Attention : Il faut le handle du processus, pas celui de sa fentre principale. Exemple avec CreateProcess :
Function RunAndGetExitCode ( Const CommandLine : String ) : LongWord ; Var StartupInfo : TStartupInfo; ProcessInfo : TProcessInformation; Begin FillChar(StartupInfo,SizeOf(StartupInfo),#0); StartupInfo.cb := SizeOf(StartupInfo); If Not CreateProcess( Nil, PChar(CommandLine), Nil, Nil, True, 0, Nil, Nil, StartupInfo, ProcessInfo) Then RaiseLastOSError; // Attente de la fin du processus. WaitForSingleObject(ProcessInfo.hProcess, INFINITE); // Rcupration du code de sortie. GetExitCodeProcess(ProcessInfo.hProcess,Result); End;

Exemple avec OpenProcess :


Function GetExitCode ( Const PID : LongWord ) : LongWord ; Var hApp : THandle ; ExitCode : LongWord ; Begin hApp:=OpenProcess(PROCESS_QUERY_INFORMATION,False,PID); // Rcupration du code de sortie. GetExitCodeProcess(hApp,Result); End;

Note : Si le processus est toujours actif, son code de sortie vaut STILL_ACTIVE. Exemple d'application renvoyant un code d'erreur :
- 108 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Program StopWithExitCode ; {$APPTYPE CONSOLE} Begin // Cette instruction arrte le programme proprement, avec un code de sortie. // Par convention, la valeur zro est utilise pour indiquer une sortie sans erreur. Halt(3);

End.

lien :

Lien MSDN : fonction GetExitCodeProces

Comment obtenir le message correspondant une erreur Windows obtenue ?


Auteur : Mac LAK Windows ne renvoie ses erreurs internes que sous forme de codes numriques, obtenus en gnral par un appel GetLastError. Pour obtenir le message d'erreur "en clair", plusieurs solutions : - Utiliser la fonction Delphi Win32Check pour appeler l'API Win32, mais ne marche que si la fonction renvoie un BOOL TRUE sur erreur. - Utiliser RaiseLastOSError (ou RaiseLastWin32Error sur D5 ou infrieur), mais ne marche pas si l'on a dj lu la valeur de GetLastError. Mais ces fonctions lancent des exceptions, ce qui n'est pas toujours souhaitable. Une solution plus fine consiste passer le code numrique la fonction Delphi SysErrorMessage. Toutes ces fonctions sont dans l'unit SysUtils.pas. Exemple :
If CreateFile(....)=INVALID_HANDLE_VALUE Then Begin ErrorCode:=GetLastError; // Traitement additionnel. ShowMessage(SysErrorMessage(GetLastError)); End;

A peu de choses prs, crire


Raise Exception.Create(SysErrorMessage(GetLastError));

revient appeler RaiseLastOSError/RaiseLastWin32Error. Note : Sur D6 et suprieur, RaiseLastWin32Error existe toujours, mais gnre un avertissement la compilation. La fonction ne fait qu'appeler RaiseLastOSError. lien : Lien MSDN : fonction FormatMessage avec le paramtre FORMAT_MESSAGE_FROM_SYSTEM.

Comment obtenir la hauteur de la barre des taches ?


Auteur : Pierre Castelain Pour obtenir la taille de la barre des tches, nous utilisons la fonction de l'API Windows, SystemParametersInfo avec comme action SPI_GETWORKAREA. On peut utiliser le code suivant pour informer l'utilisateur de la hauteur de la barre des tches :
procedure TFormMain.btnHauteurBarreClick(Sender: TObject); Var

- 109 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Rect: TRect; begin SystemParametersInfo(SPI_GETWORKAREA, 0, @Rect, 0); ShowMessage(IntToStr(Screen.Height - Rect.Bottom)); end;

Cette fonction peut tre utilise pour avoir bien d'autres informations tels que le delai de rptitions des touches du clavier par exemple. lien : Lien MSDN : fonction SystemParametersInfo

- 110 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Le composant TDrawGrid Comment Supprimer une ligne ou une colonne dans un TDrawGrid ?
Auteur : waskol Il suffit de rendre publiques les mthodes DeleteRow et DeleteColumn de la classe TCustomGrid dont hrite la classe TDrawGrid travers le transtypage de cette dernire en une classe drive dclare dans la mme unit :
type TPublicDrawGrid = class(TDrawGrid); ... procedure TForm1.Button1Click(Sender: TObject); begin //supprime la ligne n3 (donc la quatrime ligne, la premire tant la ligne n0) : TPublicDrawGrid(DrawGrid1).DeleteRow(3); //Supprime la premire colonne (colonne n0) : TPublicDrawGrid(DrawGrid1).DeleteColumn(0); end;

Rubriques connexes de la FAQ : Comment supprimer une ligne ou une colonne dans un TStringGrid ? Comment accder aux mthodes "Protected" d'une classe ?

- 111 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Le composant TStringGrid Comment supprimer n'importe quelle ligne d'une TStringGrid ?
Auteur : Smortex Le composant StringGrid ne permet pas de supprimer une ligne directement avec son numro. Il faut donc copier chaque ligne situe aprs celle a supprimer sur la ligne qui la prcde, puis supprimer la dernire ligne. Par exemple, si on veut supprimer la ligne 3, on copie la 4 sur la 3, la 5 sur la 4, ... et on supprime la dernire. On peut donc utiliser une procdure telle que :
procedure RemoveLine(AStringGrid: TStringGrid; ALine: Integer); var i: Integer; begin for i := ALine to AStringGrid.RowCount - 2 do AStringGrid.Rows[i] := AStringGrid.Rows[i + 1]; AStringGrid.RowCount := AStringGrid.RowCount - 1; end;

On peut alors facilement supprimer la ligne 3 de la StringGrid "MaStringGrid" :


RemoveLine(MaStringGrid,2);

Comment supprimer une ligne ou une colonne dans un TStringGrid ?


Auteur : waskol Il suffit de rendre publiques les mthodes DeleteRow et DeleteColumn de la classe TCustomGrid dont hrite la classe TStringGrid travers le transtypage de cette dernire en une classe drive dclare dans la mme unit :
type TPublicStringGrid = class(TCustomGrid); ... procedure TForm1.Button1Click(Sender: TObject); begin //supprime la ligne n2 (donc la troisime ligne, la premire tant la ligne n0) : TPublicStringGrid(StringGrid1).DeleteRow(2); //Supprime la deuxime colonne (colonne n1) : TPublicStringGrid(StringGrid1).DeleteColumn(1); end;

Rubriques connexes de la FAQ : Comment accder aux mthodes "Protected" d'une classe ?

- 112 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Comment Supprimer une ligne ou une colonne dans un TDrawGrid ?

Comment centrer le texte d'un TStringGrid ?


Auteur : Nono40 Le code suivant permet de centrer le texte dans les cellules d'un TStringGrid. Le centrage est la fois vertical et horizontal. Le dessin est ici effectu avec l'API de Windows car la fonction TextOut du canevas des composants ne permet pas directement le centrage.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin With Sender As TStringGrid Do With Canvas Do Begin { Slection de la couleur de fond } If gdFixed in State Then Brush.Color := clBtnFace Else If gdSelected In State Then Brush.Color := clNavy Else Brush.Color := clWhite; { Dessin du fond } FillRect(Rect); { Slection de la couleur de texte } If gdSelected In State Then SetTextColor(Canvas.Handle,clWhite) Else SetTextColor(Canvas.Handle,clBlack); { Dessin du texte en utilisant la fonction API } DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect , DT_CENTER or DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE End; end;

);

Une variante de ce code permet d'crire le texte d'une cellule sur plusieurs lignes :
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin With Sender As TStringGrid Do With Canvas Do Begin { Slection de la couleur de fond } If gdFixed in State Then Brush.Color := clBtnFace Else If gdSelected In State Then Brush.Color := clNavy Else Brush.Color := clWhite; { Dessin du fond } FillRect(Rect); { Slection de la couleur de texte } If gdSelected In State Then SetTextColor(Canvas.Handle,clWhite) Else SetTextColor(Canvas.Handle,clBlack); { Dessin du texte en utilisant la fonction API } DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect , DT_CENTER or DT_NOPREFIX or DT_WORDBREAK );
- 113 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

End; end;

lien :

Lien MSDN : fonction DrawText

Comment avoir des lignes de couleur sur un TStringGrid ?


Auteur : Nono40 Ce code permet d'obtenir une grille avec des lignes de couleurs diffrentes. Ceci facilite la lecture des grilles de taille importantes. Pour utiliser ce code il faut l'ajouter dans l'vnement OnDrawCell du TStringGrid :
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin With Sender As TStringGrid Do With Canvas Do Begin { slection de la couleur de fond } If gdFixed in State Then Brush.Color := clBtnFace Else If gdSelected In State Then Brush.Color := clNavy Else If Odd(ARow) Then Brush.Color := $FFE0FF Else Brush.Color := $FFFFE0; { Dessin du fond } FillRect(Rect); { Slection de la couleur d'criture } If gdSelected In State Then Font.Color:=clWhite Else Font.Color:=clBlack; { Dessin du texte } TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]); End; end;

Comment mettre une image en fond d'un TStringGrid ?


Auteur : Nono40 Voici le code appliquer pour mettre une image en fond des cellules blanches d'un TStringGrid. L'image est contenu dans un Bitmap, mais elle peut aussi tre contenu dans un TImage. Cette procdure gre le dplacement du fond de l'image si l'utilisateur se sert des barres de dfilement :
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); Var i,j,x,y:Integer; R:TRect; begin With Sender As TStringGrid Do With Canvas Do Begin If gdFixed in State Then Begin { Les cellules fixes sont toujours dessines en gris } Brush.Color := clBtnFace; Brush.Style := bsSolid; FillRect(Rect); End Else

- 114 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Begin If gdSelected In State Then Begin { Les cellules slectionnes sont en bleue } Brush.Color := clNavy; Brush.Style := bsSolid; FillRect(Rect); End Else Begin { Recherche de la zone image copier pour tenir compte des dcalages } { de la grille en fonction des barres de dfilement. } X:=0; For i:=FixedCols+1 To ACol Do Inc(x,ColWidths [i]); Y:=0; For i:=FixedRows+1 To ARow Do Inc(Y,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 } CopyRect(Rect,MonBitmap.Canvas,R); Brush.Style := bsClear; End; End; { Slection de la couleur de texte } If gdSelected In State Then SetTextColor(Canvas.Handle,clWhite) Else SetTextColor(Canvas.Handle,clBlack); { Dessin du texte en utilisant la fonction API } DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect ,DT_NOPREFIX ); End; end;

MonBitMap est un objet de type TBitMap qui doit avoir t charg avec l'image. L'image doit tre suffisamment grande pour couvrir le fond du TStringGrid.

Comment trier une grille en fonction d'une colonne ?


Auteur : Pierre Castelain On a souvent besoin de trier le contenu d'un composant TStringGrid afin de prsenter des donnes l'utilisateur. Malheureusement, ce composant ne propose pas de fonction de tri. Voici donc un source dmontrant comment implmenter cette fonctionnalit. Source : TriStringGrid

Comment exporter un TStringGrid vers Excel ?


Auteur : Linkin Voici une procdure qui vous permet d'exporter le contenu d'un TStringGrid vers Excel.
procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word; const AValue: string); var L: Word; const {$J+} CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0); {$J-} begin
- 115 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

L := Length(AValue); CXlsLabel[1] := 8 + L; CXlsLabel[2] := ARow; CXlsLabel[3] := ACol; CXlsLabel[5] := L; XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel)); XlsStream.WriteBuffer(Pointer(AValue)^, L); end; function SaveAsExcelFile(AGrid: TStringGrid; AFileName: string): Boolean; const {$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-} CXlsEof: array[0..1] of Word = ($0A, 00); var FStream: TFileStream; I, J: Integer; begin FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite); try CXlsBof[4] := 0; FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof)); for i := 0 to AGrid.ColCount - 1 do for j := 0 to AGrid.RowCount - 1 do XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]); FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof)); Result := True; finally FStream.Free; end; end;

Pour rappel, la directive $J contrle si les constantes types peuvent tre modifies ou non. Vous pouvez consulter l'aide sur cette directive dans l'aide pour plus de dtails. Utilisation : SaveAsExcelFile(StringGrid1,'c:\testxls.xls');

Comment avoir des retours chariot dans une cellule d'une StringGrid ?
Auteur : rbag Pour cela, il faut activer l'option goAlwaysShowEditor et ajouter le code suivant dans l'vnement OnKeyDown :
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_RETURN then StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] + sLineBreak; end;

et dans l'vnement OnDrawCell (issu de la faq Delphi):


procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin with Sender as TStringGrid do with Canvas do begin { Slection de la couleur de fond } if gdFixed in State then Brush.Color := clBtnFace
- 116 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

else if gdSelected in State then Brush.Color := clNavy else Brush.Color := clWhite; { Dessin du fond } FillRect(Rect); { Slection de la couleur de texte } if gdSelected in State then SetTextColor(Canvas.Handle,clWhite) else SetTextColor(Canvas.Handle,clBlack); { Dessin du texte en utilisant la fonction API } DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect ,DT_NOPREFIX or DT_WORDBREAK ); end; end;

Comment slectionner du texte dans une cellule de TStringGrid ?


Auteur : Pierre Castelain Pour slectionner du texte dans une cellule du composant TStringGrid, nous utilisons le composant TInplaceEdit spcialis pour le traitement du texte des cellules des grilles. Il s'agit en ralit d'une fiche sans bordure dont le parent est la grille; c'est ce qui explique pourquoi il est invisible et n'apparat pas en tant que contrle indpendant.
procedure TForm1.Button1Click(Sender: TObject); //On parcours les contrles enfants de la grille la recherche du TInplaceEdit function GetInPlaceEdit(ACustomGrid: TCustomGrid): TInplaceEdit; var i: integer; begin for i:=0 to ACustomGrid.ControlCount-1 do if ACustomGrid.Controls[i] is TInplaceEdit then begin result:= TInplaceEdit(ACustomGrid.Controls[i]); exit; end; result:= nil; end; var myRect: TGridRect; ed: TInplaceEdit; begin // Slection de la cellule myRect.Left := 1; myRect.Top := 2; myRect.Right := 1; myRect.Bottom := 2; sg.Selection := myRect; // Donner le focus la grille ActiveControl:= sg; // Passer la grille en mode dition sg.EditorMode:= true; // Rcuprer l'diteur ed:= GetInPlaceEdit(sg); // Et en faire quelque chose // dans ce cas slectionner le texte contenu dans la cellule

- 117 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

if ed <> nil then begin ed.SelStart:= 0; ed.SelLength:= ed.GetTextLen; end; end;

Remarque : TInPlaceEdit peut tre utilis avec tous les descendants de TCustomGrid, TDBGrid inclut bien videmment.

Comment empcher l'dition d'une cellulle dans un TStringGrid ?


Auteur : waskol Nous souhaitons que l'utilisateur n'ait pas la possibilit d'diter certaines cellules d'un TStringGrid, les autres restant parfaitement ditables. C'est la proprit Options-->goEditing qui permet ou non l'dition des cellules dans le TStringGrid. Il suffit alors, dans l'vnement OnSelectCell, d'activer ou de dsactiver l'option goEditing en fonction des coordonnes de la cellule et/ou de ce qu'elle contient :
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if (ARow=1) //Condition remplir pour interdire l'dition de la cellule then StringGrid1.Options:=StringGrid1.Options-[goEditing] //dsactive l'dition else StringGrid1.Options:=StringGrid1.Options+[goEditing]; //active l'dition end;

Comment Charger/Sauver un StringGrid dans un fichier ?


Auteur : waskol Nous vous proposons ici deux procdures/fonctions toutes faites qui le permettent : Premire mthode (routines fichiers de bas niveau) :
(* Sauver un TStringGrid dans un fichier *) procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName); var f: TextFile; i, k: Integer; begin AssignFile(f, FileName); Rewrite(f); with StringGrid do begin // Ecrire le nombre de Colonnes/lignes Writeln(f, ColCount); Writeln(f, RowCount); // Boucler sur les cellules for i := 0 to ColCount - 1 do for k := 0 to RowCount - 1 do Writeln(F, Cells[i, k]); end; CloseFile(F); end; // Charger un TStringGrid depuis un fichier //Attention, il faut tester l'existence du fichier avant d'utiliser cette procdure

- 118 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName); var f: TextFile; iTmp, i, k: Integer; strTemp: String; begin AssignFile(f, FileName); Reset(f); with StringGrid do begin // Obtenir le nombre de colonnes Readln(f, iTmp); ColCount := iTmp; // et de lignes Readln(f, iTmp); RowCount := iTmp; // remplir les cellules for i := 0 to ColCount - 1 do for k := 0 to RowCount - 1 do begin Readln(f, strTemp); Cells[i, k] := strTemp; end; end; CloseFile(f); end;

Deuxime mthode (avec la classe TFileStream) :


//crire une chane de caractres depuis le flux procedure WriteStreamString(Stream : TStream; UneChaine : string); var LongueurChaine : integer; begin //obtenir la longueur de la chane de caractres LongueurChaine := Length(UneChaine); //crire cette longueur dans le flux Stream.Write(LongueurChaine,SizeOf(integer)); //crire les caractres Stream.Write(UneChaine[1], LongueurChaine); end; //retourne une chane de caractres depuis le flux function ReadStreamString(Stream : TStream) : string; var LongueurChaine : integer; begin //obtenir la longueur de la chane de caractres Stream.Read(LongueurChaine,SizeOf(integer)); //Redimensionner la chaine pour allouer la mmoire ncessaire SetLength(Result, LongueurChaine); //Lire les caractres Stream.Read(Result[1], LongueurChaine); end; // Sauver un TStringGrid dans un fichier procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName); var f:TFileStream; i, k ,cc, rr: Integer; begin if FileExists(FileName) then f:=TFileStream.Create(FileName,fmOpenWrite) else f:=TFileStream.Create(FileName,fmCreate); try with StringGrid do begin cc:=ColCount; rr:=RowCount;
- 119 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

// Ecrire le nombre de Colonnes/lignes f.Write(cc,SizeOf(integer)); f.Write(rr,SizeOf(integer)); // Boucler sur les cellules for i := 0 to ColCount - 1 do for k := 0 to RowCount - 1 do WriteStreamString(F,Cells[i, k]); end; finally F.Free; end; end; // Charger un TStringGrid depuis un fichier function LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName):boolean; var f:TFileStream; iTmp, i, k, cc, rr: Integer; begin result:=FileExists(FileName); if not result then Exit; f:=TFileStream.Create(FileName,fmOpenRead); try with StringGrid do begin // Obtenir le nombre de colonnes f.Read(iTmp,SizeOf(integer)); ColCount := iTmp; // et de lignes f.Read(iTmp,SizeOf(integer)); RowCount := iTmp; // remplir les cellules for i := 0 to ColCount - 1 do for k := 0 to RowCount - 1 do Cells[i, k] := ReadStreamString(f); end; finally F.Free; end; end;

Comment dplacer une ligne dans une TStringGrid ?


Auteurs : Pedro - waskol Il suffit de rendre publiques les mthodes MoveRow et MoveColumn de la classe TCustomGrid dont hrite la classe TStringGrid travers le transtypage de cette dernire en une classe drive dclare dans la mme unit :
type TPublicStringGrid = class(TCustomGrid); ... procedure TForm1.Button1Click(Sender: TObject); begin //Dplace la premire ligne (Row=0) vers la seconde (Row=1) : TPublicStringGrid(StringGrid1).MoveRow(0,1); //Dplace la premire colonne (Col=0) vers la seconde (Col=1) : TPublicStringGrid(StringGrid1).MoveColumn(0,1); end;

- 120 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Il est a noter que si les cellules vers lesquelles on dplace avec MoveRow ou MoveColumn ne sont pas vides, les valeurs seront permutes avec celles que l'on veut dplacer. lien : lien : lien : Comment accder aux mthodes "Protected" d'une classe ? Comment Supprimer une ligne ou une colonne dans un TDrawGrid ? Comment supprimer une ligne ou une colonne dans un TStringGrid ?

Comment fusionner les cellules d'un StringGrid ?


Auteur : waskol L'ide est de pouvoir tirer partie du fait que l'on puisse dessiner n'importe o sur le Canvas d'un StringGrid dans l'vnement OnDrawCell de ce dernier. OnDrawCell ne fait rien d'autre que de nous fournir les coordonnes (ACol, ARow) de la cellule qui est prte tre dessine, son rectangle de dlimitation (Rect) et son Etat (State). Rien ne nous empche de dessiner ce que l'on veut en dehors de la zone Rect qui nous est propose... Imaginons que nous souhaitons fusionner les cellules o 1<=Colonne<=3 2<=Ligne<=3 Nous dessinerons alors le texte de la cellule situe ayant pour cordonnes (Colonne,Ligne)=(1,2) sur le rectangle s'tendant du coin suprieur gauche de la cellule (1,2) au coin infrieur droit de la cellule (3,3) Le seul hic, c'est que si nous dessinons le texte de la cellule (1,2) dans cette zone, au moment o OnDrawCell est dclench avec (ACol,Arow)=(1,2) dans cette nouvelle zone de dessin que nous avons choisie, Delphi re-prparera le dessin de fond des cellules (2,2), (2,3) etc... Donc notre texte semblera coup dans l'espace de la cellule suprieure gauche. Le dessin de la cellule fusionne doit donc se faire lorsque Delphi dclenche le OnDrawCell avec (ACol,Arow)=(3,3) (c'est--dire la cellule en bas droite de notre zone fusionne) Voici une fonction, destine tre appele dans l'vnement OnDrawCell et qui utilise ce principe :
function MergedCells(AStringGrid:TStringGrid; CurrentCol,CurrentRow,Col1,Row1,Col2,Row2:Integer; CurrentState: TGridDrawState):Boolean; var x1,y1,x2,y2:Integer; ARect:TRect; begin //Initialisations diverses ARect:=Bounds(0,0,0,0); x1:=Col1; y1:=Row1; x2:=Col2; y2:=Row2; result:=False; //On vrifie que la zone fusionne est valide if x1 < 0 then x1:=0; if x2 > AStringGrid.ColCount-1 then x2:=AStringGrid.ColCount-1; if y1 < 0 then y1:=0; if y2 > AStringGrid.RowCount-1 then y2:=AStringGrid.RowCount-1; if (x1 > x2) or (y1 > y2) then begin result:=False; Exit; end;

//Si la cellule courante est la dernire de la zone de fusion, on dessine dans la fusion le texte de la cellul if ((CurrentCol=Col2) and (CurrentRow=Row2)) then begin ARect.Left:=AStringGrid.CellRect(Col1,Row1).Left; ARect.Top:=AStringGrid.CellRect(Col1,Row1).Top; ARect.Right:=AStringGrid.CellRect(Col2,Row2).Right;
- 121 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

ARect.bottom:=AStringGrid.CellRect(Col2,Row2).Bottom; AStringGrid.Canvas.TextRect(ARect, ARect.Left+2, ARect.Top+2, AStringGrid.Cells[Col1,Row1]); end; //Si la cellule courante est dans la zone de fusion, on dit qu'on la dessin (mme si ce n'est pas vrai :) ) if ((CurrentCol>=Col1) and (CurrentRow>=Row1) and (CurrentCol<=Col2) and (CurrentRow<=Row2)) then result:=True; end;

Utilisation de la fonction MergedCells(AStringGrid:TStringGrid;CurrentCol,CurrentRow,Col1,Row1,Col2,Row2:Integer; CurrentState: TGridDrawState):Boolean; : Elle s'utilise dans la mthode de l'vnement StringGrid1.OnDrawCell
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);

AStringGrid est le StringGrid concern par la fusion de cellule, (StringGrid1 dans l'exemple qui suit...) CurrentCol,CurrentRow,CurrentState sont les paramtres ACol,ARow et State fournis par l'vnement OnDrawCell Col1,Row1 sont les coordonnes (Colonne, Ligne) de la cellule suprieure gauche Col2,Row2 sont les coordonnes (Colonne, Ligne) de la cellule infrieure droite Valeur renvoye : True si la cellule t prise en charge par la fusion (autrement dit si elle se trouve dans la zone dfinie par Col1,Row1, Col2 et Row2), sinon False

Exemple : Dans un nouveau projet, sur notre fiche, nous avons juste mis un TStringGrid et ce code :
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TForm1 = class(TForm) StringGrid1: TStringGrid; procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure FormCreate(Sender: TObject); private { Dclarations prives } public { Dclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} function MergedCells(AStringGrid:TStringGrid;CurrentCol,CurrentRow,Col1,Row1,Col2,Row2:Integer;CurrentState: TGridDrawState):Boolean;

- 122 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

var x1,y1,x2,y2:Integer; ARect:TRect; begin //Initialisations diverses ARect:=Bounds(0,0,0,0); x1:=Col1; y1:=Row1; x2:=Col2; y2:=Row2; result:=False; //On vrifie que la zone fusionne est valide if x1 < 0 then x1:=0; if x2 > AStringGrid.ColCount-1 then x2:=AStringGrid.ColCount-1; if y1 < 0 then y1:=0; if y2 > AStringGrid.RowCount-1 then y2:=AStringGrid.RowCount-1; if (x1 > x2) or (y1 > y2) then begin result:=False; Exit; end;

//Si la cellule courante est la dernire de la zone de fusion, on dessine dans la fusion le texte de la cellul if ((CurrentCol=Col2) and (CurrentRow=Row2)) then begin ARect.Left:=AStringGrid.CellRect(Col1,Row1).Left; ARect.Top:=AStringGrid.CellRect(Col1,Row1).Top; ARect.Right:=AStringGrid.CellRect(Col2,Row2).Right; ARect.bottom:=AStringGrid.CellRect(Col2,Row2).Bottom; AStringGrid.Canvas.TextRect(ARect, ARect.Left+2, ARect.Top+2, AStringGrid.Cells[Col1,Row1]); end; //Si la cellule courante est dans la zone de fusion, on dit qu'on la dessin (mme si ce n'est pas vrai :) ) if ((CurrentCol>=Col1) and (CurrentRow>=Row1) and (CurrentCol<=Col2) and (CurrentRow<=Row2)) then result:=True; end; procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin //On dessine la(les) cellule(s) //d'abord on teste et on s'occupe des fusions de cellules if not MergedCells(StringGrid1,ACol,ARow,2,2,2,3,State)then if not MergedCells(StringGrid1,ACol,ARow,3,3,4,3,State)then //puis si on a pas une cellule fusionne on la dessine normalement StringGrid1.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, StringGrid1.Cells[ACol,ARow]); end; procedure TForm1.FormCreate(Sender: TObject); begin Stringgrid1.Cells[1,1]:='Coucou'; Stringgrid1.Cells[2,2]:='Salut'; Stringgrid1.Cells[3,3]:='Bonjour tout le monde'; end; end.

Ne pas oublier de lier :


procedure TForm1.FormCreate(Sender: TObject);

l'vnement Form1.OnCreate Ainsi que :

- 123 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);

l'vnement StringGrid11.OnDrawCell

- 124 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Le composant TWebBrowser Comment afficher une page construite dans son application ?
Auteurs : Atlantis - Pierre Castelain Le protocole About vous permet d'envoyer une chane de caractres dans votre composant TWebBrowser. Trs pratique, ce protocole peut tre utilis pour construire des pages dans votre application et les afficher sans avoir les enregistrer au pralable. Cette technique est utilisable pour de courts documents.
procedure TMyForm.MyButtonClick(Sender: TObject); var Flags, TargetFrameName, PostData, Headers: OleVariant; sHTML: String; begin sHTML := { votre code HTML }; MyWebBrowser.Navigate('about:' + sHTML, Flags, TargetFrameName, PostData, Headers); end;

Si le document que vous voulez afficher est trop important pour tre pass par URL (> 2ko), vous devrez utiliser une autre technique. Celle-ci utilise l'une des interfaces proposes par le composant TWebBrowser pour lui indiquer de charger le code source de la page depuis un flux de donnes (stream) :
uses Classes, Forms, ShDocVw, ActiveX; procedure LoadHTML(AWebBrowser: TWebBrowser; const HTMLCode: string); var ss: TStringStream; sa: TStreamAdapter; begin // Il est ncessaire de rinitialiser la page avec un appel Navigate AWebBrowser.Navigate('about:blank'); // Il faut attendre que le navigateur soit prt while AWebBrowser.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages; if Assigned(AWebBrowser.Document) then begin // On cre un flux ss:= TStringStream.Create(HTMLCode); try // et un adaptateur IStream sa:= TStreamAdapter.Create(ss); // Ne pas librer // On appelle la mthode de chargement du WebBrowser (AWebBrowser.Document as IPersistStreamInit).Load(sa); finally // On libre le flux ss.Free; end; end;

- 125 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Comment rcuprer le contenu affich dans mon objet TWebBrowser ?


Auteur : Atlantis Il est possible de rcuprer le contenu au format HTML ( ou texte ) de la page affiche dans le TWebbrowser.
{Pour rcuprer le contenu du body dans un TMemo : } MyMemo.Text := MyWebBrowser.OleObject.Document.Body.InnerHTML; {Pour rcuprer le texte du document dans un TMemo : } MyMemo.Text := MyWebBrowser.OleObject.Document.Body.InnerText;

Comment appeler la boite de dialogue enregistrer sous ?


Auteur : Atlantis

Pour afficher cette fentre et enregistrer la page que vous affichez sur votre disque dur, il suffit d'utiliser la mthode ExecWB qui permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrle navigateur Web, et de lui passer le paramtre OLECMDID_SAVEAS

- 126 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

webbrowser1.ExecWB(OLECMDID_SAVEAS , OLECMDEXECOPT_DODEFAULT);

Comment lister les liens prsents dans une page ?


Auteur : Atlantis Il est possible d'obtenir la liste des liens qui sont dans le document. La proprit Webbrowser.OleObject.Document.links.length vous indique le nombre de liens prsents dans votre document et la proprit Webbrowser.OleObject.Document.links.item(i) contient les liens. Exemple : Rcuprer la liste des liens dans un TMemo :
var i : Integer; begin for i:=0 to MyWebbrowser.OleObject.Document.Links.Length-1 do MyMemo.Lines.Add(MyWebbrowser.OleObject.Document.Links.Item(i)); end;

Comment obtenir la liste et les proprits des images contenues dans la page ?
Auteur : Atlantis Le nombre d'images contenu dans la page affiche est stock dans la variable Webbrowser1.OleObject.Document.Images.Length Pour chaque image il est possible d'obtenir la Hauteur, la largeur, l'URL de l'image, le poids de l'image et le texte de l'info bulle. Largeur : WebBrowser1.OleObject.Document.Images.Item(i).Width; Hauteur : Webbrowser1.OleObject.Document.Images.Item(i).Height; Poids : Webbrowser1.OleObject.Document.Images.Item(i).FileSize; Info Bulle : Webbrowser1.OleObject.Document.Images.Item(i).Href; Exemple :
procedure TIexplore.ToolButton5Click(Sender: TObject); var i: Word; Largeur, Hauteur: Integer; Infobulle, Poids, URLImage: string; begin for i := 0 to WebBrowser1.OleObject.Document.Images.Length - 1 do begin Largeur := WebBrowser1.OleObject.Document.Images.Item(i).Width; Hauteur := WebBrowser1.OleObject.Document.Images.Item(i).Height; Poids := WebBrowser1.OleObject.Document.Images.Item(i).FileSize; URLImage := WebBrowser1.OleObject.Document.Images.Item(i).Href; Infobulle := WebBrowser1.OleObject.Document.Images.Item(i).alt; ListBox1.Items.Add(Format('%s : %d x %d Pixels; %s octets; %s', [URLImage, Largeur, Hauteur, poids, InfoBulle])); end;

- 127 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Comment dterminer le nombre de Frames dans la page ?


Auteur : Atlantis Certaines pages Web sont divises en frames. Pour savoir le nombre de frames prsentes dans vote navigateur il vous suffit d'interroger la proprit WebBrowser.OleObject.Document.frames.length .
var nombreframes: integer; begin nombreframes := MyWebBrowser.OleObject.Document.Frames.Length; end;

Comment afficher la fentre de mise en page ?


Auteur : Atlantis

Pour afficher cette fentre il suffit d'utiliser la mthode ExecWB qui permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrle navigateur Web, et de lui passer le paramtre OLECMDID_PAGESETUP

- 128 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Webbrowser1.ExecWB(OLECMDID_PAGESETUP , OLECMDEXECOPT_DODEFAULT);

Comment imprimer le document ?


Auteur : Atlantis Pour imprimer le document avec Internet Explorer 4 ou suprieur, vous devez utiliser la proprit ControlInterface pour accder l'interface du composant WebBrowser (Cette interface permet un contrleur Automation d'accder aux proprits, mthodes et vnements du navigateur Web). Dans cet exemple, l'impression du document complet sera envoye sans que la boite de dialogue d'impression n'apparaisse. Pour afficher la boite de dialogue il faut remplacer OLECMDEXECOPT_DONTPROMPTUSER par OLECMDEXECOPT_PROMPTUSER
var vaIn, vaOut: OleVariant; begin MyWebBrowser.ControlInterface.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vaIn, vaOut); end;

Avec Internet Explorer 3, vous devez utiliser la mthode suivante


procedure PrintIE; var CmdTarget : IOleCommandTarget; vaIn, vaOut: OleVariant; begin if MyWebBrowser.Document <> nil then try MyWebBrowser.Document.QueryInterface(IOleCommandTarget, CmdTarget); if CmdTarget <> nil then try CmdTarget.Exec( PGuid(nil), OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vaIn, vaOut); finally CmdTarget.Release; end; except {Rien } end; end;

Note: Si vous utilisez Delphi 2 ou 3, vous devez remplacer PGuid(nil) par PGuid(nil)^

Comment annuler l'ouverture d'un popup ?


Auteur : Atlantis Lorsque vous intgrez dans votre application l'objet TWebBrowser pour naviguer sur Internet, il arrive souvent d'avoir des fentres Popup qui s'ouvrent automatiquement. Pour annuler l'ouverture d'Internet Explorer dans ce cas l, vous devez crire une procdure pour l'vnement OnNewWindow2 de votre TWebBrowser pour affecter la valeur True la variable Cancel.
procedure TMyForm.MyWebBrowserNewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool); begin Cancel := True;
- 129 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Comment cacher les scrollbars ?


Auteur : Atlantis Selon la taille des pages affiches, les scroolbars apparaissent automatiquement.
{Pour cacher les scrollbars : } MyWebBrowser.OleObject.Document.Body.Style.OverflowX := 'hidden'; MyWebBrowser.OleObject.Document.Body.Style.OverflowY := 'hidden'; {Pour rafficher les scroolbars : } MyWebBrowser.OleObject.Document.Body.Style.OverflowX := ''; MyWebBrowser.OleObject.Document.Body.Style.OverflowY := '';

Comment slectionner tout le document en vue de le copier dans le presse papier ?


Auteur : Atlantis Il suffit d'utiliser la mthode ExecWB qui permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrle navigateur Web, et de lui passer le paramtre suivant : OLECMDID_SELECTALL pour slectionner tout OLECMDID_COPY pour effectuer la copie vers le presse papier
// Slectionner tout webbrowser1.ExecWB(OLECMDID_SELECTALL , OLECMDEXECOPT_DODEFAULT); // Copier Webbrowser1.ExecWB(OLECMDID_COPY , OLECMDEXECOPT_DODEFAULT);

Comment afficher la fentre de proprit du document ?


Auteur : Atlantis Dans internet Explorer, lorsque l'on appel le menu contextuel sur la page, l'option proprit permet d'afficher la fentre suivante :

- 130 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Pour afficher cette fentre il suffit d'utiliser la mthode ExecWB qui permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrle navigateur Web, et de lui passer le paramtre OLECMDID_PROPERTIES
Webbrowser1.ExecWB(OLECMDID_PROPERTIES , OLECMDEXECOPT_DODEFAULT);

Comment rcuprer la source complte d'une page ?


Auteurs : Olivier Lance - phenixauthor - Pierre Castelain Afin d'analyser le contenu d'une page web, il peut tre intressant de rcuprer l'intgralit de ses sources, en-tte HTML compris. Il y a pour cela deux mthodes. La premire, la plus simple, emploie l'interface IHTMLDocument3 :
procedure RecupererContenu1(CurrentWB: TWebBrowser; var Code: String); begin // recuperation du code entier Code := (CurrentWB.Document as IHTMLDocument3).documentElement.outerhtml; end;

L'interface IHTMLDocument3 n'est disponible qu' partir de la version 5 d'Internet Explorer. Il y a donc une autre mthode pour rcuprer la source complte d'un document. Elle est plus longue, et utilise un flux de donnes. Voici une fonction qui renverra une String contenant la source complte de la page.

- 131 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

function RecupererContenu2(WB: TWebBrowser): String; var PersistStream: IPersistStreamInit; Stream: IStream; StrStream: TStringStream; begin //S'il n'y a pas de document assign pour le TWebBrowser if not Assigned(WB.Document) then begin Result := ''; Exit; end; //TWebBrowser.Document implmente les fonctionnalits de l'interface //IPersitStream. On en demande l'accs ici. PersistStream := WB.Document as IPersistStreamInit; //Cration d'un flux de caractres (vide au dpart) StrStream := TStringStream.Create(''); try //On cre une instance de TStreamAdapter en demandant les //fonctionnalits de l'interface IStream. Ce sera notre "pont" entre //le stream de caractres et le document HTML. Stream := TStreamAdapter.Create(StrStream, soReference) as IStream; //Essai de sauvegarde du document dans le stream qui vient d'tre cr if Failed(PersistStream.Save(Stream, True)) then Result := '' else begin //Si a s'est bien pass, on remet le stream de caractres au dbut StrStream.Position := 0; //et on renvoie ce qu'il contient Result := StrStream.Read(StrStream.Size); end; finally StrStream.Free; end; end;

Ce code peut s'employer comme suit (dans le OnClick d'un bouton nomm Button1 ; Memo1 est un TMemo pos sur la fiche par exemple) :
procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Text := RecupererContenu(WebBrowser1); end;

Un clic sur Button1 ajoutera la source complte de la page en cours dans votre Memo. Vous pouvez aussi rcuprer uniquement le code de la zone "body" de la page en cours. IHTMLDocument se trouve dans MSHTML.pas IPersistStreamInit se trouve dans ActiveX.pas IStream se trouve dans IStreams Pour cela, rfrez-vous cette page : http://delphi.developpez.com/faq/?page=webrowser#content

- 132 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Le composant TComboBox Comment forcer l'ouverture de la liste droulante d'un comboBox ds que celui-ci prend le focus ?
Auteur : Pascal Jankowski Le message CB_SHOWDROPDOWN permet d'afficher ou de cacher la liste droulante d'un combobox. CB_SHOWDROPDOWN wParam = (WPARAM) (BOOL) fShow; // the show/hide flag lParam = 0; // not used; must be zero Pour afficher la liste droulante d'un combobox au moment o celui-ci prend le focus, il suffit de coder son vnement OnEnter indiffremment selon l'une ou l'autre des mthodes dcrites ci-dessous.
procedure TForm1.ComboBox1Enter(Sender: TObject); begin //Afficher la liste droulante ComboBox1.Perform(CB_SHOWDROPDOWN, Integer(True), 0); end;

ou
procedure TForm1.ComboBox1Enter(Sender: TObject); begin //Affiche la liste droulante SendMessage(ComboBox1.handle, CB_SHOWDROPDOWN, Integer(True), 0); end;

Remarques : 1. Pour cacher une liste droulante, il suffit de modifier le code de la faon suivante :
SendMessage(ComboBox1.handle, CB_SHOWDROPDOWN, Integer(False), 0);

2. Vous pouvez retouver dans la MSDN Library, la section traitant des Combo boxes avec notamment la liste de tous les messages et de toutes les notifications.

Comment modifier la largeur de la liste droulante d'un comboBox ?


Auteur : Pascal Jankowski Le message CB_ SETDROPPEDWIDTH permet de dfinir la largeur maximum en pixels d'une liste droulante d'un comboBox. CB_SETDROPPEDWIDTH wParam = (WPARAM) wWidth, // width of list box, in pixels lParam = 0, // not used, must be zero Pour dfinir la largeur de cette liste droulante au moment o votre combobox prend le focus il suffit par exemple de coder l'vnement OnEnter d'une des deux faons suivantes. Ces deux mthodes sont quivalentes.
procedure TForm1.ComboBox1Enter(Sender: TObject); begin //La largeur liste droulante sera de 300 pixels ComboBox1.Perform(CB_SETDROPPEDWIDTH, 300, 0); end ;

ou
- 133 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

procedure TForm1.ComboBox1Enter(Sender: TObject); begin //La largeur liste droulante sera de 300 pixels SendMessage(ComboBox1.handle, CB_SETDROPPEDWIDTH, 300, 0); end ;

Remarques: 1. Cela fonctionne galement avec un TDBComboBox ou un TDBLookupComboBox. 2. Vous pouvez retouver dans la MSDN Library, la section traitant des Combo boxes avec notamment la liste de tous les messages et de toutes les notifications.

- 134 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Le composant TRichEdit Comment crer un tableau au format RTF et l'insrer dans un TRichEdit ?
Auteur : hpalpha
function tableaurtf(nbcol,nbligne,largeur:integer):string; var i,j : integer; begin result:='{\rtf1\trowd'; for i:=1 to nbcol do result:=result+format('\cellx%d',[i*(2000+largeur)]); for j:=1 to nbligne do begin result:=result+'\intbl'; for i:=1 to nbcol do result:=result+'\cell'; result:=result+'\row'; end; result:=result+'}'; end;

Et voici un exemple de code pour insrer dans mon richedit un tableau de largeur 200 ayant 2 lignes et 2 colonnes:
RichEdit10.SelText:=tableaurtf(2,2,200);

Comment se positionner sur une ligne/Colonne d'un TMEMO/TRichEdit ?


Auteur : octal Le code suivant permet de se positionner sur une ligne/colonne prcise d'un TMemo/TRichEdit.
procedure TForm1.Button1Click(Sender: TObject); var itemp: Integer; begin with RichEdit1 do begin // Aller la dernire ligne SelStart := Length(Text); Perform(EM_SCROLLCARET, 0, 0); // ou encore: Perform(WM_VSCROLL, SB_BOTTOM,0); // Aller la Premire ligne SelStart := Perform(EM_LINEINDEX, 0, 0); Perform(EM_SCROLLCARET, 0, 0); // Aller la ligne 5, colonne 3 SelStart := Perform(EM_LINEINDEX, 5, 0) + 3; Perform(EM_SCROLLCARET, 0, 0); // Scroller d'une ligne vers le bas with RichEdit1 do begin itemp := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0); SelStart := Perform(EM_LINEINDEX, itemp + 1, 0); Perform(EM_SCROLLCARET, 0, 0); end; end;

- 135 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Comment crire en couleur dans un TRichEdit ?


Auteur : Qazer Le TRichEdit supporte contrairement au TMemo des oprations de mise en forme et de coloration. Nous pouvons attribuer une couleur soit tout le texte du TRichEdit soit une partie spcifique du texte comme nous le montrent les bouts de code suivant :
RichEdit1.SelAttributes.Color:= TColor;

permet de changer la couleur utilise pour crire dans le TRichEdit, ainsi si on fait :
RichEdit1.SelAttributes.Color:= clRed;

Le texte sera alors crit en rouge partir de cet instant.


RichEdit1.DefAttributes.Color:= TColor;

permet de changer la couleur du texte du TRichEdit tout entier. Ainsi si on passe clRed comme TColor tout le texte du TRichEdit deviendra rouge et tout ce que l'on va y crire aussi.

Comment avoir les dimensions (largeur/hauteur) en pixels d'un texte format (rtf) ?
Auteur : waskol Voici une fonction qui permet : - soit d'afficher le contenu d'un TRichEdit dans un TCanvas (mettre RenderIt True, dans les limites d'un Rectangle donn Rect) - soit de mesurer la taille du texte (RenderIt False, dimensions du Rectangle donn renvoyes dans Rect)
uses Windows,Forms,Graphics, RichEdit, ComCtrls; ... function PrintToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer; ARichEdit : TRichEdit; var ARect : TRect;RenderIt:boolean) : Longint; var Range : TFormatRange; begin //Prcaution SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, 0); if not RenderIt then begin SetRect(ARect,0,0,ARichEdit.Width,ARichEdit.Height); end; FillChar(Range, SizeOf(TFormatRange), 0); Range.hdc := ACanvas.handle; Range.hdcTarget := ACanvas.Handle; Range.rc.left := ARect.Left * 1440 div Screen.PixelsPerInch; Range.rc.top := Arect.Top * 1440 div Screen.PixelsPerInch; Range.rc.right := ARect.Right * 1440 div Screen.PixelsPerInch; Range.rc.Bottom := ARect.Bottom * 1440 div Screen.PixelsPerInch; Range.chrg.cpMax := ToChar;
- 136 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Range.chrg.cpMin := FromChar; if RenderIt then Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, Longint(@Range)) else begin Range.chrg.cpMax := ARichedit.GetTextLen; Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, Longint(@Range)); ARect:=Range.rc; ARect.Bottom := Range.rc.Bottom * Screen.PixelsPerInch div 1440; end; SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0); end;

Utilisation : ACanvas (TCanvas) : Un Canvas qui sert "dessiner" le texte format (celui d'un TBitmap que l'on a cr pour l'occasion par exemple) FromChar, ToChar (integer) : Index du premier et dernier caractre du texte prendre en compte pour mesurer le texte (mettre Tochar -1 pour prendre le dernier caractre du texte) ARichEdit (TRichEdit) : Le TRichEdit qui contient le texte format RenderIt (boolean) et var ARect (TRect) : True : on dessine vraiment le texte format dans ACanvas, dans les limites du Rectangle Rect pass en paramtre. False : on mesure le texte et on renvoie ses dimensions dans Rect La fonction retourne l'index du dernier caractre qui tient dans le Rectangle Rect plus 1 (donc Index_du_dernier_caractre+1) Exemple : On mesure la taille complte du texte (index de 0 -1)
var ARect:TRect; PrintToCanvas(Form1.Canvas,0,-1,RichEdit1,ARect,false);

- 137 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Le composant TListBox Comment aligner les lments d'une TListBox droite ?
Auteur : Pierre Castelain Il n'est pas possible d'aligner les lments d'une TListBox droite comme la plupart des descendants de TControl en mettant la proprit BiDiMode bdRightToLeft. Nous vous proposons deux mthodes pour le faire. Nous allons utiliser dans les deux cas l'vnement OnDrawItem; pour que cet vnement soit appel, il faut que le contrle soit dessin par son propritaire : ce qui implique que la proprit style doit tre lbOwnerDrawFixed, lbOwnerDrawVariable ou lbVirtualOwnerDraw. Dans le code qui suit, style vaut lbOwnerDrawFixed. La premire mthode consiste ajuster la limite droite du texte dans le canevas de la liste puis d'utiliser la mthode TextOut de ce dernier pour le dessiner :
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var Text: string; TextWidth, TextHeight, RectHeight: Integer; begin with (Control as TListBox) do if Index < Items.Count then begin Canvas.FillRect(Rect); Text:= Items[Index]; Dec(Rect.Right, 2); //Il ne faut pas que le texte soit trop coll au bord droit TextWidth:= Canvas.TextWidth(Text); TextHeight:= Canvas.TextHeight(Text); RectHeight:= Rect.Bottom - Rect.Top; //On crit le texte Canvas.TextOut(Rect.Right - TextWidth, Rect.Top + (RectHeight - TextHeight) div 2, Text); end; end;

La seconde mthode utilise une fonction de l'API Windows : DrawText


procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var Txt: string; begin Txt := (Control as TListBox).Items[Index]; DrawText((Control as TListBox).Canvas.Handle, PChar(Txt), StrLen(PChar(Txt)), Rect, DT_RIGHT or DT_NOPREFIX or DT_SINGLELINE); // DT_NOPREFIX = dsactiver le soulignement si & dans le texte end;

lien :

Lien MSDN : fonction DrawText

Comment changer la couleur d'un item d'une listBox ?


Auteur : waskol 1) Mettre la proprit Style d'une ListBox lbOwnerDrawFixed 2) coder l'vnement OnDrawItem comme suit :
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);

- 138 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin with(Control as TListBox).Canvas do //Le dessin se fait sur le canevas du contrle, pas dans la fiche begin //on choisit les couleurs en fonction de l'index if Index=1 then begin //fond Brush.Color:=clRed; //police Font.Color:=clYellow; end; FillRect(Rect);//efface le rectangle //dessin du texte TextOut(Rect.Left,Rect.Top,(Control as TListBox).Items[Index]);//affiche le texte end; end;

- 139 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Le composant TPageControl Comment crer des pages dans un TPageControl l'excution ?
Auteur : Bloon Les pages d'un TPageControl sont des composants TTabSheet. Les composants de la page doivent donc avoir le TTabSheet comme Parent. Lorsque l'on utilise la cration dynamique de pages, le plus simple est de mettre le contenu de ces pages dans une frame, qui sera galement cre dynamiquement. Ainsi, en supposant que notre contenu soit dans la frame TFrame2 :
var tbs : TTabSheet; begin //On s'assure que Self est un descendant de TComponent assert(Self is TComponent, 'L''objet Self n''est pas un descendant de TComponent'); // Cration de la page tbs := TTabSheet.Create(Self); // Cration du contenu de la page with TFrame2.Create(self) do begin // Attention, chaque frame doit avoir un nom diffrent Name := 'Frame2' + intToStr(PageControl1.PageCount); Align := alClient; Parent := tbs; end; // Ajout de la page au TPageControl tbs.PageControl := PageControl1; // Modification du titre de l'onglet tbs.Caption := 'Frame n' + intToStr(PageControl1.PageCount); end;

On peut aussi ajouter directement des composants, par exemple avec un TMemo :
var tbs : TTabSheet; begin //On s'assure que Self est un descendant de TComponent assert(Self is TComponent, 'L''objet Self n''est pas un descendant de TComponent'); tbs := TTabSheet.Create(self); with TMemo.Create(self) do begin Align := alClient; Parent := tbs; end; tbs.PageControl := PageControl1; tbs.Caption := 'n' + intToStr(PageControl1.PageCount); end;

Ces deux exemples de code sont supposs tre dans une classe de fentre, Self reprsente donc un objet TForm. Ce code ne fonctionnera pas si Self reprsente autre chose qu'un TComponent. Vous trouverez des exemples dans ces articles : Utilisation des frames : Crer une fentre 'Assistant'

- 140 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Pour les onglets dynamiques, voir le programme exemple associ cet article

Comment masquer un onglet ?


Auteurs : NoisetteProd - Xenos Pour masquer un onglet d'un PageControl il faut utiliser la proprit TabVisible.
TabSheet1.TabVisible := False;

Lors du passage False de cette proprit, la proprit Visible est galement passe False. Ceci pour effet de masquer l'onglet et la page lui correspondant. Il est donc possible, en intervenant posteriori sur la proprit Visible, de masquer un onglet tout en permettant d'afficher la page :
TabSheet1.TabVisible := False; TabSheet1.Visible := True;

Cela sera par exemple utile dans le cas o aprs avoir supprim des onglets, on ne souhaite afficher qu'une seule page dans un PageControl, la notion d'onglet n'etant plus ncessaire dans ce cas.

Comment permettre le dplacement des onglets d'un TPageControl ?


Auteurs : Claudius40 - waskol Nous vous proposons ici deux solutions : La premire, la plus simple aborder, utilise les vnements de glisser / dposer OnMouseDown,OnDragOver et OnDragDrop d'un TPageControl. Cette solution ne fonctionne qu'avec un seul TPageControl . La deuxime base sur le mme principe propose la fonctionalit entre un seul ou mme plusieurs TPageControl et dessine un point d'insertion pour visualiser le futur emplacement de l'onglet que l'on glisse. Premire Solution (par Claudius40): Ce code provient d'une application qui contient un TPageControl : La proprit DragMode du TPageControl est dmManual. Assurez-vous de la prsence de l'unit CommCtrl dans la clause uses (partie Implementation) et de la rajouter dans la ngative.

Une mthode (GetDroppedIndex) a t dclare dans la partie private de la classe TForm1. Cette fonction nous permettra d'identifier, en fonction des coordonnes de la souris au-dessus d'un TPageControl, l'index de l'onglet qui se trouve sous le curseur de la souris la fin du glisser / dposer d'un onglet. Cet index deviendra le nouvel index de l'onglet que l'on dplace.
type TForm1 = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; TabSheet3: TTabSheet; TabSheet4: TTabSheet; TabSheet5: TTabSheet; private
- 141 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

{ Dclarations prives } function GetDroppedIndex(X, Y: Integer): Integer; public { Dclarations publiques } end;

Notre fonction est implmente comme suit :


//Fonction qui permet d'identifier, en fonction des coordonnes //de la souris au-dessus d'un TPageControl, l'index de l'onglet //qui se trouve sous le curseur de la souris. function TForm1.GetDroppedIndex(X, Y: Integer): Integer; var HitTestInfo: TTCHitTestInfo; begin HitTestInfo.pt := Point(X,Y); {Utilisation de l'API Windows SendMessage, avec envoi d'un message TCM_HITTEST au TPageControl. Le rsultat de la fonction nous donne l'index de l'onglet "vis" par la souris.} result := SendMessage(PageControl1.Handle, TCM_HITTEST, 0, Longint(@HitTestInfo)); end;

Enfin, les vnements OnMouseDown,OnDragOver et OnDragDrop du TPageControl ont t implments de cette faon :
//Evnement OnMouseDown de votre TPageControl //(dbut du gliss-dpos : on commence le glissement de l'onglet) procedure TForm1.PageControl1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {Si c'est le bouton gauche de la souris qui est enfonc...} if Button = mbLeft then {...alors on active la fonctionnalit de gliss-dpos (Drag And Drop) le paramtre "False" de la fonction BeginDrag() signifie que le pointeur de la souris ne change pas et que le glissement ne commence que lorsque l'utilisateur dplace la souris sur une courte distance (1 pixel).} TPageControl(Sender).BeginDrag(False); end; //Evnement OnDragOver de votre TPageControl //(Le gliss-dpos est en train de se faire : //la souris passe au-dessus du TPageControl) procedure TForm1.PageControl1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin //Ceci est le code original qui posait problme si, dans le mme projet, //le gliss dplac de 2 PageContol taient implments : //bug lors du gliss-dplac d'un Pagecontrol un autre... //---------------------//{On autorise l'utilisateur dposer "l'objet" du Drag and Drop // si la source est un TPageControl} //Accept := Source is TPageControl; //---------------------//Ceci est le code propos : //-----------------------{On autorise l'utilisateur dposer "l'objet" du Drag and Drop si la Source est la mme que le Sender --> notre TPageControl s'identifie comme tant sa propre source} Accept := (Source=Sender) and (Sender is TPageContol); //-------------------------end;

- 142 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

//Evnement OnDragDrop de votre TPageControl //(fin du glisser-dposer : on dpose l'onglet) procedure TForm1.PageControl1DragDrop(Sender, Source: TObject; X, Y: Integer); begin {L'onglet dpos, celui qui est actif (ActivePage), prend comme valeur d'index (PageIndex) celui de l'onglet vis par la souris (utilisation de GetDroppedIndex)} TPageControl(Sender).ActivePage.PageIndex := GetDroppedIndex(X, Y); {Fin du gliss-dpos --> passage de True en paramtre} TPageControl(Sender).EndDrag(True); end;

Deuxime Solution (par waskol) : Cette solution fonctionne aussi bien avec un seul TPageControl, qu'entre plusieurs TPageControls. En sus, une ligne d'insertion est dessine au point ou sera insr l'onglet qui est gliss. Par contre, vous ne pourrez pas dplacer un onglet vers un PageControl ne possdant plus d'onglet... Comme pour le code de la premire solution : La proprit DragMode du (ou des) TPageControl est dmManual. Assurez-vous de la prsence de l'unit CommCtrl dans la clause uses (partie Interface ou Implementation) et de la rajouter dans la ngative.

Tout ce que vous avez faire est d'implmenter les vnements du ou des TPageControls(OnMouseDown,OnDragOver et OnDragDrop) tels qu'crits ci-dessus, avec le mme code. Si vous souhaitez utiliser le drag and Drop d'onglets entre plusieurs TPageControl, vous pouvez trs bien partager le mme gestionnaire d'vnements pour tous les TPageControls. Par exemple, si vous avez plusieurs TPageControls, appels PageControl1, PageControl2,PageControl3, etc...,vous aurez donc dans votre inspecteur d'objets (onglet vnements) : Pour PageControl1 : OnMouseDown : PageControl1MouseDown OnDragOver : PageControl1DragOver OnDragDrop : PageControl1DragDrop

Et les mmes entres pour PageControl2, PageControl3, etc... : OnMouseDown : PageControl1MouseDown OnDragOver : PageControl1DragOver OnDragDrop : PageControl1DragDrop

C'est la procedure DoTabDragDrop, ici directement dclare dans la partie implementation qui s'occupe de la gestion de l'onglet qui est dpos :
implementation uses CommCtrl; {$R *.dfm} (* Fonction qui permet, en fonction des coordonnes de la souris qui se trouve au-dessus d'un TPageControl : - d'identifier l'index de l'onglet qui se trouve sous le curseur de la souris - puis de dterminer le "rectangle" de dessin de cet onglet - puis, partir de la position de la souris dans ce rectangle ( gauche ou droite du milieu) de dterminer si l'onglet sera insr avant ou aprs (inc(result)) l'onglet "vis" par la souris. *) function GetTabIndex(APageControl:TPageControl;X, Y: Integer): Integer;

- 143 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

var TabRect: TRect; begin {Le rsultat de cette fonction nous donne l'index de l'onglet qui se trouve aux coordonnes X,Y (le repre de rfrence tant la fentre du TPageControl)} Result := APageControl.IndexOfTabAt(X,Y); //Si la souris se trouve au dessus d'un onglet if Result>-1 then begin //on rcupre le rectangle de l'onglet vis TabRect:=APageControl.TabRect(Result); //si on est dans la partie droite de ce rectangle if x>((TabRect.Left+TabRect.Right) div 2) //alors l'index d'insertion est (Index de l'onglet vis)+1 then Inc(Result); end; end; //procedure qui dessine une petite ligne rouge permettant de visualiser //le point d'insertion procedure DrawInsertionPoint(APageControl:TPageControl;X,Y:integer); var TabRect: TRect; TabIndex:integer; X1,X2,Y1,Y2:integer; begin //on obtient l'index o serait ventuellement insr notre onglet TabIndex:=GetTabIndex(APageControl,x,y); //la p'tite ligne indicatrice sera rouge APageControl.Canvas.Pen.Color:=clRed; if (TabIndex<APageControl.PageCount) //si l'onglet ne serait pas dpos en dernire place then begin //On prend les coordonnes du "rectangle" de dessin de l'onglet qu'il //peut remplacer TabRect:=APageControl.TabRect(TabIndex); //A partir de l, on calcule les coordonnes (X1,Y1)--(X2,Y2) de //notre ligne qui sera trace sur son bord gauche X1:=TabRect.Left; X2:=X1; Y1:=TabRect.Top; Y2:=TabRect.Bottom; end //si l'onglet serait dpos en dernire place (TabIndex<APageControl.PageCount) else begin //On prend les coordonnes du "rectangle" de dessin du dernier onglet TabRect:=APageControl.TabRect(TabIndex-1); //Puis on calcule les coordonnes (X1,Y1)--(X2,Y2) de //notre ligne qui sera trace sur son bord droit X1:=TabRect.Right; X2:=X1; Y1:=TabRect.Top; Y2:=TabRect.Bottom; end; //on trace notre petite ligne APageControl.Canvas.MoveTo(X1,Y1); APageControl.Canvas.LineTo(X2,Y2); end; //Procedure charge de dposer un onglet la fin d'un gliss-dpos procedure DoTabDragDrop(Sender, Source: TPageControl; X, Y: Integer); const TCM_GETITEMRECT = $130A; var i: Integer; SourceIndex,TargetIndex:Integer; ATabSheet:TTabSheet; begin
- 144 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

if Sender=Source //si le gliss-dpos concerne un TPageControl sur lui mme then begin {On dtermine la nouvelle valeur d'index de l'onglet que l'on dpose} TargetIndex:=GetTabIndex(Sender,x,y); {Si on ne le dpose pas "dans le vide"} if (TargetIndex>-1) {L'onglet dpos, celui qui est actif (ActivePage), prend sa nouvelle valeur d'index (PageIndex)} then begin //Si le nouvel index est suprieur l'ancien index, //on le dcrmente, sinon l'onglet est "mal dplac" if (TargetIndex>Sender.ActivePage.PageIndex) then dec(TargetIndex); Sender.ActivePage.PageIndex:=TargetIndex; end; end //si le gliss-dpos s'effectue entre deux TPageControl diffrents... else begin {On dtermine l'index de l'onglet que l'on dpose} SourceIndex:=Source.ActivePage.PageIndex; {On dtermine la nouvelle valeur d'index de l'onglet que l'on dpose} TargetIndex:=GetTabIndex(Sender,x,y); {Si on ne le dpose pas "dans le vide"} if TargetIndex>-1 then begin //on rcupre la rfrence de notre onglet ATabSheet:=Source.Pages[SourceIndex]; //on l'affecte son nouveau TPageControl ATabSheet.PageControl:=Sender; //Et on lui assigne son nouvel index ATabSheet.PageIndex:=TargetIndex; end; end; end; //Evnement OnMouseDown de votre TPageControl //(dbut du gliss-dpos : on commence le glissement de l'onglet) procedure TForm1.PageControl1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Sender is TPageControl) {On active la fonctionnalit de gliss-dpos (Drag And Drop) le paramtre "False" de la fonction BeginDrag() signifie que le pointeur de la souris ne change pas et que le glissement ne commence que lorsque l'utilisateur dplace la souris sur une courte distance (1 pixel).} then (Sender as TPageControl).BeginDrag(False); end; //Evnement OnDragDrop de votre TPageControl //(fin du gliss-dpos : on dpose l'onglet) procedure TForm1.PageControl1DragDrop(Sender, Source: TObject; X, Y: Integer); begin if (Sender is TPageControl) and (Source is TPageControl) then begin //utilisation de notre procedure charge de dposer //un onglet la fin d'un gliss-dpos DoTabDragDrop((Sender as TPageControl), (Source as TPageControl),X,Y); {Fin du gliss-dpos --> passage de True en paramtre} (Source as TPageControl).EndDrag(True); end; end; //Evnement OnDragOver de votre TPageControl //(Le gliss-dpos est en train de se faire : //la souris passe au-dessus du TPageControl) procedure TForm1.PageControl1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
- 145 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin if (Sender is TPageControl) then begin //On redessine notre TPageControl (pour effacer notre ligne d'insertion) (Sender as TPageControl).Repaint; //Si la souris quitte notre cible de gliss-dpos on ignore ce qui suit if State<>dsDragLeave then begin Accept := True; //On dessine le point d'insertion DrawInsertionPoint((Sender as TPageControl),X,Y); end; end; end; end.

- 146 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Le composant TFrame Comment avoir OnCreate et OnDestroy sur une TFrame ?
Auteur : Pedro Pratique les TFrame ? Mais qu'en est-il de OnCreate et OnDestroy ? Voici une mthode trs simple... Il suffit de surcharger son constructeur et son destructeur:
TMaFrame = class(TFrame) ... private ... public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end;

Ensuite dans l'implmentation:


constructor TMaFrame.Create(AOwner:TComponent); begin inherited; //Les traitements la cration (OnCreate) end; ... destructor TMaFrame.Destroy; begin //Les traitements la destruction (OnDestroy) inherited; end;

A la question de savoir pourquoi le composant TFrame n'avait pas de gestionnaire d'vnement OnCreate comme les TForm, les membres de la section Recherche et Dveloppement de Borland ont rpondu qu'il n'tait pas possible de dclencher cet vnement suite au message WM_CREATE. En effet, pour des raisons de performance, la cration des frames (comme pour tous les contrles d'ailleurs) est retarde jusqu'au moment o l'objet est utilis pour la premire fois. Le problme majeur survient lorsqu'il s'agit d'hriter une fiche ayant des frames, alors pour viter des bugs/ problmes, le contructeur de TFrame a tout simplement t omis.

- 147 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Le composant TTreeView Comment obtenir la taille totale d'un TTreeView ?
Auteur : Pierre Castelain Nous dfinissons la taille totale d'un TTreeview comme tant la somme des hauteurs et la somme des largeurs de tous ses noeuds. Le code ci-dessous calcule cette taille en utilisant la fonction UnionRect de l'API Windows pour additionner les dimensions des diffrents rectangles correspondants aux noeuds du TTreeview.
function TreeViewSize(ATreeView: TTreeView): TPoint; var TotalRect: TRect; i: integer; begin //les dimensions respectives de TotalRect seront la somme //des dimensions quivalentes de chaque noeud de l'arbre //On initialise TotalRect 0 pour toutes les dimensions TotalRect:= Rect(0, 0, 0, 0); //Parcours des noeuds de l'arbre for i:=0 to ATreeView.Items.Count-1 do //DisplayRect retourne les dimensions du rectangle, voir l'aide pour plus de dtail UnionRect(TotalRect, TotalRect, ATreeView.Items[i].DisplayRect(false)); result.X:= TotalRect.Right; result.Y:= TotalRect.Bottom; end; procedure TForm1.Button1Click(Sender: TObject); var maxSize: TPoint; begin maxSize:= TreeViewSize(TreeView1); //On redimensionne le TTreeview pour qu'il soit compltement visible TreeView1.ClientWidth:= maxSize.X; TreeView1.ClientHeight:= maxSize.Y; end;

Comment simuler qu'un noeud a un noeud enfant ?


Auteur : deetox Il suffit de rcuprer le TTreeNode qui vous intresse puis de faire:
TreeView1.Items.Item[0].haschildren := True;

Dans cet exemple, on simule la prsence d'un noeud enfant sur le premier noeud du TTreeView. De la mme faon, on peut aussi simuler qu'un noeud n'a pas de noeud enfant en spcifiant:
TreeView1.Items.Item[0].haschildren := False;

- 148 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Avantage de cette mthode: Les Index des noeuds ne sont pas modifis.

Comment savoir si un TTreeView est en mode dition ?


Auteur : Nono40 Il n'existe pas de proprit permettant de savoir si un TTreeView est actuellement en mode dition d'un item. Par contre avec le message TVM_GETEDITCONTROL il est possible de connaitre le Handle de la zone d'dition cre pour la modification in situ. Si la rponse de ce message est non nulle, alors le TreeView est en mode dition.
function IsTreeViewEditing(const: TrreView: TTreeView): boolean; Const TVM_FIRST =$1100; TVM_GETEDITCONTROL = TVM_FIRST + 15; begin Result := SendMessage(TreeView.Handle,TVM_GETEDITCONTROL,0,0)<>0; end;

lien :

Lien MSDN : Message TVM_GETEDITCONTROL

Comment forcer le passage en dition d'un composant TTreeView ?


Auteur : Nono40 Il est parfois utile de vouloir forcer le passage en mode dition d'un item d'un TTreeView, comme par exemple pour implmenter la touche F2. Les mthodes standards du composant ne permettent pas de le faire mais les messages Windows ddis au TreeView le permettent. Le messsage TVM_EDITLABEL permet de demander le passage en mode dition d'un TTreeView.
Const TVM_FIRST =$1100; TVM_EDITLABEL=(TVM_FIRST+65); begin SendMessage(TreeView1.Handle,TVM_EDITLABEL,0,Integer(TreeView1.Selected.ItemID)); end;

lien :

Lien MSDN : Message TVM_EDITLABEL

- 149 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Le composant TRadioGroup Comment change-t-on la couleur de fond d'un lment de radiogroup ?
Auteur : anapurna Pour changer la couleur de fond d'un item de RadioGroup, il faut transtyper cet item avec une classe drive de TControl et accder sa proprit Color. La classe drive est ncessaire pour pouvoir accder Color, car il s'agit d'un champ protected de la classe TControl.
Type TmyControl = Class(TControl) end; procedure RGB_ColorItem(RadioGroup: TRadioGroup; ItemIndex: Byte; Color: Tcolor); begin TmyControl(RadioGroup.Controls[ItemIndex]).color := Color; end;

Comment met-on un lment du radiogroup en multiligne ?


Auteur : anapurna Il faut utiliser l'API SetWindowLong sur l'item passer en multiligne pour lui ajouter cette proprit :
procedure ITEM_Multiligne(RadioGroup: TRadioGroup; ItemIndex: Byte; multiligne : boolean); var tmpStyle : integer; begin tmpStyle := GetWindowLong(Tradiobutton(RadioGroup.Controls[ItemIndex]).Handle, GWL_STYLE); // On rcupre le style actuel if multiligne then tmpStyle := tmpStyle or BS_MULTILINE // Bouton multiligne else tmpStyle := tmpStyle and (not BS_MULTILINE); // Bouton une ligne SetWindowLong(Tradiobutton(RadioGroup.Controls[ItemIndex]).Handle, GWL_STYLE, tmpStyle); // On applique le nouveau style end;

Vous pouvez par exemple utiliser la procdure ITEM_Multiligne pour mettre tous les items en multiligne :
procedure RGB_Multiligne(RadioGroup: TRadioGroup) ; var i: Byte; begin for i := 0 to RadioGroup.ControlCount - 1 do begin ITEM_Multiligne(RadioGroup,i,true); end; end;

- 150 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Composants > Divers Comment donner le focus un composant ?
Auteur : Al-Yazdi Il faut d'abord vrifier que notre composant peut recevoir un focus, puis le lui donner.
if MyComponent.CanFocus then MyComponent.SetFocus;

Comment faire un retour la ligne ?


Auteur : Gysmo Il faut utiliser le code #13#10 , code indiquant un retour la ligne (Carriage Return Line Feed, CRLF) ou bien sLineBreak qui est gal #10 sous Linux ou #13#10 sous Windows. A la conception Il suffit pour cela de modifier le fichier .dfm, pour ce faire il suffit de slectionner la fiche, puis soit faire un clic droit puis "Voir comme texte" soit faire Alt+F12. Ensuite il suffit d'diter dans la ligne Caption ou Hint par exemple ceci :
Caption = 'Premire ligne' #13#10 'Seconde ligne' Hint = 'Premire ligne' #13#10 'Seconde ligne'

Dynamiquement Dans l'vnement OnCreate par exemple avec un TLable :


MyLabel.Caption := 'Premire ligne' + sLineBreak + 'Seconde ligne' MyLabel.Hint := 'Premire ligne' + sLineBreak + 'Seconde ligne'

Dans le texte d'une boite de message :


ShowMessage('Premire ligne' + sLineBreak + 'Seconde ligne'); MessageDlg('Premire ligne'+ sLineBreak + 'Seconde ligne', mtInformation, [mbOK], 0);

Remarque : Ceci ne fonctionne pas avec la proprit Caption du TButton, utilisez alors le TBitBtn (onglet Supplment).

Comment aligner droite le contenu d'un TControl (TEdit...) ?


Auteur : Gysmo L'astuce est d'utiliser la proprit BiDiMode du TControl (anctre des composants visibles). Ce mode bidirectionnel spcifie la direction de la lecture du texte. En localisant l'application on arrive aligner le texte droite. Dans l'vnement OnCreate :
{Indique une localisation moyen-orientale } SysLocale.MiddleEast := True;
- 151 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

{Exemple avec un TEdit } MyEdit.BiDiMode := bdRightToLeft;

Ceci fonctionne avec la plupart des descendants du TControl : TEdit, TMaskEdit, TListBox... Dans le cas du TEdit il existe deux autres solutions : - Utiliser un TMemo ayant pour hauteur la hauteur d'un TEdit et sa proprit WantReturns false - Crer un TEdit qui accepte l'alignement droite :
type TMonEdit = class(TEdit) private FTextAlign: TAlignment; procedure SetTextAlign(Value: TAlignment); protected procedure CreateParams(var Params: TCreateParams); override; public constructor Create(AOwner: TComponent); override; published property TextAlignment: TAlignment read FTextAlign write SetTextAlign; end; implementation constructor TMonEdit.Create(AOwner: TComponent); begin inherited; FTextAlign := taLeftJustify; end; procedure TMonEdit.CreateParams(var Params: TCreateParams); const Alignments: array[TAlignment] of Word = (ES_LEFT, ES_RIGHT, ES_CENTER); begin inherited CreateParams(Params); Params.Style := Params.Style or Alignments[TextAlignment]; end; procedure TMonEdit.SetTextAlign(Value: TAlignment); begin if FTextAlign <>Value then Begin FTextAlign := Value; RecreateWnd; End; end;

Comment ne rentrer que des chiffres dans un TEdit ?


Auteurs : DelpHichem - Gysmo Il suffit de remplacer tout autre caractre par le caractre nul dans l'vnement OnKeyPress du TEdit, exception faite pour le sparateur dcimal (DecimalSeparator), la touche retour (VK_BACK) et la touche supprimer (VK_DELETE).
procedure TMyForm.MyEditKeyPress(Sender: TObject; var Key: Char); begin if not (Key in ['0'..'9', DecimalSeparator, Chr(VK_BACK), Chr(VK_DELETE)]) then Key := #0; if Key = DecimalSeparator then if Pos(DecimalSeparator, MyEdit.Text) <> 0 then Key := #0; end;

- 152 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

En complment au code prcdent, nous vous proposons galement celui ci-dessous qui permet de contrler la saisie des chiffres ainsi que le sparateur de dcimal et le signe moins.
procedure VerNumAll(Edit: TEdit; var Key: Char; Moins: Boolean = True; Virgul: Boolean = False); var i, j: integer; begin if Key in [',', '.'] then Key := DecimalSeparator; if not (Key in ['0'..'9', DecimalSeparator, '-', #8]) or ((Key = '-') and not (Moins)) or ((Key = DecimalSeparator) and not (Virgul)) then begin Key := #0; end; if (Key = DecimalSeparator) and (Virgul) then if Pos(DecimalSeparator, Edit.Text) > 0 then Key := #0; if (Key = DecimalSeparator) and (Virgul) then if length(Edit.Text) < 1 then begin Edit.Text := '0' + DecimalSeparator; Edit.SelStart := 2; Key := #0; end; if (Key = DecimalSeparator) and (Virgul) then if (copy(Edit.Text, 1, 1) = '-') and (Length(Edit.Text) = 1) then begin Edit.Text := '-0' + DecimalSeparator; Edit.SelStart := 3; Key := #0; end; if (Key = '-') and (Moins) then begin i := Edit.SelStart; j := Edit.SelLength; if Length(Edit.Text) > 1 then begin if Edit.Text[1] = '-' then begin Edit.Text := Copy(Edit.Text, 2, Length(Edit.Text) - 1); if i = 0 then Dec(j); end else Edit.Text := '-' + Edit.Text; end else if Edit.Text = '-' then Edit.Text := '' else Edit.Text := '-' + Edit.Text; if Edit.Text <> '' then if Edit.Text[1] = '-' then i := i + 1 else i := i - 1; Edit.Selstart := i; Edit.SelLength := j; Key := #0; end; end;

L'appelle se fait comme suit : Dans OnKeyPress

- 153 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin //Le 3eme paramtre permet de contrler la saisie du signe //moins //Le 4eme paramtre permet de contrler la saisie du //sparateur de dcimal VerNumAll(TEdit(Sender), Key, True, True); end;

Comment modifier une proprit par son nom ?


Auteur : Pierre Castelain Cette mthode prsente l'utilisation des procdures RTTI pour accder aux proprits des contrles. L'exemple suivant montre comment changer la proprit Color de tous les composants qui la possde. C'est une solution plus efficace dans ce cas car il n'est pas ncessaire de connatre la classe du composant pour changer sa proprit Color.
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i:=0 to ControlCount - 1 do if IsPublishedProp(Controls[i], 'Color') and PropIsType(Controls[i], 'Color', tkInteger) then SetOrdProp(Controls[i], 'Color', clRed); end;

Pour que ce code fonctionne il faut ajouter TypInfo dans la clause Uses.

Comment raliser un effet de scroll sur un label ?


Auteur : Nono40 Cette mthode indique comment raliser un dfilement sur le texte d'un label. Le texte va dfiler de gauche droite continuellement. Pour ce faire il faut mettre sur la fiche un Timer contenant le code suivant :
procedure TForm1.Timer1Timer(Sender: TObject); Const Saut=1; begin Label1.Caption:=Copy(Label1.Caption,Saut+1,Length(Label1.Caption)-Saut) +Copy(Label1.Caption,1,Saut) ; end;

La priode doit tre rgle sur 100 ms environ. La constante "saut" indique de combien de caractres le label avance chaque pas du timer.

- 154 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Astuce amusante : Mettre les proprit AutoSize et WordWarp du label False. Puis saisir dans le Caption un texte beaucoup plus long que la zone d'affichage. La fin du texte ne sera visible qu'au bout d'un certain temps comme un vrai texte dfilant.

Comment convertir des coordonnes cran en position de caractre d'un contrle d'dition ?
Auteur : Pierre Castelain Il est parfois intressant de pouvoir obtenir la position du caractre le plus proche d'un point en coordonnes cran. Il existe un message Windows permettant de raliser cette opration : EM_CHARFROMPOS Voici une fonction utilisant ce message et utilisable avec des contrles d'dition simple et des RichEdit.
function ClientPosToCharIndex(AnEdit: TCustomEdit; ClientPos: TPoint): Integer; var lParam: Integer; begin { Le format du paramtre LParam tant diffrent selon le type de composant } { il nous faut tester s'il s'agit d'un RichEdit ou d'un simple Edit (ou Memo).} if AnEdit is TRichEdit then begin { Dans le cas d'un RichEdit, le paramtre reprsente l'adresse d'une } { structure de type TRect contenant la position en coordonnes cran } { relative au composant.} lParam:= Integer(@ClientPos); { La valeur retourne correspond l'index absolu du caractre le plus } { prs du point ou du dernier caractre si le point est plus bas que le } { dernier caractre du contrle. } result:= AnEdit.Perform(EM_CHARFROMPOS, 0, lParam); end else begin { Dans le cas d'un Edit, le paramtre contient deux mots correspondants } { la position en coordonnes cran relative au composant. Le mot de poids } { faible contient la position horizontale (X) et le mot de poids fort la } { position verticale (Y) } lParam:= ClientPos.Y shl 16 + ClientPos.X; { La valeur retourne contient l'index absolu du caractre ainsi que } { l'index de la ligne. } { Le mot de poids faible correspond l'index absolu du caractre le plus } { prs du point ou du dernier caractre si le point est plus bas que le } { dernier caractre du contrle. } { Le mot de poids fort (l'index de la ligne) n'est pas utilis dans cet } { exemple. } result:= LoWord(AnEdit.Perform(EM_CHARFROMPOS, 0, lParam)); end; end;

Le code suivant est un exemple simple d'utilisation de cette fonction. Celui-ci affiche dans un label le caractre le plus proche du curseur lorsque l'on le dplace sur un Memo. Dans une feuille, placez un composant de type TMemo (appel Memo1) ainsi qu'un composant de type TLabel (appel Label1). Dans l'inspecteur d'objet, faites un double click sur l'vnement OnMouseMove et modifiez le code gnr comme ceci:
procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- 155 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin Label1.Caption:= Memo1.Lines.Text[ClientPosToCharIndex(Memo1, Point(X, Y))]; end;

Comment mettre une case cocher dans une MessageDlg ?


Auteur : Bloon Les MessageDlg sont des petites boites de dialogues qu'on utilise trs souvent pour alerter, informer ou poser une question l'utilisateur. On les cre grce la fonction :
MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word;

Il peut tre intressant dans certains cas d'ajouter une case cocher, gnralement "Ne plus afficher ce message". Etant donn que cette possibilit n'est pas prvue en standard, il faut rcrire notre propre MessageDlg :
function MDChecked(const Msg, { Message afficher} ChkMsg: string; { Message de la case cocher} var checkedValue : boolean; { Valeur de la case cocher} DlgType: TMsgDlgType; { Type de la boite de message} Buttons: TMsgDlgButtons) { boutons} : Word; var chk : TCheckBox; frm : TForm; begin frm := CreateMessageDialog(Msg, DlgType, Buttons); with frm do try { Ajout d'une case cocher en bas gauche} chk := TCheckBox.Create(frm); with chk do begin Checked := checkedValue; Caption := chkMsg; Left := 8; Top := frm.Height - Height - 12; Width := frm.width - left - 1; Parent := frm; end; { Agrandissement de la fentre} Height := Height + chk.Height; Position := poScreenCenter; { Affichage} Result := ShowModal; { Rcupration de la case cocher} checkedValue := chk.Checked; finally Free; end; end;

Exemple d'utilisation :
var

- 156 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

chk : boolean; ... if ParametresAppli.AfficherMessage then begin chk := false; MDChecked('Bla bla bla...','Ne plus afficher ce message',chk,mtInformation,[mbOK]); { on inverse la valeur car le texte associ } { la case cocher est l'inverse de ce qu'on stocke} ParametresAppli.AfficherMessage := not chk; end;

ParametresAppli.AfficherMessage est un paramtre de votre application, stock dans un .ini ou dans la base de registre. Voir galement : Le tutoriel trs complet d'Alexandre TRANCHANT sur les botes de messages l'aide de Delphi sur MessageDlg afin d'avoir toutes les prcisions sur TMsgDlgType et TMsgDlgButtons. L'art et la manire de crer des botes de messages rapidement par A. Tranchant

lien :

Pourquoi ai-je une erreur sur dsgnintf, en installant un composant sous Delphi 6 ou 7 ?
Auteur : DelphiCool Dans Delphi 6 et Delphi 7, l'unit dsgnintf n'existe plus. Elle a t renomme et certains changements sont ncessaires pour installer certains composants faits avec d'anciennes versions de Delphi. Dans la plupart des cas il suffit de remplacer dsgnintf par DesignIntf, DesignEditors. Lisez cet article pour plus d'informations: http://delphicool.developpez.com/tut/cpt_compo_vers_D6/dev_index.htm lien : lien : Erreur dsgnintf non trouv avec Delphi 6, par DelphiCool Les packages, par Merlin

Comment afficher des documents au format Adobe Acrobat (PDF) dans une application Delphi ?
Auteur : Pierre Castelain Adobe propose un outil gratuit de visualisation appel Acrobat Reader. L'installation de cet outil intgre un contrle ActiveX qui peut tre utilis pour afficher des documents PDF dans n'importe quelle application dveloppe avec un langage supportant les objets COM. Il est donc trs facile d'utiliser ce contrle ActiveX dans une application Delphi. Il vous faut commencer par installer Acrobat Reader sur votre ordinateur de dveloppement. Notez que cette installation sera galement ncessaire sur les ordinateurs devant excuter votre programme. Vous pouvez trouver le programme d'installation ici : http://get.adobe.com/reader/ Une fois l'installation termine, vous devez importer le contrle ActiveX dans Delphi. Celui-ci s'appelle "Acrobat Control for ActiveX" et peut tre import en suivant la procdure dcrite dans la FAQ Delphi : Comment Installer un ActiveX ? Si vous avez suivi la procdure sans modifier le nom de la palette utilise, vous devriez trouver un nouveau composant dans la palette ActiveX. Ce nouveau composant intitul TPdf peut tre pos sur une fentre Delphi comme n'importe quel autre composant. Vous pouvez prsent l'utiliser dans votre application en utilisant sa mthode LoadFile :
Pdf1.LoadFile('fichier.pdf');

- 157 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Pour plus d'information sur les mthodes proposes par ce composant, vous pouvez tudier l'unit Delphi contenant la dfinition de ses interfaces (par dfaut PdfLib_TLB.pas situe dans le dossier Imports de Delphi) ou tlcharger les documents fournis par Adobe l'adresse suivante : http://partners.adobe.com/ public/developer/acrobat/sdk/index.html Attention, le tlchargement de certains documents ncessite de s'tre enregistr sur le site mais cet enregistrement est gratuit et sans restriction particulire.

Comment effacer le contenu d'un TImage ?


Auteur : Smortex Pour effacer l'image affiche dans un TImage, il suffit d'assigner nil a sa propriete Picture :
Image1.Picture := nil;

Comment parcourir les champs d'dition avec l'appui sur la touche "Enter" dans un formulaire ?
Auteur : Giovanny Temgoua Il arrive trs souvent que l'on veuille donner le focus au contrle suivant (dans l'ordre spcifi par la proprit TabOrder) dans un formulaire condition que ce contrle ait TabStop true. Nous utilisons ici un gestionnaire d'vnement commun tous les contrles TEdit qui passera au contrle suivant si nous appuyons sur Entre :
procedure TMainForm.GoToNextEditControls(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = VK_RETURN then PostMessage(self.Handle,WM_NEXTDLGCTL,0,0); //Nous pouvons aussi utiliser : perform(WM_NEXTDLGCTL,0,0); end;

Comment utiliser l'aide en ligne avec SynEdit ?


Auteur : sjrd Vous utilisez un composant SynEdit dans votre application, et vous voudriez que, comme dans Delphi, l'aide s'affiche automatiquement lors d'un appui sur F1. Deux choses sont faire. La premire n'est pas obligatoire avec toutes les versions de SynEdit. Double-cliquez sur la proprit KeysStrokes du composant SynEdit. Dans le fentre qui s'affiche, cliquez sur le bouton Add. Dans le champ Command, entrez ecContextHelp, et dans un des champs Keystroke, entrez F1. La deuxime est de placer le code suivant dans l'vnement OnContextHelp du composant SynEdit :
procedure TForm1.SynEdit1ContextHelp(Sender: TObject; word: String); begin Application.HelpKeyword(word);

- 158 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

lien :

Site WEB de SynEdit

Comment modifier le contenu d'un composant liste sans avoir de scintillement ?


Auteur : Pierre Castelain Losque l'on effectue de nombreuses oprations dans un composant liste (TListBox, TListView, etc), l'affichage a tendance scintiller. C'est tout fait normal car ces composants rafrachissent leur aspect visuel chaque opration. Pour viter ce phnomne, il suffit d'utiliser un mcanisme implment dans les classes drives de TStrings (TStringList en particulier) permettant de bloquer temporairement l'envoi de messages de mise jour lors des modifications. Ce mcanisme est mis en oeuvre grce aux mthodes BeginUpdate et EndUpdate. En voici un exemple avec un composant TListBox :
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin { Dans cet exemple, nous vidons le TListBox et y ajoutons un grand nombre de chanes. Nous avons plac l'appel EndUpdate dans un bloc finally afin d'tre certains qu'il soit toujours appel, mme si une exception est leve pendant le remplissage. } ListBox1.Items.BeginUpdate; try ListBox1.Items.Clear; for i:= 0 to 99999 do ListBox1.Items.Add(IntToStr(i)); finally ListBox1.Items.EndUpdate; end; end;

Comment cacher la barre de menu ?


Auteur : Giovanny Temgoua Pour cacher la barre de menu d'une fiche, il suffit de mettre sa proprit Menu nil :
Self.Menu := nil;

Pour la ractiver, on remet juste le nom du Menu


Self.Menu := MainMenu1;

Comment vrifier l'galit de deux images ?


Auteur : Pierre Castelain Le code suivant permet de vrifier que deux objets de classe TGraphic sont identiques. Elle permet de comparer l'ensemble des types d'images support par cette classe (bitmap, metafile, icone).
function CompareGraphic(const Graphic1, Graphic2: TGraphic): boolean;
- 159 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

var MyImage1, MyImage2: TMemoryStream; begin // Code librement adapt de la fonction TGraphic.Equals //Si l'un des deux vaut nil... if Graphic1 = nil then result:= Graphic2 = nil else if Graphic2 = nil then begin result:= false; exit; end else begin Result:= Graphic1.ClassType = Graphic2.ClassType; //Si l'un des deux est vide if Graphic1.Empty then result:= Graphic2.Empty else begin if result then begin MyImage1 := TMemoryStream.Create; try Graphic1.SaveToStream(MyImage1); MyImage2 := TMemoryStream.Create; try Graphic2.SaveToStream(MyImage2); //On compare la taille des images et la taille binaire des images en mmoire Result := (MyImage1.Size = MyImage2.Size) and CompareMem(MyImage1.Memory, MyImage2.Memory, MyImage1.Size); finally MyImage2.Free; end; finally MyImage1.Free; end; end; end; end; end;

Comment simuler un lien hypertexte dans une fiche About ?


Auteurs : Olivier Lance - Giovanny Temgoua Il n'existe pas de composant standard pour simuler un lien hypertexte. Il faut passer par un composant tiers comme le TJvLinkLabel (de la JVCL) ou utiliser le code ci-dessous. L'astuce utilise est tout simplement d'intercepter l'vnement OnClick d'un TLabel et d'utiliser la fonction ShellExecute avec l'url atteindre comme destination. Le code du click sur le label est le suivant :
procedure TAboutBox.Label1Click(Sender: TObject); begin ShellExecute(Handle,'OPEN','http://www.Developpez.com', Nil,Nil,SW_SHOW); end;

La fonction ShellExecute est dfinie dans l'unit ShellApi, il faudra donc penser l'ajouter dans la clause uses.

- 160 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Pour que visuellement l'utilisateur puisse savoir qu'il s'agit d'un "lien", on peut en plus configurer la forme du curseur sur le TLabel en lui donnant la valeur crHand et grer les vnements OnMouseEnter et OnMouseLeave de cette faon
procedure TAboutBox.Label1MouseEnter(Sender: TObject); begin Label1.Font.Color := clBlue; end; procedure TAboutBox.Label1MouseLeave(Sender: TObject); begin Label1.Font.Color := clNavy; end;

Comment tracer dans un contrle qui n'a pas de canvas ?


Auteur : Sioux Il suffit d'utiliser un objet TControlCanvas qui se charge d'associer un canvas un contrle qui n'en a pas... Pour ce faire, on utilise sa proprit Control qui dtermine le contrle auquel associer la surface de dessin. Ensuite on utilise le TControlCanvas comme un canvas standard de TForm par exemple. Le code suivant illustre ce principe :
var fCanvas: TControlCanvas; procedure TForm1.CreateClick(Sender: TObject); begin fcanvas:=TControlCanvas.Create; fcanvas.Control := Edit1; // Edit1 est un TEdit end; procedure TForm1.UseClick(Sender: TObject); begin fCanvas.Brush.Color := clRed; fCanvas.Rectangle(1, 1, 15, 15); fCanvas.Brush.Color := clWhite; fCanvas.TextOut(17, 0, 'rouge'); //Edit1 contient maintenant un carr rouge puis le texte 'rouge' end; procedure TForm1.freeClick(Sender: TObject); begin fCanvas.Free; end;

Comment bloquer la saisie dans un Memo en Majuscule ?


Auteurs : DMO - Nono40 Pour restreindre la saisie de l'utilisateur des majuscules dans un TMemo, on peut utiliser le code suivant dans l'vnement OnKeyPress :
Key := UpCase(Key);

Cependant, cette mthode ne gre pas les caractres accentus! Pour grer correctement les caractres accentus, on peut utiliser le code suivant, en exploitant le gestionnaire de l'vnement OnCreate de la fiche:

- 161 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

TEdit(Memo1).CharCase := ecUpperCase;

Plus gnrallement, le code suivant fonctionne pour tous les descendants de TCustomEditControl :
SetWindowLong(Memo1.Handle,GWL_STYLE,GetWindowLong(Memo1.Handle,GWL_STYLE)Or ES_UPPERCASE);

Comment appeler un vnement d'un composant ailleurs dans le code ?


Auteur : Pedro Prenons un exemple, vous avez ce code sur l'vnement OnKeyPress d'une TForm appele Fiche1:
procedure TFiche1.FormKeyPress(Sender: TObject; var Key: Char) begin MessageDlg(Format('La touche %c a t enfonce',[Key]).',mtInformation,[mbOk],0); end;

Pour pouvoir appeler cette procedure ailleurs dans le code, il existe 2 mthodes. Par exemple, vous voulez que l'vnement se produise avec la touche 'p'. Il faut donc : Soit directement appeler:
FormKeyPress(Fiche1, 'p');

Note: ici, Fiche1 peut tre remplac par self. Soit appeler le membre de TFiche1:
var c:char; begin c:='p'; Fiche1.OnKeyPress(Fiche1, c); end;

ou encore
var c:char; begin c:='p'; self.OnKeyPress(self, c); end;

Note: Dans les exemples prcdents, puisque l'on ne se sert pas de Sender, il est inutile de passer quoi que ce soit dans les paramtres. On peut alors directement appeler:

- 162 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

FormKeyPress(nil,c);

Comment avoir des couleurs dans un TMenuItem ?


Auteur : waskol Afin d'avoir des couleurs dans un TMenuItem, vous devez, comme l'aide Delphi le prcise, soit passer la valeur de la proprit OwnerDraw du menu parent True ou vous assurer que le menu parent a une proprit Images non nil. Ensuite, l'vnement OnDrawItem ou OnAdvancedDrawItem est utilis pour dessiner dans le canevas du TMenuItem. L'unit suivante ( inclure dans votre projet ) vous permet de mettre des couleurs dans vos TMenuItem :
unit UnitMenusCouleurs; interface uses Windows,Menus,Graphics,types; type TMenuItemHelper=class(TMenuItem) public procedure DoAdvancedDrawItem(ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState); end; implementation procedure TMenuItemHelper.DoAdvancedDrawItem( ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState); var IsTopLevel:Boolean; OldEvent:TAdvancedMenuDrawItemEvent; begin OldEvent:=OnAdvancedDrawItem; OnAdvancedDrawItem:=nil; IsTopLevel:=(GetParentComponent is TMainMenu); AdvancedDrawItem(ACanvas,ARect,State,IstopLevel); OnAdvancedDrawItem:=OldEvent; end; end.

Son utilisation est assez simple. Dans l'unit de la fiche ou se trouve votre menu, dans la partie implementation, rajoutez UnitMenusCouleurs dans les uses, comme ceci :
... implementation uses UnitMenusCouleurs; {$R *.dfm} ...

ensuite, on code l'vnement du TMenuItem comme ainsi :


procedure TForm1.UnMenuItem2AdvancedDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState); begin ACanvas.Font.Color:=clRed; ACanvas.Brush.Color:=clYellow; TMenuItemHelper(Sender).DoAdvancedDrawItem(ACanvas,ARect,State); end;
- 163 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Il existe aussi les objets TAdvMainMenu, TAdvMenuItem, ... de chez www.tmssoftware.com Ces composants sont gratuits.

Comment animer le glyph d'un TMenuItem en fonction de son tat (odSelected, etc...) ?
Auteur : waskol Tout d'abord, voici une unit ajouter votre projet :
unit UnitSuperMenus; interface uses Windows, Classes, Menus,Graphics,types,ImgList; type TImageIndex=type Integer; TMenuItemPublic=class(TComponent) public FCaption: string; FHandle: HMENU; FChecked: Boolean; FEnabled: Boolean; FDefault: Boolean; FAutoHotkeys: TMenuItemAutoFlag; FAutoLineReduction: TMenuItemAutoFlag; FRadioItem: Boolean; FVisible: Boolean; FGroupIndex: Byte; FImageIndex: TImageIndex; FActionLink: TMenuActionLink; FBreak: TMenuBreak; FBitmap: TBitmap; FCommand: Word; FHelpContext: THelpContext; FHint: string; FItems: TList; FShortCut: TShortCut; FParent: TMenuItem; FMerged: TMenuItem; FMergedWith: TMenuItem; FMenu: TMenu; FStreamedRebuild: Boolean; FImageChangeLink: TChangeLink; FSubMenuImages: TCustomImageList; FOnChange: TMenuChangeEvent; FOnClick: TNotifyEvent; FOnDrawItem: TMenuDrawItemEvent; FOnAdvancedDrawItem: TAdvancedMenuDrawItemEvent; FOnMeasureItem: TMenuMeasureItemEvent; FAutoCheck: Boolean; end; TMenuItemHelper=class(TMenuItem) public procedure DoAdvancedDrawItem(ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState; NewIndex:Integer); end; implementation uses SysUtils;

- 164 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

{ TMenuItemHelper } procedure TMenuItemHelper.DoAdvancedDrawItem(ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState; NewIndex: Integer); var OldMenuDrawItemEvent:TMenuDrawItemEvent; OldAdvancedMenuDrawItemEvent:TAdvancedMenuDrawItemEvent; IsTopLevel:Boolean; begin OldMenuDrawItemEvent:=OnDrawItem; OldAdvancedMenuDrawItemEvent:=OnAdvancedDrawItem; OnDrawItem:=nil; OnAdvancedDrawItem:=nil; TMenuItemPublic(Self).FImageIndex:=NewIndex; IsTopLevel:=(GetParentComponent is TMainMenu); AdvancedDrawItem(ACanvas,ARect,State,IsTopLevel); OnDrawItem:=OldMenuDrawItemEvent; OnAdvancedDrawItem:=OldAdvancedMenuDrawItemEvent; end; end.

Exemple d'utilisation : Nous avons ici deux TMenuItem dclars dans un TMainMenu , reli par sa proprit ImageList une liste d'images (Ils auraient pu tre des lments d'un TPopupMenu aussi...) Le premier s'appelle HelpItem, le second ExitItem, et on a cod leurs vnements OnAdvancedDrawItem comme ceci : (La proprit OwnerDraw du menu parent doit tre True)
procedure TForm1.HelpItemAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState); var NewImageIndex:Integer; begin //en fonction de l'tat de l'lment de menu, on assigne un Nouvel ImageIndex if (OdSelected in State) then NewImageIndex:=1 else NewImageIndex:=2; //Puis on effectue le dessin du MenuItem comme ceci : TMenuItemHelper(Sender).DoAdvancedDrawItem(ACanvas,ARect,State,NewImageIndex); end; procedure TForm1.ExitItemAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState); var NewImageIndex:Integer; begin //Bonus1 : on en profite pour changer la Police du MenuItem ACanvas.Font.Color:=clRed; //...et sa couleur d'arrire plan (voir rubriques connexes) ACanvas.Brush.Color:=clYellow; //en fonction de l'tat de l'lment de menu, on assigne un Nouvel ImageIndex if (OdSelected in State) then NewImageIndex:=3 else NewImageIndex:=4; //Puis on effectue le dessin du MenuItem comme ceci : TMenuItemHelper(Sender).DoAdvancedDrawItem(ACanvas,ARect,State,NewImageIndex); end;

Rubriques connexes de la FAQ : Comment accder aux variables prives d'une classe ?

- 165 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Comment avoir des couleurs dans un TMenuItem ?

Comment avoir un TMainMenu dans un TPanel ?


Auteur : Pedro Il suffit de crer votre TMainMenu comme vous le souhaitez, d'ajouter une TToolBar dans le TPanel (ou n'importe quel autre conteneur), puis d'utiliser la proprit Menu dans laquelle vous spcifiez le TMainMenu. Note : Il vaut mieux crer le TMainMenu et ses menus d'abord puisque les modifications sur celui-ci ne se refltent pas sur la TToolBar. Pour mettre jour, vous devez enlever le TMainMenu de la proprit Menu puis le remettre.

Comment dessiner sur le vrai Canvas d'un TImage sans modifier l'image qu'il contient (Picture) ?
Auteur : waskol Le Composant TImage possde, certes, une proprit Canvas mais qui n'est pas la sienne... Lorsque vous utilisez ce canevas pour y dessiner vous accdez en fait la proprit Canvas de l'objet TCanvas de l'image spcifie dans la proprit Picture. Si vous dessinez sur ce canevas, vous modifierez donc aussi l'image sous-jacente. Or parfois il peut vous tre utile d'accder au TCanvas de TImage lui mme pour, par exemple : Dessiner (un rectangle de slection par exemple) sur le TImage sans pour autant modifier l'image sous-jacente spcifie dans la proprit Picture. Ecrire un descendant de TImage et surcharger sa mthode Paint. Dans ce cas l'utilisation de la proprit Canvas de votre nouveau composant modifiera l'image sousjacente qui redclenchera l'xcution de votre mthode Paint, etc.. Ceci conduira une boucle sans fin avec tout les dsagrments que cela occasionne...

Ce qu'il faut savoir : Le vritable canevas de TImage se trouve dans sa classe anctre TGraphicControl, et c'est une proprit protge. Pour pouvoir y accder : Il faut donc traiter le TImage comme s'il s'agissait d'un TGraphicControl Trouver un moyen d'accder la proprit protge.

La FAQ suivante rpond cette dernire question : Comment accder aux mthodes "Protected" d'une classe ? De l, nous pourrons dessiner sur le vrai canvas du TImage de cette faon, en supposant que Image1 soit un TImage :
type TPublicGraphicControl=class(TGraphicControl); ... begin ... //Utilise le canvas du TGraphicControl (le vrai Canvas du TImage) With TPublicGraphicControl(Image1).Canvas do begin Pen.Color := clRed; Brush.Color := clRed;

- 166 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Rectangle(5,5,Image1.Width-5,Image1.Height-5); end; ... end;

Aussi, un descendant d'un TImage qui surcharge la mthode paint de son anctre pourrait s'crire :
unit Image1; interface uses SysUtils, Classes, Controls, ExtCtrls; type TNouvelleImage = class(TImage) private { Dclarations prives } protected { Dclarations protges } procedure Paint; override; public { Dclarations publiques } published { Dclarations publies } end; procedure Register; implementation procedure Register; begin RegisterComponents('Exemples', [TNouvelleImage]); end; { TImage1 } type TPublicGraphicControl=class(TGraphicControl); procedure TNouvelleImage.Paint; begin inherited Paint; //Utilise le canvas du TGraphicControl (le vrai Canvas du TImage) With TPublicGraphicControl(self).Canvas do begin Pen.Width:=3; Pen.Color := clRed; Pen.Style Brush.Color := clRed; Rectangle(5,5,Width-5,Height-5); end; end; end.

Comment dessiner un texte multiligne, correctement justifi et align dans une zone particulire d'un Canvas ?
Auteur : waskol Qui n'a jamais rencontr le problme de savoir comment crire un texte qui plus est multiligne, bien centr dans une zone particulire d'un canvas ?

- 167 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

L'utilisation de la mthode TCanvas.TextOut (trop limite ?) ou de la fonction DrawText de l'API Windows (trop complexe ?) se rvle tre dcourageante pour qui souhaite par exemple afficher un texte de 3 lignes dans la cellule d'un TStringGrid. La fonction suivante utilise la fonction TextSize dj dcrite dans l'une de nos FAQs : Comment connatre la largeur et la hauteur en pixels d'un texte ?
interface ... type TAlignementVertical=(alVTop,alVCenter,alVBottom); TAlignementHorizontal=(alHLeft,alHCenter,alHRight); TJustification=(JustLeft,JustCenter,JustRight); procedure DessineTexteMultiligne(AString:string;ACanvas:TCanvas;ARect: TRect; AlignementHorizontal:TAlignementHorizontal; AlignementVertical:TAlignementVertical; TextJustification:TJustification); ... implementation //Voir FAQ Delphi de www.developpez.com pour cette fonction : //URL : http://delphi.developpez.com/faq/?page=typechaine#dimensionstexte Function TextSize(Phrase : string; Police : TFont = nil) : TPoint; var DC: HDC; X: Integer; Rect: TRect; C : TBitmap; begin C := TBitmap.create; if police <> nil then C.canvas.Font := police; Rect.Left := 0; Rect.Top:=0; Rect.Right:=0; Rect.Bottom:=0; DC := GetDC(0); C.Canvas.Handle := DC; DrawText(C.Canvas.Handle, PChar(Phrase), -1, Rect, (DT_EXPANDTABS or DT_CALCRECT)); C.Canvas.Handle := 0; ReleaseDC(0, DC); result.X:=Rect.Right-Rect.Left; result.Y:=Rect.Bottom-Rect.Top; C.Free;

end;

//Notre procedure d'affichage de texte multiligne procedure DessineTexteMultiligne(AString: string;ACanvas:TCanvas;ARect: TRect; AlignementHorizontal:TAlignementHorizontal; AlignementVertical:TAlignementVertical; TextJustification:TJustification); var AHeight,AWidth:integer; Rect,oldClipRect:TRect; ATop,ALeft,H,W:Integer; AText:string; JustificationDuTexte:Integer; MyRgn:HRGN; begin with ACanvas do begin Lock; AHeight:=ARect.Bottom-ARect.Top; AWidth:=ARect.Right-ARect.Left; //on calcule la taille du rectangle dans lequel va tenir le texte

- 168 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

W:=TextSize(AString,ACanvas.Font).X; H:=TextSize(AString,ACanvas.Font).Y; //on calcule la position (Haut,Gauche) du rectangle dans lequel va tenir le texte //en fonction de l'alignement horizontal et vertical choisi ATop:=ARect.Top; ALeft:=ARect.Left; case AlignementVertical of alVBottom : ATop:=ARect.Bottom-H; alVCenter : ATop:=ARect.Top+((AHeight-H) div 2); alVTop : ATop:=ARect.Top; end; case AlignementHorizontal of alHLeft : ALeft:=ARect.Left; alHCenter: ALeft:=ARect.Left+(AWidth-W) div 2; alHRight : ALeft:=ARect.Right-W; end; //Fin du calcul du rectangle, on met le resultat dans Rect Rect:=Bounds(ALeft,ATop,W,H); //On remplit le rectangle de la zone sinon on voit le texte que delphi dessin FillRect(ARect); //On dtermine les paramtres de justification passer Windows case TextJustification of JustLeft : JustificationDuTexte:=DT_LEFT; JustCenter: JustificationDuTexte:=DT_CENTER; JustRight : JustificationDuTexte:=DT_RIGHT; end; //Si le texte est plus grand que notre zone, on prend cette prcaution (Clipping) with ARect do MyRgn :=CreateRectRgn(Left,Top,Right,Bottom); SelectClipRgn(Handle,MyRgn); //On dessine le texte DrawText(Handle,PChar(AString),-1,Rect,JustificationDuTexte or DT_NOPREFIX or DT_WORDBREAK ); //On a plus besoin de la zone de clipping SelectClipRgn(Handle,0); DeleteObject(MyRgn); Unlock; end; end;

Utilisation de la procdure DessineTexteMultiligne : AString: string; Chane de caractre dessiner. ACanvas:TCanvas; Canvas o le texte doit tre dessin ARect: TRect; Zone rectangulaire du Canvas dans laquelle le texte doit tre dessin AlignementHorizontal:TAlignementHorizontal; Alignement Horizontal du texte dans la zone rectangulaire, trois options sont possibles : - alHLeft : Place le texte gauche dans la zone rectangulaire. - alHCenter : Centre le texte horizontalement dans la zone rectangulaire.

- 169 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

- alHRight : Place le texte droite dans la zone rectangulaire. AlignementVertical:TAlignementVertical; Alignement Vertical du texte dans la zone rectangulaire, trois options sont possibles : - alVTop : Place le texte en haut de la zone rectangulaire. - alVCenter : Centre le texte verticalement dans la zone rectangulaire. - alVBottom : Place le texte en bas de la zone rectangulaire. TextJustification:TJustification Justification du texte - JustLeft : Justifie le texte gauche - JustCenter : Justification centre du texte - JustRight : Justifie le texte droite

Note concernant le choix du type des paramtres de la procdure : L'utilisation des types dj existants de Delphi est tout aussi valable, savoir : AlignementVertical:TTextLayout; AlignementHorizontal:TAlignement; TextJustification:TAlignment;

Ces types sont dclars dans les units StdCtrls et Classes.

Comment modifier le bouton par dfaut d'un MessageDlg ?


Auteurs : Laurent Dardenne - Pedro Nous vous proposons deux mthodes pour modifier le bouton par dfaut d'un MessageDlg. D'abord la premire :
function DefMessageDlg(const aCaption: string; const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; DefButton: TModalResult; HelpCtx: Longint): Integer; //Cre une fentre de dialogue en prcisant le bouton actif. //Exemple avec le bouton non par dfaut //if DefMessageDlg('Voulez-vous le supprimer ?', mtConfirmation, mbYesNoCancel, mrno, 0) ... var i: Integer; btn: TButton; begin with CreateMessageDialog(Msg, DlgType, Buttons) do try Caption := aCaption; HelpContext := HelpCtx; for i := 0 to ComponentCount - 1 do begin if Components[i] is TButton then begin btn := TButton(Components[i]); btn.default := btn.ModalResult = DefButton; if btn.default then ActiveControl := Btn; end; end; Result := ShowModal; finally Free; end;
- 170 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

La seconde :
function MsgEx(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; DefaultButton:TMsgDlgBtn):TModalresult; var phr:string; begin if DefaultButton in Buttons then begin case DefaultButton of //On rcupre le nom du bouton d'aprs son type mbYes:phr:='Yes'; mbNo:phr:='No'; mbOK:phr:='OK'; mbCancel:phr:='Cancel'; mbAbort:phr:='Abort'; mbRetry:phr:='Retry'; mbIgnore:phr:='Ignore'; mbAll:phr:='All'; mbNoToAll:phr:='NoToAll'; mbYesToAll:phr:='YesToAll'; mbHelp:phr:='Help'; end; with CreateMessageDialog(Msg,DlgType,Buttons) do try activecontrol:=twincontrol(findcomponent(phr)); result:=ShowModal; finally free; end; end else result:=Messagedlg(Msg,DlgType,Buttons,0); end;

Comment construire la reprsentation graphique d'un composant ?


Auteur : waskol Parfois, il peut tre intressant, de pouvoir dupliquer non pas un contrle mais plutt l'image qu'il restitue de lui mme afin, par exemple, de l'imprimer ou de le sauvegarder dans un Bitmap. Les deux types de contrles qui restituent une image d'eux mme sont les TWinControl et les TGraphicControl. Les TWinControl possdent une mthode PainTo() destine cet effet; par exemple ce code copie un TPanel et son contenu dans un Bitmap, puis le Bitmap est rutilis pour tre affich dans la fiche principale :
procedure WinControl_to_Bitmap(AWinControl:TWinControl;ABitmap:TBitmap); begin ABitmap.Width:=AWinControl.Width; ABitmap.Height:=AWinControl.Height; AWinControl.PaintTo(ABitmap.Canvas,0,0); end; procedure TForm1.Button2Click(Sender: TObject); var ABitmap:TBitmap; begin ABitmap:=TBitmap.Create; WinControl_to_Bitmap(Panel1,ABitmap); //utilisation du Bitmap Form1.Canvas.Draw(0,0,ABitmap);

- 171 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

ABitmap.Free; end;

Pour les TGraphicControl, nous pouvons tirer partie du fait qu'ils possdent tous un Canvas (proprit protge) en utilisant la mthode CopyRect() de ce dernier (ce code copie un TShape dans un Bitmap) :
type //Pour rendre la proprit canvas publique voir FAQ //Comment acceder aux Mthodes "Protected" d'une classe ? //ici : http://delphi.developpez.com/faq/?page=langage#protectedhack //La mtthode dcrite dans la FAQ fonctionne aussi avec les proprits TPublicGraphicControl=class(TGraphicControl); procedure GraphicControl_to_Bitmap(AGraphicControl:TGraphicControl;ABitmap:TBitmap); begin ABitmap.Width:=AGraphicControl.Width; ABitmap.Height:=AGraphicControl.Height; ABitmap.Canvas.CopyRect(ABitmap.Canvas.ClipRect,TPublicGraphicControl(AGraphicControl).Canvas, AGraphicControl.ClientRect); end; procedure TForm1.Button3Click(Sender: TObject); var ABitmap:TBitmap; begin ABitmap:=TBitmap.Create; GraphicControl_to_Bitmap(Shape1,ABitmap); //utilisation du Bitmap Form1.Canvas.Draw(0,0,ABitmap); ABitmap.Free; end;

Enfin, nous pouvons combiner les deux techniques dcrites ci-dessus afin de raliser une procdure un peu plus gnrique en sachant que TWinControl et TGraphicControl drivent toutes les deux de la classe TControl :
procedure Control_to_Bitmap(AControl:TControl;ABitmap:TBitmap); begin if (AControl is TWinControl) then WinControl_to_Bitmap((AControl as TWinControl),ABitmap); if (AControl is TGraphicControl) then GraphicControl_to_Bitmap((AControl as TGraphicControl),ABitmap); end; procedure TForm1.Button4Click(Sender: TObject); var ABitmap:TBitmap; begin ABitmap:=TBitmap.Create; //Copie du Panel dans le Bitmap Control_to_Bitmap(Panel1,ABitmap); //Utilisation du premier Duplicata (celui du TPanel et de son contenu) Form1.Canvas.Draw(0,0,ABitmap); //Copie du Panel dans le Bitmap Control_to_Bitmap(Shape1,ABitmap); //Utilisation du deuxime Duplicata (celui du TShape et de son contenu) Form1.Canvas.Draw(0,0,ABitmap); ABitmap.Free;

- 172 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Comment bien positionner le menu contextuel d'une grille ?


Auteur : DelpHichem Lors de l'appui sur la touche Apps sur un StringGrid ou un DBGrid, le menu contextuel n'apparat pas sur la cellule slectionne, mais au coin suprieur gauche du composant, voici une solution qui permet d'afficher le menu contextuel la bonne position. Dans la section Private ou Public (il faut que pt soit une variable globale) on ajoute
Pt : TPoint ;

On utilise l'vnement OnDrawCell du StringGrid (OnDrawColumnCell du DBGrid) et on procde comme suit:


procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if gdSelected in State then begin Pt.X := Rect.Left; Pt.Y := Rect.Top; end; end;

Ou
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if gdSelected in State then begin Pt.X := Rect.Left; Pt.Y := Rect.Top; end; end;

Et bien sr, l'venement OnKeyUp (Commun aux deux composants)


procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_Apps then with TCustomGrid(Sender).ClientToScreen(Pt) do PopupMenu1.Popup(X + 4, Y + 4); end;

- 173 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

et c'est tout.

Comment n'accepter qu'un type de contrle dans un objet ?


Auteur : Herk77 Lors de la conception et d'une insertion d'objet dans un conteneur, la mthode InsertControl est appele. Toutefois, cette mthode n'est pas surchargeable. Il faut donc utiliser la mthode prvue pour cela: ValidateInsert. Pour interdire l'insertion d'un composant, il suffit de lever une exception dans cette mthode. Exemple d'une classe hritant de TCustomPanel (anctre direct de TPanel) n'acceptant que les TButton. Interface
type TUneClasse = class(TCustomPanel) private { Dclarations prives } protected { Dclarations protges } public { Dclarations publiques } procedure ValidateInsert(AComponent: TComponent); override; published { Dclarations publies } end;

Implementation
procedure TUneClasse.ValidateInsert(AComponent: TComponent); begin if not (AComponent is TButton) then Raise Exception.Create('Ce contrle n''est pas un TButton. Insertion annule'); end;

Comment changer la couleur d'un TButton normal sans crer un descendant ?


Auteur : waskol Normalement, la modification de la couleur d'un TButton standard est quasi-impossible. La mthode propose ici est base sur la drivation de la mthode WindowProc du bouton afin de grer les messages de dessin. Une fiche et un TButton dessus, et ce code :
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtDlgs, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject);
- 174 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

procedure Button1Click(Sender: TObject); private { Dclarations prives } oldBtnProc : TWndMethod; Procedure MyBtnWndProc( Var msg : TMessage ); public { Dclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // Sauvegarde la WndProc actuelle du bouton oldBtnProc := Button1.WindowProc; // Affecte une nouvelle procdure de fentre. Button1.WindowProc := MyBtnWndProc; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Coucou !'); end; procedure TForm1.MyBtnWndProc(var msg: TMessage); Var hdcBtn : HDC; btnCanvas : TControlCanvas; i,j:Integer; AColor,OldColor:TColor; Begin OldBtnProc(msg); If (msg.Msg = BM_SETSTATE) Or (msg.Msg = WM_PAINT) Or (msg.Msg = WM_NCPAINT) Then Begin btnCanvas := TControlCanvas.Create; Try btnCanvas.Control:=Button1; OldColor:=TColor(GetTextColor(btnCanvas.Handle)); for i:=2 to Button1.ClientWidth-3 do for j:=2 to Button1.ClientHeight-3 do begin AColor:=btnCanvas.Pixels[i,j]; if AColor<>OldColor then btnCanvas.Pixels[i,j]:=clyellow; end; Finally btnCanvas.Free; End; End; End; end.

Notes pratiques : Cette mthode fonctionne aussi bien sans qu'avec les themes Windows XP (thme du bouton et des autres controles activs par TXPManifest par exemple) Vous pouvez amliorer les performances du code du dessin en passant par un bitmap intermdiaire et utiliser sa proprit scanline. Vous pouvez en fait modifier non seulement la couleur du bouton mais, bien mieux, le personnaliser loisir (image de fond, dgrad, etc).

- 175 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Voici titre d'exemple (non comment) une version fortement amliore reprenant le principe et ces suggestions (Une fiche, un TButton, et un TXPManifest) :
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, XPMan; type TForm1 = class(TForm) Button1: TButton; XPManifest1: TXPManifest; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Dclarations prives } oldBtnProc : TWndMethod; Procedure MyBtnWndProc( Var msg : TMessage ); public { Dclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} type pRGBTripleArray = ^TRGBTripleArray; TRGBTripleArray = array [0 .. 65535] of TRGBTriple; TColorMatch=(cmEqual,cmDifferent); procedure ChangeColor(Source: TBitmap; const OldColor,NewColor: TColor;ColorMatch:TColorMatch;TransparencePourcent:integer); var I, J: Integer; P: pRGBTripleArray; R1, G1, B1: Integer; R2, G2, B2: Integer; R3, G3, B3: Integer; CL1,CL2:Integer; egal:boolean; p1,p2:single; begin if ((TransparencePourcent<0) or (TransparencePourcent>100)) then exit; Source.PixelFormat := pf24bit; CL1:=ColorToRGB(OldColor); CL2:=ColorToRGB(NewColor); R1 := GetRValue(CL1); G1 := GetGValue(CL1); B1 := GetBValue(CL1); R2 := GetRValue(CL2); G2 := GetGValue(CL2); B2 := GetBValue(CL2); p1:=TransparencePourcent/100; p2:=1-p1; for J := 0 to Source.Height - 1 do begin P := Source.ScanLine[J]; for I := 0 to Source.Width - 1 do begin R3 := P[i].rgbtRed;
- 176 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

G3 := P[i].rgbtGreen; B3 := P[i].rgbtBlue; egal:=((P[i].rgbtRed=R1) and (P[i].rgbtGreen=G1) and (P[i].rgbtBlue=B1)); if (egal=(ColorMatch=cmequal)) then begin P[i].rgbtRed := round(R2*p2+R3*p1); P[i].rgbtGreen := round(G2*p2+G3*p1); P[i].rgbtBlue := round(B2*p2+B3*p1); end; end; end;

procedure TForm1.MyBtnWndProc(var msg: TMessage); Var hdcBtn : HDC; btnCanvas : TControlCanvas; i,j:Integer; AColor,OldColor:TColor; ABitmap:TBitmap; ARect:TRect; Begin OldBtnProc(msg); If (msg.Msg = BM_SETSTATE) Or (msg.Msg = WM_PAINT) Or (msg.Msg = WM_NCPAINT) Then Begin btnCanvas := TControlCanvas.Create; ABitmap:=TBitmap.Create; Try btnCanvas.Control:=Button1; OldColor:=TColor(GetTextColor(btnCanvas.Handle)); //copie du canvas dans le bitmap; ABitmap.Width:=Button1.ClientWidth; ABitmap.Height:=Button1.ClientHeight; ARect:=ABitmap.Canvas.ClipRect; ABitmap.Canvas.CopyRect(ARect,btnCanvas,ARect); ChangeColor(ABitmap,OldColor,clYellow,cmDifferent,50); btnCanvas.CopyRect(ARect,ABitmap.Canvas,ARect); Finally btnCanvas.Free; ABitmap.Free; End; End; End; procedure TForm1.FormCreate(Sender: TObject); begin // Sauvegarde la WndProc actuelle du bouton oldBtnProc := Button1.WindowProc; // Affecte une nouvelle procdure de fentre. Button1.WindowProc := MyBtnWndProc; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Coucou !'); end;

- 177 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end.

Comment dessiner un texte multiligne en WordWrap dans un Canvas ?


Auteur : waskol Ecrire un texte qui plus est multiligne, bien centr dans une zone particulire d'un canvas, c'est bien, avec la possibilit d'un retour la ligne automatique, c'est encore mieux ! La fonction suivante utilise une version amliore de la fonction TextSize dj dcrite dans l'une des QR de notre FAQ : Comment connatre la largeur et la hauteur en pixels d'un texte ?
interface ... type TAlignementVertical=(alVTop,alVCenter,alVBottom); TAlignementHorizontal=(alHLeft,alHCenter,alHRight); TJustification=(JustLeft,JustCenter,JustRight); procedure DessineTexteMultiligne(AString: string; ACanvas:TCanvas;ARect: TRect; AlignementHorizontal:TAlignementHorizontal; AlignementVertical:TAlignementVertical; TextJustification:TJustification; WordWrap:boolean); ... implementation ///La valeur du paramtre AWidth dtermine si on effectue un retour // la ligne automatique ou non : // - avec AWidth=0 => pas de WordWrap // - avec AWidth<>0 => WorWrap sur la largeur donne Function TextSize2(Phrase: string; AWidth: integer; Police: TFont = nil): TPoint; var DC: HDC; X: Integer; Rect: TRect; C : TBitmap; WordWrapParams:integer; begin C := TBitmap.create; if police <> nil then C.canvas.Font := police; Rect.Left := 0; Rect.Top:=0; Rect.Right:=AWidth; Rect.Bottom:=0; DC := GetDC(0); C.Canvas.Handle := DC; WordWrapParams:=0; if AWidth<>0 then WordWrapParams:=DT_NOPREFIX or DT_WORDBREAK; DrawText(C.Canvas.Handle, PChar(Phrase), -1, Rect, WordWrapParams or (DT_EXPANDTABS or DT_CALCRECT)); C.Canvas.Handle := 0; ReleaseDC(0, DC); Result.X:=Rect.Right-Rect.Left; Result.Y:=Rect.Bottom-Rect.Top; C.Free; end; //Notre procedure d'affichage de texte multiligne function DessineTexteMultiligne(AString: string;ACanvas:TCanvas;ARect: TRect;
- 178 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

var AHeight,AWidth:integer; Rect,oldClipRect:TRect; ATop,ALeft,H,W:Integer; AText:string; JustificationDuTexte:Integer; APoint:TPoint; begin with ACanvas do begin Lock; AHeight:=ARect.Bottom-ARect.Top; AWidth:=ARect.Right-ARect.Left; //on calcule la taille du rectangle dans lequel va tenir le texte (sans WordWrap) APoint:=TextSize2(AString,0,ACanvas.Font); W:=APoint.X; H:=APoint.Y; //on calcule la position (Haut,Gauche) du rectangle dans lequel va tenir le texte //en fonction de l'alignement horizontal et vertical choisi ATop:=ARect.Top; ALeft:=ARect.Left; If WordWrap then //Si on veut un "WordWrap" (retour la ligne automatique) if W>(ARect.Right-ARect.Left) then //et que le texte dpasse du rectangle de destination begin //alors... W:=(ARect.Right-ARect.Left); //on fixe la largeur du texte H:=TextSize2(AString,W,ACanvas.Font).y; //on recalcule la hauteur du texte end; case AlignementVertical of alVBottom : ATop:=ARect.Bottom-H; alVCenter : ATop:=ARect.Top+((AHeight-H) div 2); alVTop : ATop:=ARect.Top; end; case AlignementHorizontal of alHLeft : ALeft:=ARect.Left; alHCenter: ALeft:=ARect.Left+(AWidth-W) div 2; alHRight : ALeft:=ARect.Right-W; end; //Fin du calcul du rectangle, on met le resultat dans Rect Rect:=Bounds(ALeft,ATop,W,H); //Si le texte est plus grand que notre zone, on prend cette prcaution (Clipping) IntersectRect(Rect,Rect,ARect); //On dtermine les paramtres de justification passer Windows case TextJustification of JustLeft : JustificationDuTexte:=DT_LEFT; JustCenter: JustificationDuTexte:=DT_CENTER; JustRight : JustificationDuTexte:=DT_RIGHT; end; //On dessine le texte DrawText(Handle,PChar(AString),-1,Rect,JustificationDuTexte or DT_NOPREFIX or DT_WORDBREAK ); result:=Rect; unlock; end; end;

AlignementHorizontal:TAlignementHorizontal; AlignementVertical:TAlignementVertical; TextJustification:TJustification; WordWrap:boolean):TRect;

Utilisation de la fonction DessineTexteMultiligne :


- 179 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Valeur renvoye : c'est un rectangle qui correspond aux limites de la zone du canvas dans laquelle le texte t effectivement dessin. AString: string; Chane de caractres dessiner. ACanvas: TCanvas; Canvas o le texte doit tre dessin ARect: TRect; Zone rectangulaire du Canvas dans laquelle le texte doit tre dessin AlignementHorizontal: TAlignementHorizontal; Alignement horizontal du texte dans la zone rectangulaire, trois options sont possibles : alHLeft: Place le texte gauche dans la zone rectangulaire. alHCenter: Centre le texte horizontalement dans la zone rectangulaire. alHRight: Place le texte droite dans la zone rectangulaire. AlignementVertical: TAlignementVertical; Alignement Vertical du texte dans la zone rectangulaire, trois options sont possibles : alVTop: Place le texte en haut de la zone rectangulaire. alVCenter: Centre le texte verticalement dans la zone rectangulaire. alVBottom: Place le texte en bas de la zone rectangulaire. TextJustification:TJustification : Justification du texte JustLeft: Justifie le texte gauche JustCenter: Justification centre du texte JustRight: Justifie le texte droite WordWrap: boolean; Si on passe true, le texte est dessin avec un retour la ligne automatique

Note concernant le choix du type des paramtres de la procdure : L'utilisation des types dj existants de Delphi est tout aussi valable, savoir : AlignementVertical:TTextLayout; AlignementHorizontal:TAlignement; TextJustification:TAlignment;

Ces types sont dclars dans les units StdCtrls et Classes.

Comment dterminer si une Police de caractres est TrueType ou non ?


Auteur : waskol Pour dterminer si une Police de caractre est TrueType ou non, il s'agit d'utiliser l'API Windows GetTextMetrics.
//units dclarer dans votre clause uses uses windows,Graphics; ... function IsTrueTypeFont(NomPolice : string):boolean; var Metrics: TTextMetric; ACanvas : TCanvas; DC:HDC; begin ACanvas:=TCanvas.Create; try DC:=GetDC(HWND_DESKTOP); ACanvas.Handle:=DC; ACanvas.Font.Name:=NomPolice ; GetTextMetrics(ACanvas.Handle, Metrics) ; ReleaseDC(0,DC);

- 180 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Result:=(Metrics.tmPitchAndFamily and TMPF_TRUETYPE) <> 0; finally ACanvas.free; end;

Comment supprimer les doublons d'une liste (TStrings) ?


Auteurs : Malatar - sjrd Ci-dessous, une mthode gnrique qui permet de supprimer les doublons dans une liste de type TStrings utilise dans les composants de type TListBox,TMemo, TComboBox, etc. On peut par ailleurs spcifier si l'on veut tenir compte de la casse ou pas. L'ide de base est de se servir de la proprit Duplicates de TStringList, qui, positionne dupIgnore, ignore simplement l'ajout d'une chane dj prsente dans la liste. Comme ce test tient compte de la valeur de la proprit CaseSensitive, celle-ci sera galement utilise. Ainsi, il suffit de crer une TStringList temporaire avec ces proprits spcifies correctement, puis d'y assigner le contenu de la liste de chanes traiter. Cela aura pour effet de n'y placer les chanes qu'en un exemplaire maximum. Ensuite, il suffit de refaire l'assignation dans l'autre sens. Dernire astuce, puisque le test rpt de la prsence ou non d'une chane dans la liste est coteux en temps, on veut pouvoir l'optimiser. Pour cela, on utiliser une THashedStringList plutt que TStringList, cette classe maintenant jour une table de hashage des chanes prsentes dans la liste. Le code rsultant est donc le suivant :
procedure SupprimerDoublons(Strings : TStrings; CaseSensitive : boolean = True); var SL : THashedStringList; begin SL := THashedStringList.Create; try SL.Duplicates := dupIgnore; SL.CaseSensitive := CaseSensitive; SL.Sorted := True; // Sinon Duplicates ne fait rien ! SL.Capacity := Strings.Capacity;// Allocation du tableau une fois pour toutes SL.AddStrings(Strings); Strings.BeginUpdate(); try Strings.Clear(); Strings.Capacity := SL.Capacity;// Allocation du tableau Strings.AddStrings(SL); finally Strings.EndUpdate(); end; SL.Free; end; end;

Remarque : l'usage de la classe THashedStringList requiert l'ajout de l'unit IniFiles dans les uses.

- 181 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Interface utilisateur > Gestion de messages Windows Comment accepter les fichiers lchs sur une fentre Delphi ?
Auteur : Pierre Castelain Le mcanisme permettant une fentre d'tre informe qu'un ou plusieurs fichiers ont t lchs sur elle est assez simple. Windows envoie un message de type WM_DROPFILES la fentre pour lui signifier cette action. Ensuite, libre elle de le traiter ou non. Le message envoy (TWMDropFiles) contient un handle qui va nous permettre de rcuprer le nombre et le nom des fichiers :
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls; type TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } procedure DroppedFiles(var msg : TWMDropFiles) ; message WM_DROPFILES; public { Public declarations } end; var Form1: TForm1; implementation uses ShellAPI; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin { Nous devons tout d'abord informer le systme que la fentre accepte le lcher de fichiers. } DragAcceptFiles(self.Handle, True); end; procedure TForm1.FormDestroy(Sender: TObject); begin { Le systme doit galement tre inform que la fentre n'accepte plus le lcher de fichiers.} DragAcceptFiles(self.Handle, false); end; procedure TForm1.DroppedFiles(var msg: TWMDropFiles); var i: integer; nombreDeFichiers: integer; nomDuFichier: string; tailleDuBuffer: integer; begin { Ce gestionnaire de message est appel lorsque l'utilisateur lche un ou plusieurs fichiers sur la fentre. Nous devons commencer par rcuprer le nombre de fichiers lchs avant de les numrer pour avoir leur nom.}

- 182 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

// Rcupration du nombre de fichiers dposs sur la fentre nombreDeFichiers:= DragQueryFile(msg.Drop, $FFFFFFFF, nil, 0); // Affichage des noms des fichiers dans un TListBox tailleDuBuffer:= MAX_PATH; SetLength(nomDuFichier, tailleDuBuffer); for i:= 0 to nombreDeFichiers - 1 do begin DragQueryFile(msg.Drop, i, PChar(nomDuFichier), tailleDuBuffer); ListBox1.Items.Add(nomDuFichier); end; end; end.

Comment rcuprer le texte du contrle situ sous le curseur ?


Auteur : Nono40 Pour recuprer le texte du contrle situ sous le curseur (de la souris), il faut procder en deux tapes : recuprer le handle du composant se trouvant en dessous de la souris envoyer un message ce composant pour recuprer son texte

La premire tape ncessite de retrouver le handle du composant se situant en dessous de la position du curseur de la souris. Pour cela, on utilise la fonction WindowFromPoint. Pour raliser la seconde tape, il est ncessaire de connatre l'avance la taille du texte afin allouer la mmoire ncessaire pour le stocker. Pour viter d'avoir des scintillements, nous utilisons un timer pour mettre jour le contenu de Edit1 (Edit1 contient le texte du contrle).
procedure TForm1.Timer1Timer(Sender: TObject); var Hand : THandle; c : PChar ; L : Cardinal; begin Hand:=WindowFRomPoint(Mouse.CursorPos); //handle du composant L := SendMessage(HAND,WM_GETTEXTLENGTH,0,0);//la longueur du texte If L<>0 Then Begin GetMem(C,L+1); //on alloue la mmoire. // L+1 parce que les chanes sont zro terminal, il faut prvoir la place du #0 Try SendMessage(HAND,WM_GETTEXT,L+1,Integer(C));//on recupre le texte Edit1.Text:=c; Finally FreeMem(c); End; End Else Edit1.Text:=''; end;

lien :

Qu'est-ce qu'un HANDLE ?

- 183 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

lien :

Lien MSDN : message WM_GETTEXT

Comment rendre transparent un contrle ?


Auteurs : lil_jam63 - sjrd Si votre contrle possde une proprit Transparent, il suffit de positionner celle-ci True. Dans le cas contraire, vous devez driver un nouveau composant partir de celui-ci, surcharger la mthode CreateParams et intercepter le message WM_ERASEBKGND comme ci-dessous :
type TConteneur = class(TScrollBox) private { Dclarations prives } public { Dclarations publiques } constructor Create(AOwner: TComponent); override; procedure CreateParams(var Params: TCreateParams); override; procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND; end; procedure TConteneur.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT; end; procedure TConteneur.WMEraseBkgnd(var Msg: TWMEraseBkgnd); begin SetBkMode(Msg.DC, TRANSPARENT); Msg.Result := 1; end;

Comment interdire la fermeture d'une fiche ?


Auteur : Pascal Jankowski On peut interdire la fermeture d'une fiche l'cran en utilisant le gestionnaire de messages de Windows et plus particulirement en interceptant le Message WM_CLOSE de la faon suivante:
TForm1 = class(TForm) private { Dclarations prives } procedure WMWindowClose(var Message: TWMWindowPosMsg); message WM_CLOSE; public { Dclarations publiques } end; implementation procedure TForm1.WMWindowClose(var Message: TWMWindowPosMsg); begin showMessage('Cette fiche ne peut tre referme'); end;

Note 1 : Pour les gestionnaires de messages des contrles VCL, la constante entire doit tre l'un des numros d'identification de message Windows dfinis, avec les types enregistrement correspondants, dans l'unit Messages. Note 2 : Il est possible de raliser le mme effet en dfinissant le code de l'vnement OnCloseQuery de la fiche et de la faon suivante :

- 184 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin showMessage('Cette fiche ne peut tre referme'); CanClose := false; end;

Comment interdire le dplacement d'une fiche ?


Auteur : Pascal Jankowski On peut interdire le dplacement d'une fiche l'cran en utilisant le gestionnaire de messages de Windows et plus particulirement en interceptant le Message WM_MOVE de la faon suivante:
type TForm1 = class(TForm) private { Dclarations prives } procedure WMWindowMoving(var Message: TWMWindowPosMsg); message WM_MOVE; public end; implementation {$R *.DFM} procedure TForm1.WMWindowMoving(var Message: TWMWindowPosMsg); begin if not Visible then Exit; with Message do begin WindowPos.X:= Self.Left; WindowPos.Y:= Self.Top; Result:=0; end; end; end;

Note 1 : Pour les gestionnaires de messages des contrles VCL, la constante entire doit tre l'un des numros d'identification de message Windows dfinis, avec les types enregistrement correspondants, dans l'unit Messages. Note 2 : Dans l'exemple ci-dessus, nous interdisons tout dplacement de la fiche l'cran. Par contre si vous ne dsirez que limiter les dplacements et les dimentionnements de la fiche nous vous renvoyons vers le code suivant, dvelopp par Nono40.

- 185 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Langage Qu'est-ce que le mot cl Self et comment l'utiliser ?


Auteurs : Laurent Dardenne - Pedro Schmatiquement la question qui suis-je ?, le mot cl Self rpond moi-mme en renvoyant la rfrence de l'instance en cours d'utilisation au sein d'une mthode de sa classe. Self permet donc de connatre l'instance en cours et dans certains cas de lever toute ambiguit. Par exemple ici :
procedure TObject.Free; begin if Self <> nil then Destroy; end;

on souhaite savoir si l'objet en cours est instanci ou pas (nil) avant d'appeler le destructeur. Self est aussi une rfrence sur une classe et peut donc ne pas tre affecte (MonObjet:=Nil). Cette mthode tant statique son appel ne pose pas de problme dans ce cas. Et l :
with TPaintBox(Sender).Canvas.Brush do begin Color := Self.Color;

il y a une ambiguit du la prsence de la proprit color commune l'instance en cours d'utilisation et un objet imbriqu (Canvas.Brush). Self permet ici de savoir exactement de quelle proprit on parle. Dans le cas d'une mthode de classe l'utilisation de Self une signification diffrente, il s'agit d'une variable de type rfrence de classe contenant la classe effective de l'objet. Schmatiquement dans ce cas le mot cl Self rpond la question De quelle classe suis-je ? en rpondant De la classe TMaclasse.

Comment accder aux mthodes "Protected" d'une classe ?


Auteur : waskol Supposons que vous souhaitez, pour telle ou telle raison utiliser une Mthode protge d'un Objet particulier que l'on appellera MaSomme (cel peut tre un composant visuel ou non par exemple). Supposons que notre objet ai t dfini comme suit, dans une unit part :
unit UnitSomme; interface type TSomme = class private FA,FB: Integer; FResultat: Integer; procedure SetA(const Value: Integer); procedure SetB(const Value: Integer); protected //La fonction que l'on souhaiterais utiliser... function Somme(A,B:Integer):Integer; public
- 186 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

constructor Create; destructor Destroy; property A:Integer read FA write SetA; property B:Integer read FB write SetB; property Resultat:Integer read FResultat; end; ... implementation ... function TSomme.Somme(A,B:Integer):Integer; begin result:=A+B; end; ... end.

Alors, habituellement, vous l'utiliseriez comme ceci, par exemple :


var MaSomme:TSomme; ... MaSomme.A:=5; MaSomme.B:=9; Result:=MaSomme.Resultat; ...

//

Peut tre auriez-vous prfr utiliser la fonction Factorielle de l'Objet MaFactorielle directement dans votre code, mais cette dernire tant protge (c'est dire dclare dans le bloc protected de la classe TFactorielle), l'accs direct la mthode de l'objet vous est interdit selon les lois de la programmation oriente objet. La solution : L'ide est la suivante : Crer une classe drive de la classe TFactorielle, que l'on appellera par exemple TPublicFactorielle , ceci dans l'unit mme ou l'on souhaite utiliser la mthode. de Transtyper notre objet MaFactorielle comme suit :
TPublicFactorielle(MaFactorielle)

afin d'accder la fonction rendue visible. De cette faon, nous pourrons contourner la protection objet sans pour autant enfreindre les lois de la POO. Voici l'unit d'une fiche frachement cre dans laquelle nous avons ajout le code ad hoc :
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, unitFactorielle; type //Notre classe drive... //A travers sa dfinitions, toutes les mthodes protges deviennent //visibles pour tout le code crit dans notre unit unit1 TPublicSomme=class(TSomme); Dialogs,

- 187 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

TForm1 = class(TForm) private { Dclarations prives } public { Dclarations publiques } procedure Calcule; end; ... implementation ... procedure TForm1.Calcule; var MaSOmme:TSomme; begin ... //On transtype MaSomme afin d'utiliser la mthode rendu visible Result:=TPublicSomme(MaSomme).Somme(A,B); .... end;

Applications : Dans la FAQ/Sources, nous retrouverons les astuces suivantes qui exploitent ce procd, ou en drivent : lien : lien : lien : Comment avoir des couleurs dans un TMenuItem ? Comment supprimer une ligne ou une colonne dans un TStringGrid ? Comment Supprimer une ligne ou une colonne dans un TDrawGrid ?

Comment accder aux variables prives d'une classe ?


Auteur : waskol Un exemple concret : On souhaite, par exemple, accder depuis le code d'une fiche la variable prive FImageIndex d'un TMenuItem , (n'importe quelle variable prive de n'importe quel objet de n'importe quelle classe aurait pu faire l'affaire). Solution : Tout rside dans les possibilits du transtypage, et du fait que les types classes ne sont rien d'autre que des types de pointeurs particuliers. Tout d'abord, Il faut dclarer la classe TMenuItemPublic de telle faon quelle drive exactement du mme objet que TMenuItem, en l'occurence de TComponent. Vous remarquerez, que l'on y retrouve exactement les mmes variables et exactement dans le mme ordre que dans la classe TMenuItem, la diffrence que ces variables sont toutes dclares publiques. Ainsi, on obtient une classe ayant la mme structure en mmoire que la classe TMenuItem, ce qui nous autorise alors transtyper un TMenuItem en TMenuItemPublic et nous permet alors d'accder toutes les variables prives de TMenuItem comme si elles avaient t dclares Public !
type TMenuItemPublic=class(TComponent) public FCaption: string; FHandle: HMENU; FChecked: Boolean; FEnabled: Boolean; FDefault: Boolean; FAutoHotkeys: TMenuItemAutoFlag; FAutoLineReduction: TMenuItemAutoFlag; FRadioItem: Boolean; FVisible: Boolean; FGroupIndex: Byte;

- 188 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

FImageIndex: TImageIndex; FActionLink: TMenuActionLink; FBreak: TMenuBreak; FBitmap: TBitmap; FCommand: Word; FHelpContext: THelpContext; FHint: string; FItems: TList; FShortCut: TShortCut; FParent: TMenuItem; FMerged: TMenuItem; FMergedWith: TMenuItem; FMenu: TMenu; FStreamedRebuild: Boolean; FImageChangeLink: TChangeLink; FSubMenuImages: TCustomImageList; FOnChange: TMenuChangeEvent; FOnClick: TNotifyEvent; FOnDrawItem: TMenuDrawItemEvent; FOnAdvancedDrawItem: TAdvancedMenuDrawItemEvent; FOnMeasureItem: TMenuMeasureItemEvent; FAutoCheck: Boolean; end;

La variable qui nous intresse en particulier tant FImageIndex, le problme est rsolu comme ceci :
var UnMenuItem:TMenuItem; begin .... TMenuItemPublic(UnMenuItem).FImageIndex:=NewIndex; .... end;

Rubriques connexes de la FAQ : lien : lien : lien : Quid des pointeurs Comment accder aux mthodes "Protected" d'une classe ? Comment animer le glyph d'un TMenuItem en fonction de son tat (odSelected, etc...) ?

Comment affecter Nil lors d'une exception dans un constructeur ?


Auteurs : Laurent Dardenne - sjrd Certains constructeurs de classe peuvent lors de leur excution gnrer une exception. Dans ce cas son destructeur est appel automatiquement. Cette situation tant gre le plus souvent par le bloc suivant :
Var MonObjet : TUneClasse; ParametreUn : String; begin Try MonObjet:=TUneClasse.Create(ParametreUn); ...Traitement... Finally FreeAndNil(MonObjet); end; end;

- 189 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Ici malheureusement l'instruction FreeAndNil du bloc Finally peut provoquer une violation d'accs (AV) tant donn que le contenu de la variable MonObjet est indtermin. La modification de l'instance concerne dans le destructeur de sa classe n'est pas possible. Pour viter cette possible violation d'accs il faut tout simplement initialiser la variable NIL AVANT l'appel du constructeur :
Var MonObjet : TUneClasse; ParametreUn : String; begin Try MonObjet:=Nil; MonObjet:=TUneClasse.Create(ParametreUn); ...Traitement... finally FreeAndNil(MonObjet); end; end;

soit utiliser une mthode de classe se chargeant d'appeler le constructeur et vitera la duplication du bloc except :
Class procedure TUneClasse.CreateAndNilIfExcept(Var AObjet:TUneClasse; ParametreUn:String); begin try AObjet:=TUneClasse.Create(ParametreUn); except On Exception do begin AObjet:=Nil; //Evite la violation d'accs Raise; // On redclenche l'exception end; end; end;

Le code initial devenant :


Var MonObjet : TUneClasse; ParametreUn : String; begin Try TUneClasse.CreateAndNilIfExcept(MonObjet,ParametreUn); ...Traitement... finally FreeAndNil(MonObjet); end; end;

- 190 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Dans ce second cas, la syntaxe with NomDeClasse.Create(...) do est donc viter si vous souhaitez grer cette situation.

Un tableau de procdures ? Comment et pourquoi ?


Auteur : waskol L'utilisation de l'instruction case ... of en Delphi, quoique pratique dans la plupart des cas de programmation peut parfois se rvler inapproprie lorsque le nombre de branchements devient trop grand : Lourdeur du code Vitesse d'excution dsastreuse.

Ce cas peut parfois tre rencontr lorsque l'on crit par exemple : un mulateur : on effectue une action particulire diffrente pour chaque instruction du microprocesseur. Dans ce cas, la vitesse d'excution est primordiale. un jeu d'aventure : - Chaque case d'une carte peut tre un type de rencontre diffrente. - Chaque objet possd par le hros possde un effet diffrent lorsqu'il est utilis, chaque arme une attaque particulire, chaque sortilge dclenche un effet particulier. Dans ce cas c'est la clart du code qui permettra le design d'un univers riche en contenu et rebondissements.

Par exemple, ce type de code...


procedure TForm1.UneActionADeterminer(Parametre:integer); begin ... case Parametre of 0:MaProcedure0; 1:MaProcedure1; 2:MaProcedure2; 3:MaProcedure3; 4:MaProcedure4; 5:MaProcedure5; ..... 203:MaProcedure203; //etc... end; ... end;

...gagnera en clart et en clrit si nous pouvions le transformer en :


procedure TForm1.UneActionADeterminer(Parametre:integer); begin ... MesProcedures[Parametre]; ... end;

Nous venons de prsenter ici le cas d'un tableau de procdures sans paramtre. Nous allons voir qu'il est tout aussi possible d'utiliser un tableau de fonctions ou bien encore d'utiliser des paramtres.
- 191 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Pour aboutir ce rsultat, nous devons : 1) Dfinir un type de variable pouvant contenir un type gnrique de procdure ou de fonction avec ou sans paramtre (Variables procdurales) : Il s'agit de dfinir ici un type de variable un peu particulire destin recevoir une procdure ou une fonction. Ce genre de variable s'appelle une variable procdurale. La syntaxe pour dclarer ce type de variable est la suivante :
<Nom du Type> = <procedure ou function>[(<paramtres>)[:<type de resultat>]] [of object;]

(Nota : "of object" signifie que nos procdures ou fonctions seront dfinies dans une classe comme TForm1 par exemple : elles font partie d'un objet.) Ainsi aurons nous ce genre de dclarations pour des : Variables de type procedure : avec paramtres (c'est ce genre de dclaration qui est utilis pour dfinir des variables de type vnement comme TNotifyEvent, TDrawItemEvent, etc..) :
type TProcedureAvecParametres=procedure(a,b:integer;s:string) of object;

sans paramtre :
type TProcedureSimple=procedure of object;

Variables de type function : avec paramtres :


type TOperationArithmetique=function(a,b:real):real of object;

sans paramtre :
type TTraiterUnCodeErreur=function:boolean of object;

2) Ecrire nos procdures ou fonctions : L'exemple suivant concerne des fonctions avec paramtres, dfinies dans une classe (notez le "of object")
type TOperationArithmetique=function(a,b:real):real of object; TForm1 = class(TForm) ... private { Dclarations prives } public { Dclarations publiques } ... TableauDeFonctions:array[0..3] of TOperationArithmetique; function Addition(a,b:real):real; function Multiplication(a,b:real):real; function Division(a,b:real):real; function Soustraction(a,b:real):real;
- 192 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

... end; ... implementation ... function TForm1.Addition(a,b:real):real; begin result:=a+b; end; function TForm1.Multiplication(a,b:real):real; begin result:=a*b; end;

Les fonctions sont des fonctions globales n'appartenant pas une classe (disparition du "of object") :
type TOperationArithmetique=function(a,b:real):real; TForm1 = class(TForm) ... private { Dclarations prives } public { Dclarations publiques } ... TableauDeFonctions:array[0..3] of TOperationArithmetique; ... end; function Addition(a,b:real):real; function Multiplication(a,b:real):real; function Division(a,b:real):real; function Soustraction(a,b:real):real; ... implementation ... function Addition(a,b:real):real; begin result:=a+b; end; function Multiplication(a,b:real):real; begin result:=a*b; end;

3) ...Assigner une procdure chaque lment du tableau : Dans cette partie de code, nous allons simplement remplir notre tableau aussi simplement que nous le ferions avec des variables simples comme des entiers ou des chanes de caractres :
procedure TForm1.InitialisationDuTableau begin TableauDeFonctions[0]:=Addition; TableauDeFonctions[1]:=Multiplication; ... //etc... end;

4) Utiliser notre tableau :


- 193 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Avec des procdures sans paramtre :


procedure TForm1.UneActionADeterminer(Parametre:integer); begin //si Parametre est compris entre la borne infrieure et la borne suprieure du tableau de procdures if ((Parametre>=low(TableauDeProcedures)) and (Parametre<=high(TableauDeProcedures)) then //si l'entre du tableau contient effectivement quelque chose (une procdure) if Assigned(TableauDeProcedures[Parametre]) then //excution de la procdure ad hoc TableauDeProcedures[Parametre]; end;

Avec des fonctions acceptant des paramtres :


procedure TForm1.Calcule(OperationChoisie:integer;NombreA,NombreB:real;var resultat:real); begin if ((OperationChoisie>=0) and (OperationChoisie<=3)) then if Assigned(TableauDeFonctions[OperationChoisie]) then resultat:=TableauDeFonctions[OperationChoisie](NombreA,NombreB); end;

Un exemple complet : Dans un nouveau projet, nous avons plac un TButton sur notre fiche.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type //Dfinition d'un type de procedure simple TProcedureAffichage=procedure of object; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Dclarations prives } public { Dclarations publiques } TableauDeProcedures:array[0..2] of TProcedureAffichage; procedure AffichageShowMessage; procedure AffichageDansLaFiche; procedure AffichageBarreDeTitre; end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.AffichageShowMessage; begin showmessage('Procedure n1');

- 194 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end; procedure TForm1.AffichageDansLaFiche; begin canvas.font.Color:=random($ffffff); canvas.TextOut(10,10,'Procdure n2'); end; procedure TForm1.AffichageBarreDeTitre; var i:integer; oldcaption:string; begin oldcaption:=Caption; for i:=0 to 9 do begin caption:='Procedure n3'; sleep(200); caption:=''; sleep(100); end; caption:=oldcaption; end; //Evnement OnClick du Bouton procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin //choix alatoire d'une procedure d'affichage i:=Random(3); if assigned(TableauDeProcedures<i>) then TableauDeProcedures<i>; end; //Evnement OnCreate de la fiche procedure TForm1.FormCreate(Sender: TObject); begin Randomize; TableauDeProcedures[0]:=AffichageShowMessage; TableauDeProcedures[1]:=AffichageDansLaFiche; TableauDeProcedures[2]:=AffichageBarreDeTitre; end; end.

Prcision sur les variables procdurales : pointeurs ou variables ? C'est un grand dbat qui dpasse le cadre et l'objectif de cette simple QR. En effet, il est tout de mme tonnant de constater que bien que ce type se gre comme une variable classique, c'est un type de variable laquelle s'applique le @, le nil et le Assigned() des pointeurs. Si vous souhaitez approfondir le sujet, nous vous suggrons la lecture de la documentation de Delphi aux rubriques suivantes : Assigned,fonction Types procdure Types procdure dans les instructions et les expressions

Comment passer un nombre variable de paramtres une procdure externe ?


Auteur : waskol Quand vous importez une fonction en langage C qui prend un nombre variable de paramtres, utilisez la directive varargs. Par exemple :

- 195 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

function printf(Format: PChar): Integer; cdecl; varargs;

La directive varargs fonctionne uniquement avec des routines externes et uniquement avec la convention d'appel cdecl. Vous trouverez des informations complmentaires dans l'aide de Delphi la rubrique nomme : Dclarations externes

Comment retrouver le GUID d'une interface ?


Auteur : Laurent Dardenne On souhaite parfois connatre le GUID d'une interface Delphi malheureusement il n'existe pas de mthode dans la VCL pour ce faire. Heureusement les RTTI nous offrent une solution au travers de l'appel la fonction Typeinfo.
//Programme de type Console uses Typinfo; var DonneeDeType : PTypeData; begin //Rcupre les information de RTTI d'une interface DonneeDeType := GetTypeData(typeinfo(ISWbemObject)); //Vrifie si l'interface possde bien un GUID if ifHasGuid in DonneeDeType^.IntfFlags then Writeln(GUIDToString(DonneeDeType^.Guid)); Writeln(DonneeDeType^.IntfUnit); // Nom de l'unit o est dclare l'interface readln; end.

L'information de type existera pour un type donn, ici une interface de WMI, si un appel TypeInfo est fait pour lui, ou si le type est mentionn dans la section published d'une classe qui est rfrenc dans le code du programme. La seule diffrence rside dans le fait que l'appel est effectu la compilation et que l'on doit lui passer un nom de type et non pas un nom d'instance. Pour une classe l'appel de GetTypeData(TMonObjet.ClassInfo) est identique GetTypeData(TypeInfo(TMonObjet)). lien : Introduction aux RTTI sous Delphi

Comment vider le buffer du clavier ?


Auteur : waskol Pour vider le buffer du clavier on utilise l'API PeekMessage qui opre sur la file d'attente des messages du thread courant.
procedure VideBufferClavier; var Msg: TMsg; begin while PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE or PM_NOYIELD) do;
- 196 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Le code prcdent recherche les messages claviers et les supprime (PM_REMOVE) du premier (WM_KEYFIRST) jusqu'au dernier (WM_KEYLAST). lien : Lien MSDN : fonction PeekMessage

Comment calculer la cardinalit d'un ensemble ou trouver le nombre de bits "allums" dans une variable ?
Auteur : waskol Voici une fonction permettant d'obtenir le nombre de bits "allums" dans le contenu d'une variable de n'importe quel type.
function card(var UneVariable; size: integer): integer; const // table des bits actifs dans un groupe de 4 bits (exemple : 9=8+1-->2 bits) NBits: array[0..15] of integer=( 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4); var t: TbyteArray absolute UneVariable; //table pointant sur le premier octet de la variable //dont on souhaite connatre le nombre de //bits allums j: integer; PoidsFort:byte; PoidsFaible:byte; begin result:=0; //Pour chaque octet du tableau for j := 0 to size - 1 do begin //chaque octet est coup en deux groupe de 4 bits PoidsFort:=t[j] shr 4 PoidsFaible:=t[j] and $F; //On dnombre pour chaque groupe de 4 bits le nombre de bits allums inc(result, NBits[PoidsFort] and $F] + NBits[PoidsFaible]); end; end;

L'exemple d'utilisation le plus vident est de connatre la cardinalit d'un ensemble :


var MonEnsemble:Set of Byte; NomBreDElements:integer; begin ... MonEnsemble:=[128,25,96,36,200]; //on passse notre fonction notre variable //et aussi sa taille en octets, obtenue grace la fonction SizeOf() ) NomBreDElements:=Card(MonEnsemble,SizeOf(MonEnsemble)); ShowMessage(IntToStr(NomBreDElements)); //affiche "5" ... end;

Mais n'importe qu'elle variable peut faire l'affaire (ce qui n'a que peu d'intrt si ce n'est pour un entier) :
var UnEntier:integer; UnBoolean:Boolean; UnReel:double; UneClasse:TForm; UneChaine:string;

- 197 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

UnTableau:array[] of ... //QuelqueChose begin ... NomBreDElements:=Card(UnEntier,SizeOf(UnEntier)); NomBreDElements:=Card(UnBoolean,SizeOf(UnBoolean)); NomBreDElements:=Card(UnReel,SizeOf(UnReel)); NomBreDElements:=Card(UneClasse,SizeOf(UneClasse)); NomBreDElements:=Card(UneChaine,SizeOf(UneChaine)); NomBreDElements:=Card(UnTableau:,SizeOf(UnTableau)); ... end;

Exemple concret d'utilisation : Cet outil mathmatique peut tre intressant pour l'laboration d'un jeu de cartes (par exemple), qui permet de dterminer facilement le nombre de cartes restantes dans la main d'un joueur, la pioche, etc... A propos de la directive absolute : cette directive est un relicat du Turbo Pascal, elle permet de crer une nouvelle variable place la mme adresse qu'une variable existante. Pour cela, il s'agit de placer le mot absolute aprs le nom de type, dans la dclaration de la nouvelle variable, en le faisant suivre du nom d'une variable existante (dclare prcdemment). On peut voir cette directive comme un transtypage de variable.

Comment crer une fonction pouvant renvoyer un rsultat de type quelconque ?


Auteurs : Laurent Dardenne - waskol On peut souhaiter quelquefois qu'un traitement au sein d'une mme fonction puissent renvoyer un type de donne diffrents selon les cas. Vous trouverez une solution dans le tutoriel cit. lien : Comment passer un nombre variable de paramtres une procdure ?

Comment passer un nombre variable de paramtres une procdure ?


Auteurs : Laurent Dardenne - waskol Quelques fois, on peut tre amen manipuler des DLL crites en C ou C++ utilisant un nombre variable de paramtres. Dans ce cas, la solution se trouve ici. En revanche, raliser en natif une mthode utilisant un nombre variable de paramtres ncessite une autre approche. Dans un premier temps, on pourrait penser qu'un tableau de pointeurs suffirait mais au moins 2 questions se posent, savoir comment : connatre le nombre de paramtres dans un tableau de pointeurs ? retrouver le type de chaque paramtre ?

- 198 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Les traitements mettre en place seraient assez dlicats. Le langage Delphi nous proposant le type Variant, pouvant encapsuler n'importe quel type Delphi, voyons comment procder sans trop d'efforts dans le tutoriel cit ci-dessous. lien : Comment passer un nombre variable de paramtres une procdure ?

Comment crer un GUID dynamiquement?


Auteur : Pascal Jankowski Il existe dans Delphi un raccourci pour crer un GUID lors de l'criture du code : Ctrl+Shift+G... Mais comment faire lorsque l'on veut crer ce GUID dynamiquement pendant l'excution d'un programme? Il suffit d'utiliser la fonction CoCreateGuid. On peut donc crer une fonction qui permet de retourner un GUID facilement:
function CreateGuid: string; var GUID: TGUID; begin Result := ''; if CoCreateGuid(GUID) = S_OK then Result := GUIDToString(GUID); end;

Ne pas oublier de rajouter les units comObj et ActiveX dans la clause uses. Note : A partir de BDS 2006 l'unit comObj propose une fonction identique :
function CreateClassID: string;

et l'unit Sysutils propose la fonction suivante renvoyant un nouveau TGUID :


function CreateGUID(out Guid: TGUID): HResult;

- 199 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Langage > Types de donnes Quid des pointeurs


Auteur : waskol La mmoire : Tout d'abord, la mmoire de l'ordinateur peut tre reprsente comme un nombre trs important de cases d'une certaine taille que l'on appelle un octet. Ces cases, pour que l'ordinateur puisse y accder, sont repres par un numro : leur Adresse. La mmoire d'un ordinateur est donc en quelque sorte un grand tableau de cases numrotes, ces cases contenant chacune un octet. Les variables : Le tableau qu'est la mmoire est rempli par des donnes qui, parfois, ont besoin d'un octet, de deux, de quatre ou plus pour pouvoir tre reprsentes : ces donnes sont appeles variables. Elles peuvent tre des caractres, des nombres... Imaginons une variable dclare dans un code delphi :
var UnNombre: Cardinal;

UnNombre, qui a besoin de 32 bits pour tre stock, va donc utiliser en mmoire quatre cases contigus (quatre octets). Par exemple les cases n205, 206, 207 et 208. Pour obtenir le numro de la case (donc l'Adresse) dans lequel elle se trouve il existe deux possibilits : @UnNombre ou bien Addr(UnNombre) L'adresse de UnNombre sera le numro de la premire case qu'il occupe, c'est--dire 205. Exemple :
var UneAdresse: UnNombre: begin UneAdresse := //ou bien UneAdresse := end; Pointer; Cardinal; @UnNombre; Addr(UnNombre);

Donc, @X signifie Donne-moi l'adresse de X. Les Pointeurs Premirement, un pointeur est une variable, un peu similaire un entier (c'est criant en C++, mais pas en Delphi). C'est une variable, sur 32 bits (4 octets), qui contient l'adresse d'une case de la mmoire. Comme c'est similaire un nombre entier, on peut tout fait imaginer (pour l'instant, on ne fait qu'imaginer !) des additions et des soustractions et mme afficher son contenu (a marche trs bien en c++, mais pas en Delphi qui "protge" ce genre de choses pour viter des "accidents"). On dit qu'un pointeur, qui contient en gnral l'adresse d'une autre variable, "pointe" sur cette autre variable. Quand la valeur de l'adresse contenue dans le pointeur est gale zro, alors a se traduit en Delphi par UnPointeur = nil. Maintenant, il peut tre intressant, connaissant une adresse, de pouvoir accder son contenu. En supposant que UnPointeur = 205, UnPointeur^ nous donnera le contenu de ce qui se trouve la case n205, c'est--dire la valeur de UnNombre. Donc, X^ signifie Donne-moi la valeur de ce qui se trouve en X. Variables avances : Normalement, une variable d'un certain type (un byte par exemple, qui prend un octet, donc une case), ne peut cohabiter avec une variable d'un autre type (un char, qui tient lui aussi sur un octet). Cela peut pourtant tre pratique pour transformer, sans faire de calcul, une variable UnByte contenant 65, directement en caractre UnChar qui vaudrait 'A'.
- 200 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Delphi le permet, tout comme le C++ le permet avec son instruction Union. La mthode, mal explique dans l'aide Delphi, est de dclarer un enregistrement avec une partie variable, comme ceci :
Type TSuperVariable = Record Case b: Boolean of True: (UnByte: Byte); False: (UneChar: Char); end;

Ensuite, on peut travailler "avec la mmoire" comme suit :


var SuperVariable: TSuperVariable UnMessage: String; begin SuperVariable.AByte := 65; //est quivalent //SuperVariable.AChar := 'A'; UnMessage := 'Valeur de AByte au format caractre : ' + SuperVariable.AChar); ShowMessage(UnMessage); end;

Rien n'empche de faire des SuperVariables plus complexes, comme ceci :


Type TSuperVariable1 = Record Case i: SmallInt of 1: (UnPetitReel: Single); 2: (UnEntierSigne: Integer); 3: (UnEntierNonSigne: Cardinal); 4: (UnPointeur: Pointer); 5: (UnPointeurSurUnEntier: ^Integer); end;

On remarquera juste, que les cinq types (Single, Integer, Cardinal, Pointer, ^Integer), proposent tous des variables de 4 octets. De l, les possibilits sont multiples (et dangereuses, donc attention...). Addition sur des Pointeurs : Pour ce qui est des additions et soustractions avec des pointeurs, c'est possible en dclarant un enregistrement avec une partie variable :
Type TAccesMemoire = Record Case i: Smallint of 1: (UnPointeur: Pointer); 2: (UneAdresse: Cardinal); 3: (UnPointeurSurCaractere: ^Char); 4: (UnPointeurSurByte: ^Byte); end; var Acces: TAccesMemoire; UneChaine: String; i: Integer; UnMessageBizarre: String; begin //Initialisation des donnes

- 201 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

UneChaine := 'bonjour les Delphinautes, comment a va ? :)'; i := 66; UnMessageBizarre := ''; //on se place, sur le premier caractre de la chane : Acces.UnPointeurSurCharactre := @UneChaine[1]; //on remplace le b minuscule par l'quivalent ASCII de ce qu'il y a dans i; Acces.UnPointeurSurByte^ := i; //Affichage ShowMessage(UneChaine); //deux pas en avant, un pas en arrire... (5 fois) for i := 1 to 5 do begin //2 pas en avant Acces.UneAdresse := Acces.UneAdresse + 2; //on rcupre le caractre point UnMessageBizarre := UnMessageBizarre + Acces.UnPointeurSurCaractere^; //1 pas en arrire Acces.UneAdresse := Acces.UneAdresse-1; //on rcupre le caractre point UnMessageBizarre := UnMessageBizarre + Acces.UnPointeurSurCaractere^; end; ShowMessage(UnMessageBizarre); end;

lien :

Qu'est-ce qu'un pointeur et comment l'utiliser ?

Comment obtenir l'adresse d'un objet ?


Auteur : Smortex L'oprateur @ permet d'obtenir l'adresse de l'objet. Il suffit de transtyper l'adresse en Cardinal pour afficher le rsultat en hexadcimal.
IntToHex(Cardinal(@MonObjet),6);

Comment raliser un IF immdiat ?


Auteur : ptitbob Un If immdiat permet de raliser une affectation conditionnelle. Il s'agit suivant la valeur de vrit d'une condition (vraie ou fausse) d'affecter une valeur une variable donne. Ceci peut se faire soit travers une construction if...then...else (3 instructions) ou avec l'oprateur ?..: pour ceux qui connaissent le langage C. A partir de Delphi 6, nous pouvons utiliser l'instruction IfThen dont une signature est :
function IfThen(AValue: Boolean; const ATrue: Integer; const AFalse: Integer = 0): Integer; overload;

surcharge respectivement pour les types Int64, Double et String et qui renvoie, selon la condition, une des deux valeurs spcifies. Consultez l'aide de Delphi pour avoir plus de dtails. Pour les versions antrieures la version 6, nous vous proposons le code suivant qui permet d'implmenter un quivalent de IfThen.

- 202 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Interface { Immediate If } { IIF renvoyant un entier } function IIF(ACondition: boolean; { IIF renvoyant un extended } function IIF(ACondition: boolean; { IIF renvoyant une string } function IIF(ACondition: boolean; { IIF renvoyant un objet } function IIF(ACondition: boolean;

ATruePart, AFalsePart: integer): integer; overload; ATruePart, AFalsePart: Extended): Extended; overload; ATruePart, AFalsePart: string): string; overload; ATruePart, AFalsePart: TObject): TObject; overload;

Implmentation function IIF(ACondition: boolean; ATruePart, AFalsePart: integer): integer; { Immediate IF pour les entiers } begin if ACondition then Result := ATruePart else Result := AFalsePart; end; function IIF(ACondition: boolean; ATruePart, AFalsePart: Extended): Extended; { Immediate IF pour les flottant } begin if ACondition then Result := ATruePart else Result := AFalsePart; end; function IIF(ACondition: boolean; ATruePart, AFalsePart: string): string; { Immediate IF pour les chanes } begin if ACondition then Result := ATruePart else Result := AFalsePart; end; function IIF(ACondition: boolean; ATruePart, AFalsePart: TObject): TObject; { Immediate IF pour les objets } begin if ACondition then Result := ATruePart else Result := AFalsePart; end;

Utilisation des fonctions:


procedure TMyObject.TestIIF; var idx: integer; MyString: String; begin idx := 10; { Par exemple } MyString := IIF(idx=0,'Zero','Diffrent de Zero'); end;

est quivalent
procedure TMyObject.TestIIF; var idx: integer; MyString: String; begin idx := 10; { Par exemple } if idx=0 then
- 203 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

MyString = 'Zero' else MyString = 'Diffrent de Zro';

Cela permet de grer les conditions simples d'affectation de variables.

Comment utiliser les exceptions ?


Auteur : Laurent Dardenne Vous trouverez, sur l'URL suivante, un tutorial sur la gestion des exceptions : http://fbeaulieu.developpez.com/guide/?page=page_19 lien : lien : Les exceptions et la gestion des erreurs sous DELPHI La gestion des exceptions

Comment dsactiver l'affichage des exceptions dans Delphi ?


Auteur : Laurent Dardenne Dans le menu Outils|Options du dbogueur, slectionnez l'onglet Exceptions du langage, puis dans la liste Type d'exceptions ignorer dsactiver la ou les exceptions que vous souhaitez ignorer lors d'une phase de dbug. Dcochez la case Arrter sur les exceptions Delphi si vous voulez que le dbogueur interrompe l'excution de votre programme lorsque celui-ci dclenche une exception Delphi

Qu'est-ce qu'un pointeur et comment l'utiliser ?


Auteur : Laurent Dardenne La notion de base de pointeur est assez simple : il s'agit d'une variable qui stocke l'emplacement en mmoire d'un autre lment (qui est le plus souvent une variable). Tout ce qu'il faut savoir sur le sujet est dcrit ici http://fbeaulieu.developpez.com/guide/?page=page_11 lien : http://fbeaulieu.developpez.com/guide/?page=page_11

Comment optimiser le redimensionnement d'un tableau ?


Auteur : reisubar Lorsqu'un tableau dynamique a besoin d'tre redimensionn de manire frquente (par exemple, dans une boucle), il vaut mieux effectuer cette opration de manire intelligente pour gagner du temps et viter de fragmenter la mmoire. Voil un code qui rcupre tous les handles des composants du projet de type TWinControl pour les placer dans un tableau dynamique :
procedure TForm1.Button1Click(Sender: TObject); var LArray: array of HWND; I: Integer; begin SetLength(LArray, 0); for I := 0 to Pred(ComponentCount) do if Components[I] is TWinControl then
- 204 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

begin SetLength(LArray, Length(LArray) + 1); LArray[Length(LArray) + 1] := TWinControl(Components[I]).Handle; end;

Le motif suivant est utilis classiquement par beaucoup de programmeurs pour tendre la taille du tableau et affecter une valeur au nouvel lment rserv :
SetLength(LArray, Length(LArray) + 1); LArray[Length(LArray) + 1] := TWinControl(Components[I]).Handle;

Ce n'est pas la meilleure manire de procder, car chaque tour de boucle il y a rservation d'un nouveau petit bout de mmoire. De manire rpte, cela rend votre code lent et fragmente la mmoire de votre application. Pour y remdier, il vaut mieux lorsqu'on connat la taille que prendra le tableau, effectuer l'allocation une seule fois en dbut de boucle :
L := MyList.Count() ; SetLength(LArray, L) ; For I := 0 to Pred(L) do LArray[I] := ...

Lorsque qu'on connat la taille maximale que peut prendre le tableau, il vaut mieux le dimensionner cette taille quitte la diminuer au besoin. Dans notre premier exemple, cela conduirait supposer que tous les composants pourraient tre des TWinControl, donc dimensionner notre tableau ComponentCount. On utilise alors une variable supplmentaire pour compter le nombre d'lments rellement ajouts et redimensionner le tableau en fin de boucle (en effet, on ne peut utiliser la variable qui sert d'index de boucle car Delphi la laisse dans un tat indtermin) :
procedure TForm1.Button1Click(Sender: TObject); var LArray: array of HWND; I, J: Integer; begin J := 0; SetLength(LArray, ComponentCount); for I := 0 to Pred(ComponentCount) do if Components[I] is TWinControl then begin LArray[I] := TWinControl(Components[I]).Handle; Inc(J); end; SetLength(LArray, J); end;

Enfin, lorsqu'on ne connat pas la taille maximale que peut prendre un tableau (on a par exemple une boucle While sans maximum fix), on peut enfin allouer par blocs d'lments. Autrement dit, on fixe une constante dfinissant un nombre d'lments allouer par cycle d'allocations. Tant que la taille actuelle est infrieure au nombre d'lments actuellement allous, on ne fait rien ; et ds que celle-ci la dpasse, on alloue un nouveau bloc. Il va de soi que la taille des blocs d'allocation est proportionnelle au nombre de rsultats qui sont censs tre dlivrs par la boucle : si par exemple il est plausible que la boucle renvoie 5000 lments affecter, on peut avancer par blocs de 500 ou 1000 lments. Enfin, comme le nombre total d'lments affects ne correspondra pas forcment la dimension alloue au tableau on utilise comme la dernire mthode une variable incrmente chaque affectation pour rtablir la taille du tableau exacte en fin de boucle :
procedure TFoo.Bar
- 205 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

const cstGrowBy: Integer = 100; var LList: array of Int64; I, J: Integer; begin SetLength(LList, 0); I := 0; AcquireDriver; try SetSQL('SELECT ID FROM ...); //Requte SQL donnant un nombre N de rsultats ExecSelect; while not QueryEOF do //Notre boucle try //Motif d'allocation voqu dans le paragraphe ci dessus if (I + 1 > Length(LList)) then //Si le nombre actuel d'lments atteint la taille actuelle SetLength(LList, Length(LList) + cstGrowBy); //On alloue un nouveau bloc LList[I] := GetFieldAsInt64('ID'); //On affecte une valeur au tableau finally Inc(I); QueryNext; end; SetLength(LList, I) ; //On peut exploiter le tableau...

Comment rcuprer une rfrence d'objet dans un bloc With ?


Auteur : Laurent Dardenne Attention cette approche n'est possible qu' partir de Delphi 2005. Lors de la construction d'un objet de la manire suivante :
with TMOnObjet.Create do begin end;

il est parfois utile de rcuprer la rfrence de l'objet pour la communiquer un traitement. Sous Delphi 2005 l'utilisation de Class Helper peut tre une solution.
Type GetterClassHelper=Class Helper For TObject Function WriteClassName:ShortString; Function GetInstance:TObject; end;

L'appel devenant
begin With TStringList.Create do begin ... Traitement(GetInstance); // rcupre une rfrence sur l'instance ... end; end.

Il est possible d'utiliser une variable locale en lieu et place de cette mcanique base sur les Class Helper.
- 206 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

PS : Sous Delphi 2005 cette volution du langage n'est pas documente pour Win32 mais l'est pour Delphi .NET. Sous Delphi 2006 les assistants de classe sont bien implments. Voici un programme illustrant son utilisation:

program classhelper; {$APPTYPE CONSOLE} uses SysUtils; Type TTest=Class Nom: String; end; GetterClassHelper=Class Helper For TObject Function WriteClassName:ShortString; Function GetInstance:TObject; end; Function GetterClassHelper.WriteClassName:ShortString; begin // Self fait rfrence au type Test, et non GetterClassHelper. Result:=Self.ClassName; end; function GetterClassHelper.GetInstance:TObject; begin // Self fait rfrence la variable en cours, // et non une possible instance de type GetterClassHelper. Result:=Self; end; Procedure Visualise(AInstance :TObject; NomVaraible:String); begin Writeln('Nom de la variable : ',NomVaraible); Writeln; Writeln('Instance de la classe '+ TTest(AInstance).WriteClassName +' dans la methode visualise : '+TTest(AInstance).Nom); Writeln; end; Var Premier, Second : TTest; begin Premier:=TTest.Create; Premier.Nom:='Je reference l''instance Premier'; visualise(Premier,'Premier'); // Teste si on rcupre bien une rfrence sur l'instance Premier // quivaut : // Second:=Premier Second:=TTest(Premier.GetInstance); visualise(Second,'Second'); Readln; Premier.Free; Second:=Nil; // Objectif final With TTest.Create do Try

- 207 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Nom:='Je reference l''instance transitoire dans le bloc With-do'; visualise(GetInstance,' ici elle n''a pas de nom'); Finally Free; end; Readln; end.

Dans notre exemple le code suivant ne pourra pas compiler car Self n'a pas d'existence dans ce programme console :

With TTest.Create do begin Nom:='Je reference l''instance transitoire dans le bloc With-do'; visualise(self,' Dans notre cas self n''existe pas'); end;

Si dans une mthode d'une classe on utilise le mot cl self dans le bloc With do begin end, self fera rfrence l'instance courante de la classe comportant la mthode en cours d'excution, et non l'instance de l'objet cr la vole dans le bloc with. lien : Les possibles volutions du langage Delphi 2006 (chapitre Syntaxe d'assistance de classe (Class Helper)) lien : Assistant de classe (Class Helper)

Quid du transtypage et de l'oprateur as ?


Auteur : sjrd Le transtypage est trop souvent confondu avec l'oprateur as. Rgulirement, on utilise l'un ou l'autre sans trop y faire attention. Pourtant, chacun a son utilisation propre. Le transtypage Pour commencer, le transtypage (du latin trans : travers), c'est simplement considrer une valeur d'un type donn comme une valeur d'un autre type. La seule contrainte est que ces deux types soient stocks sur le mme nombre d'octets en mmoire. Ainsi, n'importe quel TObject peut tre transtyp en Single et vice versa, car ils sont tous deux stocks sur 4 octets ; par contre, un TObject ne peut tre transtyp en Double (il y aura transtypage incorrect), car Double est stock sur 8 octets. Dans le code excutable produit par le compilateur, il n'y a aucune diffrence entre une affectation d'un Single un autre et l'affectation d'un TObject transtyp en Single un Single. Plus exactement, il n'y a aucune diffrence entre un Single et un TObject transtyp en Single, tout simplement. Le seul effet du transtypage est d'empcher le compilateur de signaler une erreur d'incompatibilit de types. NB : il possible de "transtyper" un integer en un Byte, ou mme un TObject en un Char, alors qu'ils ne sont pas stocks sur le mme nombre d'octets. En ralit, ce n'est pas un rel transtypage : les transtypages entre types scalaires entiers (entiers, pointeurs, objets et caractres), ou entre nombres (entiers et floats), de mme que les transtypages entre types chanes, sont compils spcialement de faon effectuer une vritable conversion de format. N'oubliez pas que dans le cas o un pointeur est impliqu, cette conversion n'a toutefois aucun sens. L'oprateur as avec des classes D'autre part, l'oprateur as. Celui-ci fonctionne diffremment selon qu'il est utilis avec des classes ou des interfaces. Dans le cas des classes, l'oprateur [as] n'est pas diffrent du transtypage, il ajoute simplement un test pour vrifier si ce transtypage est valide. Ce test est effectu l'aide de l'oprateur is. Puis, si le transtypage est valide, il est appliqu, sinon une exception EInvalidCast est gnre.
- 208 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

En fait, le code suivant :


ClasseEnfant := ClasseParent as TClasseEnfant;

correspond celui-ci :
if ClasseParent is TClasseEnfant then ClasseEnfant := TClasseEnfant(ClasseParent) else EInvalidCast.Create(ClasseParent.ClassName + ' n''est pas un descendant de '+TClasseEnfant.ClassName);

Autrement dit, lorsque vous savez que ClasseParent est bel et bien une instance de TClasseEnfant, utilisez le transtypage ; cela vous vitera des tests inutiles et donc une perte de temps l'excution. D'autant plus que l'oprateur is doit parcourir dynamiquement la hirarchie de la classe pour dterminer son rsultat. Si, en revanche, vous devez vrifier que les classes sont compatibles, utilisez soit l'oprateur is et un transtypage ou l'oprateur as. Notez aussi que l'oprateur as, avec des classes, peut tre utilis uniquement si ClasseParent est dclare comme une classe dans la gnalogie directe de TClasseEnfant. Par gnalogie directe, j'entends les parents, grands-parents, enfants, petits-enfants etc. Mais pas les cousins ou les oncles par exemple... Utiliser is ou as ? L'utilisation de l'un ou l'autre amne des modles de programmation diffrents. Avec l'oprateur is, vous devrez utiliser des tests de type if. Avec l'oprateur as, vous devrez encadrer votre code de blocs try et grer les exceptions qui peuvent tre gnres. Dans le cas contraire, vous vous exposez des risques de plantage brutal de votre programme. L'oprateur as avec des interfaces Finalement, l'oprateur as, utilis avec les interfaces, est l'appel de la mthode QueryInterface avec gnration d'une exception EIntfCastError si la rfrence ne supporte pas l'interface demande. Ainsi, le code suivant :
UneInterface := UneAutreInterface as IUneInterface;

quivaut celui-l :
if UneAutreInterface.QueryInterface(GUID_de_IUneInterface, UneInterface) <> 0 then raise EIntfCastError.Create('La rfrence n''implmente pas l'interface demande');

Remarquez que ce test requiert que l'interface IUneInterface ait t gratifie d'un GUID... Si ce n'est pas le cas, il y aura erreur de compilation. Contrairement l'utilisation sur ces classes, l'oprateur as appliqu des interfaces ne demande pas des interfaces de la mme branche gnalogique. C'est normal, c'est la philosophie des interfaces : un objet peut implmenter deux interfaces n'ayant aucun rapport l'une avec l'autre. propos du portage sous Delphi .NET Si votre code est destin tre port sous .NET, n'utilisez plus de transtypages dits sauvages, tel que integer(UnObjet), car ils ne sont pas autoriss en .NET. Utilisez la place l'oprateur as. lien : http://hallvards.blogspot.be/2005/01/interface-to-interface-casts.html

- 209 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Langage > Types de donnes > Nombres Comment transformer un rel en entier ?
Auteur : Nono40 Pour convertir un rel en entier il faut utiliser les fonctions suivantes : Fonction Trunc(X:Extended):Integer; Trunc ajuste l'entier le plus petit. Exemples : Trunc(1.2) donne 1 Trunc(1.9) donne 1 Trunc(-1.4) donne -1 Fonction Round(X:Extended):Integer; Round arrondi l'entier le plus proche, dans le cas ou la valeur est juste entre deux entiers, c'est l'entier pair qui est choisi. Exemples : Round(1.2) donne 1 Round(1.9) donne 2 Round(1.5) donne 2 Round(2.5) donne 2 Round(2.500001) donne 3 Round(-1.4) donne -1 Round(-1.5) donne -2 function Ceil(X:Extended):Integer; ( unit Maths ) Ceil arrondi l'entier suprieur Ceil(1.2) donne 2 Ceil(1.9) donne 2 Ceil(-1.5) donne -1 function Floor(X:Extended):Integer; ( unit Math ) Floor arrondi l'entier infrieur Floor(1.2) donne 1 Floor(1.9) donne 1 Floor(-1.5) donne -2 lien : Comment formater l'affichage d'un rel ?

Comment formater l'affichage d'un rel ?


Auteur : Nono40 Pour transformer un rel en chane sans formatage particulier il faut utiliser la fonction FloatToStr(Value:Extended):String; Mais dans la plupart des cas, il est utile de formater le nombre de dcimales. Pour ce faire il y a diffrentes fonctions dans Delphi : FloatToStrF(), FormatFloat() ou Format(). Par exemple pour afficher une valeur avec deux chiffres aprs la virgule :
Var f:Real; begin f:=12345.6789; ShowMessage(FloatToStrf(f,ffFixed,8,2)); ShowMessage(FormatFloat('0.00',f)); ShowMessage(Format('%8.2f',[f])); end;

- 210 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Voir l'aide en ligne pour l'utilisation de ces fonctions. lien : Comment transformer un rel en entier ?

Comment changer le caractre dcimal par dfaut ?


Auteur : Nono40 En fonction des ordinateurs et de la configuration des options rgionales, le caractre dcimal par dfaut n'est pas toujours le mme. Si votre application est sensible ce caractre, il est conseill de le fixer l'initialisation de l'application. Par exemple dans la section Initialization de la fiche principale :
... Initialization DecimalSeparator:='.'; end.

Ainsi le caractre sera toujours le mme. Il faut aussi penser grer la saisie de ce caractre dans les TEdit devant contenir des nombres rels :
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin If (Key=',') Or (Key='.') Then Key:=DecimalSeparator; end;

Comment transformer un nombre entier en lettres ?


Auteur : Bloon La procdure donne dans le code source permet de transformer un nombre en lettres. C'est dire transformer 123 en "cent vingt trois". La dclaration de la fonction est la suivante :
function NombreEnLettres(n : integer ; France : Boolean = True ) : string;

n est le nombre transformer en lettres France dtermine le langage utiliser. Si France est True, 70 sera crit "soixante dix". Si france est False 70 sera crit "septante". Par dfaut, France est True s'il n'est pas prcis. Cette fonction tiens comptes des cas particuliers du Franais : 31 : trente et un 80 : quatre-vingts 81 : quatre-vingt un ( sans 's' et sans 'et' ) 200 : deux cents

- 211 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

202 : deux cent deux ( sans 's' ) intergerlettres.zip [2Ko]

Comment arrondir un rel ?


Auteur : Bloon Pour arrondir un rel, utiliser la fonction SimpleRoundTo de l'unit Math. Exemple :
showMessage(floatToStr(SimpleRoundTo(1.235,-2))); // Affiche 1.24

Si cette fonction n'est pas disponible dans votre version de Delphi, vous pouvez utiliser la fonction suivante :
uses Math; function Arrondir(nombre : extended ; nbDecim : integer) : extended; var p10 : extended; begin { 2 tant le cas le plus frquent, on le traite directement } if (nbDecim = 2) then result := round(nombre * 100) / 100 else begin p10 := Power(10,nbDecim); result := round(nombre * p10) / p10; end; end;

Exemples :
memo1.Lines.Add(floatToStr(arrondir(12,2))); memo1.Lines.Add(floatToStr(arrondir(13.59,1))); memo1.Lines.Add(floatToStr(arrondir(0.1,5))); memo1.Lines.Add(floatToStr(arrondir(0.14444444,3))); memo1.Lines.Add(floatToStr(arrondir(1.5,0))); memo1.Lines.Add(floatToStr(arrondir(1.54345678,1))); memo1.Lines.Add(floatToStr(arrondir(1.54345678,2))); memo1.Lines.Add(floatToStr(arrondir(1.54345678,3))); memo1.Lines.Add(floatToStr(arrondir(1.54345678,4)));

on obtient : 12 13,6 0,1 0,144 2 1,5 1,54 1,543 1,5435

- 212 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Comment convertir un nombre en hexa ?


Auteur : Bloon La fonction utiliser est StrToInt en ajoutant un '$' devant la chane qui contient le nombre hexa :
function hexaToInt(s : string) : integer; begin if (s <> '') and (s[1] <> '$') then result := StrToInt('$' + s) else result := StrToInt(s); end;

Exemples :
showMessage(intToStr(hexaToInt('10'))); // 16 showMessage(intToStr(hexaToInt('$10'))); // 16 showMessage(intToStr(hexaToInt('ABCD'))); // 43981

Rappel : la fonction inverse est intToHex, qui renvoie la reprsentation hexadcimale d'un entier.

Comment lever un rel X la puissance Y ?


Auteur : sjrd Cette fonctionnalit est propose par la fonction Power, dclare dans l'unit Math. Syntaxe Delphi : function Power(const Base, Exponent: Extended): Extended; Description Power lve Base n'importe quelle puissance. Pour les exposants fractionnels ou suprieurs MaxInt, le paramtre Base doit tre suprieur 0. Ainsi, pour rcuprer 2.5^6, effectuez :
uses Math; ... Value := Power(2.5, 6);

Astuce : pour calculer la racine cubique d'un rel, utilisez :


uses Math; ... Value := Power(Value, 1/3);

Comment comparer deux rels ?


Auteur : Bloon Lorsque l'on compare 2 nombres virgule flottante avec l'oprateur =, on a parfois des surprises : 2 nombres priori gaux ne le sont pas. Ceci est d la reprsentation en virgule flottante qui est une approximation du nombre et non une reprsentation exacte (voir ci-dessous pour des explications plus pousses). Par exemple :
- 213 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

var a : double; begin a := 11 + 1.11; if (a = 12.11) then showMessage('gal') else showMessage('pas gal') // <-- affiche ce message end;

Heureusement, partir de Delphi 6, Borland nous fournit 3 fonctions dans l'unit Math qui sont :
// Indique si deux valeurs en virgule flottante sont (approximativement) gales. function SameValue(const A, B: Single; Epsilon: Single = 0): Boolean; overload;

Les 2 fonctions suivantes utilisent SameValue :

// Indique si une variable ou une expression en virgule flottante est value zro ou une valeur trs proche function IsZero(const A: Single; Epsilon: Single = 0): Boolean; overload; // Renvoie la relation existant entre deux valeurs numriques. function CompareValue(const A, B: Single; Epsilon: Single = 0): TValueRelationship; overload;

Ces trois fonctions sont dfinies pour des Single, Double et Extended. CompareValue est galement dfinie pour Integer et Int64. Le code ci-dessus qui ne fonctionnait pas devient alors :
uses Math; var a : double; begin a := 11 + 1.11; if sameValue(a,12.11) then showMessage('gal') // <-- affiche ce message else showMessage('pas gal'); end;

L'aide de Delphi nous apprend qu'Epsilon est la quantit maximale dont A et B peuvent s'loigner tout en tant considres comme gales. Par dfaut cette valeur est 0 mais en regardant le code, on constate que si espilon est 0 (ce qui n'aurait pas de sens), cette valeur est corrige. Si vous avez une version antrieure Delphi 6 Il faut crire une fonction qui se charge du travail. La valeur de Epsilon dpend de la prcision des types rels compars :
function EgaliteReels(n1,n2 : extended) : boolean; begin result := Abs(n1 - n2) < Min(abs(n1),abs(n2)) * 1E-16; end; function EgaliteReels(n1,n2 : double) : boolean; begin result := Abs(n1 - n2) < Min(abs(n1),abs(n2)) * 1E-12; end; function EgaliteReels(n1,n2 : single) : boolean; begin result := Abs(n1 - n2) < Min(abs(n1),abs(n2)) * 1E-4; end;

- 214 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Quelques prcisions sur le calcul flottant Pour aborder le calcul flottant je vous invite vous reporter la Norme IEEE 754 que vous pouvez consulter cet endroit. Les arrondis corrects de la nome IEEE 754, font qu'il est pratiquement impossible de comparer deux extended par le simple test suivant :
x,y: extended; if x = y then //pas bien

Pour rsoudre ce problme de faon simple plusieurs mthodes sont notre disposition. - La premire consiste calculer la diffrence entre nos deux extended x et y puis de vrifier que cette diffrence est infrieure epsilon (1 > epsilon > 0) que nous aurons fix. Cela donne :
| x - y | < epsilon

Rappelons que x et y sont des flottants normaliss, on peut alors crire


x = m1 10exp(a) et y = m2 10exp(b)

donc,
|m1 10exp(a) - m2 10exp(b)| < epsilon

Puisque x et y sont des nombres trs proche dans le meilleur des cas nous aurons a = b, donc
|(m1-m2) 10exp(a)| < epsilon

- La seconde mthode pour comparer les nombres x et y peut partir de la constatation que si x et y sont trs proches alors le quotient de ces deux nombres est proche de 1. On peut alors crire :
1-epsilon &lt; |x/y| < 1 + epsilon -epsilon &lt; |x/y| - 1 < epsilon

soit encore
|1-|x/y|| < epsilon (*en ayant multipli chacun des membres par -1*)

En remplaant x et y par leur reprsentation flottante normalise, nous obtenons


|1-|(m1 10exp(a))/(m2 10exp(b))|| < epsilon

Comme plus haut, a = b dans le meilleur des cas, donc


|1-|m1/m2|| &lt; epsilon

- 215 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Ce qui est plus simple que dans la premire mthode. En effet ici le calcul ne prendra en compte que les mantisses des flottants.

- 216 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Langage > Types de donnes > Chanes de caractres Comment connatre la longueur d'une chane de caractres ?
Auteur : Smortex Il faut utiliser la fonction Length qui permet de connatre le nombre de caractres qui composent une chane ou le nombre d'lments d'un tableau. Exemple :
var Longueur: Integer; begin Longueur := Length('Hello World'); { 11 } { Reste du code } end;

lien : Comment accder un caractre d'une chane en connaissant sa position ?

Comment accder un caractre d'une chane en connaissant sa position ?


Auteur : Smortex On peut accder chaque caractre d'une chane en indiquant entre crochets l'index du caractre que l'on souhaite rcuprer. Attention : - le premier caractre a l'index 1 et non pas 0 ! - Il ne faut pas dpasser la longueur de la chane sous peine de violation d'accs Exemple :
var S: String; C: Char; begin S := 'Hello World'; C := S[7]; { 'W' } { Reste du code } end;

lien : Comment connatre la longueur d'une chane de caractres ?

Comment transformer une chane de un caractre en une variable de type Char ?


Auteur : Smortex Convertir une variable string en Char se fait trs simplement en accdant au premier caractre de la chane.
var S: String; C: Char; begin S := 'A'; C := S[1]; { C = 'A', C tant de type Char } end;

lien : Comment accder un caractre d'une chane en connaissant sa position ?


- 217 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

lien : Comment connatre la longueur d'une chane de caractres ?

Comment trouver une chane dans une autre ?


Auteur : Nono40 Pour rechercher une chane dans une autre, il faut utiliser la fonction Pos:
function Pos (Substr:string;S:string):Integer;

Cette fonction retourne la position de la premire occurrence de Substr dans S.


Pos('CD','ABCDEF'); { retourne 3 }

Depuis Delphi 7, il est possible de rechercher une chane partir d'une position donne: il suffit d'utiliser la fonction PosEx:
function PosEx(const SubStr,S:string;Offset:Cardinal =1):Integer;

Cette fonction est trs pratique pour chercher les occurrences suivantes d'une sous chane. Voici un exemple d'utilisation, cette fonction compte le nombre d'occurrences d'une sous-chane dans une chane :
Function Compte(Const SubStr:String;Const s:String):Integer; Var i:Integer; begin Result:=0; i:=0; Repeat i:=PosEx(SubStr,s,i+1); If i<>0 Then Inc(Result); Until i=0; End;

lien : Comment remplacer une chane dans une chane ?

Comment remplacer une chane dans une chane ?


Auteur : Nono40 Pour remplacer toutes les occurrences d'une chane par une autre dans une chane, il faut utiliser la fonction AnsiReplaceStr(const AText,AFromText,AToText:string):string;. Cette fonction remplace toutes les occurrences de AFromText par AToText dans la chane AText. AnsiReplaceStr est sensible la casse. Pour ne pas en tenir compte, utilisez plutt AnsiReplaceText.
AnsiReplaceStr('ABCGHABKJABFab','AB','XX') { retourne 'XXCGHabKJXXFab' } AnsiReplaceText('ABCGHABKJABFab','AB','XX') { retourne 'XXCGHXXKJXXFXX' }

- 218 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Ces fonctions sont utilisables avec Delphi 6 et suprieur. lien : Comment trouver une chane dans une autre ?

Comment extraire les mots d'une chane ?


Auteur : Bloon L'objectif de cette procdure est d'extraire les mots qui se trouvent dans une chane (string) pour les placer dans une liste de chanes (TStrings), comme la fonction explode de PHP. Les caractres qui servent sparer les mots sont passs la procdure. Exemples d'utilisation :
extraireMots(Edit1.Text,memo1.Lines); extraireMots(Edit1.Text,memo1.Lines,true,[' ',',','.',';']);

Cette procdure est relativement performante puisque la chane initiale n'est parcourue qu'une seule fois.
procedure extraireMots(s : string; into : TStrings; viderListe : boolean = false; sep : TSysCharSet = [' ', ',']); var i, n : integer; currentWord : string; begin if viderListe then into.Clear; n := length(s); i := 1; while (i <= n) do begin currentWord := ''; { on saute les sparateurs } while (i <= n) and (s[i] in sep) do inc(i); { rcupration du mot courant } while (i <= n) and not (s[i] in sep) do begin currentWord := currentWord + s[i]; inc(i); end; if (currentWord <> '') then into.Add(currentWord); end; end;

Comment saisir dans le source une chane de plus de 255 caractres ?


Auteur : Nono40 Le type string n'est pas limit en longueur ( enfin si, mais limit 4Go ), par contre il n'est pas possible de saisir dans le source des chanes de plus de 255 caractres. Ceci provoque une erreur de compilation "Les chanes ne doivent pas dpasser 255 caractres". Pour palier ce problme, il faut saisir dans le source la chane en plusieurs fois :
Memo1.Text:='Ceci est un texte vraiment long qui ne tiens par sur une ligne,' +' mais quelle ide aussi de saisir un texte comme cela alors que ' +'la ligne ne tiens mme pas dans l''diteur et qu''il faut '

- 219 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

+'utiliser les barres de dfilement horizontales pour le lire ' +'en entier ! Non mais bon sang de bon soir !';

Comment insrer des apostrophes dans une chane de caractres ?


Auteur : Laurent Dardenne L'ajout d'une apostrophe dans une chaine de caractres se fait par la duplication du caractre '.
Const Chaine='Ceci '' est une apostrophe. Et c''est tout.'; begin showmessage(Chaine) end;

Affiche la chane Ceci ' est une apostrophe. Et c'est tout.

Comment transformer une chane DOS en chane Windows ?


Auteur : Nono40 Windows fournit une fonction permettant de convertir une chane contenant des caractres DOS en chane contenant leur quivalent en caractres Windows.
function DosStrToWinStr(Const StrDos: String): String; begin SetLength(Result, Length(StrDos)); OemToCharBuff(pChar(StrDos),@Result[1],Length(StrDos)); end;

Pour utiliser les caractres tendus, il faut adapter la fonction aux chanes WideString :
function DosStrToWinStrW(Const StrDos: String): WideString; begin SetLength(Result,Length(StrDos)); OemToCharBuffW(pChar(StrDos),@Result[1],Length(StrDos)); end;

lien :

Windows SDK - Fonction OemToCharBuff

Comment faire un Case Of avec des String ?


Auteur : sjrd Etant donn que la structure Case Of requiert une donne de type ordinal, il est impossible de faire un Case Of directement avec des String. L'astuce consiste utiliser la fonction AnsiIndexStr de l'unit StrUtils :
uses StrUtils; ... case AnsiIndexStr(Str, ['Chane1', 'Chane2', 'Chane3']) of 0 : // Str = 'Chane1' 1 : // Str = 'Chane2' 2 : // Str = 'Chane3' -1 : // Str ne vaut aucune de ces trois chanes end;

- 220 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Si votre version de Delphi ne propose pas cette fonction, elle peut tre implmente comme suit :
function AnsiIndexStr(AText : string; const AValues : array of string) : integer; begin Result := 0; while Result <= High(AValues) do if AValues[Result] = AText then exit else inc(Result); Result := -1; end;

Une autre ide, dans le cas d'un Case Of dynamique, est d'utiliser un objet de type TStrings et sa mthode IndexOf

Comment convertir les caractres spciaux HTML ?


Auteur : Bloon Il faut crire une fonction qui remplace les caractres spciaux par leur quivalent HTML :
function filtreHTML(const s : string) : string; var i : integer; begin result := ''; for i := 1 to length(s) do begin case s[i] of '&amp;' : result := result + '&amp;'; '<' : result := result + '&lt;'; '>' : result := result + '&gt;'; '"' : result := result + '&amp;quot;'; '' : result := result + '&amp;trade;'; '' : result := result + '&amp;copy;'; '' : result := result + '&amp;reg;'; '' : result := result + '&amp;Agrave;'; '' : result := result + '&amp;Aacute;'; '' : result := result + '&amp;Acirc;'; '' : result := result + '&amp;Atilde;'; '' : result := result + '&amp;Auml;'; '' : result := result + '&amp;Aring;'; '' : result := result + '&amp;AElig;'; '' : result := result + '&amp;Ccedil;'; '' : result := result + '&amp;Egrave;'; '' : result := result + '&amp;Eacute;'; '' : result := result + '&amp;Ecirc;'; '' : result := result + '&amp;Euml;'; '' : result := result + '&amp;Igrave;'; '' : result := result + '&amp;Iacute;'; '' : result := result + '&amp;Icirc;'; '' : result := result + '&amp;Iuml;'; '' : result := result + '&amp;ETH;'; '' : result := result + '&amp;Ntilde;'; '' : result := result + '&amp;Ograve;'; '' : result := result + '&amp;Oacute;'; '' : result := result + '&amp;Ocirc;'; '' : result := result + '&amp;Otilde;'; '' : result := result + '&amp;Ouml;'; '' : result := result + '&amp;Oslash;'; '' : result := result + '&amp;Ugrave;'; '' : result := result + '&amp;Uacute;'; '' : result := result + '&amp;Ucirc;';
- 221 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

'' : result := result + '&amp;Uuml;'; '' : result := result + '&amp;Yacute;'; '' : result := result + '&amp;THORN;'; '' : result := result + '&amp;szlig;'; '' : result := result + '&amp;agrave;'; '' : result := result + '&amp;aacute;'; '' : result := result + '&amp;acirc;'; '' : result := result + '&amp;atilde;'; '' : result := result + '&amp;auml;'; '' : result := result + '&amp;aring;'; '' : result := result + '&amp;aelig;'; '' : result := result + '&amp;ccedil;'; '' : result := result + '&amp;egrave;'; '' : result := result + '&amp;eacute;'; '' : result := result + '&amp;ecirc;'; '' : result := result + '&amp;euml;'; '' : result := result + '&amp;igrave;'; '' : result := result + '&amp;iacute;'; '' : result := result + '&amp;icirc;'; '' : result := result + '&amp;iuml;'; '' : result := result + '&amp;eth;'; '' : result := result + '&amp;ntilde;'; '' : result := result + '&amp;ograve;'; '' : result := result + '&amp;oacute;'; '' : result := result + '&amp;ocirc;'; '' : result := result + '&amp;otilde;'; '' : result := result + '&amp;ouml;'; '' : result := result + '&amp;oslash;'; '' : result := result + '&amp;ugrave;'; '' : result := result + '&amp;uacute;'; '' : result := result + '&amp;ucirc;'; '' : result := result + '&amp;uuml;'; '' : result := result + '&amp;yacute;'; '' : result := result + '&amp;thorn;'; '' : result := result + '&amp;yuml;'; '' : result := result + '&amp;iexcl;'; '' : result := result + '&amp;cent;'; '' : result := result + '&amp;pound;'; '' : result := result + '&amp;curren;'; '' : result := result + '&amp;yen;'; '' : result := result + '&amp;brvbar;'; '' : result := result + '&amp;sect;'; '' : result := result + '&amp;uml;'; '' : result := result + '&amp;ordf;'; '' : result := result + '&amp;laquo;'; '' : result := result + '&amp;shy;'; '' : result := result + '&amp;macr;'; '' : result := result + '&amp;deg;'; '' : result := result + '&amp;plusmn;'; '' : result := result + '&amp;sup2;'; '' : result := result + '&amp;sup3;'; '' : result := result + '&amp;acute;'; '' : result := result + '&amp;micro;'; '' : result := result + '&amp;middot;'; '' : result := result + '&amp;cedil;'; '' : result := result + '&amp;sup1;'; '' : result := result + '&amp;ordm;'; '' : result := result + '&amp;raquo;'; '' : result := result + '&amp;frac14;'; '' : result := result + '&amp;frac12;'; '' : result := result + '&amp;frac34;'; '' : result := result + '&amp;iquest;'; '' : result := result + '&amp;times;'; '' : result := result + '&amp;divide;'; '' : result := result + '&amp;euro;'; else result := result + s[i]; end; end;
- 222 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

lien :

Table de correspondance ISO-HTML

Comment transformer une taille en string ?


Auteur : reisubar On peut parfois avoir besoin de convertir une taille (de fichier, de dossiers...) en une chane plus parlante pour l'utilisateur. Voici une possibilit d'implmentation, qui affiche la taille dans son unit la plus proche :
function SizeToStr(Sz: int64): string; resourcestring strMinSize = '0 Octets'; strKo = '%s Ko'; strMo = '%s Mo'; strGo = '%s Go'; strOct = '%s Octets'; const cstFloatFmt = '#.##'; cstOneKo = 1024; cstOneMo = cstOneKo * 1024; cstOneGo = cstOneMo * 1024; begin Result := strMinSize; if (Sz = 0) then Exit; if (Sz <= cstOneKo) then begin Result := Format(strOct, [FormatFloat(cstFloatFmt, Sz)]); Exit; end; if (Sz <= cstOneMo) then begin Result := Format(strKo, [FormatFloat(cstFloatFmt, Sz / cstOneKo)]); Exit; end; if (Sz <= cstOneGo) then begin Result := Format(strMo, [FormatFloat(cstFloatFmt, Sz / (cstOneMo))]); Exit; end; Result := Format(strGo, [FormatFloat(cstFloatFmt, Sz / (cstOneGo))]); end;

Comment convertir un fichier texte Mac au format PC ?


Auteur : pipistrelle Les fichiers textes de Windows, Macintosh et Unix diffrent par leurs fins de ligne. Sur Mac, le passage la ligne se fait par le caractre CR (#13), sous Windows, il se fait par le caractre CR+LF (#13+#10), et sous Unix, par le caractre LF (#10).

Il en rsulte que la rcupration d'un fichier texte Mac ou Linux en utilisant l'instruction ReadLn se solde par un chec. Voici une mthode pour convertir un fichier vers un des trois formats. Cette variante utilise un TStringList car sa mthode LoadFromFile reconnat les types de fichiers.
- 223 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

type

TTextFileFormat = (tfWINDOWS, tfUNIX, tfMAC);

// Convertir un fichier texte vers le format dsir // cette variante utilise un TStringList function ConvertTextFile(const InputFileName, OutputFilename: string; const OutputFormat: TTextFileFormat): boolean; var FI: File; FO : TextFile; ENDL: string; // fin de ligne ALine: string; i,j: integer; begin Result:=False; if Not(FileExists(InputFileName)) then Exit; case OutputFormat of tfWINDOWS: ENDL:=#13+#10; tfUNIX : ENDL:=#10; tfMAC : ENDL:=#13; end; with TStringList.Create do begin try Clear; LoadFromFile(InputFileName); AssignFile(FO, OutputFilename); ReWrite(FO); try try for i:=0 to Count-1 do begin ALine:=Trim(Strings[i])+ENDL; Write(FO, ALine); end; Result:=True; except end; finally CloseFile(FO); end; finally // with TStringList Clear; Free; end; end; end;

Comment connatre la largeur et la hauteur en pixels d'un texte ?


Auteur : waskol Le code suivant permet de recuprer la largeur et la hauteur en pixel d'un texte. La fonction supporte du texte multiligne et renvoie la largeur de la plus longue ligne, et la hauteur du tout. Le principe est d'utiliser les fonctionnalits du Canvas d'un TBitmap pour rcuprer les tailles du texte.
Function TextSize(Phrase : string; Police : TFont = nil) : TPoint; var DC: HDC; Rect: TRect; C : TBitmap; begin C := TBitmap.create;

- 224 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

if police <> nil then

C.canvas.Font := police;

end;

Rect.Left := 0; Rect.Top:=0; Rect.Right:=0; Rect.Bottom:=0; DC := GetDC(0); C.Canvas.Handle := DC; DrawText(C.Canvas.Handle, PChar(Phrase), Length(Phrase), Rect, (DT_EXPANDTABS or DT_CALCRECT)); C.Canvas.Handle := 0; ReleaseDC(0, DC); result.X:=Rect.Right-Rect.Left; result.Y:=Rect.Bottom-Rect.Top; C.Free;

Comment convertir un texte avec des formats RTF en texte brut ?


Auteur : waskol Il peut tre intressant dans certains cas de pouvoir convertir un texte contenant des formats RTF en texte brut, sans aucune marque de formatage. Par exemple, transformer ceci :
{\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fswiss\fcharset0 Arial;} {\f1\fmodern\fprq1\fcharset0 Courier New;}} {\colortbl ;\red0\green255\blue0;\red255\green0\blue0;\red0\green0\blue128;} {\*\generator Msftedit 5.41.15.1503;}\viewkind4\uc1\pard\qc\f0\fs32 A la \cf1 p\'eache \cf0 aux moules\par jkhjkhhkkhj\par du Ma\'efs des \'e9pis de bl\'e9\line\ul\b\f1 le caf\'e9\par \pard\ulnone\b0\i\f0\fs20 Bonjour tout le monde,\par \i0 comment \'e7a va ?\par \cf2\b\'e9l\'e9phant \cf3 rhinoc\'e9ros\cf0\b0\par \fs32\par }

En cel :
A la pche aux moules jkhjkhhkkhj du Mas des pis de bl le caf Bonjour tout le monde, comment a va ? lphant rhinocros

La plupart du temps, il est possible et satisfaisant de raliser cette conversion avec un TRichEdit intermddiaire comme ceci :
function TForm1.RTFtoText(rtf:string):string; var temp_richedit: TRichedit; temp_str: string; ss: TStringStream; begin ss := TStringStream.Create(rtf); temp_richedit := TRichEdit.Create(nil); try
- 225 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

temp_richedit.Lines.LoadFromStream(ss); result := temp_richedit.Lines.Text; finally ss.free; temp_richedit.Free; end; end;

Cependant, dans certains cas de figure, d'aucun prfrerais viter l'utilisation d'un TRichEdit. Par exemple, cel peut tre le cas dans les configurations suivantes : Un champ blob d'une base de donnes contient du texte format que l'on souhaite afficher dans un label par exemple : la cration et la destruction d'un grand nombre de composant TRichEdit n'est pas une solution idale... On souhaite convertir un fichier au format RTF de Word95 (format non support par TRichEdit) en fichier texte.

Au passage, il peut tre aussi intressant : de remplacer les passages la ligne par des espaces. de ne rcuprer que les N premiers caractres du rsultat

...afin d'afficher tout ceci dans un TLabel ou bien de crer un logiciel de recherche de document et d'en afficher leur contenu la manire d'un moteur de recherche internet. Une solution : Une solution consiste alors utiliser la fonction suivante :
function RTFtoText(const RTF: string;ReplaceLineFeedWithSpace,DoTrimLeft:Boolean;TrailAfter:integer): string; var //n: Nombre de caractres traiter la source //i:index du caractre dans le rsultat // (utilis aprs le traitement de la source) //x:index du caractre que l'on traite dans la source (voir ThisChar) n,i,x:Integer; //flag iniquant si on est en train de lie un code de formatage //Un code de formatage commence par un Anti-Slash "\" et //considr comme fini juste avant un autre Anti-slash, //un espace ou un retour la ligne. GetCode:Boolean; //Chane dans laquelle on stocke le code de formatage que //l'on est en train de lire Code:String; //Caractre que l'on est en train de traiter, //et caractre le prcdant ThisChar,LastChar:Char; //Niveau de groupe (ou bloc) de format dans lequel on se trouve //un groupe commence par une accolade ouverte "{" et se termine par une accolade ferme "}" Group:Integer; //Flag indiquant si le caractre Thiscar doit tre rejet (True) ou recopi dans le rsultat (False] Skip:Boolean; procedure ProcessCode; begin //Si on vient de terminer la lecture d'un code de formatage if ThisChar in ['\',' ',#13,#10] then
- 226 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin //si on vient de lire le code de format d'un dbut de paragraphe //ou celui d'un passage la ligne... if (Code='\par') or (Code='\line') or (Code='\pard') then begin //#13#10 est le code iutilis sous Windows //pour coder en ASCII un retour la ligne if ReplaceLineFeedWithSpace then Result:=Result+' ' else Result:=Result+#13#10; GetCode:=FALSE; skip:=TRUE; end; //si on vient de lire le code de format d'une tabulation if Code='\tab' then begin //#9 est le code iutilis sous Windows //pour coder une tabulation en code ASCII Result:=Result+#9; GetCode:=FALSE; skip:=TRUE; end; end; //Un code de format \'xx indigue le code ASCII d'un caractre spcial // (lettres accentues en particulier). xx est ce code en hxadcimal. if ((Length(Code)=4) and ((Code[1]+code[2])='\''')) then begin //on retranscrit le code hexadcimal en code ASCII) Result:=Result+Chr(strtoint('$'+code[3]+code[4])); GetCode:=FALSE; skip:=TRUE; end; end; begin try //Initialisations n:=Length(RTF); Result:=''; GetCode:=FALSE; Group:=0; LastChar:=#0; //Traitement de la source x:=1; while x&lt;=n do begin Skip:=FALSE; ThisChar:=RTF[x]; case ThisChar of '&#123;':if LastChar&lt;&gt;'\' then begin //Dbut de groupe inc(Group); skip:=TRUE; end else GetCode:=FALSE; '&#125;':if LastChar&lt;&gt;'\' then begin //Fin de groupe dec(Group); skip:=TRUE; end else GetCode:=FALSE; '\':if LastChar&lt;&gt;'\' then begin // Dbut de Code de format traiter if GetCode then ProcessCode; Code:=''; GetCode:=TRUE;
- 227 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end else GetCode:=FALSE; //c'tait bien le caractre anti-slash //(cod en RTF avec deux anti-slashs // successifs) ' ':begin if GetCode then begin //fin de Code de format ProcessCode; GetCode:=FALSE; skip:=TRUE; end; end; #10: begin if GetCode then begin //fin de Code de format ProcessCode; GetCode:=FALSE; skip:=TRUE; end; //(on est dans un groupe, // on ne recopie pas le "LineFeed") if Group&gt;0 then skip:=TRUE; end; #13: begin if GetCode then begin ProcessCode; GetCode:=FALSE; skip:=TRUE; end; //(on est dans un groupe, // on ne recopie pas le "Retour chariot") if Group&gt;0 then skip:=TRUE; end; end; if not GetCode then begin if (not Skip) and (Group &lt;= 1) then //On a un caractre recopier dans le rsultat du traitement //(du texte brut, pas du format) Result:=Result+ThisChar; end else begin //on lit le code Code:=Code+ThisChar; ProcessCode; end; //Prparation de la boucle suivante LastChar:=ThisChar; Inc(x); end; //Fin du traitement de la source et //Dbut de traitement du rsultat obtenu //Suppression des catractres cr/lf et espaces en fin de chane n:=Length(Result); while ((n&gt;0) and (Result[n]&lt;' ')) do dec(n); if n&gt;0 then SetLength(Result,n); //idem mais pour le dbut de la chane if DoTrimLeft then begin i := Length(Result);
- 228 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

n := 1; while (n &lt;= i) and (Result[n] &lt;= ' ') do Inc(n); Result := Copy(Result, n, Maxint); end; result:=TrimLeft(Result); //csure du texte si l'utilisateur l' demand if TrailAfter&gt;0 then begin if Length(Result)&gt;TrailAfter then begin SetLength(Result,TrailAfter); result:=result+'...'; end; end; except on e:exception do end; end;

Utilisation de la fonction : - ReplaceLineFeedWithSpace : Avec True : un espace remplacera les retours la ligne. Votre texte sera alors affich sur une seule ligne. Avec False, les caractres spciaux de retour la ligne seront conservs : vous pourrez ainsi rcuprer le texte dans un TMemo via sa proprit Text :
var ASL:TStringList; begin ASL:=TStringList.Create; try ASL.Lines.LoadFromFile('FichierTest.rtf'); Memo1.Text:=RTFtoText(ASL.Text,false,False,-1); finally ASL.Free; end; end;

- DoTrimLeft: Avec True : Supprime les espace et caractres de contrles en dbut de chane - TrailAfter: Avec TrailAfter>0 : Si la chane rsultante est plus longue que TrailAfter, cette dernire est coupe, et trois petits points sont rajouts. Donc attention, la longueur de la chane en retour sera gale TrailAfter+3 ! Avec TrailAfter=0 ou -1 : Sans effet.

Comment peut on faire des textures et contours d'un texte ?


Auteur : waskol Pour appliquer une texture, dessiner un contour (ou n'importe quelle forme gomtrique), il faut procder en trois tapes : 1) Avant de dessiner :
BeginPath(Canvas.Handle);

2) dessiner le texte 3) Aprs le dessin :

- 229 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

CloseFigure(Canvas.Handle); EndPath(Canvas.Handle); StrokeAndFillPath(Canvas.Handle);

Ci-dessous, nous vous proposons un exemple concret. Crer une fiche et y dposer un bouton(Le plus droite possible sur la fiche) et un TOpenPictureDialog, puis copier/coller le code ci-dessous :
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtDlgs; type TForm1 = class(TForm) Button1: TButton; OpenPictureDialog1: TOpenPictureDialog; procedure Button1Click(Sender: TObject); private { Dclarations prives } public { Dclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} procedure TexteTexture(Texte : string; x,y:integer; Dest : TCanvas); // Texte est le texte crire // x,y : la position o crire le texte // Dest est le Canvas o crire le texte var DC:HDC; begin DC:=Dest.Handle; //Avant de dessiner le texte BeginPath(DC); //Petite prparation... SetBkMode(DC, TRANSPARENT); //dessiner le texte Dest.TextOut(x, y, Texte); //Aprs le dessin : EndPath(DC); StrokeAndFillPath(DC); end; procedure TForm1.Button1Click(Sender: TObject); const TonTexte='Hello World !'; var oldBrush:TBrush; HauteurTexte:integer; //pour le troisime exemple Texture:TBitmap;

- 230 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

//pour les derniers exemples i,x,y:integer; size:TSize; l:double; MyRgn:HRGN; begin Texture :=TBitmap.Create; try if OpenPictureDialog1.Execute then Texture.LoadFromFile(OpenPictureDialog1.FileName); with form1 do begin oldBrush:=Canvas.Brush; //Choix de la police Canvas.Font.Name:='Arial'; //Cela ne fonctionne qu'avec des polices TrueType Canvas.Font.Size:=48; //Plus elle est grande, plus joli ce sera !!! HauteurTexte:=Canvas.TextHeight(TonTexte); //Premier effet canvas.Pen.Color:=clYellow; canvas.Pen.Width:=3; Canvas.Brush.Style:= bsSolid; Canvas.Brush.Color := clLime; TexteTexture(TonTexte,10,0,Canvas); //second... canvas.Pen.Color:=clRed; canvas.Pen.Width:=1; Canvas.Brush.Style:= bsDiagCross; Canvas.Brush.Color := clBlue; TexteTexture(TonTexte,10,HauteurTexte,Canvas); //troisime, avec une texture Canvas.Brush.Bitmap :=Texture; TexteTexture(TonTexte,10,2*HauteurTexte,Canvas); Canvas.Brush.Bitmap :=nil; ////////////////////encore plus fort... //Dimensions GetTextExtentPoint32(Canvas.Handle, PChar(TonTexte), Length(TonTexte), size); //quatrime demo canvas.Pen.Color:=clBlack; canvas.Pen.Width:=1; Canvas.Brush.Style:= bsclear; Canvas.Brush.Color := form1.Color; canvas.Pen.width:=3; //Avant de dessiner le texte BeginPath(Canvas.Handle); SetBkMode(Canvas.Handle, TRANSPARENT); //dessiner le texte Canvas.TextOut(10,3*HauteurTexte, TonTexte); //Aprs le dessin : EndPath(Canvas.Handle); SelectClipPath(Canvas.Handle, RGN_DIFF); i:=3*HauteurTexte; while (i < (3*HauteurTexte + size.cy)) do begin Canvas.MoveTo(11, i); Canvas.LineTo(8+size.cx, i); inc(i,6); end;
- 231 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

//Cinquime demo canvas.Pen.Color:=clBlack; canvas.Pen.Width:=1; Canvas.Brush.Style:= bsclear; Canvas.Brush.Color := form1.Color; canvas.Pen.width:=3; //Avant de dessiner le texte BeginPath(Canvas.Handle); SetBkMode(Canvas.Handle, OPAQUE); //dessiner le texte Canvas.TextOut(10,4*HauteurTexte, TonTexte); //Aprs le dessin : EndPath(Canvas.Handle); SelectClipPath(Canvas.Handle, RGN_DIFF); i:=4*HauteurTexte+1; while (i < (4*HauteurTexte + size.cy)) do begin Canvas.MoveTo(11, i); Canvas.LineTo(8+size.cx, i); inc(i,6); end; //Sixime demo canvas.Pen.Color:=clBlack; canvas.Pen.Width:=1; Canvas.Brush.Style:= bsclear; Canvas.Brush.Color := form1.Color; //Avant de dessiner le texte BeginPath(Canvas.Handle); SetBkMode(Canvas.Handle, Transparent); //dessiner le texte Canvas.TextOut(10,5*HauteurTexte, TonTexte); //Aprs le dessin : EndPath(Canvas.Handle); MyRgn:=PathToRegion(Canvas.Handle); SelectClipRgn(Canvas.Handle,MyRgn); i:=0; for i:=0 to 90 do begin x:=round(cos(i*pi/180)*size.cx); y:=round(sin(i*pi/180)*size.cx); Canvas.MoveTo(11,5*HauteurTexte+1); Canvas.LineTo(11+x,5*HauteurTexte+1+y); end; SelectClipRgn(Canvas.Handle,0); DeleteObject(MyRgn); end; finally Texture.Free; end; end; end.

- 232 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Langage > Types de donnes > La classe TStream Comment crire et/ou lire un type string dans un TStream ?
Auteurs : Pedro - waskol Pour crire ou lire des donnes de longueur fixe dans un flux (TFileStream, TMemoryStream, bref toutes les classes drives de TStream), comme par exemple des types integer, double, boolean ou des types string de longueur fixe, ou mme des types enregistrement (record) simples dclars comme ceci :
type TUnEnregistrement=record Nom,Prenom,Pseudo:string[20]; Age:integer; InscritAuClubDVP:Boolean; end; ... var i:integer; d:double; b:boolean; s:string[10]; UnEnregistrement:TUnEnregistrement;

...la lecture et l'criture dans un flux pourra toujours s'effectuer de faon similaire selon ce schma :
//Ecriture UnStream.Write(<variable>,SizeOf(<variable ou bien type de la variable>)); //Lecture UnStream.Read(<variable>,SizeOf(<variable ou bien type de la variable>));

Par exemple pour crire nos donnes dans un flux :


//Ecriture UnStream.Write(i,SizeOf(integer)); UnStream.Write(d,SizeOf(double)); UnStream.Write(b,SizeOf(boolean)); UnStream.Write(s,SizeOf(s)); UnStream.Write(UnEnregistrement,SizeOf(TUnEnregistrement));

Et pour les lire :


//Lecture UnStream.Read(i,SizeOf(integer)); UnStream.Read(d,SizeOf(double)); UnStream.Read(b,SizeOf(boolean)); UnStream.Read(s,SizeOf(s)); UnStream.Read(UnEnregistrement,SizeOf(TUnEnregistrement));

Pour ce qui est des donnes de longueur variable (tableau dynamique, string), Delphi ne propose pas de mthode standard pour le faire, c'est donc chacun d'en imaginer une ou bien de suivre l'exemple de la mthode propose ci-dessous. L'astuce consiste lors de l'criture des donnes : 1 2 de fournir dans un premier temps un entier qui reprsente le nombre de donnes (Nbre d'lment d'un tableau, nombre de caractres, etc...). puis les donnes proprement dites.

- 233 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Pour la lecture : 1 2 3 lire le nombre de donnes. Adapter les dimension de la variable qui va recevoir les donnes en fonction de la valeur lue l'tape 1) lire les donnes proprement dites.

Pour une chaine de caractres, nous vous proposons le code suivant :


{crire une chane de caractres depuis le flux} procedure WriteStreamString(Stream : TStream; UneChaine : string); var LongueurChaine : integer; begin {obtenir la longueur de la chane de caractres} LongueurChaine := Length(UneChaine); {crire cette longueur dans le flux} Stream.Write(LongueurChaine,SizeOf(integer)); {crire les caractres (tous d'un coup !)} Stream.Write(UneChaine[1], LongueurChaine); end; {retourne une chane de caractres depuis le flux} function ReadStreamString(Stream : TStream) : string; var LongueurChaine : integer; begin {obtenir la longueur de la chane de caractres} Stream.Read(LongueurChaine,SizeOf(integer)); {Redimensionner la chaine pour allouer la mmoire ncessaire} SetLength(Result, LongueurChaine); {Lire les caractres (Tous d'un coup)} Stream.Read(Result[1], LongueurChaine); end; ... //Utilisation de nos fonctions et procdures var s:string; AStream:TMemoryStream; begin AStream:=TMemoryStream.Create; ... s:='www.developpez.com, c''est gnial !'; //Ecriture WriteStreamString(AStream,s); ... //Lecture s:=ReadStreamString(AStream); ... AStream.Free; end;

Il existe aussi la mthode qui utilise les chanes AZT (A Zro Terminal). Pour l'utiliser, il faut ajouter le caractre #0 la fin de la chaine de caractres au moment de l'criture. Lors de la lecture, il suffit alors de parcourir le stream jusqu' ce que l'on tombe sur #0. Fonction de lecture :
function LitStringDansStream(Stream:TStream):string; var c:char;
- 234 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin result:=''; repeat stream.Read(c,1); if c <> #0 then result:=result+c; until c=#0; end;

Procdure d'criture
procedure EcritStringDansStream(Stream: TStream;Chaine:string); var i:integer; c:char; begin if length(Chaine)>0 then for i:=1 to length(Chaine) do begin c:=Chaine[i]; stream.Write(c,1); end; c:=#0; stream.Write(c,1); end;

- 235 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Langage > Compilation Pourquoi mon projet ne se compile pas ?
Auteur : NotANumber Il peut arriver que votre projet ne se compile pas pourtant le code semble correct. Cela peut tre d au fait que le nom du rpertoire de votre projet contienne des accents. Il faut donc tout simplement utiliser des caractres non accentus dans le nom du rpertoire pour corriger le problme.

Comment raliser de la compilation conditionnelle ?


Auteur : Nono40 La compilation conditionnelle est la compilation d'une partie du code ou non suivant des conditions. Ces conditions sont dtermines par une srie de {$IFDEF ... } ... {$ENDIF} portant sur des identificateurs dclars par {$DEFINE} ou {$UNDEF}. Les utilisations courantes sont les suivantes : Ajout de messages pour la mise au point :
{$DEFINE MISEAUPOINT} procedure TForm1.Button1Click(Sender: TObject); Var i:Integer; begin i:=FaitUnCalcul; {$IFDEF MISEAUPOINT} { Cette ligne n'est compile que pour la mise au point } ShowMessage(IntToStr(i)); {$ENDIF} TraiteLeCalcul(i); end;

Compilation suivant les version de Delphi Des identificateurs sont prdfinis pour chaque version de Delphi, ce qui permet de compiler diffremment suivant la version.
uses Windows, Messages, SysUtils, Classes, Controls, Forms, StdCtrls, AppEvnts, {$IfDef VER130} DsgnIntf; { Pour Delphi 5 } {$Else} DesignEditors, DesignIntf; { Pour Delphi 6 et 7 } {$EndIf}

VER80 est prdfini pour Delphi1 VER90 est prdfini pour Delphi2 VER100 est prdfini pour Delphi3 VER120 est prdfini pour Delphi4 VER130 est prdfini pour Delphi5 VER140 est prdfini pour Delphi6 VER150 est prdfini pour Delphi7 VER160 est prdfini pour Delphi8 VER170 est prdfini pour Delphi2005 Compilation suivant l'OS Cet exemple est tir de la dfinition du type TSearchRec utilis par FindFirst/ FindNext.
TSearchRec = record Time: Integer;
- 236 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Size: Integer; Attr: Integer; Name: TFileName; ExcludeAttr: Integer; {$IFDEF MSWINDOWS} FindHandle: THandle platform; FindData: TWin32FindData platform; {$ENDIF} {$IFDEF LINUX} Mode: mode_t platform; FindHandle: Pointer platform; PathOnly: String platform; Pattern: String platform; {$ENDIF} end;

Typologie des codes d'erreurs interne de Delphi


Auteur : Delphi-fan En dehors des messages d'erreurs de compilation classiques, Delphi produit quelquefois des messages d'erreur interne. Ils sont difficiles rsoudre car ils ne sont pas tous documents loin s'en faut, mais il peut tre utile de se faire une ide de l'origine du problme en faisant attention la premire lettre du code du message : B : debugger BC : debugger BR : browser C : codegen CM : command line version of the compiler D : parser DB : debugger DBG: debug info output DM : IDE version of the compiler E : parser EO : debugger/evaluator FN : filename / pathname parsing GH : HPP generator I : code generator IN : inspectors L : linker LI : BPI file writing LO : object file loading M : memory allocation MA : name mangling MB : multi-byte (MBCS) support O : object (OMF) file handling P : package managment R : resource writing S : scanner ST : standard procedure handling SY : symbol table T : code generator TI : RTTI generator U : parser UD : IDE version of the compiler

- 237 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

UI : error handling URW: DCU reading/writing W : Object file (OMF) writing X : code generator

Dans la plupart des cas la fermeture de Delphi, la suppression des fichiers .DSM et la construction complte de projet permettent de corriger cette erreur. Le numro donn en plus, correspond un numro de ligne interne au compilateur. Seul Borland peut exploiter cette information. lien : Rsolution des erreur internes

Pourquoi Delphi rclame un .pas alors que je n'ai qu'un .dcu ?


Auteur : Pierre Castelain Les fichiers .dcu de Delphi correspondent la version compile des units (.pas). Les spcifications de Borland stipulent que ces fichiers ne sont pas compatibles d'une version l'autre de Delphi. Lorsque Delphi vous rclame un fichier .pas alors que vous n'avez que le .dcu, cela signifie que ce .dcu a t compil avec une version diffrente de la vtre. Vous devez donc obtenir une version de votre composant spcifique votre version de Delphi. Note : lorsque l'on parle ici de version de Delphi, il s'agit du numro de version et non du type (personnel, entreprise, etc).

Comment rsoudre le problme des rfrences circulaires ?


Auteur : Laurent Dardenne Quand deux fiches doivent se rfrencer mutuellement, on ne doit pas placer les deux clauses uses dans la section interface de leur fichier unit respectif. Cela provoque l'erreur "Rfrence circulaire" la compilation. Dans le cas le plus simple de deux units mutuellement dpendantes, cela signifie que les units ne peuvent se rfrencer mutuellement dans la clause uses de leur section interface. Ainsi, l'exemple suivant produit une erreur de compilation : Premire unit
Unit Unit1; interface uses Unit2; ... end;

Seconde Unit
unit Unit2; interface uses Unit1; // Impossible dans ce cas d'utilisation ... end;

Pour viter une telle erreur, utilisez l'une des mthodes suivantes :
- 238 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Placez les deux clauses uses, avec les identificateurs d'units, dans la section implementation de leur fichier unit respectif, c'est ce que fait la commande du menu Fichier|Utiliser l'unit. Placez l'une des clauses uses dans la section interface et l'autre dans la section implementation.

Utilison la solution numro 2 : Les deux units peuvent sans problme se rfrencer mutuellement si l'une des rfrences est dplace dans la section implmentation : Premire unit, elle n'est pas modifie.
Unit Unit1; interface uses Unit2; ... end;

Seconde Unit, on dplace la dclaration de la clause uses dans la partie implementation.


unit Unit2; interface ... implementation uses Unit1; //Modification ... end;

Afin de rduire les risques de rfrences circulaires, il est prfrable chaque fois que cela est possible de lister les units dans la clause uses de l'implmentation. C'est uniquement si des identificateurs d'une autre unit sont utiliss dans la section interface qu'il est ncessaire d'indiquer cette unit dans la clause uses de l'interface.

Comment tester les versions de Delphi avec des directives de compilation ?


Auteur : manuker Les versions du compilateur Delphi peuvent tre testes avec des directives de compilation. VER80 -> Delphi 1 VER90 -> Delphi 2 VER100 -> Delphi 3 VER120 -> Delphi 4 VER130 -> Delphi 5 VER140 -> Delphi 6 VER150 -> Delphi 7 VER160 -> Delphi 8 VER170 -> Delphi 2005

Exemple : pour faire une action diffrente pour Delphi 5 seulement:


{$IFDEF VER130} a faire si Delphi5 {$ELSE}
- 239 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

a faire sinon {$ENDIF}

Mais on a souvent besoin de savoir si le compilateur a une version suprieure une certaine version! On utilise pour cela la constante RTLVersion dclare dans System.pas. Exemple : pour tester la version du compilateur Delphi sur une plage :
{$IF RTLVersion >= 13} //si delphi5 ou suprieur a faire si Delphi >= Delphi5 {$ELSE} a faire sinon {$IFEND}

RTLVersion est dfinie dans System.pas Exemple pour Delphi7 :


const RTLVersion = 15.00;

Comment simuler des variables de classe ?


Auteur : Laurent Dardenne A la diffrence des mthodes de classes il n'existe pas de variables de classes en Delphi. Pour les simuler on doit donc dclarer des mthodes de classe associes une variable globale.
// Solution propose par Cpdump, Sjrd et Nono40 interface type TMaClasse = class public class function GetDefaultValue : Char; class procedure SetDefaultValue(New : Char); end; implementation var TMaClasse_DefaultValue : Char = ' '; class function TMaClasse.GetDefaultValue : Char; begin Result := TMaClasse_DefaultValue; end; class procedure TMaClasse.SetDefaultValue(New : Char); begin TMaClasse_DefaultValue := New; end; end.

- 240 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Vous pouvez combiner cette approche en utilisant des proprits. Gardez l'esprit que ce code reste un pis-aller, tant donn que l'on accde une proprit d'une instance non instancie. Si jamais le code de la classe change et que la mthode n'est plus une mthode de classe alors votre code risque de planter...

Comment enregistrer une proprit de type tableau/pointeur/etc dans les dfm ?


Auteur : sjrd La solution consiste en l'utilisation d'une seule mthode hrite de TPersistent : DefineProperties. Il faut la rimplmenter et y appeler autant de fois que ncessaire la mthode DefineProperty/DefineBinaryProperty de l'objet TFiler pass en paramtre. DefineProperty doit tre utilis si vous devez crire/lire des types de base. DefineBinaryProperty doit tre utilis si vous devez crire vos proprits dans des flux.
type TMonPersistent = class(TAncetre) // TAncetre hrite de TPersistent private ... procedure LoadMyProp1(Reader : TReader); procedure SaveMyProp1(Writer : TWriter); procedure LoadMyProp2(Stream : TStream); procedure SaveMyProp2(Stream : TStream); protected ... procedure DefineProperties(Filer : TFiler); override; public ... published ... end;

Voici la mthode DefineProperties de notre exemple. On dfinit une proprit virtuelle MyProp1 qui va tre lue/crite avec des objets TReader/TWriter ainsi qu'une autre MyProp2 qui va tre lue/crite depuis/vers des flux.
procedure TMonPersistent.DefineProperties(Filer : TFiler); begin inherited; // Surtout ne pas oublier la mthode hrite ! Filer.DefineProperty('MyProp1', LoadMyProp1, SaveMyProp2, True); Filer.DefineBinaryProperty('MyProp2', LoadMyProp2, SaveMyProp2, True); end;

Les quatre autres procdures se contentent de lire et d'crire le contenu des proprits :
procedure TMonPersistent.LoadMyProp1(Reader : TReader); begin // Lire avec les mthodes de TReader end; procedure TMonPersistent.SaveMyProp1(Writer : TWriter); begin // Ecrire avec les mthodes de TWriter end; procedure TMonPersistent.LoadMyProp2(Stream : TStream); begin // Lecture depuis Stream end; procedure TMonPersistent.SaveMyProp2(Stream : TStream); begin
- 241 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

// Ecriture dans Stream end;

Comment crer une fentre partir de son nom de classe ?


Auteur : Pascal Jankowski En regardant de prs dans l'unit Classes vous trouverez : - procedure RegisterClass(AClass: TPersistentClass); Cette procdure permet de recenser une classe d'objet persistant pour que le type de classe puisse tre retrouv. - function FindClass(const ClassName: string): TPersistentClass; Cette fonction permet de localiser un type de classe par son nom. FindClass recherche les classes connues du systme d'enregistrement. Mcanisme: En appelant RegisterClass, la classe sera recense par le systme d'enregistrement de la VCL. La mthode FindClass tente de localiser dans le systme d'enregistrement, la classe dont le nom est pass en paramtre. Si la classe n'est pas touve alors FindClass dclenche une exception. Le code ci-dessous met en oeuvre ce mcanisme et vous permet de retrouver une fentre par son nom de classe. Recommandations: Dans un nouveau projet, crez deux nouvelles fiches TForm2 et TForm3 respectivement dans Unit2 et Unit3. Sur TForm1 (Unit1), placez un TEdit et un TButton. Remplacez le code de l'unit1 par celui fourni ci-dessous. Utilisation: A l'excution renseignez le Tedit avec soit la valeur TForm2, soit la valeur TForm3 puis validez en cliquant sur le TButton.
unit Unit1; interface uses Unit2, unit3, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin RegisterClass(Tform2); RegisterClass(Tform3);
- 242 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end; procedure TForm1.Button1Click(Sender: TObject); var f : Tformclass; begin try f := tformclass(findClass(edit1.text)); with f.create(self) do show; except raise; end; end; end.

Comment rduire la taille de son excutable ?


Auteur : Pedro Il existe plusieurs mthodes pour allger un excutable sous Delphi. Il est vident qu'il n'existe pas de solution miracle mais quelques options de compilation permettent de gagner quelques Kilo octets superflus. Nous ne verrons ici que les mthodes les plus courantes. - Limiter la taille des ressources images: Une TImageList avec des Bitmap de 500x500, a grossit vite... Donc prfrez des types d'images moins lourds (jpg, png, gif, etc.). Il existe de plus des descendants de TImageList qui prennent en charge ces formats. Plusieurs paramtres dans les options du projet spcifient si le compilateur doit inclure ou non des donnes l'excutable. Certaines peuvent tre dsactives. Ces options se trouvent dans Projet\Options... onglet Linker. - TD32: {$D+}L'aide de Delphi a crit:
Active ou dsactive la gnration d'informations de dbogage. Ces informations se prsentent sous la forme de tables de numros de lignes propres chaque procdure, qui contiennent les adresses du code correspondant chaque ligne du texte source. Pour les units, les informations de dbogage sont enregistres dans le fichier unit, avec le code objet de l'unit. Elles augmentent la taille des fichiers unit et l'espace mmoire occup lors de la compilation des programmes utilisant cette unit, mais n'affectent ni la taille ni la vitesse d'excution du programme excutable.

-Symbole locaux : {$L+}L'aide de Delphi a crit:


Active ou dsactive la gnration d'informations concernant les symboles locaux. Il s'agit des noms et types de toutes les variables et constantes locales au module, c'est--dire tous les symboles de la partie implmentation du module (y compris les symboles des procdures et fonctions). Pour les units, les informations concernant les symboles locaux sont stocks dans le fichier unit avec le code objet de l'unit. Ces informations augmentent la taille des fichiers unit et l'espace mmoire ncessaire la compilation des programmes utilisant l'unit.

- Utiliser DCUIL/DCU de dbogage: L'aide de Delphi a crit:


Les DCUIL/DCU de dbogage contiennent des informations de dbogage et sont construits avec les cadres de piles. Lorsque
- 243 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

cette option est coche, le compilateur ajoute le chemin des DCUIL/DCU de dbogage au dbut du chemin de recherche de l'unit

Dans l'onglet packages: - Construire avec les paquets d'excution : Si cette option est dcoche, tous les packages ncessaires l'excution de l'application seront intgrs au fichier. Sinon, le fichier sera beaucoup plus petit mais ncessitera, pour son dploiement, de fournir les fichiers .bpl qu'il utilise

Message d'erreur : L'unit X a t compile avec une version diffrente de Z.Y


Auteur : Laurent Dardenne Sur d'anciens projets, la compilation peut chouer en indiquant un message d'erreur dans la clause Uses d'une unit:
[Erreur fatale] info.pas(8): L'unit XXXX a t compile avec une version diffrente de ZZZ.yyyy exe System.RTLVersion

Le problme est le suivant : Il existe, dans le rpertoire de l'unit en cause, un fichier .dcu compil avec une autre version de Delphi que celle que vous utilisez actuellement. La prsence de ces units compiles provoque des conflits que le compilateur ne sait rsoudre. La suppression des fichiers .dcu suivi d'une recompilation du projet rsoud ce problme. A noter que si vous ne disposez pas des fichiers sources, cas de composants shareware ou freeware, il n'est pas possible de rsoudre ce problme.

Comment dsactiver localement une directive de compilation ?


Auteur : Laurent Dardenne Certaines directives de compilation ayant une porte locale il reste possible de contrler leurs activation ou dsactivation pour une portion de code. Prenons ici le cas de la directive I, l'aide en ligne de Delphi nous indique : La directive bascule $I active ou dsactive la gnration automatique du code vrifiant le rsultat des appels aux procdures d'E/S. Si une procdure d'E/S renvoie un code retour d'E/S non nul alors que cette bascule est active, une exception EInOutError est dclenche (ou le programme termine son excution si la gestion des exceptions est dsactive). Lorsque cette bascule est dsactive, le programme doit tester les codes retour des procdures d'E/S l'aide de la fonction IOResult. Dans notre exemple, les directives de compilation du projet active la directive $I, elle sera donc utilise par tout le code. Mais ici, on souhaite pouvoir tester le rsultat de la fonction IOResult au lieu de dclencher une exception et seulement pour cette procdure. On donc doit dsactiver provisoirement cette directive afin de ne pas avoir d'effet de bord sur le reste du code.
Procedure Log(Chaine:String; LogDate : Boolean); var F : Textfile; S : String; begin Assignfile(F, 'C:\Temp\Test.txt'); {$IFOPT I+} // Si la directive I est active {$DEFINE I_Plus} // Alors dfini le symbole (local) {$I-} // Et dsactive la directive
- 244 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

{$ENDIF} Append(F); //Section de code concern {$IFDEF I_Plus} // Si la directive I tait prcdemment active {$I+} // Alors on ractive la directive {$ENDIF} {$UNDEF I_Plus} //On supprime le symbole prcdemment dfini if IOresult <> 0 then Rewrite(F); Try if LogDate then S:=FormatDateTime('DDDD DD MMMM YYYY HH:NN:SS',Now) else S:=''; Writeln(F,S+' '+Chaine); Finally Closefile(F); end; end;

Il est bien videment possible d'inverser la logique, par exemple :


{$IFOPT I-} // Si la directive I est dsactive {$DEFINE I_Moins} // Alors dfini le symbole (local) {$I+} // Et active la directive {$ENDIF} Append(F); //Section de code concern {$IFDEF I_Moins} // Si la directive I tait prcdemment dsactive {$I-} // Alors on dactive la directive {$ENDIF} {$UNDEF I_Moins} //On supprime le symbole prcdemment dfini

- 245 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Langage > Divers Comment remplacer l'instruction for each de VB ?
Auteurs : Laurent Dardenne - Nono40 L'instruction For Each permettant l'numration d'une collection n'est pas disponible en Delphi Win32. Si dans la plupart des cas les collections sont indexables via un ordinal de 1 Count, certaines ne le sont pas. Il est alors indispensable d'utiliser un numrateur de collection. Les collections disposent d'une mthode retournant un objet d'numration transtypable en IEnumVariant. Cet objet dispose d'une mthode Next permettant d'extraire un certain nombre d'lments de la collection. Next avance automatiquement dans la collection jusqu' la fin. Il faut tester la valeur retourne par Next afin de savoir si la fin est atteinte. La dclaration de IEnumVariant est la suivante :
IEnumVariant = interface(IUnknown) ['{00020404-0000-0000-C000-000000000046}'] function Next(celt: LongWord; var rgvar : OleVariant; out pceltFetched: LongWord): HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; function Reset: HResult; stdcall; function Clone(out Enum: IEnumVariant): HResult; stdcall; end;

Le paramtre rgVar contenant l'item de collection en retour doit tre de type OleVariant. Il doit tre transtyp en lment de type IDispatch avant d'tre transtyp en lment de base de la collection. A titre d'exemple, le code suivant permet d'extraire la liste des langues de Word dfinies dans la collection Languages.
// Obtention de la liste des langues Langs:=Word.Languages; // On va utiliser l'numrateur de collection fourni IEnum:=Langs._NewEnum as IEnumVariant; While IEnum.Next(1,Element,Nombre)=S_OK Do Begin // Indispensable ici de passer par un IDisp intermdiaire... IDisp := Element; Langue := IDisp As Language; // MAJ de la liste With Liste.Items.Add Do Begin Caption := IntToStr(Langue.ID); SubItems.Add(Langue.Name); SubItems.Add(Langue.NameLocal); If Langue.ActiveSpellingDictionary=Nil Then SubItems.Add('Non') Else SubItems.Add('Oui'); If Langue.ActiveGrammarDictionary=Nil Then SubItems.Add('Non') Else SubItems.Add('Oui'); End; End;

Une alternative au code prcdent :


procedure WordlLangage; var Word : Variant; Element: OleVariant; IEnum : IEnumVariant; Langue : Variant;
- 246 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Nombre : LongWord; begin Word := CreateOleObject('Word.Application'); // Obtention de la liste des langues IEnum:=IUnKnown(Word.Languages._NewEnum) as IEnumVariant; // Puis utilisation de l'numrateur de collection fourni While IEnum.Next(1,Element,Nombre)=S_OK Do Begin // Il est indispensable de transtyper Element Langue := IUnknown(Element) As Language; Writeln(IntToStr(Langue.ID),' ',Langue.Name,' ',Langue.NameLocal); End; Word.Quit; Word := unassigned; end;

Depuis sa version 2005, Delphi supporte, pour .NET et Win32, l'itration sur des lments d'une collection (iteration over containers). Voir aussi. lien : lien : More automation in Delphi L'interface IEnumVariant ( uniquement Delphi 2005 et >)

Qu'est-ce que la VMT ou TMV ?


Auteurs : Olivier Lance - Hdd34 - Laurent Dardenne - Mac LAK - Tourlourou Afin de pouvoir appeler la mthode approprie au moment souhait, un objet doit s'appuyer sur une liste de ses mthodes virtuelles : la VMT ou Virtual Methods Table (Table des Mthodes Virtuelles). Cette table est mise en place par le constructeur d'un objet dans le cas o il dclare une mthode virtuelle. Aprs l'appel du constructeur l'instance reue est en fait un pointeur vers une zone mmoire qui contient d'abord l'adresse de la VMT de la classe, puis les adresses des champs de sa classe de base, stockes dans l'ordre de leur dclaration comme une suite contigu de variables. Les champs sont toujours aligns et correspondent un type unpacked record. Tous les champs hrits d'une classe anctre sont stocks avant les nouveaux champs dfinis dans la classe descendante, la dernire adresse contient donc le dernier champ dclar dans la classe. Aux offsets positifs une VMT se compose d'une liste de pointeurs de mthodes, un par mthode virtuelle dfinie par l'utilisateur, dans l'ordre de dclaration du type de la classe. Aux offsets ngatifs, une VMT contient un certain nombre de champs utiliss en internes. On peut donc dire que le type d'un objet est un pointeur sur la VMT. Toute classe possde sa propre VMT, conservant toujours un lien avec la VMT de son anctre (hirarchie de classe). Il y a donc une copie de la VMT chaque fois que vous hritez d'une classe. La classe TObject dclare plusieurs mthodes et une proprit cache pour stocker une rfrence la classe de l'objet. Cette proprit contient un pointeur vers la VMT de la classe. Chaque classe a une VMT unique et tous les objets de cette classe partagent la VMT de la classe. C'est--dire que l'hritage d'une classe partir d'une autre implique l'hritage de la VMT complte de cette dernire, les nouvelles mthodes tant ajoutes en fin de table. La VMT d'un objet contient toutes les mthodes virtuelles de ses anctres comme celles qu'il dclare, les mthodes virtuelles emploient donc plus de mmoire que des mthodes dynamiques, bien qu'elles s'excutent plus rapidement. Lorsqu'un appel une mthode virtuelle est effectu, l'objet recherche dans sa VMT s'il trouve la mthode recherche. Si c'est le cas, alors il utilise l'adresse enregistre et excute la mthode. Sinon, il parcourt la VMT de son anctre direct et ainsi de suite jusqu' l'anctre le plus loign dans la hirarchie. De mme, lorsqu'une mthode surcharge fait appel la mthode anctre, une recherche est effectue en partant cette fois-ci de la VMT du premier anctre.

- 247 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Ceci est d au fait qu'une mthode virtuelle est lie au moment de son excution et pas au moment de la compilation. La VMT est dtruite par le destructeur lorsque celle-ci n'a plus lieu d'exister. Une rfrence de classe est implmente comme un pointeur vers la VMT de la classe. Traduction d'un tableau extrait d'un article de Brian Long : Offset...Nom de constante.......Description --------------------------------------------------------------------------------------------------------------76......vmtSelfPtr..................Adresse de la 1re entre de la VMT si elle existe sinon du nom de classe * -72......vmtIntfTable...............Adresse de la table des interfaces implmentes * -68......vmtAutoTable..............Adresse de la section des 'class automated' (Delphi 2) * -64......vmtInitTable...............Adresse de la table des champs requrant une initialisation * -60......vmtTypeInfo...............Adresse des informations RTTI * -56......vmtFieldTable..............Adresse de la table des champs publis (published) * -52......vmtMethodTable...........Adresse de la table des mthodes publies (published) * -48......vmtDynamicTable.........Adresse de la DMT (table des mthodes dynamic) * -44......vmtClassName.............Adresse du nom de classe, chane de caractres/string -40......vmtInstanceSize...........Taille en octet d'une instance d'objet -36......vmtParent....................Adresse de la VMT de la classe anctre * -32......vmtSafeCallException....Adresse de la mthode virtuelle, SafeCallException * -28......vmtAfterConstruction.....Adresse de la mthode virtuelle, AfterConstruction -24......vmtBeforeDestruction.....Adresse de la mthode virtuelle, BeforeDestruction -20......vmtDispatch...................Adresse de la mthode virtuelle, Dispatch -16......vmtDefaultHandler.........Adresse de la mthode virtuelle, DefaultHandler -12......vmtNewInstance............Adresse de la mthode virtuelle, NewInstance -8......vmtFreeInstance.............Adresse de la mthode virtuelle, FreeInstance -4......vmtDestroy....................Adresse du destructeur virtuel, Destroy Les entres indiques * sont nil si elles ne sont pas renseignes. Cette disposition est compatible avec une v-table de C++ et avec COM. La VMT contient l'adresse des mthodes virtuelles (dclares avec la directive virtual ou override) mais elle n'inclut pas les adresses dfinies dans TObject (SafeCallException, AfterConstruction, BeforeDestruction, expdition, DefaultHandler, NewInstance, FreeInstance et le destructeur destroy) qui sont renseignes avant la VMT. Au lieu d'employer la directive virtual, vous pouvez galement employer la directive dynamic. La smantique est identique, mais l'implmentation est diffrente. La recherche d'une mthode virtuelle dans une VMT est rapide car le compilateur gnre un index directement dans la VMT. Pour terminer sachez que la directive override remplace, dans la VMT, l'adresse originale de la mthode concerne par l'adresse de cette nouvelle mthode. Voir aussi le source de l'unit :
C:\Program File\Borland\BDS\3.0\source\Win32\rtl\sys\System.pas

Note : Puisque toutes les VMT doivent tre stockes dans le mme segment de donnes, les objets crs dans des DLL sont accompagns de leur propre VMT mais elles sont stockes dans le segment de donnes de la DLL. lien : Qu'est-ce que la DMT ?

Qu'est-ce que la DMT ?


Auteurs : Olivier Lance - Laurent Dardenne Les mthodes dynamiques sont fondamentalement des mthodes virtuelles mais avec un systme de rpartition (dispatching system) diffrent.

- 248 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

La diffrence est que la DMT (Dynamic Method Table ou Table dynamique de mthode) n'est pas compltement copie chaque fois que vous instanciez un objet. Le compilateur affecte un nombre unique chaque mthode dynamique et associe ces nombres avec des adresses de mthodes afin de construire un tableau dynamique de mthodes (DMT). la diffrence de la VMT, la DMT d'un objet contient seulement les mthodes dynamiques qu'il dclare, et cette mthode se fonde sur la DMT de son anctre pour le reste de ses mthodes dynamiques. Cette approche fait que les DMT sont plus lentes que les VMT mais rduit leur occupation mmoire en vitant de recopier la VMT dans son intgralit chaque fois que vous hritez d'un objet. Elles prennent plus de temps lors de l'appel parce qu'il se peut que vous deviez parcourir les DMT de plusieurs anctres avant de trouver l'adresse d'une mthode dynamique particulire. Quand une mthode dynamique est appele elle est d'abord recherche dans la DMT de l'objet lui-mme. Si elle n'est pas trouve elle est recherche dans la DMT de son anctre direct et ainsi de suite. L'utilisation de mthodes dynamiques ne prend son sens que dans quelques cas spciaux (objets avec beaucoup de mthodes dynamiques/virtuelles, par exemple une centaine, et ayant de nombreux hritages). En gnral vous devriez vous en tenir l'utilisation de mthodes virtuelles. Citation de Holger Lembke : Les DMT (Dynamic Methods Table) sont en ceci diffrentes qu'elles ne rfrencent plus toutes les mthodes des anctres. La DMT est incluse dans la VMT (voir le champ "Adresse de la DMT" dans la structure de la VMT) La DMT se prsente ainsi : Pointeur sur la DMT prcdente (longint) index (longint) offset (longint) Nombre de mthodes dans la DMT (word) 1. Index mthode (word) n. Index mthode (word) 1. Pointeur mhode (longint) n. Pointeur mthode (longint)

Pour le stockage d'une mthode on utilise en gros la procdure suivante : Chaque mthode reoit un numro. Dans la DMT apparat d'abord le nombre de mthodes stockes, puis leurs index et enfin leurs pointeurs. Ainsi, si l'on a besoin d'une mthode, on connait son numro. Avec celui-ci on cherche l'index de la mthode dans la DMT et ensuite on trouve son pointeur. Exemple : le numro de la mthode a t trouv l'index 3 -> Son pointeur se trouve en "3. Pointeur mthode" lien : Qu'est-ce que la VMT ou TMV ?

Comment dupliquer un objet ?


Auteur : sjrd En Delphi, il n'existe pas de moyen natif pour dupliquer un objet. Pour remdier ce problme, il existe une classe, TPersistent, dont descendent toutes les classes susceptibles de devoir tre dupliques. TPersistent est une classe abstraite enfant de TObject et parente de TComponent, TStrings et autres classes bien connues de la VCL.

- 249 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Cette classe dclare une mthode Assign virtuelle (virtual) publique et une mthode AssignTo protge (protected). L'implmentation de Assign dans TPersistent appelle la mthode AssignTo de l'objet en paramtre avec Self en paramtre. La mthode AssignTo dclenche une exception EConvertError avec comme message "Impossible d'assigner %s %s" (avec les %s les noms des classes de source et de destination). partir de l, il est possible, lorsqu'on cre une classe descendante de TPersistent, de sucharger (override) ces mthodes afin d'assigner correctement un objet un autre. Par exemple, si vous voulez crer une classe TVoiture dont les objets puissent tre dupliqus, il faut la faire hriter de TPersistent, et surcharger la mthode Assign afin de faire l'assignation :
procedure TVoiture.Assign(Source : TPersistent); begin if Source is TVoiture then with TVoiture(Source) do begin Self.FMarque := FMarque; Self.FCouleur := FCouleur; end else inherited; end;

Aprs, crons une classe descendante de TVoiture, par exemple TAutreVoiture avec une cylindre et un type de carburant, il suffit de re-surcharger la mthode Assign :
procedure TAutreVoiture.Assign(Source : TPersistent); begin inherited; if Source is TAutreVoiture then with TAutreVoiture(Source) do begin Self.FCylindree := FCylindree; Self.FCarburant := FCarburant; end; end;

Sachez ce propos que tous les composants de la VCL surchagent correctement Assign et/ou AssignTo afin de pouvoir se copier.

Comment appeler une procdure en connaissant son nom ?


Auteurs : delphiprog - Nono40 Les procdures n'tant pas des mthodes d'objet il n'est pas possible d'utiliser RTTI pour en trouver les adresses. Cependant il existe une ruse pour forcer le compilateur garder une trace des noms des procdures et fonctions voulues afin que l'on puisse les appeler par leur nom. Cette mthode consiste exporter les noms de procdure comme on le ferait dans une dll. Une fois les fonctions exportes on utilise la mme mthode pour les appeler que la mthode utilise pour l'appel d'une fonction de dll.
Function Additionner(x, y: Integer): Integer; Begin Result:=x+y; End; Function Soustraire(x, y: Integer): Integer; Begin Result:=x-y; End; Function Multiplier(x, y: Integer): Integer; Begin

- 250 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Result:=x*y; End; Exports Additionner,SousTraire,Multiplier; procedure TForm1.Button1Click(Sender: TObject); var H: HModule; F: Function(X,Y:Integer):Integer; begin H := GetModuleHandle(nil); if H <> 0 then begin F := GetProcAddress(H, PChar(Edit1.Text)); if Assigned(F) then ShowMessage(IntToStr(F(SpinEdit1.Value,SpinEdit2.Value))) Else ShowMessage('Fonction non trouve !'); End; // SetWindowLong(Memo1.Handle,GWL_STYLE,GetWindowLong(Memo1.Handle,GWL_STYLE)Or ES_UPPERCASE); end;

Notez l'ajout de la clause Exports pour dclarer les fonctions comme on le ferait dans une dll.

Comment appeler une mthode en connaissant son nom ?


Auteurs : Mac LAK - Nono40 Lorsque le code source est compil, chaque mthode cre occupe un emplacement bien prcis en mmoire. Pour appeler une mthode donne, il faut donc pouvoir rcuprer l'adresse de cette dernire en mmoire : ceci se fait l'aide de MethodAddress. Cependant, la signature de la fonction est requise pour pouvoir l'appeler (dans le cas des surcharges, il ne sera pas possible par exemple de dfinir quelle est la fonction appeler). Le code suivant nous permet d'appeler une mthode (NouvelleMethode) qui reoit deux entiers en paramtre et retourne un entier par son nom :
Var Meth : Function(x,y:Integer):Integer Of Object; //on dfinit le prototype de la fonction appeler Begin // La mthode est cherche par son nom @Meth :=MethodAddress('NouvelleMethode'); If @Meth <> Nil Then Begin // Si l'adresse est trouve elle est appele normalement Resultat.Caption := (IntToStr(Meth(A.Value,B.Value))); End Else Begin // Sinon erreur ShowMessage('Nom de mthode introuvable !'); End; End;

- 251 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Vous pouvez trouver un exemple pratique ici.

Comment affecter la mme valeur plusieurs variables ?


Auteur : waskol Afin d'affecter la mme valeur plusieurs variables, nous allons utiliser la notion de tableau ouverts. Un tableau ouvert nous permet de construire un tableau d'lment sans spcifier ses dimensions. Nous utilisons les primitives Low et High pour connatre ses dimensions. Nous utiliserons une procdure d'affectation par type de variable; c'est dire une procdure qui prendra en paramtre la valeur affecter ainsi qu'un tableau de variables pouvant accepter cette valeur. Pour les entiers, ce sera par exemple :
procedure SetMultiValueInteger(AValue:integer;T:Array of Integer); var i:Integer; begin for i:=Low(T) to High(T) do T[i]:=AValue; end;

Pour les chanes de caractres :


procedure SetMultiValueString(AValue:string;T:Array of string); var i:Integer; begin for i:=Low(T) to High(T) do T[i]:=AValue; end;

Pour les boolens :


procedure SetMultiValueBoolean(AValue:boolean;T:Array of string); var i:Integer; begin for i:=Low(T) to High(T) do T[i]:=AValue; end;

etc... Pour tester notre code, il nous suffira alors d'crire quelque chose comme :
var i1,i2,i3:Integer; s1,s2,s3,s4,s5:string; b1,b2:boolean; begin SetMultiValueInteger(5,[i1,i2,i3]); SetMultiValueString('Toto',[s1,s2,s3,s4,s5]); SetMultiValueBoolean(True,[b1,b2]);

- 252 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Comment lister et appeller les mthodes d'une Form ?


Auteurs : Laurent Dardenne - Malatar Il est possible de retrouver une mthode ou une procdure en fonction de son nom, mais parfois on aimerait retrouver l'ensemble des mthodes d'une fiche. A l'aide des RTTI il est possible de rcuprer des informations d'une classe. Voici comment procder, le rsultat est mis dans une TStringGrid.
procedure TForm1.GetObjectInfo(Objet: TObject); var PData : PTypeData; PListe : PPropList; NbProps, I : Integer; Method : TMethod; iPosGrid : integer; begin PData := GetTypeData(PTypeInfo(Objet.ClassInfo)); NbProps := PData^.PropCount; New(PListe); GetPropInfos(PTypeInfo(Objet.ClassInfo), PListe); SortPropList(PListe,NbProps); with StringGrid1 do begin ColCount := 3; RowCount := NbProps + 1; for i := 0 to RowCount -1 do Cells[1,i] := ''; iPosGrid := 1; for I := 0 to NbProps -1 do begin Cells[0,iPosGrid] := PListe^[I]^.Name; Cells[2,IposGrid] := PListe^[I]^.PropType^.Name; case PListe^[I]^.PropType^.Kind of tkInteger: begin if UpperCase(PListe^[I]^.PropType^.Name) = 'TCOLOR' then Cells[1,iPosGrid] := IntToHex(GetOrdProp(Objet, PListe^[I]),6) else Cells[1,iPosGrid] := IntToStr(GetOrdProp(Objet, PListe^[I])); end; tkString,tkWString,tkLString : Cells[1,iPosGrid] := GetStrProp(Objet, PListe^[I]); tkFloat : Cells[1,iPosGrid] := FormatFloat('0.0000000',GetFloatProp(Objet, PListe^[I])); tkEnumeration : begin if UpperCase(PListe^[I]^.PropType^.Name) = 'BOOLEAN' then Case GetOrdProp(Objet, PListe^[I]) of 0: Cells[1,iPosGrid] := 'False'; 1: Cells[1,iPosGrid] := 'True'; else Cells[1,iPosGrid] := 'Inconnue'; end; end; tkMethod : begin
- 253 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Method := GetMethodProp(Self, PListe^[I]); if Method.Code <> NIL then Cells[1,iPosGrid] := ' (' + TObject(Method.Data).MethodName(Method.Code) + ')'; end; tkUnknown: Cells[1,iPosGrid] := 'Inconnue'; end; // case inc(iPosGrid); end; end; Dispose(PListe); end;

La partie qui nous intresse le plus est la suivante :


tkMethod : begin Method := GetMethodProp(Self, PListe^[i]); With Method begin if Code <> NIL then Cells[1,iPosGrid] := ' (' +TObject(Data).MethodName(Code) + ')'; end; end;

Il reste un problme, comment excuter la mthode rcupre ? Dans le cas d'un gestionnaire d'vnement on doit transtyper le rsultat obtenu avec le prototype de la mthode appeler :
type TTraitement= procedure (S:String) of object;

Par exemple :
procedure AfficheDetails(Informations : TPropInfo); var TypePropriete : String; DonneePropriete: PTypeData; Method : TMethod; Resultat : String; ... //Excute le code associ la proprit Method := GetMethodProp(UnObjet, Informations.Name); if Method.Code <> NIL then //UnObjet.OnTraitement:=Nil begin Resultat:=''; TTraitement(Method)(Resultat); Writeln(Resultat); end;

Notes :

- 254 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Les RTTI ne fonctionnent compltement que sur les classes drives de TPersistent. lien : Introduction aux RTTI sous Delphi

Pourquoi un paramtre const change-t-il mystrieusement de valeur ?


Auteur : sjrd Voici la situation : vous avez implment une routine ou mthode avec un paramtre (appel Param) dclar const, et vous remarquez en pas--pas la chose suivante. Un appel une autre routine/mthode, sans mme passer Param en paramtre, modifie Param ! Voici l'explication rationnelle du problme (si si, il y en a une) : Pourquoi un paramtre const change-t-il mystrieusement de valeur ?

Comment convertir une image JPEG en BMP?


Auteur : Pedro Il suffit pour cela de charger l'image dans un TJPegImage puis de recopier son contenu dans un TBitmap pour enfin l'enregistrer.
procedure ConversionJPEGversBMP(const FichierEntree, FichierSortie: string); var ImageJPEG : TJPEGImage; ImageBitmap : TBitmap; begin ImageJPEG := TJPEGImage.Create; try ImageJPEG.LoadFromFile(FichierEntree); //Chargement de l'image ImageBitmap := TBitmap.Create; try //On donne la mme taille que l'image jpeg ImageBitmap.Width := ImageJPEG.Width; ImageBitmap.Height := ImageJPEG.Height; //On dessine le jpeg sur le canvas du Bitmap ImageBitmap.Canvas.Draw(0, 0, ImageJPEG); //On enregistre ImageBitmap.SaveToFile(FichierSortie); finally ImageBitmap.Free; end; finally ImageJPEG.Free; end; end;

- 255 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gestion des fichiers

- 256 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gestion des fichiers > Rpertoire Comment connatre le rpertoire de mon application ?
Auteur : hachesse L'objet Application de l'unit Form contient un attribut ExeName: String; qui contient le nom de fichier de l'excutable de l'application, y compris le chemin d'accs. Pour extraire uniquement le rpertoire o se trouve notre programme, on utilisera la fonction ExtractFilePath(const FileName: String):String; de l'unit SysUtils.
Repertoire := ExtractFilePath(Application.ExeName);

Note : Application.ExeName contient la mme valeur que ParamStr(0). lien : Comment rcuprer les paramtres passs au programme ?

Comment crer un rpertoire ?


Auteur : hachesse On utilise la fonction CreateDir(const Dir: String): Boolean; de l'unit SysUtils. Il est toutefois prfrable de tester pralablement si le rpertoire n'existe pas dj. Il est aussi bien vu de vrifier qu'il n'y ait pas eu d'erreurs lors de la cration du rpertoire. Exemple de l'aide en ligne de Delphi :
begin if not DirectoryExists('C:\temp') then if not CreateDir('C:\temp') then raise Exception.Create('Impossible de crer C:\temp'); end;

lien : Comment tester si un rpertoire existe ?

Comment crer une arborescence de rpertoires ?


Auteur : Smortex On utiliser la fonction function ForceDirectories(Dir: string): Boolean; de l'unit SysUtils. ForceDirectories permet de crer un dossier et ses rpertoires parents si ncessaire. Il n'est pas ncessaire de vrifier que le dossier n'existe pas avant d'appeler cette fonction puisque cela se fait avant la cration des rpertoires. Exemple de l'aide en ligne de Delphi:
var Dir: string; begin Dir := 'C:\APPS\SALES\LOCAL'; if ForceDirectories(Dir) then Label1.Caption := Dir + ' a t cr' end;

lien : Comment crer un rpertoire ?

- 257 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

lien : Comment tester si un rpertoire existe ?

Comment supprimer un rpertoire ?


Auteur : Atlantis Deux possibilits sont envisager : - le rpertoire est vide : l'utilisation de la fonction RemoveDir(const Dir: String): Boolean suffit. - le rpertoire n'est pas vide : une solution consiste utiliser l'API de l'unit ShellAPI :
uses ShellApi; function DelDir(Dir: String): Boolean; var fos: TSHFileOpStruct; begin ZeroMemory(@fos, SizeOf(fos)); with fos do begin wFunc := FO_DELETE; fFlags := FOF_SILENT or FOF_NOCONFIRMATION; pFrom := PChar(Dir + #0); end; Result := (0=ShFileOperation(fos)); end;

Note : il est prfrable de s'assurer que le rpertoire existe avant de le supprimer. Ceci fonctionne sur Windows 95 ou NT4 minimum. lien : Lien MSDN : structure ShFileOPStruct

Comment renommer un rpertoire?


Auteur : hachesse La fonction RenameFile(constOldName, NewName:string):Boolean; de l'unit SysUtils permet de renommer les fichiers mais aussi les rpertoires.
RenameFile('c:\tmp\', 'c:\tmp2\');

Note : il est prfrable de s'assurer que le rpertoire existe avant de le renommer et de contrler que le rpertoire a bien t renomm. lien : Comment tester si un rpertoire existe ?

Comment tester si un rpertoire existe ?


Auteur : hachesse On utilise pour cela la fonction DirectoryExists(const Directory: String): Boolean; de l'unit SysUtils.
begin if DirectoryExists('C:\MyDirectory\') then { le repertoire existe } else { le repertoire n'existe pas }

- 258 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

lien : Comment tester si un fichier existe ?

Comment ouvrir la bote de dialogue permettant l'utilisateur de choisir un rpertoire ?


Auteur : Atlantis La fonction SelectDirectory affiche l'explorateur des rpertoires de Windows. Il faut ajouter FileCtrl dans la clause Uses. Cette fonction deux format d'appel diffrents : SelectDirectory(constCaption:string;constRoot:WideString;outDirectory:string):Boolean; Cette version permet de choisir le rpertoire de dpart de la recherche et le titre de la fentre.
procedure TForm1.Button1Click(Sender: TObject); var ChoixRepertoire : string; begin If SelectDirectory('Choisissez le dossier d''installation','C:\TEMP\',ChoixRepertoire) Then Label1.caption := ChoixRepertoire; end;

SelectDirectory(varDirectory:string;Options:TSelectDirOpts;HelpCtx:Longint):Boolean; permet de dfinir ce qu'il se passe si l'utilisateur choisi un rpertoire inexistant.


procedure TForm1.Button1Click(Sender: TObject); var ChoixRepertoire : string; begin If SelectDirectory(ChoixRepertoire,[sdAllowCreate,sdPerformCreate,sdPrompt],0) Then Label1.caption := ChoixRepertoire; end;

Cette

version

sdAllowCreate autorise la slection d'un rpertoire inexistant sdPerformCreate autorise la boite de dialogue crer le rpertoire sdPrompt demande la confirmation en cas de cration de rpertoire.

Comment retrouver le chemin du rpertoire systme de Windows ?


Auteur : Atlantis Selon la version de Windows, le rpertoire systme de Windows n'est pas le mme (system32 ou System). Pour retrouver ce rpertoire, il suffit de le demander Windows par le biais de la fonction GetSystemDirectory.
function SystemDirectory: String; const dwLength: DWORD = 255; var SystemDir: PChar; begin GetMem(SystemDir, dwLength); GetSystemDirectory(SystemDir, dwLength); Result := String(SystemDir); FreeMem(SystemDir, dwLength);

- 259 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Dans quel rpertoire est install Windows ?


Auteur : Atlantis Selon la version, Windows est install en standard soit dans le rpertoire C:\WINDOWS, soit dans le rpertoire C:\WINNT. Pour retrouver ce rpertoire, il suffit de le demander Windows par le biais de la fonction GetWindowsDirectory.
function WindowsDirectory: String; const dwLength: DWORD = 255; var WindowsDir: PChar; begin GetMem(WindowsDir, dwLength); GetWindowsDirectory(WindowsDir, dwLength); Result := String(WindowsDir); FreeMem(WindowsDir, dwLength); end;

Comment retrouver les rpertoires spciaux de Windows ?


Auteur : Atlantis Dans l'API Windows, il existe la fonction SHGetSpecialFolderLocation qui permet de rcuprer le chemin des rpertoires spciaux de Windows : Bureau, Menu Dmarrer...
uses Shlobj; function SpecialFolder(Folder: Integer): String; var SFolder : pItemIDList; SpecialPath : Array[0..MAX_PATH] Of Char; begin SHGetSpecialFolderLocation(Form.Handle, Folder, SFolder); SHGetPathFromIDList(SFolder, SpecialPath); Result := StrPas(SpecialPath); end; { Application : } procedure TForm.MyButtonClick(Sender: TObject); begin MyLabel.Caption := SpecialFolder(CSIDL_PERSONAL); end;

Selon le rpertoire que l'on souhaite obtenir, vous devez utiliser l'une des variables suivante : CSIDL_APPDATA : Rpertoire contenant les donnes des applications. CSIDL_COMMON_FAVORITES : Rpertoire contenant les Favoris commun tous les utilisateurs. CSIDL_COMMON_STARTMENU : Rpertoire du menu dmarrer commun tous les utilisateurs. CSIDL_COMMON_PROGRAMS : Rpertoire Programmes du menu dmarrer commun tous les utilisateurs.

- 260 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

lien :

CSIDL_COMMON_STARTUP : Rpertoire du groupe Dmarrage du menu dmarrer commun tous les utilisateurs. CSIDL_COMMON_DESKTOPDIRECTORY : Rpertoire correspondant au bureau commun tous les utilisateurs. CSIDL_COOKIES : Rpertoire ou sont stocks les cookies d'Internet Explorer. CSIDL_DESKTOP : Rpertoire correspondant votre Bureau. CSIDL_DESKTOPDIRECTORY : Rpertoire correspondant votre Bureau. CSIDL_FAVORITES : Rpertoire Favoris. CSIDL_FONTS : Rpertoire dans lequel sont stockes toutes les polices de caractres. CSIDL_HISTORY : Rpertoire contenant les historiques d'Internet Explorer. CSIDL_INTERNET_CACHE : Rpertoire ou sont stocks les fichiers temporaires d'Internet Explorer. CSIDL_NETHOOD : Rpertoire Voisinage Rseau. CSIDL_PERSONAL : Rpertoire Mes Documents. CSIDL_PRINTHOOD : Rpertoire de voisinage d'impression. CSIDL_PROGRAMS : Rpertoire Programmes du Menu Dmarrer. CSIDL_RECENT : Rpertoire dans lequel se trouvent les raccourcis vers les Fichiers rcemment ouverts. CSIDL_SENDTO : Rpertoire dans lequel se trouvent les raccourcis Envoyer vers CSIDL_STARTMENU : Rpertoire Menu Dmarrer. CSIDL_STARTUP : Rpertoire du groupe Dmarrage du Menu Dmarrer. CSIDL_TEMPLATES : Rpertoire contenant les modles de documents de Windows. Lien MSDN : fonction SHGetSpecialFolderLocation

Comment Copier un rpertoire ?


Auteurs : DelpHichem - Nono40 - Vulcanos La fonction suivante vous permet de copier un rpertoire :
function CopyFolder(FromFld, ToFld: string): boolean; var fos: TSHFileopStruct; begin // il faut supprimer les antislashs de fin sinon vous aurez droit un message d'erreur FromFld := ExcludeTrailingPathDelimiter(Trim(FromFld)); ToFld := ExcludeTrailingPathDelimiter(Trim(ToFld)); FillChar(fos, SizeOf(fos),0); with fos do begin wFunc := FO_COPY; pFrom := PChar(FromFld+#0); pTo := PChar(ToFld+#0); fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR; end; Result := ShFileOperation(fos)=0; end;

L'appel la fonction se fait simplement par :


if CopyFolder('d:\Repertoire01', 'c:\Repertoire02')then ShowMessage('Copie effectue avec succs') else ShowMessage('Copie non effectue');

- 261 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

La structure SHFILEOPSTRUCT est dfinie dans l'unit ShellAPI, donc il faudra rajouter celle-ci dans vos uses.

- 262 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gestion des fichiers > Fichier Comment tester si un fichier existe ?
Auteur : hachesse On utilise pour cela la fonction FileExists(const FileName: String): Boolean; de l'unit SysUtils.
begin if FileExists('C:\MyDirectory\MyFile.txt') then { le fichier existe } else { le fichier n'existe pas} end;

lien : Comment tester si un rpertoire existe ?

Comment renommer un fichier?


Auteur : hachesse La fonction RenameFile(constOldName, NewName:string):Boolean; de l'unit SysUtils permet de renommer tout type de ficher.
RenameFile('C:\MonFichier.txt', 'C:\MonTexte.txt');

Note : il est prfrable de s'assurer que le ficher existe avant de le renommer et de contrler que le fichier a bien t renomm. lien : Comment tester si un fichier existe ? lien : Comment renommer un rpertoire?

Comment copier un fichier ?


Auteur : Laurent Dardenne Vous pouvez utiliser la fonction ShFileOperation qui permet, entre autres l'opration de copie de fichiers. En cas d'erreur le systme affichera une fentre de dialogue indiquant la cause probable de l'erreur. Les flags FOF_xxx influencent l'opration, consulter l'aide en ligne pour plus de dtails.
function CopyFile(Source, Destination: String ) : boolean; var fos : TSHFileOpStruct; begin FillChar(fos, SizeOf(fos),0); with fos do begin wFunc := FO_COPY; pFrom := PChar(Source+#0); pTo := PChar(Destination+#0); fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT; end; result := (0 = ShFileOperation(fos)); end;

- 263 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Si toutefois vous souhaitez grer les possibles erreurs lors de la copie , vous pouvez utiliser la fonction CopyFile. CopyFile(NomDeFichierExistant,NouveauNomDeFichier : String; EchecSiExiste: BOOL): BOOL; Le paramtre "EchecSiExiste" indique comment procder si un fichier portant le mme nom que le paramtre "NouveauNomDeFichier" existe dj. Si ce paramtre vaut TRUE et qu'un fichier existe dj, la fonction choue et renvoie FALSE. Si ce paramtre vaut FALSE et qu'un fichier existe dj, le fichier existant est cras, la fonction russit et renvoie TRUE.
Result := CopyFile(PChar(NomDeFichierExistant), PChar(NouveauNomDeFichier), False);

lien :

Lien MSDN : Fonction ShFileOperation

Comment dplacer un fichier ou un rpertoire ?


Auteur : Laurent Dardenne Utiliser la function MoveFileEx : MoveFileEx(ExistingFileName,NewFileName :PChar; Flags : DWord):Boolean;
function MoveFile(FichierSource, FichierDestination: String; CommentDeplacerLeFichier: DWORD) : boolean; Begin Result := MoveFileEx(PChar(FichierSource), PChar(FichierDestination),MOVEFILE_COPY_ALLOWED); end;

Avec cette fonction vous pouvez galement dplacer un fichier sur un volume diffrent. Les paramtres ExistingFileName et NewFileName rfrence un nom de fichier ou un nom de rpertoire. Voir l'aide en ligne pour le dtail du paramtre Flags. lien : Lien MSDN : Fonction MoveFileEx

Comment crer un fichier et ses rpertoires?


Auteur : Smortex Il suffit pour cela de forcer la cration du fichier et de l'arborescence avec la fonction ForceDirectories(Dir:String):Boolean et d'diter ce fichier avec ReWrite(F:FileFile,[...])
var F: TextFile; begin ForceDirectories('c:\PremierRep\DeuxRep\TroisRep'); AssignFile(F,'c:\PremierRep\DeuxRep\TroisRep\MonFichier.txt'); ReWrite(F); try { Code } finally CloseFile(F); end;

- 264 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Comment envoyer un fichier la corbeille ?


Auteur : Delphi-fan L'usage classique de la fonction DeleteFile (dans FileIntf.pas) a pour effet de supprimer totalement un fichier. Mais on peut vouloir passer par la corbeille comme le fait l'explorateur Windows. C'est ce que fait le code suivant : Vous remarquerez l'ajout du caractre #0 la fin du nom de fichier. Ainsi, aprs la conversion en PChar, pFrom contiendra le nom du fichier supprimer suivi de deux caractres #0. Ces deux caractres sont imposs par la MSDN car FO_DELETE peut servir pour supprimer plusieurs fichiers la fois. Chaque nom de fichier doit tre spar par un #0 et le dernier suivi par deux #0.
function DeleteFileToRecycleBin(AFileName : string ) : boolean; var fos : TSHFileOpStruct; begin FillChar(fos, SizeOf(fos),0); with fos do begin wFunc := FO_DELETE; pFrom := PChar(AFileName+#0); fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT; end; result := (0 = ShFileOperation(fos)); end;

lien : Comment vider la corbeille ?

Comment vider la corbeille ?


Auteur : Delphi-fan Pour vider la corbeille par code et sans confirmation, on peut utiliser la procdure suivante :
function SHEmptyRecycleBin (Wnd:HWnd; LPCTSTR:PChar; DWORD:Word):Integer; stdcall; const SHERB_NOCONFIRMATION = $00000001; SHERB_NOPROGRESSUI = $00000002; SHERB_NOSOUND = $00000004; Implementation {$R *.DFM} function SHEmptyRecycleBin; external 'SHELL32.DLL' name 'SHEmptyRecycleBinA';

procedure TForm1.EmptyBtnClick(Sender: TObject); begin SHEmptyRecycleBin(self.handle,'', SHERB_NOCONFIRMATION);

- 265 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

lien : Comment envoyer un fichier la corbeille ?

Comment ouvrir un document ?


Auteur : Nono40 Vous voulez ouvrir un fichier texte, un document Word, lire un fichier MP3 ou tout simplement afficher une page html. Alors il vous suffit d'utiliser la fonction suivante :
ShellExecute(0,'OPEN','C:\Mes documents\mon rapport.doc', Nil, Nil, SW_SHOW);

Pour compiler la fonction ci-dessus, il faut ajouter ShellApi dans la clause Uses de l'unit contenant la fonction. Par exemple :
uses [...] ,ShellApi;

Cette fonction permet d'ouvrir, n'importe quel type de document pourvu que Windows connaisse le programme utiliser. Ce document peut tre une adresse internet ou directement une application. Exemples :
ShellExecute(0,'OPEN','C:\Mes documents\mon rapport.doc', Nil, Nil, SW_SHOW); ShellExecute(0,'OPEN','http://www.developpez.com', Nil, Nil, SW_SHOW); ShellExecute(0,'OPEN','C:\MaMusiqueBranche.MP3', Nil, Nil, SW_SHOW); ShellExecute(0,'OPEN','mailto:Nono40@fr.st', Nil, Nil, SW_SHOW); ShellExecute(0,'OPEN','C:\projets\MonProg.exe', Nil, Nil, SW_SHOW);

lien : Comment excuter une application extrieure ?

Comment lister les fichiers d'un rpertoire ?


Auteur : Nono40 Cette mthode montre l'utilisation simple des fonctions FindFirst, FindNext et FindClose pour lister les fichiers et rpertoires contenus dans un rpertoire donn. L'exemple donn ici recherche les fichiers et sous-rpertoires contenus dans le chemin indiqu dans Edit1. Les listes sont affiches respectivement dans ListBox1 et ListBox2.
procedure TForm1.Button1Click(Sender: TObject); Var Chemin : String; Info : TSearchRec; begin ListBox1.Items.Clear; ListBox2.Items.Clear; { Pour tre sur que la barre oblique finisse le nom du chemin } Chemin := IncludeTrailingPathDelimiter(Edit1.Text); { Recherche de la premire entre du rpertoire } If FindFirst(Chemin+'*.*',faAnyFile,Info)=0 Then Begin Repeat { Les fichiers sont affichs dans ListBox1 } { Les rpertoires sont affichs dans ListBox2 }
- 266 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

If Not((Info.Attr And faDirectory)=0) Then ListBox2.Items.Add(Info.FindData.cFileName) Else ListBox1.Items.Add(Info.FindData.cFileName) { Il faut ensuite rechercher l'entre suivante } Until FindNext(Info)<>0; { Dans le cas ou une entre au moins est trouve il faut } { appeler FindClose pour librer les ressources de la recherche } FindClose(Info); End; end;

Fonctionne avec Delphi2 et suprieur. Pour Delphi 1 il faut modifier le code en remplaant Info.FindData.cFileName par Info.Name. D'autre part partir de Delphi6 un message d'avertissement est indiqu pour l'utilisation de FindData. Pour dsactiver cet avertissement il faut ajouter la directive {$WARN SYMBOL_PLATFORM OFF} en dbut de code.

Comment obtenir le nom long d'un chemin ?


Auteur : Pierre Castelain Comment retrouver le nom long d'un chemin ou d'un fichier partir de son nom court (8 caractres + extension au format DOS ou Windows 16 bits) ? La fonction GetLongFilename retourne le nom long d'un chemin en utilisant le Shell. Si ce nom ne peut tre obtenu, elle retourne le nom original pass en argument ce qui permet de ne pas avoir besoin de vrifier qu'il s'agit bien d'un nom court avant l'appel.
uses ShlObj, Windows; function GetLongFilename(const ShortFilename: string): string; var desktop: IShellFolder; filename: Widestring; pchEaten: Cardinal; ppIdl: PItemIDList; pdwAttributes: Cardinal; buffer: array [0..MAX_PATH] of char; begin result:= ShortFilename; if SHGetDesktopFolder(desktop) = NOERROR then begin filename:= ShortFilename; { Conversion en WideString } if Desktop.ParseDisplayName(0, nil, PWideChar(filename), pchEaten, ppidl, pdwAttributes) = NOERROR then begin if SHGetPathFromIDList(ppidl, buffer) then result:= buffer; end; end; end;

- 267 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Note: pour obtenir le rsultat inverse (nom court partir du nom long) vous pouvez utiliser la fonction ExtractShortPathName disponible dans l'unit SysUtils depuis Delphi 4.

Comment afficher le dialogue "Ouvrir avec..." ?


Auteur : Pierre Castelain Il peut arriver que nous ayons besoin d'afficher le dialogue "Ouvrir avec..." qui est utilis lorsque l'utilisateur tente d'excuter un fichier dont l'extension ne correspond aucune application. Malheureusement, il semble que ce dialogue ne soit pas accessible l'aide d'une fonction de l'API Windows classique. En fait, ce dialogue est implment dans shell32.dll et n'est utilis que par le shell lui-mme. Il est toutefois possible de l'appeler trs simplement en utilisant ShellExecute. Voici le code d'une procdure effectuant cette opration pour un nom de fichier pass en paramtre :
uses SysUtils, ShellAPI, Windows; procedure OpenWith(const Filename: string); { Appelle le dialogue "Ouvrir avec..." pour le fichier dont le nom est pass en argument. } begin ShellExecute(0, 'open', 'rundll32.exe', PChar('shell32.dll,OpenAs_RunDLL ' + Filename), PChar(ExtractFilePath(Filename)), SW_SHOWNORMAL); end;

Cette fonction tant souvent utilise aprs avoir tent d'ouvrir un fichier par ShellExecute, voici une fonction ralisant les deux appels en srie (si ncessaire bien sur) :
uses SysUtils, ShellAPI, Windows; function OpenFile(const Filename: string; const Handle: THandle = 0): boolean; { Tente d'ouvrir le fichier dont le nom est pass en argument avec l'application associe son extension. Si aucune application n'est associe celle-ci, le dialogue "Ouvrir avec..." est appel. } var errCode: Cardinal; filePath: string; begin { On stocke le chemin pour viter de le dcoder 2 fois } filePath:= ExtractFilePath(Filename); { Tentative d'ouverture de l'application associe } errCode:= ShellExecute(Handle, 'Open', PChar(Filename), '', PChar(filePath), SW_SHOWNORMAL); { Si la tentative a chou avec le code SE_ERR_NOASSOC, c'est que l'extension n'est associe aucune application } if errCode = SE_ERR_NOASSOCthen { Dans ce cas, on appelle le dialogue } errCode:= ShellExecute(0, 'open', 'rundll32.exe', PChar('shell32.dll,OpenAs_RunDLL ' + Filename), PChar(filePath), SW_SHOWNORMAL); { Si le code retourn par ShellExecute est suprieur 32, alors l'opration a russi, sinon c'est un code d'erreur } result:= errCode > 32;

- 268 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Comment manipuler les diffrentes parties d'un nom de fichier ?


Auteur : Laurent Dardenne Partie Drive La fonction ExtractFileDrive renvoie la partie lecteur de FileName. Elle renvoie une chane contenant la partie 'lecteur' d'un chemin complet pour le fichier pass dans FileName. Pour les noms de fichiers ayant des lettres d'unit, le rsultat est de la forme '<lecteur>'. Pour les noms de fichiers au format UNC, la chane est au format '\\<serveur>\<nom_partag>'. Si le chemin indiqu ne contient aucun de ces types de chemins, le rsultat est une chane vide. Partie path La fonction ExtractFilePath extrait le lecteur et le rpertoire d'un nom de fichier. La chane renvoye est compose des caractres de gauche de FileName, jusqu'aux deux points ou la barre oblique inverse qui sparent le chemin du nom et de l'extension.
var ProgramPath : String; begin ProgramPath := ExtractFilePath(ParamStr(0)); // Rcupre le path complet du programme ... end;

La chane renvoye est vide si FileName ne contient pas de partie lecteur et rpertoire. Partie nom et extension La fonction ExtractFileName renvoie un chane en commenant par le premier caractre aprs les deux points ou la barre oblique inverse sparant le chemin du nom et de l'extension.
var ProgramName : String; begin ProgramName := ExtractFileName(ParamStr(0)); // Rcupre le nom du programme ... end;

La chane renvoye est gale FileName si FileName ne contient pas de lecteur et de rpertoire. Partie nom La procdure suivante permet de rcuprer uniquement la partie nom d'un nom de fichier.
Function ExtractFileNameOnly(FileName:TFileName): TFileName; // renvoie la partie nom, d'un nom de fichier constitu d'un nom et d'une extension var ExtPart : TFileName; lgExt : Integer; begin ExtPart := ExtractFileExt(FileName); LgExt:=Length(ExtPart); Delete(FileName,Length(FileName)-lgExt+1,lgExt); Result:=FileName; end;

Partie extension La fonction ExtractFileExt extrait l'extension d'un nom de fichier donn. Par exemple, le code suivant renvoie l'extension du nom de fichier indiqu par une variable nomme MyFileName.
- 269 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

var MyFileExtension : String; begin MyFileExtension := ExtractFileExt(MyFileName); ... End;

La chane renvoye comprend le point sparant le nom et l'extension (.TXT). Cette chane est vide si le nom du fichier ne comprend pas d'extension. Rcuprer toutes les parties dans un enregistrement La procedure ProcessPath dcoupe un nom de fichier en ses diffrentes parties : Drive, Path, Filename +extension
Type TFileNamePart = Record Drive : Char; DirPart, FilePartExt, FilePart, ExtPart : String; end; Procedure GetFilePart(FileName:TFileName; Var Part :TFileNamePart); // Dcompose un nom de fichier existant dans un enregistrement begin FillChar(Part, SizeOf(Part),#0); If FileExists(FileName) then begin ProcessPath(FileName,Part.Drive,Part.DirPart,Part.FilePartExt); Part.ExtPart :=ExtractFileExt(Part.FilePartExt); // Extrait l'extension Part.FilePart:=ExtractFileNameOnly(Part.FilePartExt); // Extrait le nom uniquement end; end;

Comment lire/modifier les attributs d'un fichier ?


Auteur : Laurent Dardenne La fonction FileGetAttr permet de rcuprer les attributs d'un fichier. En cas d'chec elle renvoie la valeur -1. La fonction FileSetAttr permet de modifier les attributs d'un fichier. Elle renvoie zro si l'excution de la fonction russit. Sinon, cette valeur est un code d'erreur Windows.
var Attributs : Word; begin Attributs := FileGetAttr('C:\Temp\Test.txt'); if Attributs and faReadOnly = faReadOnly then begin // Modifie l'attribut ReadOnly FileSetAttr('C:\Temp\Test.txt', Attributs and not faReadOnly); end; end;

Vous pouvez utiliser les valeurs suivantes : faReadOnly : Fichiers en lecture seule faHidden : Fichiers cachs

- 270 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

faSysFile : Fichiers systme faVolumeID : Fichiers d'identification de volume faDirectory : Fichiers rpertoire faArchive : Fichiers archive faAnyFile : Tout fichier

Comment rcuprer la taille d'un fichier ?


Auteur : reisubar Vous pouvez utiliser la fonction suivante qui renvoie une valeur de type int64.
function TForm1.GetFileSize(const APath: string): int64; var Sr : TSearchRec; begin if FindFirst(APath,faAnyFile,Sr)=0 then try Result := Int64(Sr.FindData.nFileSizeHigh) shl 32 + Sr.FindData.nFileSizeLow; finally FindClose(Sr); end else Result := 0; end;

Comment rcuprer les dates associes un fichier ?


Auteur : reisubar L'API GetFileTime permet de rcuprer les dates de cration, de dernier accs, et de modification d'un fichier. Voil une fonction permettant d'exploiter son rsultat :
function GetFileTimes(const FileName: string; var Created: TDateTime; var Accessed: TDateTime; var Modified: TDateTime): Boolean; var h: THandle; Info1, Info2, Info3: TFileTime; SysTimeStruct: SYSTEMTIME; TimeZoneInfo: TTimeZoneInformation; Bias: Double; begin Result := False; Bias := 0; h := FileOpen(FileName, fmOpenRead or fmShareDenyNone); if h > 0 then begin try if GetTimeZoneInformation(TimeZoneInfo) <> $FFFFFFFF then Bias := TimeZoneInfo.Bias / 1440; // 60x24 GetFileTime(h, @Info1, @Info2, @Info3); if FileTimeToSystemTime(Info1, SysTimeStruct) then Created := SystemTimeToDateTime(SysTimeStruct) - Bias; if FileTimeToSystemTime(Info2, SysTimeStruct) then Accessed := SystemTimeToDateTime(SysTimeStruct) - Bias; if FileTimeToSystemTime(Info3, SysTimeStruct) then Modified := SystemTimeToDateTime(SysTimeStruct) - Bias; Result := True; finally FileClose(h);
- 271 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end; end; end;

Comment lister les fichiers de plusieurs sous-rpertoire ?


Auteur : Nono40 Pour lister les fichiers d'un sous-rpertoire, nous pouvons utiliser les fonctions FindFirst, FindNext et FindClose en rcursif. Ces mthodes utilisent la structure TSearchRec qui permet de spcifier le type de fichiers rechercher (rpertoires, fichiers "normaux"). Un exemple d'utilisation de ces fonctions est disponible cette page : http://nono40.developpez.com/ sources/source0042/ lien : Comment lister les fichiers d'un rpertoire ?

Comment rcuprer la taille d'un fichier avec les fonctions de l'API ?


Auteurs : Olivier Lance - TicTacToe La fonction suivante nous permet de recuprer la taille d'un fichier en utilisant la fonction GetFileSize de l'API Windows :
function TailleFichier(Fichier: String): Int64; var hFile: THandle; HiSize: DWord; begin Result := 0; hFile := CreateFile(pAnsiChar(Fichier), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); if hFile <> INVALID_HANDLE_VALUE then begin Result := GetFileSize(hFile, @HiSize ); Result := Result + Int64( HiSize ) shl 32; end; end;

lien :

Comment rcuprer la taille d'un fichier ?

- 272 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gestion du temps Comment initialiser une variable avec une date ou un temps?
Auteur : psl Les deux principaux types de date sont TDate et TDateTime : TDate reprsente une date sous la forme AAAA, MM et JJ TDateTime reprsente la date et l'heure sous la forme AAAA, MM, JJ, HH, MM, SS, mSS. La dclaration se fait sous la forme : VarDate1 = TDate ou VarDate2 = TDateTime Le type spcial TDate ou TDateTime reprsente pour sa partie entire le nombre de jours couls depuis le 30/12/1899 et pour sa partie fractionnaire le nombre d'heure depuis minuit (partie fractionnaire nulle pour TDate).
uses DateUtils; {pour les fonctions Tomorrow, Yesterday et IsToday} var MaDate01, MaDate02, MaDate03: TDate; MaDate11: TDateTime; begin MaDate01 := Date; {la fonction Date renvoie la date en cours} MaDate02 := Tomorrow; {la fonction Tomorrow renvoie le jour suivant de Date} MaDate03 := Yesterday; {la fonction Yesterday renvoie le jour prcdent de Date} MaDate11 := now; {la fonction now renvoie la date et l'heure systme} if IsToday(MaDate11) then {IsToday renvoie un boolean qui permet de contrler si MaDate11 est la date en cours} ShowMessage('OK'); end;

Les deux principaux types de time sont TTime et TDateTime. TTime reprsente un temps sous la forme HH, MM, SS et mSec.
var Temps1 : TTime; Temps2, TempsP : TDateTime; begin Temps1 := EncodeTime(12,30,25,0); {initialise Temps1 avec 12h 30mn 25 sec} ShowMessage(TimeToStr(Temps1)); TempsP := Time; {la fonction Time renvoie l'heure actuelle} ShowMessage(TimeToStr(TempsP)); Temps2 := Now; {mme effet que Time} ShowMessage(TimeToStr(Temps2)); end;

Comment encoder/dcoder une date ou un temps ?


Auteur : psl Pour affecter une date une variable de type TDate ou TDateTime, il suffit d'utiliser la fonction EncodeDate(Year, Month, Day: Word):TDateTime. Pour rcuprer les lments d'une variable TDate, on utilise la procdure DecodeDate(Date:TDateTime; var Year, Month, Day: Word).
var MaDate: TDate; Jour, Mois, Annes: Word;

- 273 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin {Jour, Mois et Annee doit tre une date valide} {Pour encoder : } MaDate := EncodeDate(Annee,Mois,Jour); {Pour dcoder : } DecodeDate(MaDate, Annee, Mois, Jour); end;

Pour affecter un temps une variable de type TTime ou TDateTime, il suffit d'utiliser la fonction EncodeTime. Pour rcuprer les lments d'une variable TTime, on utilise la fonction DecodeTime.
var MonHeure : TTime; Heure, Minute, Seconde, milliSec : Word; begin {Heure, Minute, Seconde et milliSec doivent tre un temps valide} {Pour encoder} MonHeure := EncodeTime(Heure, Minute, Seconde, milliSec); ShowMessage(TimeToStr(MonHeure)); {Pour dcoder} DecodeTime(MonHeure,Heure, Minute, Seconde, milliSec); end;

Comment vrifier si une date ou un temps est valide ?


Auteur : psl Pour savoir si une date est valide, il suffit d'utiliser la fonction IsValidDate(). Il en va de mme pour le temps en utilisant la fonction IsValideTime().
uses DateUtils; var DateOK : Boolean; Annee, Mois, Jour : Word; TimeOK : Boolean; Heure, Minute, Seconde, milliSec : Word; begin DateOK := IsValidDate(Annee, Mois, Jour); TimeOK := IsValidTime(Heure, Minute, Seconde, milliSec); end;

Comment changer la date/l'heure du PC ?


Auteur : Nono40 Pour modifier l'heure et la date du PC il faut utiliser la fonction API SetSystemTime. Or cette fonction demande une heure absolue. La fonction suivante permet de mettre l'heure le PC en fonction des dcalages horaires et de l'heure d't :
{ Fonction de mise l'heure } Function MiseHeure(DateHeure:TDateTime):Boolean; Var Infos :TSystemTime; Zone :TTimeZoneInformation; Retour :Integer; Begin

- 274 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

{ Recherche des information sur les dcalages locaux } Result:=False; Retour:=GetTimeZoneInformation(Zone); { DateHeure tant en heure locale => ajout des dcalages pour obtenir l'heure absolue } Case Retour Of TIME_ZONE_ID_UNKNOWN : DateHeure:=DateHeure+( Zone.Bias /(24*60)); TIME_ZONE_ID_STANDARD : DateHeure:=DateHeure+((Zone.Bias+Zone.StandardBias)/(24*60)); TIME_ZONE_ID_DAYLIGHT : DateHeure:=DateHeure+((Zone.Bias+Zone.DaylightBias)/(24*60)); Else Exit; End; { Ensuite, mise l'heure du Pc } { Attention sous Windows NT/2000/XP l'utilisateur doit avoir les droits } { suffisants pour que a fonctionne ! } 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); Result:=SetSystemTime(Infos); End;

Pour que ce code fonctionne, il faut ajouter DateUtils dans la clause Uses.

Comment formater une date ?


Auteur : rbag Pour formater un type TDateTime en chane de caractres il faut utiliser la fonction FormatDateTime.
var DateChaine: string; begin DateChaine := FormatDateTime('"Nous sommes le" dd/mm/yyyy", il est "hh:ss', Now); end;

Les spcificateurs de format sont dtaills dans l'aide de delphi de cette fonction. Les plus utiliss sont les suivants : yyyy : anne sur quatre chiffres : 2005 yy : anne sur deux chiffres : 05 mmmm : mois en clair : Janvier mmm : mois en abrg : Jan mm : mois sur deux chiffres : 01 m : mois sur un ou deux chiffres : 1 dddd : jour en clair : Dimanche ddd : jour en abrg : Dim dd : jour sur deux chiffres : 09 d : jour sur un ou deux chiffres : 9 hh : heure sur deux chiffres : 01 h : heure sur un ou deux chiffres : 1 nn : minute sur deux chiffres : 01 n : minute sur un ou deux chiffres : 1 ss : seconde sur deux chiffres : 01 s : seconde sur un ou deux chiffres : 1

- 275 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

z : millisecondes sans les prfixer d'un zro (0 999) zzz : millisecondes en les prfixant d'un zro (000 999)

Comment convertir un entier en heure, minutes, secondes ?


Auteur : Nono40 Il arrive souvent dans un programme que l'on rcupre une dure dans un entier sous forme de nombre de secondes (ou de minutes, heures, ...). Pour transformer en affichage classique HH:MM:SS il est possible d'effectuer des divisions et modulo mais il existe une mthode bien plus simple. Le format TDateTime de Delphi est un nombre flottant dont la partie entire est le nombre de jour, et la partie fractionnaire l'heure dans le jour sous forme d'une fraction de jour. Ansi : 1/24 reprsente un heure 1/(24*60) reprsente un minute 1/(24*3600) reprsente un seconde

Sur ce principe on peut formater facilement un nombre de secondes :


TimeToStr(MonEntier/24/3600);

- 276 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gestion du temps > Oprations sur les dates/heures Comment additionner ou soustraire des jours une date ?
Auteur : psl Pour ajouter ou soustraire un nombre de jours une date, on peut utiliser plusieurs mthodes : En utilisant directement la date
var Date1 : NbJour : begin Date1 := Date1 := {ou bien end;

TdateTime; Integer; EncodeDate(2002, 11, 1); Date1 + NbJour; Date1 := Date1 - NbJour;}

La variable NbJour peut tre positive ou ngative. En utilisant des fonctions


uses DateUtils; var Date1 : TdateTime; NbJour : Integer; begin Date1 := EncodeDate(2002, 11, 1); Date1 := IncDay(Date1, NbJour);

La variable NbJour peut tre positive ou ngative. On peut galement utiliser les fonctions IncMonth(), IncYear() et IncWeek().
Date1 := IncMonth(Date1, NbMois); Date1 := IncYear(Date1, NbAnnee); Date1 := IncWeek(Date1, NbSemaine);

NbMois, NbAnnee et NbSemaine peuvent tre positifs ou ngatifs. En utilisant le jour Julien
uses DateUtils; var Date1 : TdateTime; Annee, Mois, Jour, Heure, Minute, Seconde, milliSec : Word; NbJour : Integer; JourJul : Double; begin Date1 := EncodeDateTime(Annee, Mois, Jour, Heure, Minute, Seconde, milliSec); JourJul := DateTimeToJulianDate(Date1) + NbJour; Date1 := JulianDateToDateTime(Date1); end;

- 277 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

NbJour peut tre un entier ou un rel positif ou ngatif. La variable JourJul intgre l'heure et est entire pour midi.

Comment calculer le nombre de jours entre deux dates ?


Auteur : psl Pour calculer la diffrence entre deux dates, on peut utiliser plusieurs mthodes : En passant directement par les dates
var Date1, Date2 : TDateTime; Diff : Extended; Jour1, Mois1, Annee1 : Word; Jour2, Mois2, Annee2 : Word; begin Date1 := EncodeDate(Annee1, Mois1, Jour1); Date2 := EncodeDate(Annee2, Mois2, Jour2); Diff := Date2 - Date1; end;

En passant directement par une fonction


var Date1, Date2 : TDateTime; Diff : Extended; Jour1, Mois1, Annee1 : Word; Jour2, Mois2, Annee2 : Word; begin Date1 := EncodeDate(Annee1, Mois1, Jour1); Date2 := EncodeDate(Annee2, Mois2, Jour2); Diff := DaysBetween(Date2, Date1); end;

En passant par les jours Juliens


var Date1, Date2 : TDateTime; Diff : Extended; Jour1, Mois1, Annee1 : Word; Jour2, Mois2, Annee2 : Word; begin Date1 := EncodeDate(Annee1, Mois1, Jour1); Date2 := EncodeDate(Annee2, Mois2, Jour2); Diff := DateTimeToJulianDate(Date2)-DateTimeToJulianDate(Date1); end;

La variable Diff reprsente la diffrence entre les deux dates, mais dans le cas o le nombre de jours dans un intervalle il y a lieu d'ajouter 1 au rsultat (problme de bornes).

Comment calculer le numro de jour dans l'anne d'une date ?


Auteur : psl Le rang du jour de l'anne est obtenu par la fonction DayOfTheYear().
- 278 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

uses DateUtils; var Date1 : TDateTime; NumeroJ : Integer; begin Date1 := Now; {Date systme} NumeroJ := DayOfTheYear(Date1); end;

lien : Comment calculer le numro de semaine dans l'anne d'une date ?

Comment calculer le numro de semaine dans l'anne d'une date ?


Auteur : psl Le numro de la semaine dans l'anne est obtenu par la fonction WeekOfTheYear().
uses DateUtils; var Date1 : TDateTime; NumSem : Word; begin Date1 := EncodeDate(2002, 11, 1); NumSem := WeekOfTheYear(Date1); end;

lien : Comment calculer le numro de jour dans l'anne d'une date ?

Comment calculer le jour de la semaine pour une date ?


Auteur : psl Le jour de la semaine est obtenu par la fonction DayOfTheWeek().
uses DateUtils; var JourSem : Word; Date1 : TDateTime; begin Date1 := EncodeDate(2002, 11, 1); JourSem := DayOfTheWeek(Date1); end;

Comment afficher la meilleure reprsentation d'une dure ?


Auteur : Mac LAK Les fonctions de chronomtrage prcises renvoient, en gnral, une dure fractionnaire exprime en secondes. Cependant, l'affichage de la dure dans cette unit est souvent inadapt, et demande tre exprim dans une unit plus approprie.
/*

- 279 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

*/ function BestTimeDisplay ( const SecCount : Extended ) : String ; Var TimeUnit : String ; Begin TimeUnit:='s' ; // Calcul : temps &lt; 1s. If (SecCount &lt; 1) Then Begin // Temps en ms. SecCount:=SecCount*1000; TimeUnit:='ms'; // Temps en s. If (SecCount &lt; 1) Then Begin SecCount:=SecCount*1000; TimeUnit:='s'; End; // Temps en ns. If (SecCount &lt; 1) Then Begin SecCount:=SecCount*1000; TimeUnit:='ns'; End; End Else Begin // Temps &gt; 1 mn. If (SecCount &gt; 60) Then Begin SecCount:= SecCount/60; TimeUnit:='mn'; End; // Temps &gt; 1 h. If (SecCount &gt; 60) Then Begin SecCount:=SecCount/60; TimeUnit:='h'; // Temps &gt; 1 j. If (SecCount &gt; 24) Then Begin SecCount:=SecCount/24; TimeUnit:='j'; End; End; End; // OK, on a une unit de temps et une valeur = &gt; on peut prparer l'affichage. Result:=Format('%.2f %s',[SecCount,TimeUnit]); End;

Convertit une dure exprime en secondes vers la meilleure unit possible. SecCount : Nombre de secondes coules. Retour : Chane formate (2 dcimales), avec unit de temps.

Par rapport au code d'exemple des chronomtrages, la valeur calcule FElapsed est directement utilisable par la fonction BestTimeDisplay. lien : Comment effectuer des chronomtrages prcis ?

Comment calculer le trimestre d'une date ?


Auteur : OutOfRange Cette fonction renvoie, la manire de la partie entire d'un TDate, le nombre de trimestres depuis le 1er janvier de l'an un (1/1/1), y compris le trimestre en cours...

- 280 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

function QuelTrimestre(Jour: TDate): integer; begin Result:=(yearof(jour)-1)*4 +(monthof(jour)-1)div 3+1; end;

Le 1/1/1 appartient au trimestre numro 1. Le 6/11/2006 appartient au trimestre numro 8024. A partir de l, il est facile de calculer : - Le nombre de trimestres couls entre deux dates :
var DateDebut,DateFin:TDate; NombreDeTrimestres:integer; begin ... NombreDeTrimestres := QuelTrimestre(DateFin) - QuelTrimestre(DateDebut); end;

- Ou le numro de trimestre calendaire d'une date :


function Trimestre(jour:TDate):integer; begin Result := ((QuelTrimestre(Now)-1) mod 4)+1; end;

Exemple : Le 6/11/2006 appartient au 4me trimestre de l'anne 2006

- 281 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Gestion du temps > Dates particulires Comment connatre les dates de passage l'heure d'hiver et t ?
Auteur : psl Le passage l'heure d't et d'hiver est fix par loi jusqu'en 2006. Le passage l'heure d't s'effectue le dernier dimanche du mois de mars et le passage l'heure d'hiver le dernier dimanche du mois d'octobre.

Comment calculer la date de Pques ?


Auteur : psl Le dimanche de Pques correspond au premier dimanche suivant la premire pleine lune du printemps. La fonction ci-dessous calcule le jour de Pques pour les dates comprises entre 1583 et 4099.
function Paques(Annee : Integer) : TDateTime; var Y,G,C,X,Z,D,E,N,P,J,M : Integer; begin {Algorithme valable pour les dates comprises entre 1583 et 4099} Y := Annee; G := (Y mod 19) + 1; C := Trunc((Y/100)) + 1; X := Trunc(3 * C / 4) - 12; Z := Trunc(((8 * C) + 5) / 25) - 5; D := Trunc(((5 * Y) / 4) - X - 10); E := ((11 * G)+ 20 + Z - X) mod 30; if ((E = 25) and (G > 11)) or (E = 24) then E := E + 1; N := 44 - E; if N <; 21 then N := N + 30; P := N + 7 - ((D + N) mod 7); if P > 31 then J := P - 31 else J := P; if J = P then M := 3 else M := 4; Result := EncodeDate(Annee, M, J); end;

lien : Comment dfinir les jours fris en France ?

Comment dfinir les jours fris en France ?


Auteur : psl Il est souvent ncessaire, lors des manipulations de dates, de savoir si un jour est fri ou non (calcul des jours ouvrables, gnration de calendriers, etc...). Tout cela est facile pour les jours fris de date fixe (jour de l'an, Nol, etc...) mais il en va tout autrement pour les jours fris mobiles (Pques, Pentecte, etc...) qui sont calculs partir de la date de Pques. Lundi de Pques = Pques + 1 jour Ascension = Pques + 39 jours Pentecte = Pques + 49 jours

- 282 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Lundi de Pentecte = Pques + 50 jours

lien : Comment calculer la date de Pques ?

Comment savoir si une anne est bissextile ?


Auteur : psl Pour qu'une anne soit bissextile, il suffit qu'elle soit un multiple de 4, sans tre un multiple de 100 sauf si elle est multiple de 400. Les annes 1700, 1800 et 1900 ne sont pas bissextiles alors que 2000 est bissextile. On trouve galement la fonction IsInLeapYear(constAValue:TDateTime):Boolean.
uses DateUtils; var MaDate: TDate; begin MaDate := EncodeDate(2004,12,35); if IsInLeapYear(MaDate) then ShowMessage('C''est une anne bissextile') else ShowMessage('Ce n''est pas une anne bissextile'); end;

Comment convertir une date julienne en date grgorienne ?


Auteur : psl Pour convertir une date au format Julien vers le format Grgorien, il suffit de faire appel la fonction JulianDateToDateTime().
uses DateUtils; var JourJulien : Extended; DateC : TDateTime; begin DateC := JulianDateToDateTime(JourJulien); end;

Pour les utilisateurs dont la version de Delphi ne permet pas d'avoir accs cette fonction, on peut utiliser le code prsent dans l'unit Julien2Gregorien.pas splashscreen [11,4 ko]

Comment convertir une date grgorienne en date julienne ?


Auteur : psl Pour convertir une date au format Grgorien vers le format Julien, il suffit de faire appel la fonction DateTimeToJulianDate().
uses DateUtils; var
- 283 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

JourJulien : Extended; DateC : TDateTime; Annee, Mois, Jour : Word; Heure, Minute, Seconde : Word; begin DateC := EncodeDateTime(Annee, Mois, Jour, Heure, Minute, Seconde,0); JourJulien := DateTimeToJulianDate(DateC); end;

Attention : Pour que le rsultat de la fonction DateTimeToJulianDate(date) de Delphi retourne une valeur juste, il faut que la date soit strictement suprieure au 15/10/1582 00:00:00 (dbut du calendrier Grgorien). Avant cette date, il manque le dcalage de 10 jours entre les deux calendriers. Pour les dates strictement infrieures au 5 octobre 1582, il suffit de rajouter 10 au rsultat de la fonction Delphi. On ne peut pas calculer les jours Juliens des dates du 5 au 14 octobre 1582 puisqu'elles n'existent pas.

- 284 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Les ToolsAPI

- 285 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Les ToolsAPI > Utilisation des interfaces Comment dterminer si un objet, une interface ou une classe supporte une interface donne ?
Auteur : rsc La fonction Supports de l'unit Sysutils, permet de dterminer si un objet, une interface ou une classe supporte une interface donne.
//Appel sur une interface function Supports(const Instance: IInterface; const IID: TGUID; out Intf): Boolean; begin Result := (Instance <> nil) and (Instance.QueryInterface(IID, Intf) = 0); end; //Appel sur une classe function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean; var LUnknown: IUnknown; begin Result := (Instance <> nil) and ((Instance.GetInterface(IUnknown, LUnknown) and Supports(LUnknown, IID, Intf)) or Instance.GetInterface(IID, Intf)); end; //Appel sur une rfrence de classe function Supports(const AClass: TClass; const IID: TGUID): Boolean; begin Result := AClass.GetInterfaceEntry(IID) <> nil; end;

Voici un exemple dans un contexte utilisant les API OpenTools alias OTA :
Supports(ModuleServices.Modules[2], IOTAProjectGroup, Result)

Ce code est utilis pour rcuprer la conception le nom du project actif. On vrifie si le module 2 supporte l'interface IOTAProjectGroup, le rsultat de l'appel est renvoy dans Result. Toutefois, pour les versions antrieures Delphi 5, cette fonction (Supports) n'est pas dfinie. On utilise alors la mthode QueryInterface :
if ModuleServices.Modules[2].QueryInterface(IOTAProjectGroup, Result) = S_OK then ....

- 286 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Utilisation du XML partir de Delphi Comment crer / ouvrir un fichier XML ?
Auteur : Giovanny Temgoua Le composant TXMLDocument, situ dans la page de composants Internet, nous permet de manipuler les fichiers xml partir de Delphi. On peut procder de deux faons : > Utiliser la proprit FileName pour spcifier le nom d'un fichier xml existant > Utiliser la proprit XML pour entrer du xml sous forme de chane. Dans tous les cas, il faut spcifier l'implmentation DOM en attribuant une valeur la proprit DOMVendor; sans cela le fichier xml ne pourra pas tre trait. Une fois ceci fait, on met la proprit Active du TXMLDocument true pour commencer traiter le contenu de la proprit XML (qui dans le cas o FileName est renseign contient tout le contenu de ce dernier). Il faut noter par ailleurs que FileName doit tre une fichier existant. Pour crer un fichier XML, il suffit alors de renseigner la proprit XML, puis en fin de traitement d'utiliser la mthode SaveToFile pour crer le fichier xml. lien : Un tutoriel sur le XML

Comment crer la structure d'un fichier XML ?


Auteur : Giovanny Temgoua Les mthodes du composant TXMLDocument nous permettent de crer la structure d'un fichier XML. Ce dernier ayant une structure d'arbre, il faut noter que la racine correspond la valeur de la proprit DocumentElement. Un noeud peut tre ( part la racine) : > interne ou > une feuille Toutes les mthodes sont celles de la collection ChildNodes qui reprsente l'ensemble des noeuds enfants d'un noeud donn. Les mthodes qui permettent de crer des noeuds sont CreateNode et AddChild. On utilise CreateElement pour crer une feuille. Celle-ci n'a pas un parent associ et il faudra manuellement l'ajouter la liste des enfants d'un noeud existant. CreateNode permet de crer un noeud gnrique qui pourra ensuite tre intgr dans une hirarchie existante (en tant que fils d'un noeud par exemple). Le code suivant permet de crer un noeud et de l'ajouter en tant qu'enfant d'un autre noeud :
var UnNoeud : IXMLNode; Feuille : IXMLNode; begin XMLDoc.Active := True; //On cre un noeud UnNoeud := XMLDoc.CreateNode('QR', ntElement); //on cre une feuille. La balise correspondante celle-ci est donne Feuille := XMLDoc.CreateElement('Donnee', ''); //On donne une valeur la feuille Feuille.NodeValue := 'Rien'; //On ajoute la feuille dans le noeud UnNoeud.ChildNodes.Add(Feuille); //On ajoute le noeud dans la hirarchie de notre document XMLDoc.DocumentElement.ChildNodes.Add(UnNoeud);

- 287 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

//Pour tre sr que le code a t correctement excut ShowMessage(XMLDoc.XML.Text); end;

Un autre code qui ralise la mme opration mais en utilisant AddChild cette fois :
var Feuille : IXMLNode; begin XMLDoc.Active := True; Feuille := XMLDoc.CreateElement('Donnee', ''); Feuille.NodeValue := 'Rien'; //Le noeud est insr dans une queue de collection XMLDoc.DocumentElement.AddChild('Nouveau'); XMLDoc.DocumentElement.ChildNodes.Last.ChildNodes.Add(Feuille); end;

Il faut prciser par ailleurs que remplacer la racine par un nouveau noeud, dtruit la structure du XML! La suppression d'un noeud se fait en utilisant la mthode Delete de la collection ChildNodes.

Comment charger un TTreeView avec le contenu d'un document XML ?


Auteur : Giovanny Temgoua La procdure ci-dessous nous permet de remplir un TTreeView avec le contenu d'un document XML (TvXML dsigne un TTreeView pralablement dpos sur la fiche).
procedure TFrmTreeviewXML.LoadXMLInTree(XMLNode: IXMLNode; TreeNode: TTreeNode); var I: Integer; Noeud : TTreeNode; TexteDuNoeud: string; AttributNoeud: IXMLNode; begin //Les noeuds internes sont traits rcursivement if XMLNode.NodeType <> ntElement then Exit; //On ajoute le noeud courant TexteDuNoeud := XmlNode.NodeName; //S'il s'agit d'une feuille if XMLNode.IsTextElement then TexteDuNoeud := TexteDuNoeud + ' = ' + XMLNode.NodeValue; Noeud := TvXML.Items.AddChild(TreeNode, TexteDuNoeud); //S'il y a des attributs on les ajoute... for I := 0 to XMLNode.AttributeNodes.Count - 1 do begin AttributNoeud := XMLNode.AttributeNodes.Nodes[I]; TvXML.Items.AddChild(Noeud,'[' + AttributNoeud.NodeName + ' = "' + AttributNoeud.Text + '"]'); end; //si le noeud courant a des noeuds enfants, on les ajoute if XMLNode.HasChildNodes then for I := 0 to XMLNode.ChildNodes.Count - 1 do LoadXMLInTree(XMLNode.ChildNodes.Nodes [I], Noeud);

- 288 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Pour l'appel de la procdure, on peut le faire dans l'vnement OnClick d'un bouton :
procedure TFrmTreeviewXML.BtnLoadClick(Sender: TObject); begin //On efface le contenu du TreeView TvXML.Items.Clear; XMLDoc.Active := True; //Pour viter le scintillement avec les gros fichiers... TvXML.Items.BeginUpdate; LoadXMLInTree(XMLDoc.DocumentElement, nil); TvXML.Items.EndUpdate; end;

Comment savoir si un document XML est syntaxiquement correct ?


Auteur : Giovanny Temgoua On distingue les documents valides des documents bien forms. Un document valide est celui qui respecte son DTD tandis qu'un document bien form est celui qui respecte la syntaxe du XML. Lorsqu'on essaie d'ouvrir un document mal form avec un navigateur, il nous indique la position et la raison de l'erreur. La fonction que nous prsentons ci-dessous prend un nom de fichier xml en paramtre et indique dans le cas d'une erreur la ligne, la colonne et la raison de l'erreur :
(*Supprimer les commentaires pour afficher les messages appropris*) function IsXMLWellFormed(XMLFileName : String) : Boolean; var ParseError: IDOMParseError;//Interface permettant de recuprer les erreurs dans le xml FileContent : TStringList; //Pour stocker le contenu du fichier begin Result := False; //Une simple vrification d'extension if UpperCase(ExtractFileExt(XMLFileName)) <> UpperCase('.xml') then begin MessageDlg('Extension de fichier incorrecte!', mtError, [mbOK], 0); Exit; end; //Ouverture du document : On doit l'ouvrir pour que le parser puisse interprter son contenu XMLDoc.Active := True; FileContent := TStringList.Create; (* TXMLDocument implmente l'interface IXMLDocumentAccess qui nous permet d'accder aux proprits protges de TXMLDocument (une en particulier, DOMPersist est utilise dans le code pour charger le contenu du fichier xml) *) try try FileContent.LoadFromFile(XMLFileName); (XMLDoc as IXMLDocumentAccess).DOMPersist.LoadXML(FileContent.Text); finally FileContent.Free; end; except on E : Exception do begin //ShowMessage(E.Message);

- 289 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Exit; end; end; ParseError := (XMLDoc.DOMDocument as IDOMParseError); if ParseError.ErrorCode <> 0 then with ParseError do begin //MessageDlg('Erreur la ligne ' + IntToStr(Line) + 'Position ' + IntToStr(linePos) + //#13#10 + Reason, mtError, [mbOK], 0); Exit; end; Result := True; //MessageDlg('Document bien form!', mtInformation, [mbOK], 0); end;

Comment lire la valeur d'un noeud sans Violation d'accs ?


Auteur : NoisetteProd En protgeant correctement le code. Un simple Try Except ne suffit pas, il faut galement vrifier que le noeud sur lequel on travaille existe bien. Pour ce faire, on utilise la fonction Assigned. Il existe aussi le problme des valeurs null. Si la valeur est null, on ne pourra pas la transformer en string. Il faut donc tester la valeur et le cas chant, traiter la valeur null. C'est ce que fait VarIsNull. La fonction suivante permet de rcuprer la valeur String d'un noeud. Vous devez fournir en paramtre la rfrence du noeud sur lequel vous travaillez. Exemple :
Noeud := XMLDocument1.ChildNodes['RACINE'].ChildNodes['MonNoeud'];

et la valeur par dfaut retourner dans le cas ou la valeur est nulle ou dans le cas o une exception est leve.
function XMLNodeValue(Noeud : IXMLNode; DefaultValue : string) : string; begin if assigned(noeud) then try if not VarIsNull(noeud.NodeValue) then Result := noeud.NodeValue else Result := DefaultValue; except Result := DefaultValue; end else result := DefaultValue; end;

La fonction ci-dessus peut tre adapte facilement d'autres types de donnes, NodeValue tant un variant.

Comment valider un XML avec un XSD ?


Auteur : neilbgr Une solution consiste utiliser l'ActiveX MSXML 4.0.
unit UXMLvalidation;

- 290 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

interface uses Classes, SysUtils, msxmldom, MSXML2_TLB, { Il faut importer l'activeX MSXML DOM2 4.0 pour obtenir l'unit MSXML2_TLB.pas } xmldom, XMLDoc, XMLIntf; { Pour une utilisation de TXMLDocument } type EXMLDOMValidationError = class(Exception) private FSrcText: DOMString; FURL: DOMString; FReason: DOMString; FErrorCode: Integer; FLine: Integer; FLinePos: Integer; FFilePos: Integer; public constructor Create(const ValidationError: IXMLDOMParseError); property ErrorCode: Integer read FErrorCode; property URL: DOMString read FURL; property Reason: DOMString read FReason; property SrcText: DOMString read FSrcText; property Line: Integer read FLine; property LinePos: Integer read FLinePos; property FilePos: Integer read FFilePos; end; procedure ValidateXMLFileName(XMLFilename, XSDFilename: TFileName; NameSpaceSchema: string); procedure ValidateXMLText(XMLText: string; XSDFilename: TFileName; NameSpaceSchema: string); procedure ValidateXMLDoc(XMLDoc, XSDDoc: IXMLDOMDocument2; NameSpaceSchema: string); // Gnre une exception EXMLDOMValidationError si errorcode<>0 procedure CheckValidationError(ValidationError: IXMLDOMParseError); // Permet de retrouver l'interface COM de MSXML partir d'un IXMLDocument (Borland) // Attention: le IXMLDocument doit avoir dans ce cas MSXML comme Vendor ! function GetXMLDOMDocument2(XMLDoc: IXMLDocument): IXMLDOMDocument2; resourcestring RS_EXMLDOM_FILE_VALIDATION_ERROR = 'Document XML non conforme au schma.'#13#10#13#10+ 'Raison:'#13#10'%s'#13#10+ 'Ligne: %d'#13#10+ 'Position: %d'#13#10+ 'Position dans le fichier: %d'#13#10+ 'URL: %s'#13#10+ 'XML: '#13#10'%s'; RS_EXMLDOM_NOFILE_VALIDATION_ERROR = 'Document XML non conforme au schma.'#13#10#13#10+ 'Raison:'#13#10'%s'#13#10; implementation { EXMLDOMValidationError } constructor EXMLDOMValidationError.Create( const ValidationError: IXMLDOMParseError); begin FSrcText := ValidationError.srcText; FURL := ValidationError.url; FReason := ValidationError.reason; FErrorCode := ValidationError.errorCode; FLine := ValidationError.line; FLinePos := ValidationError.linepos; FFilePos := ValidationError.filepos;

- 291 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

if FLine>0 then inherited CreateResFmt(@RS_EXMLDOM_FILE_VALIDATION_ERROR, [FReason, FLine, FLinePos, FFilePos, FURL, FSrcText]) else inherited CreateResFmt(@RS_EXMLDOM_FILE_VALIDATION_ERROR, [FReason]); end; function GetXMLDOMDocument2(XMLDoc: IXMLDocument): IXMLDOMDocument2; begin XMLDoc.Active := True; Result := ((XMLDoc.DOMDocument as IXMLDOMNodeRef).GetXMLDOMNode as IXMLDOMDocument2); end; procedure CheckValidationError(ValidationError: IXMLDOMParseError); begin if ValidationError.errorCode<>0 then raise EXMLDOMValidationError.Create(ValidationError); end; procedure ValidateXMLDoc(XMLDoc, XSDDoc: IXMLDOMDocument2; NameSpaceSchema: string); var vSchemaCollection: IXMLDOMSchemaCollection2; begin vSchemaCollection := CoXMLSchemaCache40.Create; vSchemaCollection.add(NameSpaceSchema, XSDDoc); XMLDoc.schemas := vSchemaCollection; CheckValidationError(XMLDoc.validate); end; procedure ValidateXMLFilename(XMLFilename, XSDFilename: TFileName; NameSpaceSchema: string); var vXML, vSchema: IXMLDOMDocument2; vSchemaCollection: IXMLDOMSchemaCollection2; begin vSchema := CoDOMDocument40.Create; vSchema.async := False; vSchema.load(XSDFilename); vSchemaCollection := CoXMLSchemaCache40.Create; vSchemaCollection.add(NameSpaceSchema, vSchema); vXML := CoDOMDocument40.Create; vXML.async := False; vXML.validateOnParse := True; vXML.schemas := vSchemaCollection; vXML.load(XMLFilename); CheckValidationError(vXML.parseError); end; procedure ValidateXMLText(XMLText: string; XSDFilename: TFileName; NameSpaceSchema: string); var vXML, vSchema: IXMLDOMDocument2; vSchemaCollection: IXMLDOMSchemaCollection2; begin vSchema := CoDOMDocument40.Create; vSchema.async := False; vSchema.load(XSDFilename);

- 292 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

vSchemaCollection := CoXMLSchemaCache40.Create; vSchemaCollection.add(NameSpaceSchema, vSchema); vXML := CoDOMDocument40.Create; vXML.async := False; vXML.validateOnParse := True; vXML.schemas := vSchemaCollection; vXML.loadXML(XMLText); CheckValidationError(vXML.parseError); end; end.

lien :

Comment Installer un ActiveX ?

Qu'est-ce que Xml Mapper ?


Auteur : Big Xml mapper est un outil de conversion. Il permet de tranformer un document Xml standard en un paquet de donnes utilisable dans Delphi (aussi un fichier xml). Ce nouveau document xml-data packet peut servir de support de base de donnes, car il contient la structure de la base. Le Xml original :
<Root> <AAA>Hello World</AAA> <BBB name="Big"/> <CCC name="test">Xml Mappeur</CCC> </Root>

Le xml data packet, gnr par le xml mapper


<DATAPACKET Version="2.0"> <METADATA> <FIELDS>

<FIELD <FIELD <FIELD <FIELD </FIELDS> <PARAMS/> </METADATA> <ROWDATA/> </DATAPACKET>

attrname="AAA" fieldtype="string" WIDTH="11"/> attrname="BBB_name" fieldtype="string" WIDTH="3"/> attrname="CCC" fieldtype="string" WIDTH="11"/> attrname="CCC_name" fieldtype="string" WIDTH="3"/>

Ce fichier data packet peut tre charg dans un TClientDataSet.

Comment rcuprer un noeud par son nom ?


Auteur : Malatar La procdure ci-dessous permet de recuprer un noeud d'un document XML grce son nom :
- 293 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

function GetNode(XmlNode : IXmlNode;NodeName : String) : IXmlNode; var i : integer; begin Result := nil; //Les noeuds internes sont traits rcursivement if XMLNode.NodeType <> ntElement then Exit; //S'il s'agit d'une feuille if XMLNode.IsTextElement then if UpperCase(XmlNode.NodeName) = UpperCase(NodeName) then begin Result := XmlNode; Exit; end; // S'il s'agit d'un attribut for i := 0 to XMLNode.AttributeNodes.Count - 1 do if UpperCase(XMLNode.AttributeNodes.Nodes[I].NodeName) = Uppercase(NodeName) then begin Result := XMLNode.AttributeNodes.Nodes[I]; Exit; end; // Si le noeud a des enfants on recherche dedans. if XMLNode.HasChildNodes then for I := 0 to XMLNode.ChildNodes.Count - 1 do begin Result := GetNode(XmlNode.ChildNodes.Nodes[I],NodeName); // si on a un resultat on quitte car c'est celui qu'on recherche if Result <> nil then Exit; end; end;

Pour l'appel de la fonction :


var Noeud : IXmlNode; begin Noeud := GetNode(XmlDoc.DocumentElement,'MonNoeud'); if Assigned(Noeud) then Showmessage(La valeur de ' + Noeud.NodeName + ' est de ' + Noeud.Text); end;

Comment transformer dynamiquement un XML grce un XSL


Auteur : yobenzen Voici une fonction qui vous permettra d'obtenir un document rsultant de la transformation d'un fichier XML par un XSL.
function FusionXMLXSL(sXML, sXSL: string): string; var XMLDoc1 : TXMLDocument; XSLPageProd1: TXSLPageProducer; begin Result := '' ; try XMLDoc1 := TXMLDocument.Create(Self);

- 294 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

XMLDoc1.DOMVendor := DOMVendors.Find ('MSXML'); XSLPageProd1 := TXSLPageProducer.Create(Self); XSLPageProd1.DOMVendor := DOMVendors.Find ('MSXML'); XMLDoc1.LoadFromXML(sXML); XSLPageProd1.XMLData := XMLDoc1; XSLPageProd1.XML.text := sXSL; Result := XSLPageProd1.Content; finally if (XMLDoc1 <> Nil) then XMLDoc1.Free; if (XSLPageProd1 <> Nil) then XSLPageProd1.Free; end; end;

Petite prcision, le constructeur Create des composants TXMLDocument et TXSLPageProducer n'accepte pas le paramtre nil. Vous obtiendrez alors soit une violation d'accs, soit une exception EPrivilege

- 295 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Expressions rgulires Comment utiliser les expressions rgulires avec Delphi ?
Auteurs : BeTuLa - Bruno75 - tiki06 On entend par expression rgulire le fait d'appliquer un filtre particulier sur une chane ou ensemble de chanes de caractres ou encore sur des fichiers ASCII. Ce filtre contiendra des caractres ayant une signification particulire dans ce contexte. Il existe plusieurs approches : La fonction MatchesMask Elle est sans doute la fonction la plus mconnue de Delphi. L'aide de Delphi spcifie clairement que cette fonction ne gre pas seulement les noms de fichier. On peut donc l'utiliser sur des textes. Voici un exemple qui vrifie si un dossier correspond une liste de filtres diffrents stocks dans un TStringlist. Si le nom du dossier correspond au masque, le chemin complet du dossier est ajout dans un autre TStringlist. La liste des filtres peut ressembler ceci : ab? cdef* *xyz gh*op?w
Var S : String; Masque, //Liste des filtres diffrents Liste : TStringList; //Liste de dossiers correspondant aux filtres begin ... //o Nom est le nom du dossier S := Nom + '\'; For i := 0 to Masque.Count - 1 Do If MatchesMask(s, '*\' + Masque[i] + '\*') Then begin Liste.Add(Nom + '\'); Break; //Pour ne pas avoir 2 fois le nom du dossier end;

Les caractres gnriques utilisables sont * et ? . On peut galement utiliser des ensembles et des intervalles. Il faut ncessairement dclarer l'unit Masks dans la clause uses. Le composant TRegExpr Un composant Delphi ddi la gestion des expressions rgulires. Microsoft VBScript Regular Expressions 5.5 C'est un composant COM utilisable aprs un import dans Delphi. En fait ce composant dclare parfois des interfaces IDispatch au lieu de dclarer des types spcifiques. C'est pourquoi le concepteur du wrapper pour PCRE a galement crit un wrapper pour Microsoft VBScript Regular Expressions 5.5. Tlchargement du Wrapper. Les wrappers (Microsoft et PCRE) fonctionnent avec des interfaces notamment pour la gestion de la mmoire. Voici une documentation Microsoft sur les patterns qui contient galement un exemple d'utilisation.
uses

- 296 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

VBScriptRegex ... procedure TForm1.Button1Click(Sender: TObject); var re: IRegex; mc: IMatchCollection; iMatch: Integer; resultat: string; begin // Find re := Regex.Create('([^\.]*)\.pas'); mc := re.FindAll('qsdsdq.pas; aeze.pas'); for iMatch := 0 to mc.Count - 1 do begin Memo1.Lines.Add(mc.Item[iMatch].Value); end; // Replace resultat := re.ReplaceAll('qsdsdq.pas; aeze.pas', '$1.txt'); Memo1.Lines.Add(resultat);

end;

Rsultat :
qsdsdq.pas ; aeze.pas qsdsdq.txt; aeze.txt

PCRE, Perl Compatible Regular Expressions Il s'agit d'une bibliothque C package pour Delphi et Delphi.NET disponible sur ce site. Une documentation sur les patterns de PCRE.
procedure TForm1.Button1Click(Sender: TObject); var re: IRegex; mc: IMatchCollection; iMatch: Integer; resultat: string; begin // Find re := RegexCreate('([^\.]*)\.pas'); mc := re.Matches('qsdsdq.pas; aeze.pas'); for iMatch := 0 to mc.Count - 1 do begin Memo1.Lines.Add(mc.Items[iMatch].Value); end; // Replace resultat := re.Replace('qsdsdq.pas; aeze.pas', '$1.txt'); Memo1.Lines.Add(resultat);

end;

Rsultat :
qsdsdq.pas ; aeze.pas qsdsdq.txt; aeze.txt

- 297 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > IntraWeb Comment forcer le serveur d'une application couter sur un port fixe ?
Auteur : Magnus Pour que le serveur coute chaque excution sur le mme port, il faut modifier la proprit port du fichier ServerController.pas. Cependant, une fois cette modification apporte, il se peut encore qu' l'excution le port du serveur soit diffrent et alatoire chaque excution. La cause la plus probable de cette persistence de port alatoire est que l'application fonctionne en mode d'valuation. Que signifie et quand une application fonctionne-t-elle en mode d'valuation ? Lors de la compilation / excution d'un projet sous intraweb, l'application a pour licence globale la licence du composant le plus faible. Cette information est visible l'excution sur la fentre du serveur.

- 298 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Il faut garder l'esprit que la licence globale de l'application implique que : le port sur lequel l'application coute est unique chaque excution il est impossible d'installer l'application en tant que service la seule IP valide est 127.0.0.1 (localhost) pas de SSL pas de dploiement

Exemple : si vous compilez / excutez une application possdant toutes les licences ncessaires sauf une qui est en version d'valuation alors l'application fonctionnera en mode d'valuation. Ainsi, la solution apporter pour assigner un port fixe au serveur l'excution est de renouveler TOUTES les licences. Remarque : mme une fois toutes les licences achetes, il se peut encore que le serveur fonctionne en version d'valuation ; il peut s'agir d'anomalies identifies par Atozed. lien : lien : http://www.atozed.com/Archive/IntraWeb/FAQ/IDE/2005.EN.aspx http://www.atozed.com/Archive/IntraWeb/FAQ/Keys.EN.aspx

J'ai une erreur 'page introuvable' dans mon navigateur lorque je tente d'accder via IIS 5.1 une application en mode ISAPI
Auteur : Magnus Vous devez vrifier : - que vous avez correctement saisi votre url et ventuellement que sous IIS vous avez positionn une page par dfaut dont le chemin d'accs est correct - que l'utilisateur IUSR_<NOM_MACHINE> dispose des droits suffisants sur le rpertoire contenant la page laquelle vous tentez d'accder (et sur tous les rpertoires auxquels votre application accessible cette url pourrait accder) - s'il existe une base oracle d'installe alors elle peut dj couter sur le port 80 requis par IIS. Pour liminer cette hypothse, installez un programme tel que ActivePorts qui permet de lister les ports actifs de votre machine vous indiquant aussi quel processus occupe quel port. Si vous trouvez un processus nomm webcached.exe qui coute sur le port 80 alors sous IIS vous devez modifier l'url laquelle vous pouvez accder votre application en utilisant un port disponible que vous aurez identifi via ActivePorts (ex : http://<url_application_ISAPI>:<port_libre>/<page_par_defaut>). Lorsque vous modifiez la configuration d'un rpertoire virtuel, n'oubliez pas d'arrter ce service et de le redmarrer sous peine de ne pas voir vos modifications s'appliquer : $net stop iisadmin $net start w3svc. lien : tlchargement du freeware ActivePorts

- 299 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Composants Indy

- 300 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Composants Indy > Gnralits Qu'est-ce qu'un socket ?


Auteur : reisubar Un socket est l'abstraction d'un objet via lequel un service peut envoyer ou recevoir des donnes. Il permet la connexion au rseau de l'application et sa communication avec les autres entits connectes. Les sockets se composent de deux familles principales : les sockets de stream (stream sockets) et de datagrames (datagrams sockets). Les sockets de datagrammes utilisent UDP pour envoyer rapidement des messages qui n'excdent pas 65000 octets de longueur, alors que les sockets de streams permettent de recevoir de manire fiable des flux de donnes avec TCP. Sous Windows, la gestion des sockets est effectue par un ensemble de fonctions (API) nommes Winsock (WINdows SOCKets), actuellement en version 2 (ws2_32.dll). Delphi encapsule ces API avec les composants basiques TTCPServer et TTCPClient. Cependant, ces composants sont vraiment peu flexibles et peu vidents. De nombreuses librairies plus pratiques se sont dveloppes pour Delphi. Les deux plus connues sont : ICS, de Francois Piette : http://www.overbyte.be/frame_index.html Indy, dont il est question ici : http://www.indyproject.org/index.en.aspx

Qu'est-ce qu'un socket bloquant ?


Auteur : reisubar Il y a deux modes d'exploitation des sockets : le mode bloquant et le mode non bloquant (Winsock supporte les 2 modes). Le principe du mode bloquant (Indy) est le suivant : une fonction lisant ou crivant sur un socket ne rend pas la main tant qu'elle n'a pas termin ses oprations. Si un fichier doit tre envoy via un canal TCP, la fonction l'envoyant ne rendra pas la main tant qu'elle n'aura pas termin l'envoi, ou qu'une erreur survienne pendant cet envoi. C'est, ceci dit, le comportement normal de toute fonction Delphi : cela se passe de la mme manire lorsque vous lisez ou vous crivez dans un fichier, part que les temps d'accs sur le rseau sont nettement plus long que sur votre disque. On utilisera des techniques spciales pour ne pas que toute l'application soit fige en phase bloquante. Le mode non bloquant (implment dans la librairie internet ICS de Francois Piette ) fonctionne de manire oppose. Par exemple, l'excution n'est pas stoppe en l'attente de donnes si vous lisez le socket alors qu'il n'y a aucune donne disponible. Des vnements sont dclenchs quand il y a quelque chose lire et quand ce qu'il y a crire a t crit. Lorsque vous voulez envoyer quelque chose, la fonction rend immdiatement la main et Windows renvoie un message l'opration termine, que vous pouvez ventuellement prendre en compte dans un vnement du composant. Cette approche vnementielle est plus difficile utiliser au dbut ( mon avis ) car on doit toujours utiliser les vnements du serveur pour connatre l'tat des oprations prcdentes alors qu'un simple gestionnaire d'erreurs suffit en mode bloquant. Le dbat entre sockets bloquants et sockets non bloquants a fait couler beaucoup d'encre. Le fait que le mode bloquant impose l'utilisation de threads (du moins, du ct serveur, comme vous le verrez dans la section Serveurs Indy ) peut faire dire certains qu'au final, lors d'utilisations intensives, le systme passera plus de temps basculer entre les threads qu' traiter concrtement les requtes. A ce sujet, le concepteur d'Indy rpond que les threads ne sont bascules que lorsqu'elles sont actives alors que les sockets sont la plupart du temps en phase d'attente, c'est donc un faux problme. Le ct bloquant a de nombreux avantages dont le premier est la simplicit de conception et de dboguage : toutes les transactions sont crites en une seule procdure, on n'a pas besoin de grer des connexions par des squences d'vnements. Le mode bloquant est trs adapt aux threads. De plus, les sockets bloquants sont les seuls supports sous Linux. Indy ayant t port pour Linux, si vous voulez construire des applications multi plates formes, c'est sans doute un bon choix que de prendre Indy comme base sous Kylix.

- 301 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Indy et ICS reprsentent chacun de leur ct une excellente implmentation des deux modes de fonctionnement des sockets. Essayez les deux, et faites votre choix. Cette FAQ est en tout cas base sur Indy. lien : Composants ICS

Qu'est-ce que Indy ?


Auteur : reisubar Indy est une librairie de composants Open Source disponible pour Delphi et Kylix (Linux). C'est un ensemble d'environ 70 objets prenant en charge la majorit des protocoles client et serveur. Indy fut d'abord dvelopp sous Visual Basic en 1993 comme un jeu de fonctions par Chad Z. Hower. Port sous Delphi, initialement sous le nom de Winshoes, il fut ouvert l'open source en 1995, puis inclus dans Delphi 6 et 7. La version 8 de Winshoes, dont l'objectif principal tait la compatibilit avec Kylix, a t renomme en Indy (Internet Direct) pour perdre le lien original du nom avec Windows (Winshoes tait un jeu de mots avec Winsocks, l'implmentation Win32 des sockets). Indy est maintenant maintenue par une quipe de professionnels et dsormais port pour la plateforme .NET. Deux versions sont ce jour disponibles : la version 9 et la version 10. La version 9 est considre comme stable, la version 10 est une refonte complte du noyau effectue tout en tentant de garder une compatibilit minimum avec la version 9. De nombreux nouveaux protocoles sont prvus, les performances amliores via l'utilisation de fibers (sorte de threads dont la gestion n'est pas assure par l'OS), etc. Pour l'instant cette version est en bta-test, on ne l'utilisera donc pas, et on se concentrera sur la version 9. Je vous conseille vivement de dsinstaller proprement la version que vous possdez (surtout si elle est antrieure la 9 !) pour installer la dernire version snapshot (la release n'a pas t mise jour depuis un petit bout de temps !). Celle-ci est disponible sur ftp://indy.fulgan.com/, rpertoire Indy9 . Elle doit s'installer sans problme.

Comment utiliser les Command Handlers ?


Auteur : reisubar Les CommandHandlers ont t introduits pour simplifier l'implmentation de serveurs qui doivent ragir des commandes textuelles comportant des paramtres ventuels. Ils peuvent tre utiliss pour gnrer des messages de rponse et/ou appeler des procdures pour raliser ce que la commande est sense faire. Si, par exemple, vous voulez implmenter une commande permettant d'teindre un ordinateur distance, vous pouvez enregistrer un handler pour la commande SHUTDOWN sur le serveur, qui sera donc dclench quand la commande sera reue. Vous ne rpondrez donc pas la commande dans OnExecute, mais dans l'vnement OnCommand du CommandHandler cre. Pour utiliser les CommandHandlers, la proprit CommandHandlerEnabled des descendants du TIdTCPServer doit tre mise true. Ensuite, vous devez ajouter des items dans la collection "CommandHandlers". Changez la proprit "Command" de ces items avec le nom de la commande laquelle votre serveur devra ragir. Tapez ensuite le code excuter dans l'vnement OnCommand du CommandHandler cr. Exemple de code :
procedure TForm1.IdTCPServer1TIdCommandHandler0Command( ASender: TIdCommand); var Param1,Param2 : string; begin with ASender.Thread.Connection do try if ASender.Params.Count<2 then //Accs aux paramtres //Envoi d'une rponse avec WriteLn
- 302 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

WriteLn('Pas assez de paramtres !') else begin Param1 := ASender.Params[0]; Param2 := ASender.Params[1]; //Faire quelque chose end; finally //Au final, par exemple, dconnecter. Disconnect; end; end;

Pourquoi n'y a t-il pas d'vnements OnError dans les sockets Indy ?
Auteur : reisubar Contrairement certains sockets, les composants Indy n'ont pas d'vnements OnError. En fait, les concepteurs ont privilgi la voie naturelle de gestion des exceptions : lorsqu'une erreur doit tre notifie, une exception est leve, comme tout autre composant de la VCL. A vous, par consquent, d'encadrer les blocs de code susceptibles de produire des erreurs par les structures de contrle try except end et try finally end.

Comment diffrencier erreurs VCL et erreurs Indy ?


Auteur : reisubar Les exceptions Indy descendent toutes de EIdException. On peut donc diffrentier les erreurs lies la connexion et celles de la VCL en construisant un gestionnaire d'erreurs de ce style :
Try //Code ici Except On E : EIdException do MessageDlg(Format('Erreur Indy : %s',[E.message]), mtError, [mbOK], 0) On E : Exception do MessageDlg(Format('Autre type d'erreur : %s',[E.message]), mtError, [mbOK], 0); End;

Vous devez rajouter IdException dans votre clause Uses pour que ce code puisse fonctionner.

A quoi sert la proprit Bindings ?


Auteur : reisubar Par dfaut, votre serveur est attach au port choisi avec toutes les adresses IP disponibles sur le poste (Indy utilise l'IP gnrique 0.0.0.0). Modifiez cette proprit pour associer votre service une seule ou plusieurs IP dtermines. Par exemple, si vous souhaitez que votre serveur web ne puisse tre accessible que par votre machine (ceci par exemple pendant les phases de test), vous pouvez associer uniquement votre IP locale la proprit Bindings. Par code, cela donnerait :
IdHTTPServer.Bindings.Clear; with IdHTTPServer.Bindings.Add do begin IP := '127.0.0.1'; Port := 80;

- 303 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

Comment dboguer des applications Indy ?


Auteur : reisubar - Lors de la mise au point d'algorithmes, crez un projet vierge sur lequel vous poserez les composants client et serveur. Ne remplissez pas les proprit Host, localhost (le poste courant) sera automatiquement utilis et les deux composants communiqueront directement en local. Utilisez les points d'arrt bon escient en les posant aux endroits critiques dans le serveur et le client. Une fois les algoritmes mis au point, divisez le projet en deux applications, le client et le serveur, et intgrez le code dbogu aux deux parties. - Lorsque vous voulez tester des protocoles orients "commande" qui ne ncessitent pas de communications binaires, pensez tester votre application avec Telnet ! Telnet est un socket client qui ne fait que transmettre vos requtes et afficher les rponses du serveur, c'est le moyen idal de voir ce qu'il vous rpond. Le client telnet se dmarre sous Windows par la ligne de commande suivante :
telnet <Hte> <IP>

Par exemple, pour tester votre serveur HTTP :


telnet localhost 80

- Enfin, pour voir les flux changs, posez un TIdLogFile sur votre fiche, mettez sa proprit Active True et liez-le un composant Client via leur proprit Intercept. Indiquez un nom de fichier dans la proprit FileName : il correspondra au fichier o seront enregistrs tous les tats successifs du serveur ainsi que les flux changs entre client et serveur. Lancez votre application, et servez vous du fichier pour voir exactement les octets envoys et reus et procder au dbogage.

Comment soumettre un formulaire de type file avec Indy ?


Auteur : reisubar Vous pouvez parfois avoir envoyer des flux binaires un serveur via un formulaire : la majorit du temps, il sagit de formulaires d'upload de fichiers qui copient un fichier de votre pc vers le serveur. On va voir un cas pratique : la ralisation d'un tel systme en HTML/PHP puis la simulation du formulaire HTML avec Indy. Le code HTML du formulaire (ct client) C'est un formulaire classique, contenant deux champs : un pour contenir le chemin du fichier uploader (userfile), l'autre pour contenir le dossier de destination sur le serveur (dossier). Les donnes sont envoyes par POST, directement dans la requte HTTP.
<HTML> <BODY> <FORM method="post" enctype="multipart/form-data" action="http://127.0.0.1/upload/uploadfile.php"> <INPUT type="hidden" name="MAX_FILE_SIZE" value="2000000" /> Dossier : <INPUT type="text" id="dossier" name="dossier" size="20" /> <BR /> Fichier : <INPUT type="file" id="userfile" name="userfile" size="20" /><BR /><BR /> <INPUT type="submit" value="Envoyer..." /> </FORM> </BODY> </HTML>

Le code PHP (ct serveur) Plac dans le dossier /upload, le script effectue les actions suivantes : Rcuprer et traiter l'adresse de destination,

- 304 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Crer le dossier o sera stock le fichier (si ncessaire), Vrifier l'intgrit du fichier (en comparant sa taille thorique et la taille du fichier reu), Renomer les fichiers PHP en TXT pour viter des attaques suivant le mode du "cheval de troie", Dplacer le fichier reu dans le bon rpertoire (/upload).
<?php $dossier=$_POST['dossier']; if($dossier<>'') { if(substr($dossier,strlen($dossier)-1,1)=='/')$dossier.='/'; $dir=@explode('/',$dossier); $dossier=''; for($x=0;$x<count($dir);$x++) { $dossier.=$dir[$x].'/'; if(! @is_dir($dossier))@mkdir($dossier,0777); } if(! @is_dir($dossier))die("Le dossier est invalide! (".$dossier.")"); } $filenameHTTP=$HTTP_POST_FILES['userfile']['name']; $typeHTTP=$HTTP_POST_FILES['userfile']['type']; $sizeHTTP=$HTTP_POST_FILES['userfile']['size']; $tmpfileHTTP=$HTTP_POST_FILES['userfile']['tmp_name']; if((empty($filenameHTTP))or($sizeHTTP<=0)) die("Le fichier spcifi est introuvable ou vide!"); if(@is_uploaded_file($tmpfileHTTP)) { if(@eregi('.php',$filenameHTTP))$filenameHTTP.='.txt'; if(filesize($tmpfileHTTP)<>$sizeHTTP) die("Erreur de tlchargement du fichier!"); if(@move_uploaded_file($tmpfileHTTP,$dossier.$filenameHTTP)) { @chmod($filenameHTTP,0777); echo "Fichier correctement upload!<br>". $dossier.$filenameHTTP." (".round($sizeHTTP/1024)." ko)<br>"; } else die("Une erreur est survenue lors du tlchargement!"); } else die("Erreur de tlchargement du fichier!"); ?>

Soumettre ce formulaire avec Indy Basiquement, il sagit de "remplir" les champs du formulaire comme vous le faites depuis un navigateur Web. On doit donc renseigner le champ "dossier" et "userfile"... Pour cela, on utilise un objet TIdMultiPartFormDataStream (ajoutez IdMultipartFormData dans votre clause uses). Les champs "normaux" sont remplis avec la mthode AddFormField qui attend un nom de champ et une valeur. Le champ contenant le flux binaire envoyer au serveur est quand lui rempli avec la mthode AddFile qui attend elle, un nom de champ, l'adresse du fichier joindre et le type MIME des donnes joindre. Enfin, on poste la requte en appellant Post() paramtr avec l'adresse du script PHP ainsi que le IdMultipartFormData cre :
uses IdMultipartFormData, ... ... procedure TForm1.Button1Click(Sender: TObject); var MultiPartFormDataStream: TIdMultiPartFormDataStream; begin if OpenDialog1.Execute then begin MultiPartFormDataStream := TIdMultiPartFormDataStream.Create; try //"Remplis" la variable "dossier" pour spcifier l'upload dans /test MultiPartFormDataStream.AddFormField('dossier','/test'); //"Joint" le fichier MultiPartFormDataStream.AddFile('userfile', OpenDialog1.FileName, 'multipart/form-data'); MultiPartFormDataStream.Position := 0; //Poste ! IdHTTP1.Post('http://127.0.0.1/upload/uploadfile.php', MultiPartFormDataStream); finally MultiPartFormDataStream.Free; end;

- 305 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end; end;

Notez que PHP.INI interdit gnralement l'upload de fichiers de plus de 2 Mo. Vous devrez donc faire un test dans votre programme avant d'envoyer le fichier pour empcher toute transmission de fichiers suprieurs cette taille.

Comment utiliser le SSL avec Indy ?


Auteur : Malatar Il faut rcuprer les 2 DLL OpenSSL selon la version de indy que l'on utilise : - Indy 9 : http://indy.fulgan.com/SSL/ - indy 10.1.5 : il faut les DLLs 0.98 http://indy.fulgan.com/ZIP/ http://www.apachefrance.com/Telechargement/fichiers/mod_ssl-2.0.58-openSSL-0.98a.zip Ensuite, il suffit de poser un composant IdSSLIoHandlerOpenSll et le lier au composant Indy par le IOHandler (IdSmtp , idHttp, etc ...). Attention : Les DLLs doivent tre dans le rpertoire de l'application ou dans le rpertoire System32 de Windows.

- 306 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Composants Indy > Indy et les threads Comment empcher mon application de sembler bloquer lors de l'envoi ou de la rception de commandes ?
Auteur : reisubar Les composants Indy sont des sockets bloquants, c'est dire qu'une fonction ncessitant l'envoi ou la rception de donnes ne rendra pas la main tant que tout le volume d'informations n'aura pas t reu ou envoy. Pendant ce temps, les messages Windows ne sont plus traits, ce qui se caractrise essentiellement par l'aspect "gel" de l'application. Pour y remdier, il y a plusieurs solutions : Travailler avec des applications console qui ne demandent pas d'interaction avec l'utilisateur, Poser un TIdAntiFreeze sur la fiche. Ce composant appelle automatiquement "ProcessMessages()" pendant les "timeout" des sockets ce qui permet de traiter les messages et de ne pas figer l'application. Au prix d'un lger (mais imperceptible) ralentissement, vous avez tout les avantages des sockets bloquants sans leurs inconvnients. Travailler avec des threads. Indy est conu pour tre thread : crer un nouveau thread comportant le socket et son code empchera tout blocage (du moins, le thread principal du programme ne sera pas affect lorsque le (ou les) thread(s) secondaires seront en phase bloquante).

Notez que seul les clients doivent se proccuper de problmes de blocage. Les serveurs eux sont automatiquement threads

Comment bien grer l'accs aux objets dans le thread serveur ?


Auteur : reisubar Il y a plusieurs mthodes de synchronisation qui peuvent (qui doivent) tre excutes dans le serveur, d au fait que chaque requte client s'excute dans un thread particulier (voir QR 'fonctionnement des serveurs'). -Objets et variables prives au thread : aucune mthode de synchronisation ni prcautions particulires ne doivent tre prises, car ces variables ne sont partages que par l'instance du thread en elle-mme. -Objets publics, fichiers, lments non graphiques : Si l'accs ces objets se fait en lecture seule il n'y a pas besoin de protection. Si par exemple un fichier INI doit tre lu pour extraire une valeur dans une fonction, cette fonction peut tre appele sans protection particulire depuis le thread serveur. Ds que ces lments doivent tre modifis, on doit utiliser des Sections Critiques (l'objet TCriticalSection). Cela assure qu'un seul thread la fois excute les passages de code accdant des objets non propres aux threads. Voil un exemple ajoutant le nom d'un utilisateur dans une TStringList publique: 1.Dclaration d'une section critique, dans les variables globales de la fiche (on n'oubliera pas d'ajouter SyncObjs dans la clause uses):
var GLock : TCriticalSection;

2.On cre et on dtruit cette section dans la partie initialization et finalization de l'unit :
initialization GLock := TCriticalSection.Create; finalization GLock.Free;

3.Dans la fonction, on appelle Acquire pour commencer le blocage et Leave pour l'arrter :

- 307 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

procedure TForm1.AddUser(const AUserName: string); begin GLock.Acquire; try //Code ne devant tre excut que par un thread la fois if UserList.IndexOf(AUserName)<0 then UserList.Add(AUserName); finally GLock.Leave; end; end;

- Elements graphiques de la VCL : la plupart les objets VCL supposent qu'ils s'excutent depuis le thread principal de l'application. Utiliser les sections critiques rsout le problme de la concurrence (seulement un thread peut mettre jour l'interface graphique de l'application) mais pas de l'unicit des threads puisque c'est toujours le thread du serveur qui utilise les fonctions de mise jour graphiques. On utilise donc Synchronize(), qui interrompt l'excution du thread qui l'appelle et fait excuter la mthode passe en paramtre par le thread principal de l'application. Il y a plusieurs manires de procder avec Synchronize. La premire mthode est de crer des procdures dans la fentre principale qui mettent jour l'interface et de les appeler via la mthode Synchronize() du TIdPeerThread :
procedure TForm1.ClientConnected; begin ListBox1.ItemIndex := ListBox1.Items.Add('Un client s''est connect !') end;

Dans un vnement serveur :


procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin AThread.Synchronize(Form1.ClientConnected); //MAJ GUI end;

Le principal problme est que la fonction ne doit pas accepter de paramtres pour tre synchronise. La seconde mthode est de crer une classe de synchronisation. Il faudra ensuite crer une instance de cette classe, assigner une valeur sa variable prive Data , puis appeler 'DoSynchronize' avec un thread Indy et la mthode qui doit tre invoque par Synchronize(), et enfin librer l'objet.
TSyncClass = class protected FData : string; public procedure UpdateVCL; //Procdure sans paramtre qui pourra tre synchronise procedure DoSynchronize(AThread : TIdThread; AMethod : TThreadMethod); end; { TSyncClass } procedure TSyncClass.DoSynchronize(AThread: TIdThread; AMethod: TThreadMethod); begin AThread.Synchronize(AMethod); //synchro. end; procedure TSyncClass.UpdateVCL; begin //Procdure manipulant les lments graphiques de la VCL Form1.ListBox1.ItemIndex := Form1.ListBox1.Items.Add(FData) end;

- 308 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

On pourra ainsi appeler notre classe dans un vnement serveur : procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin with TSyncClass.Create do try FData := Format('Le client %s se connecte...',[AThread.Connection.Socket.Binding.PeerIP]); DoSynchronize(AThread,UpdateVCL); finally Free; end; end;

Comment le serveur gre t-il les threads clients ?


Auteur : reisubar Les serveurs Indy bass sur TCP ont peu prs tous le mme fonctionnement. Par dfaut, un thread d'coute ( Listenner Thread ) est cre et attend les connexions clientes. Ds qu'un client est accept, le thread d'coute cr un nouveau thread qui accueillera la connexion cliente. C'est dans le contexte de ce thread que sont dclenchs tous les vnements du serveur. Les vnements serveur s'excutent donc dans des threads diffrents que le principal thread du programme. Une fois le client dconnect, le thread client est supprim par le thread d'coute. Voil la signature classique d'une fonction membre d'un serveur :
procedure TForm1.IdPOP3Server1Execute(AThread: TIdPeerThread); begin //Code end;

Remarquez la prsence de AThread: TIdPeerThread. Cette variable dsigne le thread dans lequel est appele la fonction. Encore une fois, comme un thread est cr pour chaque client, plusieurs exemplaires de la fonction ci-dessus peuvent s'excuter en mme temps. Cela implique que tout accs des lments non-membres du thread devra tre fait l'aide de mthodes de synchronisation. De mme, l'accs aux lments graphiques de la VCL devra se faire absolument en utilisant synchronize().

Comment un serveur peut-il diffuser un message tous ses clients ?


Auteur : reisubar Pour diffuser un message tous ses clients, vous pouvez rcuprer la liste de tous les threads clients par la proprit Threads du serveur. LockList() est utilis pour refuser l'accs la liste pendant qu'on effectue les oprations. Dans notre cas, il s'agit d'un simple WriteLn() envoyant le message fourni en paramtre. Code d'exemple :
procedure TForm1.BroadcastMessage(TheMessage : String); var Count: Integer; List : TList; begin List := tcpServer.Threads.LockList; //vrouiller la liste try for Count := 0 to Pred(List.Count) do //Pour chaque thread try TIdPeerThread(List.Items[Count]).Connection.WriteLn(TheMessage); //Envoie le message except TIdPeerThread(List.Items[Count]).Stop; end;
- 309 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

finally tcpServer.Threads.UnlockList; //dvrouiller la liste end; end;

- 310 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Composants Indy > Indy et le Client/Serveur Comment dois-je faire pour rpondre un client avec mon serveur ?
Auteur : reisubar - Si vous utilisez un serveur bas sur un protocole pris en charge par Indy (HTTP, FTP, SMTP, etc.), celui-ci fournit des vnements dans lesquels vous avez ou vous pouvez, directement ou indirectement, communiquer avec le client. La plupart du temps vous n'avez pas besoin d'envoyer directement du texte ou des commandes "brutes", il s'agit de remplir des proprits ou des variables que Indy utilisera pour gnrer une rponse correctement formate, en fonction du protocole utilis. - Vous pouvez galement vous servir des "CommandHandlers". Ces proprits serveur permettent de ragir des commandes et d'excuter des fonctions leur rception. Voir le sujet Comment utiliser les Command Handlers ?. - Enfin, la dernire solution est d'utiliser l'vnement OnExecute. Celui-ci est dclench juste aprs la connexion du client et est appell en boucle tant que celui-ci n'est pas dconnect. Vous pouvez dans cet vnement crire directement sur la connexion et changer des donnes avec le client. Il est important dans cette procdure de bien grer les exceptions, car en cas d'erreur non gre, l'excution de la procdure sera interrompue, et la connexion avec le client laisse en suspens tant que la pile TCP/IP ne ferme pas la connexion pour cause de "time out". Cela pouvant prendre une ou deux minutes, on utilisera toujours un bloc try...finally...end. Exemple "type" de bloc OnExecute :
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); begin with AThread.Connection do try try //Travail effectuer except //Notification d'une erreur au client on E : Exception do WriteLn(Format('ERROR : %s',[e.Message])); end; finally Disconnect; //Fermeture de la connexion end; end;

lien : Comment utiliser les Command Handlers ?

Comment changer du texte entre client et serveur ?


Auteur : reisubar Si vous souhaitez changer facilement des lignes de texte entre client et serveur, utilisez les fonctions WriteLn() et ReadLn() du TIdTCPClient et de l'objet Connexion du TIdPeerThread du serveur. Voil un exemple simple : un serveur qui excute la ligne de commande qui lui est envoye. Dans l'extrait de code ci-dessous, le client fait excuter au serveur la commande "shutdown", et donc commande distance son extinction. Code du client
procedure ShutdownServer(const AHost : string; const APort : integer); begin with IdTCPClient do begin Port := APort; Host := AHost; try Connect; //connecte
- 311 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

IdTCPClient.WriteLn('shutdown -h -t 00'); //envoie la ligne de commande if IdTCPClient.ReadLn()<>'OK' then //attends la rponse. Si <> de OK, erreur : MessageDlg('Erreur : l''excution a t refuse par le serveur.', mtInformation, [mbOK], 0); finally Disconnect; //dans tous les cas, se dconnecter end; except MessageDlg('Une erreur est survenue durant l''envoi de commandes', mtError, [mbOK], 0); end; end; end;

Try

Code du serveur Le code se place dans l'vnement OnExecute du serveur :


procedure TForm1.IdTCPServerExecute(AThread: TIdPeerThread); var Line, Command, Args : String; begin Line := AThread.Connection.ReadLn(); //Lire une ligne AThread.Connection.WriteLn('OK'); //Signifie que la demande a t correctement reue. //On pourrait renvoyer autre chose pour notifier un refus d'excution. if Pos(' ',Line)>0 then begin //Il y a un/des paramtre(s), il faut extraire Commande et Arguments Command := Copy(Line,1,Pred(Pos(' ',Line))); Args := Copy(Line,Succ(Pos(' ',Line)),Length(Line)) end else begin //Aucun paramtre. Commande = toute la ligne reue Command := Line; Args := ''; end; //Excuter la ligne de commande ShellExecute(Handle,nil,PChar(Command),PChar(Args),nil,SW_SHOWNORMAL); end;

Comment compresser les flux entre client et serveur ?


Auteur : reisubar Il est trs facile de compresser les flux changs entre un client et un serveur descendant respectivement de TIdTCPClient et TIdTCPServer. Ct client, il faut associer un TIdCompressionIntercept la proprit Intercept du client. Vous devez entrer un nombre entre 1 et 9 dans la proprit CompressionLevel pour indiquer le niveau de compression utiliser (0 correspond une compression nulle). Ct serveur, vous devez crer dynamiquement pour chaque thread client un CompressionIntercept afin de permettre la dcompression du flux de connexion (et le librer la connexion termine). Ceci peut s'implmenter ainsi : Dans l'vnement OnConnect :
procedure TForm1.IdTCPServerConnect(AThread: TIdPeerThread); begin with (AThread.Connection) do begin Intercept := TIdCompressionIntercept.Create(nil); //Crer le "dcompresseur" TIdCompressionIntercept(Intercept).CompressionLevel := 9; //Niveau de compression end; end;

- 312 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Dans l'vnement OnDisconnect :


procedure TForm1.IdTCPServerDisconnect(AThread: TIdPeerThread); begin with (AThread.Connection) do begin if Assigned(Intercept) then //Assign ? begin Intercept.Free; //on libre... Intercept := nil; end; end; end;

Comment envoyer des enregistrements (record) entre un client et un serveur ?


Auteur : reisubar Tout d'abord, il faut dfinir un record : - ...dont les membres sont de longueur statique, pour que la taille globale du record soit prvisible du ct client comme du ct serveur. Par consquent, vous ne pouvez pas utiliser des types de longueur variable automatiquement grs par Delphi. Le type brut string est proscrire. Indiquez toujours une longueur maximum (string [15], pour par exemple crer une chane de 15 caractres maximum), voire passez vos chanes par des array of char. - ...exempts de tout pointeurs. Les pointeurs dsignent un espace mmoire propre un processus. Le serveur et le client sont gnralement sur des machines diffrentes et ne partagent pas le mme processus mmoire : l'adresse transmise ne correspondrait donc rien. Exemple d'enregistrement valide :
TClient = record Nom : string[50]; Adresse : string[200]; CodeVille : integer; end;

Cet enregistrement doit tre le mme ct serveur et ct client. L'idal est que les deux entits partagent la mme unit de dfinition du record. Code ct client : On utilisera WriteBuffer pour crire dans le tampon de connexion. Le dernier paramtre, mis true, permet de le vider instantanment dans le flot pour qu'il soit directement transmis au serveur :
IdTCPClient.WriteBuffer(ARecord,sizeof(ARecord),true);

Code ct serveur : Dans l'vnement OnExecute, on utilisera ReadBuffer pour lire dans le tampon :
AThread.Connection.ReadBuffer(Recv,Sizeof(Recv));

Comment transfrer un fichier entre un client et un serveur ?


Auteur : reisubar On peut facilement envoyer un fichier entre un client et un serveur TCP. Pour cela, on utilise chez le client la mthode WriteStream. Sur le serveur, on se contente de lire le flux et de le placer dans un TFileStream.

- 313 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Il est ncessaire de mettre au point un minuscule protocole pour que les entits puissent communiquer aisment. Voil celui que j'ai choisi : - Le client se connecte au serveur, et lui envoie la commande "TRANS" suivie du nom de fichier qu'il envoie. - Le serveur reoit la commande TRANS, et comprend qu'on lui envoie un fichier. Il extrait alors le nom du fichier et cre un TFileStream sur un document du mme nom dans son rpertoire. - Le client envoie ensuite la taille du fichier. Cette taille sera ncessaire lorsqu'il faudra lire un flux sur la connexion (spcifier la taille du flux est obligatoire, o alors le flux est lu jusqu' la dconnexion, ce qui n'est pas ce que nous souhaitons faire ici). - Le serveur reoit la taille du fichier. Il attend donc un flux et le stocke dans le TFileStream jusqu' que le nombre d'octets reus atteigne la valeur lue prcdemment. - Pendant ce temps, le client ouvre son tampon d'criture, place le contenu du fichier transfrer en utilisant WriteStream puis ferme ce flux. - Une fois la rception termine, le serveur confirme la bonne rception en crivant sur la connexion "OK". Notez que toute exception ventellement leve ct serveur fait crire "ERR" au lieu de "OK". - Le client attend une rponse du serveur. Si celle-ci est gale "OK", on en dduit que tout s'est bien pass, et on fait renvoyer true la fonction, false sinon. - L'change termin, client et serveur se dconnectent mutuellement. Code de la fonction d'envoi :
function TForm1.SendFile(const AFileName: string; ATcpClient: TIdTCPClient) : Boolean; var Fs : TFileStream; begin Result := False; ATcpClient.Connect(); //Connecte. Les proprits Host et Port doivent tre remplies. try Fs := TFileStream.Create(AFileName,fmOpenRead,fmShareDenyWrite); //Crer le flux try ATcpClient.WriteLn(Format('TRANS %s',[ExtractFileName(AFileName)])); //demander transfert try ATcpClient.WriteInteger(Fs.Size); //Ecrire la taille ATcpClient.WriteStream(Fs); //Ecrit le flux except MessageDlg('Erreur pendant l''envoi du fichier.', mtError, [mbOK], 0); end; finally FreeAndNil(Fs); //Librer le flux Result := ATcpClient.ReadLn()='OK'; //OK uniquement si le serveur a renvoy "OK" end; finally ATcpClient.Disconnect; //Dconnecter la fin. end; end;

Code du serveur :
procedure TForm1.IdTCPServerExecute(AThread: TIdPeerThread); var Line, FileName : String; i, FileSize : integer; Fs : TFileStream; begin with AThread.Connection do try Line := ReadLn(); //Attends une commande de la forme TRANS suivi du nom de fichier i := Pos(' ',Line); if (i>0) and (LowerCase(Copy(Line,1,Pred(i)))='trans') then begin FileName := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + Copy(Line,Succ(i),Length(Line)); //Copier nom de fichier Fs := TFileStream.Create(FileName,fmCreate); //Crer le flux
- 314 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

try try FileSize := ReadInteger(); //Lire la taille ReadStream(Fs,FileSize,False); //Lire le flux WriteLn('OK'); //Signaler succs except WriteLn('ERR'); //Signaler une erreur end; finally FreeAndNil(Fs); //Librer le flux dans tous les cas end; end else WriteLn('ERR'); //Commande incomprise finally Disconnect; //A la fin, on dconnecte end;

Exemple d'exploitation :
procedure TForm1.Button1Click(Sender: TObject); begin IdTCPClient.Host := 'localhost'; //Hte IdTCPClient.Port := 1985; //Le serveur doit aussi couter sur le port 1985 if SendFile('c:\setup.exe',IdTCPClient) then MessageDlg('Ok !', mtInformation, [mbOK], 0) else MessageDlg('Erreur...', mtInformation, [mbOK], 0) end;

Comment stocker des informations sur un client ?


Auteur : reisubar Dans les protocoles connexions "persistantes" (la connexion est maintenue durant toute la session), on peut utiliser dans le thread associ au client la proprit Data de type TObject pour stocker un ensemble d'informations qui lui sont propres. Par exemple, dans un serveur FTP, pour stocker le rpertoire racine du client pendant la connexion, on peut procder ainsi : - Au moment de la connexion, on cre un objet qu'on remplit avec les proprits adquates. On l'associe ensuite au thread client. - Dans tout le reste du programme on pourra relire cette proprit dans les vnements serveurs (puisque tous les vnements ont accs au thread qui leur sont lis). On prendra garde bien transtyper cette proprit dans le type choisi au dpart pour l'objet. - A la dconnexion, on librera l'objet. Autrement dit : On dfinit un objet associer chaque thread :
TFtpClient = class(TObject) RootPath : String; //L'information mmoriser Thread : Pointer; //Pointe vers le thread client end;

Au moment de la connexion, on l'associe au thread client :


procedure TMainForm.IdFTPServerAfterUserLogin(ASender: TIdFTPServerThread); var AClient : TFtpClient;
- 315 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin AClient := TFtpClient.Create; //Cration AClient.Thread := ASender; //Association Objet->Thread attach AClient.RootPath := 'Donne mmoriser'; ASender.Data := AClient; //Associer l'objet au thread end;

Dans n'importe quel vnement, on pourra accder cette proprit en n'oubliant pas de la transtyper (ici, on appelle la fonction StrGetRealPathName avec la valeur "RootPath" associe prcdemment l'objet ) :
procedure TMainForm.IdFTPServerMakeDirectory(ASender: TIdFTPServerThread; var APath : string; begin APath := StrGetRealPathName(TFTPClient(ASender.Data).RootPath,ASender.CurrentDir,VDirectory); ...etc

A la dconnexion, on librera l'objet :


procedure TMainForm.IdFTPServerDisconnect(AThread: TIdPeerThread); var AClient : TFtpClient; begin AClient := TFtpClient(AThread.Data); //on rcupre l'objet if AClient <> nil then //Si le client a une structure associe... begin FreeAndNil(AClient); //...on la dtruit AThread.Data := nil; end; end;

Comment utiliser le protocole UDP avec Delphi ?


Auteur : SubZero2 Il existe deux modes de communication : le mode connect, le plus courant, correspondant au protocole TCP et le mode dconnect correspondant au protocole UDP. Vous tes invits lire de la documentation approprie pour plus de dtails sur ces deux protocoles. Pour utiliser le protocole UDP partir de Delphi, nous pouvons utiliser les composants de la suite Indy, en particulier les composants IdUDPClient et IdUDPServer. Le client envoie des donnes au serveur par l'intermdiaire de la mthode Send du composant IdUDPClient, comme nous sommes en mode dconnect, nous devons prciser le destinataire du message ainsi que le port chaque message :
IdUDPClt.Send('Host', 'Port', 'Le message envoy');

Ct serveur, nous devons crire un gestionnaire pour l'vnement UDPSrvUDPRead pour spcifier les oprations excuter la rception d'un message. L'exemple qui suit affiche le message reu ainsi que le port et le nom de l'expditeur :
procedure TForm1.UDPSrvUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var DataStringStream: TStringStream; begin DataStringStream := TStringStream.Create(''); try DataStringStream.CopyFrom(AData, AData.Size);

- 316 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

ShowMessage(Reu : "' + DataStringStream.DataString + '" De : ' + ABinding.PeerIP + ' sur le port : ' + IntToStr(ABinding.PeerPort)); finally DataStringStream.Free; end; end;

- 317 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Composants Indy > Indy et les adresses IP Comment dterminer la classe d'une IP ?
Auteur : reisubar Pour dterminer la classe d'une IP, vous pouvez utiliser la mthode GetIPClass de la pile globale GStack. Celle-ci renvoie un type TIdIPClass que vous pouvez exploiter ultrieurement. Voici un exemple d'utilisation qui affiche la classe d'une IP saisie dans un TEdit (remarquez qu'on appelle d'abord IsIP() de la mme classe pour vrifier avant tout si l'IP saisie est bien valide !) :
if GStack.IsIP(Trim(Edit1.Text)) then begin case GStack.GetIPClass(Trim(Edit1.Text)) of Id_IPClassA : MessageDlg('L''IP saisie est Id_IPClassB : MessageDlg('L''IP saisie est Id_IPClassC : MessageDlg('L''IP saisie est Id_IPClassD : MessageDlg('L''IP saisie est Id_IPClassE : MessageDlg('L''IP saisie est Id_IPClassUnkn : MessageDlg('Impossible de mtInformation, [mbOK], 0); end; end;

de classe A.', mtInformation, de classe B.', mtInformation, de classe C.', mtInformation, de classe D.', mtInformation, de classe E.', mtInformation, dterminer la classe de l''IP

[mbOK], [mbOK], [mbOK], [mbOK], [mbOK], !',

0); 0); 0); 0); 0);

N'oubliez pas d'ajouter IdStack dans votre clause uses. lien : Comment vrifier si une IP est correcte ?

Comment vrifier si une IP est correcte ?


Auteur : reisubar Il peut vous arriver d'avoir besoin de contrler si une IP saisie par exemple par un utilisateur dans un TEdit est correcte. Il faut utiliser la fonction IsIP() de la pile globale GStack : elle renvoie une valeur boolenne indiquant si l'IP est valide ou non. Rajoutez IdStack dans la clause uses de votre unit. Voici un exemple d'exploitation :
if not GStack.IsIP(Trim(Edit1.Text)) then begin MessageDlg('L''IP que vous avez entr est incorrecte. Recommencez !', mtError, [mbOK], 0); exit; end;

IsIP renvoie False lorsque la valeur des 4 octets est suprieure 255, ou bien qu'un ou plusieurs octets est manquant ou de trop.

Comment, dans un serveur, rcuprer l'IP du client ?


Auteur : reisubar L'IP du client est enregistre dans la proprit "PeerIP" de la proprit "Bindings" du socket utilis pour la connexion. Ainsi, dans un vnement serveur classique possdant un paramtre identifiant le thread client, celle-ci peut se rcuprer par :
AThread.Connection.Socket.Binding.PeerIP;

- 318 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Dans un vnement de type CommandHandler (ou le thread n'est pas explicitement pass en paramtre), on peut tout de mme la trouver en utilisant le paramtre "Thread" de l'objet "ASender":
ASender.Thread.Connection.Socket.Binding.PeerIP;

Notez que le port client associ la connexion peut aussi tre rcupr de la mme manire, en changeant "PeerIP" par "PeerPort".

Comment puis-je numrer mes adresses IP locales ?


Auteur : reisubar Si vous avez une seule adresse IP (une seule carte rseau), vous pouvez utiliser la pile globale GStack en rajoutant IdStack dans votre clause Uses et en accdant sa proprit LocalAddress :
MessageDlg(Format('Mon IP est : %s',[GStack.LocalAddress]), mtInformation, [mbOK], 0);

Si vous avez plusieurs interfaces rseau, donc plusieurs adresses IP, vous pouvez utiliser la proprit LocalAdresses, de type TStrings. De mme, si vous souhaitez que votre programme puisse s'adapter aux utilisateurs possdant plusieurs adresses IP, il vaut mieux toujours parcourir cette proprit. Ceci peut se faire suivant ce modle :
for i:=0 to Pred(GStack.LocalAddresses.Count) do MessageDlg(Format('IP n%d = %s',[i+1,GStack.LocalAddresses[i]]), mtInformation, [mbOK], 0)

Comment effectuer des pings avec Indy ?


Auteur : reisubar Il faut utiliser le composant TIdICMPClient. Celui-ci comporte une mthode Ping() qui effectue une requte sur l'hte dsign par la proprit Host du composant. Les informations sur le ping envoy sont reues dans la proprit ReplyStatus du composant. On y trouve entre autres le nombre d'octets reus (BytesReceived), le temps en millisecondes (MsRoundTripTime), le TTL du paquet (TimeToLive), etc. Voil titre d'exemple une fonction permettant de dterminer le ping moyen d'un hte donc on spcifie l'IP ou le nom. On passe aussi en paramtre le nombre d'envois que l'on doit faire (plus le nombre de pings effectu sera important, plus le rsultat sera prcis mais plus l'opration sera longue), et une variable de type Double dans laquelle on placera le rsultat. La fonction renvoie true si tout s'est bien droul, false en cas d'chec :
function TForm1.Ping(const AHost : string; const ATimes : integer; out AvgMS:Double) : Boolean; var R : array of Cardinal; i : integer; begin Result := True; AvgMS := 0; if ATimes>0 then with TIdIcmpClient.Create(Self) do try Host := AHost; ReceiveTimeout:=999; //TimeOut du ping SetLength(R,ATimes); {Pinguer le client}

- 319 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

for i:=0 to Pred(ATimes) do begin try Ping(); Application.ProcessMessages; //ne bloque pas l'application R[i] := ReplyStatus.MsRoundTripTime; except Result := False; Exit; end; if ReplyStatus.ReplyStatusType<>rsEcho Then result := False; //pas d'cho, on renvoi false. end; {Faire une moyenne} for i:=Low(R) to High(R) do begin Application.ProcessMessages; AvgMS := AvgMS + R[i]; end; AvgMS := AvgMS / i; finally Free; end; end;

Cette fonction ncessite l'inclusion des units : IdBaseComponent, IdComponent, IdRawBase, IdRawClient, IdIcmpClient. Exemple d'exploitation (ici, on pingue Developpez.com !) :
procedure TForm1.Button1Click(Sender: TObject); var RoundTripTime : Double; begin if Ping('www.developpez.com', 4, RoundTripTime) then MessageDlg(Format('Ping moyen : %s',[FormatFloat('0.00',RoundTripTime)]), mtInformation, [mbOK], 0) else MessageDlg('Erreur. L''hte est sans doute injoignable.', mtInformation, [mbOK], 0); end;

L'envoi de ping avec cette mthode ncessite les droits administrateurs sous Windows NT/2000/XP.

- 320 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Composants Indy > IdHTTP Comment tlcharger un fichier avec un IdHTTP ?
Auteur : reisubar C'est trs simple : il suffit d'utiliser la mthode Get du TIdHTTP et de lui transmettre l'URL du document rapatrier ainsi que le flux dans lequel le stocker. Voil un exemple d'une fonction crant dynamiquement le composant pour rcuprer la page dans un TStream :
procedure DownloadHTTP(const AUrl : string; out DestStream: TStream); begin with TIdHTTP.Create(Application) do try try Get(AUrl,DestStream); except On e : Exception do MessageDlg(Format('Erreur : %s',[e.Message]), mtInformation, [mbOK], 0); end; finally Free; end; end;

Ainsi, le code suivant rapatrie la premire page du forum Delphi dans un fichier "c:\test.txt" :
procedure TForm1.Button1Click(Sender: TObject); var Fs : TFileStream; begin Fs := TFileStream.Create('c:\test.txt',fmCreate); try DownloadHTTP('http://www.developpez.net/forums/viewforum.php?f=2',TStream(fs)); finally Fs.Free; end; end;

Comment grer les redirections ?


Auteur : reisubar Par dfaut, Indy ne gre pas les redirections : si un code d'erreur entre 300 et 307 du genre "Found" ou "Moved Permanently" est reu, il lve une exception, et ne rapatrie rien. Pour que les redirections soient gres, il faut : Mettre HandleRedirect True;

- 321 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Renseigner un nombre de redirections maximum (pour viter une boucle infinie) dans RedirectMaximum. Par dfaut, il est 15, mais peut tre modifi.

Comment grer les authentifications de type HTACCESS avec le TIdHTTP ?


Auteur : reisubar Par dfaut, lorsque des pages sont protges par une mthode d'authentification de type Basic (la fameuse bote de dialogue de demande de nom d'utilisateur / mot de passe), Indy renvoie une exception EIdHTTPProtocolException "HTTP/1.1 401 Unauthorized". Pour valider cette authentification, vous devez encoder directement dans la requte le nom d'utilisateur et le mot de passe dans la proprit "UserName" et "Password" de la proprit Request du TidHTTP. De plus, BasicAuthentication doit tre mis true. Exemple de code :
procedure TForm1.Button1Click(Sender: TObject); var Fs : TFileStream; begin Fs := TFileStream.Create(IncludeTrailingBackslash( ExtractFilePath(Application.ExeName))+'document.txt',fmCreate); try with IdHTTP do begin Host := '192.168.0.3'; //Hte Request.Username:='abc'; //Utilisateur Request.Password:='abc'; //Mot de passe Request.BasicAuthentication := True; //Auth. BASIC Get('192.168.0.3/',Fs); //demande le fichier end; finally Fs.Free; end; end;

Comment afficher la progression durant un tlchargement ?


Auteur : reisubar Avec un TIdHTTP, il est trs facile d'afficher dans une ProgressBar (ou tout autre composant) la progression du tlchargement d'un fichier. Grer le dbut du transfert L'vnement OnWorkBegin est dclench lorsque une opration de transfert commence. On rcupre dans cet vnement la taille totale de l'lment tlcharger dans AWorkCountMax et le type d"opration (lecture ou criture de donnes) dans AWorkMode. On a donc contrler que c'est bien un vnement de lecture de donnes et assigner la ProgressBar (ou autre composant de visualisation) comme maximum la taille reue :
procedure TForm1.IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin if AWorkMode = wmRead then //uniquement quand le composant recoit des donnes begin ProgressBar.Max := AWorkCountMax; //Maximum = taille de l'lment ProgressBar.Position := 0; //Position zro end; end;

- 322 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

On initialise galement zro la position de la ProgressBar pour montrer que le tlchargement commence. Grer le transfert Pendant le transfert, Indy appelle rgulirement l'vnement OnWork pour notifier que des nouvelles donnes arrivent ou sont envoys. C'est cette procdure qu'on utilise pour incrmenter la position de la ProgressBar :
procedure TForm1.IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin if AWorkMode=wmRead then //uniquement quand le composant recoit des donnes ProgressBar.Position := AWorkCount; end;

Grer la fin du transfert Il n'y a rien de particulier faire lorsque le transfert est termin. Si vous voulez effectuer des oprations ce stade, implmentez vos fonctions dans l'vnement OnWorkEnd. Le code ci-dessus remet par exemple la position de la barre de progression zro :
procedure TForm1.IdHTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin ProgressBar.Position := 0; end;

A titre d'exemple, voil une procdure qui dclenche le tlchargement d'un fichier et que vous pouvez utiliser pour vrifier si votre code est bon :
procedure TForm1.btnDownloadClick(Sender: TObject); var Fs : TFileStream; begin Fs := TFileStream.Create(ExtractFilePath(Application.ExeName) +'demo.exe',fmCreate); //Nom du fichier local with IdHTTP do try try //URL du fichier tlcharger Get('http://rabusier.free.fr/mirrors/astase/ultrabackup_setup.exe',Fs); except On E : EIdException do ShowMessage(Format('Erreur durant le tlchargement : %s',[E.Message])); On E : Exception do ShowMessage(Format('Erreur inconnue : %s',[E.Message])); end; finally Fs.Free; //Liberer le flux end; end;

Comment puis-je connatre la vitesse de tlchargement avec un TidHTTP ?


Auteur : reisubar Il faut utiliser les mmes vnements que ceux utiliss pour notifier la progression du tlchargement ( Comment afficher la progression durant un tlchargement ? ) savoir OnWorkBegin (lorsque le tlchargement commence), OnWork (pendant le tlchargement) et OnWorkEnd (lorsque le tlchargement est termin). On procde ainsi : on stocke la date du dbut de tlchargement dans un variable TDateTime (celleci peut tre par exemple mis dans la partie variables prives du TForm ou TThread parent). Pendant le

- 323 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

tlchargement, on divise les octets transfrs (accessibles via AWorkCount) par le nombre de secondes passes depuis le tlchargement, calcul avec GetSecondBetween (pensez donc ajouter DateUtils votre clause uses !) Dans l'exemple ci-dessous, c'est un label qui doit tre mis jour. Cette technique peut bien sr tre applique tout contrle de la VCL. Au dbut du tlchargement On stocke donc la date courante, et on initialise le texte du label. J'ai suppos que la mise jour n'tait pas fait depuis un thread : l'appel ProcessMessages() est donc ncessaire pour traiter les messages de rafrachissement, et voir le label changer de valeur :
procedure TForm1.IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin if AWorkMode = wmRead then //uniquement quand le composant recoit des donnes begin Label1.Caption := 'Vous tlchargez 0 Ko/s '; //Init. label FStartDate := Now; //Stocker la date Application.ProcessMessages; //Demander la MAJ. end; end;

Pendant le tlchargement On divise le nombre d'octets transfrs par 1024 pour avoir une taille en kilo-octets, puis par le nombre de secondes de tlchargement calcul en dbut de fonction.
procedure TForm1.IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); var ElapsedTime : Cardinal; begin if AWorkMode=wmRead then //Uniquement pendant la rception de donnes begin ElapsedTime := SecondsBetween(Now,FStartDate); //Calculer le temps de tlchargement if ElapsedTime>0 then begin Label1.Caption := Format('Vous tlchargez %s Ko/s', [FormatFloat('0.00',(AWorkCount/1024)/ElapsedTime)]); //MAJ Label. Application.ProcessMessages; end; end; end;

Comment soumettre des informations un script par la mthode GET ?


Auteur : reisubar Une manire est d'appeller la mthode Get du TidHTTP pour charger une page en lui transmettant les paramtres encods dans l'URL. Rappel : La partie contenant les informations soumettre est spare de l'adresse du script par un "?", et les paires noms/valeurs sont spares par le caractre "&". Exemple d'utilisation :
IdHttp1.Get('http://localhost/myscript.php?param1=valeur1&param2=valeur2');

Lorsque les donnes contiennent des caractres spciaux (" ",""",&,=,?, les caractres accentus, etc.) ou que les valeurs soumises sont entres par l'utilisateur, il est plus prudent de les encoder en utilisant la mthode PathEncode de la proprit URL du TidHTTP :
IdHttp1.Get(Format('http://www.mysite.com/cgi-bin/submit.cgi?nom=%s&prenom=%s', [IdHTTP1.URL.PathEncode(EditNom.Text),
- 324 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

IdHTTP1.URL.PathEncode(EditPrenom.Text)]));

Comment valider un formulaire ne contenant que des donnes textuelles avec la mthode POST ?
Auteur : reisubar Il faut utiliser la mthode Post() du TIdHTTP. Celle-ci attend une TStringList contenant une liste de paramtres sous la forme paramtre=valeur. Vous devez donc avant instancier une StringList, la remplir avec les paires nom/valeur reprsentant les donnes soumettre, puis enfin appeller Post() :
procedure TForm1.Button1Click(Sender: TObject); var Ts : TStringList; begin Ts := TStringList.Create; try Ts.Add('Param1=Valeur1'); Ts.Add('Param2=Valeur2'); IdHttp1.Request.ContentType := 'application/x-www-form-urlencoded'; IdHTTP1.Post('http://localhost/myscript.php',Ts) finally Ts.free; end; end;

Comment rcuperer les liens dans une page HTML ?


Auteur : sjrd Pour rcuprer des liens sur une page HTML, on peut se servir du composant TIdHTTP comme cela est montr dans l'exemple ci-dessous :
procedure GetLinksInHTMLDoc(URL : string; Links : TStrings); var HTTP : TIdHTTP; Content, Link : string; Position : integer; begin HTTP := TIdHTTP.Create(nil); try Links.Clear; Content := HTTP.Get(URL); Position := 0; while True do begin Position := PosEx('href', Content, Position+1); if Position = 0 then Break; inc(Position, 4); while (Position < Length(Content)) and (Content[Position] in [#0, #10, #13, ' ']) do inc(Position); if Content[Position] <> '=' then Continue; inc(Position); while (Position < Length(Content)) and (Content[Position] in [#0, #10, #13, ' ']) do inc(Position); if Content[Position] <> '"' then Continue; inc(Position); BeginPos := Position; while (Position <= Length(Content)) and (Content[Position] <> '"') do inc(Position);

- 325 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Link := Copy(Content, BeginPos, Position-BeginPos); if (Link <> '') and (Links.IndexOf(Link) = -1) then Links.Add(Link); end; finally HTTP.Free; end; end;

lien :

Comment rcuperer les liens dans une page HTML avec IE et simuler un click sur un de ces liens?

Comment stopper un tlchargement par un TIdHTTP ?


Auteur : Giovanny Temgoua Le composant TIdHTTP ne possde pas d'quivalent la mthode abort comme le composant TIdFTP pour stopper une opration avec le serveur. La solution que je vous propose consiste interrompre le transfert en provoquant l'appel de EndWork via l'objet IOHandler du TIdHTTP. Dans notre fiche, nous dclarons un champ priv boolen :
TTestForm = class(TForm) private //Autres proprits ... FRunning : Boolean; public { Public declarations } end;

Au dbut du transfert, c'est dire dans l'vnement OnWorkBegin de notre TIdHTTP, nous aurons :
procedure TTestForm.IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); begin if AWorkMode = wmRead then begin FRunning := True; // Autres traitements... end; end;

Ensuite, nous dposons un bouton qui nous servira stopper le tlchargement. Son code sera :
procedure TTestForm.btnStopClick(Sender: TObject); begin FRunning := not FRunning; end;

Dans l'vnement OnWork, il nous suffira alors d'crire :


procedure TTestForm.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); begin //Autres traitements... Application.ProcessMessages; if not Frunning then IdHTTP.IOHandler.CloseGracefully;

- 326 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

lien :

Comment ne pas bloquer une application pendant un traitement long ?

- 327 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

Sommaire > Composants Indy > IdFTP Comment puis-je tester si un fichier existe sur un serveur FTP ?
Auteur : reisubar Il y a plusieurs manires de raliser une sorte de Fileexists() sur FTP. La premire mthode est de tenter d'excuter la commande Size sur le serveur. Normalement, tout les serveurs devraient supporter cette commande, qui sert renvoyer la taille en octets d'un fichier. Si le fichier n'existe pas, une exception est leve, sinon, une variable boolenne est mise true.
function FTPFileExists(AFTPClient : TIdFTP; const AFile : string) : Boolean; begin Result := False; try if not AFTPClient.Connected then //Pas connect ? AFTPClient.Connect(); //On connecte except Exit; //Impossible de connecter ! end; Result:=AFTPClient.Size(APath)<>-1; end;

Exemple d'utilisation :
procedure TForm1.Button1Click(Sender: TObject); begin IdFTP1.Host := 'ftp.foo.com'; IdFTP1.Username := 'anonymous'; IdFTP1.Password := 'anonymous@anonymous.com'; IdFTP1.Connect(); if FTPFileExists(IdFTP1,'/pub.txt') then MessageDlg('Le fichier existe !', mtInformation, [mbOK], 0) else MessageDlg('Le fichier n''existe pas.', mtInformation, [mbOK],0); end;

Une autre mthode est d'utiliser List(), qui rcupre le listing complet du dossier spcifi. Pour cela, la fonction a besoin du rpertoire dans lequel se situe le dossier et le nom de fichier rechercher (On pourrait effectuer une analyse syntaxique pour sparer le fichier du dossier (en copiant le texte partir du dernier slash), mais cela demanderait l'appel d'autres fonctions auxiliaires). On procde ainsi : on tente de se positionner dans le rpertoire pass en paramtre. Si celui-ci n'existe pas, une exception est leve, et on interrompt le fil d'excution. Sinon, on appelle List() en lui passant en paramtre une TStringList qui sera remplie avec le contenu du dossier. Le dernier paramtre de la fonction prcise que nous ne voulons pas tout les dtails (poids, date de modification) mais juste les noms. L'existence du fichier est teste en cherchant (avec IndexOf()) le nom du fichier dans la liste. Le seul inconvnient de cette fonction est que si un dossier est nomm comme le fichier cherch, la fonction renverra aussi true.
function FTPFileExists2(AFTPClient : TIdFTP; const ADirectory, AFile : string) : Boolean; var AOldDir : string; FolderList : TStringList; begin Result := False; try if not AFTPClient.Connected then //Pas connect ? AFTPClient.Connect(); //On connecte except Exit; //Impossible de connecter !
- 328 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

end; try FolderList := TStringList.Create; AOldDir := AFTPClient.RetrieveCurrentDir; //sauvegarder le rpertoire actuel try AFTPClient.ChangeDir(ADirectory); //Si le dossier n'existe pas -> exception leve try AFTPClient.List(FolderList,'',False); //Lister les fichiers finally Result := FolderList.IndexOf(AFile) > 0; end; except end; finally AFTPClient.ChangeDir(AOldDir); //reviens l'ancien dossier FolderList.Free; //Libre la StringList end;

On pourrait appeller cette fonction ainsi :


if FTPFileExists2(IdFTP1,'/data','test.txt') then ...

...pour tester l'existence de /data/test.txt. Vous pouvez enfin aussi utiliser la liste parse DirectoryListing ( Comment connatre facilement le contenu d'un dossier FTP sans analyse ? ) aprs un appel List() (la mthode est sensiblement gale celle nonce ci-dessus).

Comment tester si un dossier existe sur un serveur FTP ?


Auteur : reisubar Il peut arriver que vous ayez besoin d'une fonction testant si un dossier existe sur un serveur FTP : une sorte de DirectoryExists() fonctionnant sur le serveur. La mthode suivre est la suivante : avec un TIdFTP, se connecter au serveur, et tenter de se placer dans le rpertoire dont l'existence est tester. Si ce rpertoire n'existe pas, une exception sera souleve par Indy, dans le cas contraire rien ne se passera. On utilisera ce comportement pour mettre un variable boolenne True si l'exception n'est pas leve. Dans la fonction suivante, on suit cette logique en mmorisant le rpertoire courant, tenter de changer de rpertoire, et rtablissant l'ancien rpertoire si le changement a pu se faire :
function FTPDirectoryExists(AFTPClient : TIdFTP; const APath : string) : Boolean; var AOldDir : string; begin Result := False; try if not AFTPClient.Connected then //Pas connect ? AFTPClient.Connect(); //On connecte except Exit; //Impossible de connecter ! end; try AOldDir := AFTPClient.RetrieveCurrentDir; try AFTPClient.ChangeDir(APath); //Si le dossier n'existe pas -> exception leve Result := True; //Si on arrive ici -> OK except Result := False; end;

- 329 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

end;

finally AFTPClient.ChangeDir(AOldDir); //reviens l'ancien dossier end;

Voici un exemple d'exploitation de cette fonction qui teste l'existence d'un rpertoire '/test' :
procedure TForm1.Button1Click(Sender: TObject); begin IdFTP1.Host := 'ftp.foo.com'; IdFTP1.Username := 'anonymous'; IdFTP1.Password := 'anonymous@anonymous.com'; IdFTP1.Connect(); if FTPDirectoryExists(IdFTP1,'/test') then MessageDlg('Le dossier existe !', mtInformation, [mbOK], 0) else MessageDlg('Le dossier n''existe pas.', mtInformation, [mbOK],0); end;

Comment connatre facilement le contenu d'un dossier FTP sans analyse ?


Auteur : reisubar Indy 9 permet de rcuprer dans une variable de type TCollection le contenu d'un dossier. Chaque item de la collection est relatif un fichier est contient entre autres : Le type de l'lment (ItemType, qui vaut ditDirectory pour un dossier, ditFile pour un fichier, et ditSymbolicLink pour un lien symbolique), La taille de l'lement (Size), Le nom du fichier (FileName), La date de modification (ModifiedDate), Les permissions du groupe (GroupPermissions), Les permissions de l'utilisateur (UserPermissions), Le proptitaire (OwnerName), etc.

Cette collection est situe dans TIdFTP.DirectoryListing. Elle est remplie lors d'un appel la mthode List(). Le texte brut renvoy par le serveur est analys (pars) et les items sont ajouts la collection. Prcisions importantes propos de cette proprit : - Les parseurs de Indy 9 sont basiques : il ne supportent que les serveurs MS-DOS ou Unix. Cependant, beaucoup de serveurs mulent le formatage Unix, comme les serveurs Macintosh et la plupart des serveurs FTP Windows distribus en freeware et shareware. La version 10 permettra l'analyse des rponses des serveurs Bull, Cisco, IBM, etc. Aussi, si vous avez besoin de parseurs sophystiqus, vous devrez certainement installer la version 10. - Certaines informations doivent tre utilises avec prudence : -- La proprit Size contient une taille relative sous certains systmes des blocs d'enregistrements et pas des octets. Utilisez plutt la commande Size() du TidFTP. -- Il vaut mieux utiliser la commande MDTM (Modification Time) que la proprit ModifiedDateTime. Cette commande fait partie des extensions au protocole FTP dfinies. Cette fonction n'est pas directement implmente dans Indy 9, mais vous pouvez le faire vous mme. Elle est par contre implmente par dfaut dans Indy 10. Exemple permettant de rechercher un fichier dans un rpertoire pass en paramtre :
List(nil); for i:=0 to Pred(DirectoryListing.Count) do if (DirectoryListing[i].FileName=FName) and (DirectoryListing[i].ItemType=ditFile) then
- 330 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

begin Result := True; Exit; end;

Comment modifier les droits d'un fichier avec idFtp ?


Auteur : Nono40 Pour modifier les droits d'un fichier sur un serveur FTP il faut utiliser la commande SITE CHMOD <droits> <nomfichier>. Avec les composants Indy il faut utiliser la mthode Site :
idFTP.Site('chmod 666 MonFichier');

Cet exemple donne les droits en lecture/ecriture pour tout le monde. Ceci permet par exemple de pouvoir autoriser l'enregistrement de donnes dans un fichier par un script php, ou alors d'en interdire la lecture via http. Attention : Cette fonction dclenche toujours une exception mme en cas de succs. Il convient donc de la mettre dans une clause try except dans tous les cas.

Comment construire un prototype fonctionnel de serveur FTP ?


Auteur : reisubar Pour plus d'informations sur le sujet consultez le tutoriel indiqu dans la section lien . lien : Construire un serveur FTP

Comment crer une arborescence sur un serveur FTP ?


Auteur : adaneels Pour crer une arborescence sur un serveur FTP et ainsi pouvoir y dposer un fichier sans avoir vrifier l'existence de chaque rpertoire, utiliser la procdure suivante :
// vrifie que le rpertoire existe, cr l'arborescence si ncessaire procedure TForm1.ForceFtpDirectories(pathToForce: string); var FtpDirtoCreate : string; i : Integer; begin try IdFTP1.ChangeDir(pathToForce); // le rpertoire existe -> c'est fini! except // le rpertoire n'existe pas -> on vrifie et cr toute l'arborescence FtpDirToCreate:= '/'; // on commence par la racine du ftp repeat // on prend le prochain rpertoire dans l'arborescence for i:= Length(FtpDirToCreate)+1 to Length(pathToForce) do begin if pathToForce[i]='/' then begin FtpDirToCreate:= LeftStr(pathToForce, i); break; end; //if end; //for i try

- 331 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

IdFTP1.ChangeDir(FtpDirToCreate); // le rpertoire existe -> ok except // le rpertoire n'existe pas -> on le cr IdFTP1.MakeDir(FtpDirToCreate); end; //except // et on passe au suivant tant que toute l'arborescence n'est pas vrifie until FtpDirtoCreate=pathToForce; end; //except end;

Exemple d'utilisation : Je veux dposer un fichier 'toto.bin' dans le rpertoire '/pub/driver/v2/releases/' d'un serveur FTP.
procedure deposeFichier(); var IdFTP1 : TIdFTP; begin // on cr un objet TIdFTP IdFTP1:= TIdFTP.Create; // on renseigne les champs de connexion IdFTP1.Host:= 'nom_du_serveur'; IdFTP1.Username:= 'nom_utilisateur'; IdFTP1.Password:= 'mot_de_passe'; // connexion au ftp IdFTP1.Connect; try // vrification de l'existence du rpertoire... //... et cration arborescence si ncessaire ForceFTPDirectories('/pub/driver/v2/releases/'); // dpt du fichier IdFTP1.Put('C:\toto.bin', '/pub/driver/v2/releases/toto.bin'); finally // dconnexion quoi qu'il arrive IdFTP1.Disconnect; end; end;

Ceci est l'quivalent de la fonction ForceDirectories de Delphi mais sur un serveur FTP. lien : Comment crer une arborescence de rpertoires ?

Comment tlcharger un fichier suprieur 2 Giga-octets en FTP?


Auteur : waskol Avec les composants Indy ? Non... TIdFTP est limit 2 Giga-octets du fait qu'un entier de type integer est utilis en interne pour comptabiliser le nombre d'octets reus (valeur maxi d'un integer=2 147 483 647, d'o la limite de 2 147 483 647 octets = 2 Go) Voici la fonction propose qui porte la limite de tlchargement 4 Giga-octets (et mme beaucoup plus, mais cel n'a pas encore t test aujourd'hui) :
uses Wininet; function FtpDownloadFile(strHost, strUser, strPwd: string; Port: Integer; ftpDir, ftpFile, TargetFile: string; ProxyUser,ProxyPassword:string; ALabel:TLabel=nil;AProgressBar: TProgressBar=nil): Boolean; function FmtFileSize(Size: Int64): string; begin
- 332 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

if Size >= $E8D4A51000 then Result := Format('%.2f', [Size / $3B9ACA00]) + ' To' else if Size >= $3B9ACA00 then Result := Format('%.2f', [Size / $3B9ACA00]) + ' Go' else if Size >= $F4240 then Result := Format('%.2f', [Size / $F4240]) + ' Mo' else if Size < 1000 then Result := IntToStr(Size) + ' bytes' else Result := Format('%.2f', [Size / 1000]) + ' Ko'; end; const READ_BUFFERSIZE = 4096; // ou 256, 512, ... var hNet, hFTP, hFile: HINTERNET; buffer: array[0..READ_BUFFERSIZE - 1] of Char; bufsize, dwBytesRead: DWORD; fileSize:Int64; sRec: TWin32FindData; strStatus: string; LocalFile: file; bSuccess: Boolean; PC:integer; //Pourcentage de tlchargement UnFichier:TFileStream; begin Result := False; { Ouvre une session internet } hNet := InternetOpen('Nom du programme', // Agent INTERNET_OPEN_TYPE_PRECONFIG, // AccessType PChar(ProxyUser), // Nom utilisateur pour le Proxy PChar(ProxyPassword), // Mot de passe Proxy 0); // ou INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE { } l'agent contient le nom de l'application ou de l'entit appelant les fonctions Internet

{ Le Handle de connexion est-il valide?} if hNet = nil then begin ShowMessage('Impossible d''accder WinInet.Dll'); Exit; end; {Connexion au serveur FTP} hFTP := InternetConnect(hNet, // Handle de InternetOpen PChar(strHost), // serveur FTP port,//ou bien (INTERNET_DEFAULT_FTP_PORT), PChar(StrUser), // username PChar(strPwd), // password INTERNET_SERVICE_FTP, // FTP, HTTP, ou Gopher? INTERNET_FLAG_PASSIVE, // flag: 0 ou INTERNET_FLAG_PASSIVE 0);// Nombre dfini par l'utilisateur pour un callback if hFTP = nil then begin InternetCloseHandle(hNet); ShowMessage(Format('L''hte "%s" n''est pas disponible',[strHost])); Exit; end;

- 333 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

{ Changer de rpertoire } bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir)); if not bSuccess then begin InternetCloseHandle(hFTP); InternetCloseHandle(hNet); ShowMessage(Format('Ne peut accder au rpertoire %s.',[ftpDir])); Exit; end; { Lecture de la taille du fichier } if FtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil then begin fileSize := sRec.nFileSizeLow; end else begin InternetCloseHandle(hFTP); InternetCloseHandle(hNet); ShowMessage(Format('Cannot find file ',[ftpFile])); Exit; end; { Ouvre le fichier } hFile := FtpOpenFile(hFTP, // Handle d'une session ftp PChar(ftpFile), // Nom du fichier GENERIC_READ, // dwAccess FTP_TRANSFER_TYPE_BINARY, // dwFlags 0); // Ceci est le contexte utiliser pour les Callback. if hFile = nil then begin InternetCloseHandle(hFTP); InternetCloseHandle(hNet); Exit; end; { Crer un nouveau fichier local } if FileExists(TargetFile) then DeleteFile(TargetFile); UnFichier:=TFileStream.Create(TargetFile,fmCreate); try dwBytesRead := 0; bufsize := READ_BUFFERSIZE; while (bufsize > 0) do begin Application.ProcessMessages; if not InternetReadFile(hFile, @buffer, // addresse d'un buffer qui reoit les donnes READ_BUFFERSIZE, // Nombre d'octets lire et placer dans le buffer bufsize) // Nombre d'octets effectivement lus then Break; //On a fini de recevoir quelque chose if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then bufsize:=UnFichier.Write(buffer, bufsize); dwBytesRead := dwBytesRead + bufsize; { Montrer Progression } PC:=Round(dwBytesRead * 100 / fileSize); if Assigned(AProgressBar) then AProgressBar.Position :=PC; if Assigned(ALabel) then ALabel.Caption := Format('%s of %s / %d %%', [FmtFileSize(dwBytesRead),FmtFileSize(fileSize) ,PC]); end; Result := True;
- 334 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2007 Developpez LLC. Tous droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://delphi.developpez.com/faq/

FAQ Delphi

finally UnFichier.Free; InternetCloseHandle(hFile); InternetCloseHandle(hFTP); InternetCloseHandle(hNet); end; end;

Et un exemple d'utilisation :
procedure TForm1.Button1Click(Sender: TObject); var TargetFile:string; begin TargetFile:=ExtractFilePath(Application.ExeName)+'fftw-3.1.2-dll.zip'; FtpDownloadFile('ftp.fftw.org','','', //Serveur ftp / Nom d'utilisateur sur le ftp / Mot de passe sur le ftp 21,'/pub/fftw','fftw-3.1.2dll.zip', //Numro de port FTP/ rpertoire dans lequel se trouve le fichier / le fichier tlcharger TargetFile, //La destination du fichier '','', //Nom d'utilisateur et mot de passe Proxy ventuel Label1,ProgressBar1); //Un Label et une ProgressBar (facultatifs) ShowMessage('Tlchargement termin'); end;

Vous noterez les possibilits suivantes : prise en compte des paramtres de connexion proxy (si vous en avez un) prise en compte des connexions ftp anonymes ou non La possibilit de mettre ou non en paramtre un TLabel informatif ou une TProgressBar, tous deux ddis l'affichage de la progression. La possibilit thorique de tlcharger des fichiers de 2^63-1 octets (limite de Int64), limit toutefois au format de fichier (NTFS, FAT32) de votre disque dur.

Comment obtenir la date de modification d'un fichier avec idFtp ?


Auteur : Nono40 L'une des solutions est d'envoyer une commande LIST et de tester les fichiers reus. Cette mthode va retourner beaucoup d'informations pour pas grand chose au final. Pour obtenir la date de dernire modification d'un fichier on peut utiliser la commande ftp MDTM. Cette comma