https://wiki.freepascal.org/api.php?action=feedcontributions&user=Gillou58&feedformat=atomFree Pascal wiki - User contributions [en]2024-03-28T21:06:58ZUser contributionsMediaWiki 1.35.6https://wiki.freepascal.org/index.php?title=LCL_Internals_-_Resizing,_Moving/fr&diff=127527LCL Internals - Resizing, Moving/fr2019-10-07T15:14:30Z<p>Gillou58: /* GetWindowRelativePosition(Handle,NewLeft,NewTop) */</p>
<hr />
<div>{{LCL Internals - Resizing, Moving}}<br />
<br />
== Présentation ==<br />
<br />
La bibliothèque LCL possède de nombreuses propriétés de redimensionnement (Left, Width, Anchors, Align, AnchorSide, AutoSize, Constraints, ChildSizing, ...) et des points d'ancrage (hooks)avec lesquels les applications peuvent modifier le comportement de l'application (OnResize, OnChangeBounds, ...). Comme tous ces éléments ne peuvent pas être calculés en une seule étape, les contrôles peuvent beaucoup se déplacer avant que les coordonnées finales ne soient disponibles. Pour réduire les risques de scintillement, la bibliothèque LCL n'envoie pas tous les déplacements ou redimensionnements à l'interface de la bibliothèque LCL. Par exemple, au cours des Begin/EndAlign et csLoading, aucun move/resize n'est envoyé à l'interface. Le widgetset va essayer de suivre les conseils de la bibliothèque LCL, mais il y a quelques cas où il ne le fera pas. Par exemple, les fiches(fenêtres de haut niveau) sont limitées par les politiques de gestion de fenêtres, et TPage dépend entièrement de la taille et du thème de TNotebook.<br />
<br />
== Comment la bibliothèque LCL indique à l'interface de redimensionner / déplacer une poignée(handle) ==<br />
<br />
Dans TWinControl.DoSendBoundsToInterface la fonction widget SetBounds est appelée<br />
TWSWinControlClass(WidgetSetClass).SetBounds(Self, Left, Top, Width, Height);<br />
<br />
== Comment l'interface dit à la bibliothèque LCL de redimensionner / déplacer une poignée ==<br />
<br />
=== Quand la zone client d'une poignée a été redimensionnée ===<br />
<br />
''Note'': Si le thème change, le cadre d'un TGroupBox peut changer. Cela laisse la taille et la position du TGroupBox inchangées, mais ce n'est pas le cas pour l'espace client. L'interface appelle<br />
LCLControl.InvalidateClientRectCache(false);<br />
et envoie un message LM_SIZE comme ci-dessous.<br />
<br />
=== Quand une poignée d'un TWinControl a été redimensionnée / déplacée ===<br />
<br />
==== Tout d'abord, l'interface de la bibliothèque LCL envoie un message LM_WINDOWPOSCHANGED ====<br />
* x := Left (par rapport à 0,0 de la zone cliente du parent)<br />
* y := Top<br />
* cx := Width<br />
* cy := Height<br />
<br />
==== Ensuite, un message LM SIZE est envoyé ====<br />
<br />
* Width<br />
* Height<br />
* SizeType est un drapeau d'un bit contenant Size_SourceIsInterface plus une des valeurs SIZENORMAL, SIZEICONIC, SIZEFULLSCREEN.<br />
<br />
==== Ensuite, un message LM_MOVE est envoyé ====<br />
<br />
* MoveType := Move_SourceIsInterface;<br />
* XPos := Left (par rapport à 0,0 de la zone cliente du parent)<br />
* YPos := Top<br />
<br />
=== Quand une fiche est à son maximum, minimisée ou restaurée, l'interface envoie un message LM_SIZE ===<br />
<br />
* Width<br />
* Height <br />
* SizeType est un drapeau d'un bit contenant Size_SourceIsInterface plus une des valeurs SIZENORMAL, SIZEICONIC, SIZEFULLSCREEN.<br />
<br />
== Comment la bibliothèque LCL obtient la taille/la position de la poignée de l'interface de la bibliothèque LCL ==<br />
<br />
=== LCLIntf.GetWindowSize(Handle, InterfaceWidth, InterfaceHeight) ===<br />
<br />
Renvoie la largeur et la hauteur courante d'une poignée.<br />
<br />
=== LCLIntf.GetClientRect(Handle, Result) ===<br />
<br />
Retourne la largeur et la hauteur actuelles(gauche et haut sont toujours à 0) de la zone cliente d'une poignée (= zone intérieure à l'intérieur des frontières / cadre d'un contrôle).<br />
<br />
=== TWSWinControlClass(WidgetSetClass).GetDefaultClientRect(Self, Left, Top, Width, Height, Result) ===<br />
<br />
Cette fonction est appelée en premier lieu par la bibliothèque LCL pour obtenir le ClientRect. Si elle retourne false, la bibliothèque LCL va utiliser la fonction GetClientRect si une poignée a déjà été créée, sinon les valeurs chargées à partir du fichier .lfm. Si tout cela échoue, la valeur par défaut est Rect(0,0,Width,Height).<br />
GetDefaultClientRect peut être utilisée par l'interface de la bibliothèque LCL pour réduire le scintillement en offrant de bonnes valeurs avant que la poignée ne soit créée.<br />
<br />
=== GetWindowRelativePosition(Handle,NewLeft,NewTop) ===<br />
<br />
Renvoie les valeurs Left et Top actuelles d'une poignée relative à l'espace client (0,0) de son parent.<br />
<br />
== Contraintes ==<br />
<br />
La bibliothèque LCL demande à l'interface les contraintes(min, max pour la largeur et la hauteur) avec la fonction<br />
GetControlConstraints<br />
<br />
Par exemple: sous gtk, une barre de défilement horizontale a une hauteur fixe.<br />
<br />
== Taille préférée ==<br />
<br />
Pour un redimensionnement automatique d'un contrôle (par exemple, un TButton ou un TLabel), la bibliothèque LCL demande à l'interface la taille minimale pour rendre le contrôle agréable :<br />
<br />
TWSWinControlClass(WidgetSetClass).GetPreferredSize(Self, PreferredWidth, PreferredHeight, WithThemeSpace);<br />
<br />
== Défilement ==<br />
<br />
La bibliothèque LCL fait défiler les contrôles fils seulement virtuellement. Cela signifie que leurs propriétés Left et Top ne changent pas. Pour les faire défiler, utilisez la fonction d'interface <br />
TWSScrollingWinControlClass(WidgetSetClass).ScrollBy(Self, DeltaX, DeltaY);<br />
<br />
== Divers ==<br />
<br />
=== LCLIntf.GetClientBounds(Handle,Result); ===<br />
<br />
Retourne le rectangle du client qui n'a pas défilé par rapport aux propriétés Top et Left de la poignée. En d'autres termes, c'est équivalent à :<br />
CurClientBounds := GetClientRect(Handle)<br />
OffsetRect(CurClientBounds,FrameBorderLeft,FrameBorderTop);</div>Gillou58https://wiki.freepascal.org/index.php?title=LCL_Internals_-_Resizing,_Moving/fr&diff=127526LCL Internals - Resizing, Moving/fr2019-10-07T15:13:51Z<p>Gillou58: </p>
<hr />
<div>{{LCL Internals - Resizing, Moving}}<br />
<br />
== Présentation ==<br />
<br />
La bibliothèque LCL possède de nombreuses propriétés de redimensionnement (Left, Width, Anchors, Align, AnchorSide, AutoSize, Constraints, ChildSizing, ...) et des points d'ancrage (hooks)avec lesquels les applications peuvent modifier le comportement de l'application (OnResize, OnChangeBounds, ...). Comme tous ces éléments ne peuvent pas être calculés en une seule étape, les contrôles peuvent beaucoup se déplacer avant que les coordonnées finales ne soient disponibles. Pour réduire les risques de scintillement, la bibliothèque LCL n'envoie pas tous les déplacements ou redimensionnements à l'interface de la bibliothèque LCL. Par exemple, au cours des Begin/EndAlign et csLoading, aucun move/resize n'est envoyé à l'interface. Le widgetset va essayer de suivre les conseils de la bibliothèque LCL, mais il y a quelques cas où il ne le fera pas. Par exemple, les fiches(fenêtres de haut niveau) sont limitées par les politiques de gestion de fenêtres, et TPage dépend entièrement de la taille et du thème de TNotebook.<br />
<br />
== Comment la bibliothèque LCL indique à l'interface de redimensionner / déplacer une poignée(handle) ==<br />
<br />
Dans TWinControl.DoSendBoundsToInterface la fonction widget SetBounds est appelée<br />
TWSWinControlClass(WidgetSetClass).SetBounds(Self, Left, Top, Width, Height);<br />
<br />
== Comment l'interface dit à la bibliothèque LCL de redimensionner / déplacer une poignée ==<br />
<br />
=== Quand la zone client d'une poignée a été redimensionnée ===<br />
<br />
''Note'': Si le thème change, le cadre d'un TGroupBox peut changer. Cela laisse la taille et la position du TGroupBox inchangées, mais ce n'est pas le cas pour l'espace client. L'interface appelle<br />
LCLControl.InvalidateClientRectCache(false);<br />
et envoie un message LM_SIZE comme ci-dessous.<br />
<br />
=== Quand une poignée d'un TWinControl a été redimensionnée / déplacée ===<br />
<br />
==== Tout d'abord, l'interface de la bibliothèque LCL envoie un message LM_WINDOWPOSCHANGED ====<br />
* x := Left (par rapport à 0,0 de la zone cliente du parent)<br />
* y := Top<br />
* cx := Width<br />
* cy := Height<br />
<br />
==== Ensuite, un message LM SIZE est envoyé ====<br />
<br />
* Width<br />
* Height<br />
* SizeType est un drapeau d'un bit contenant Size_SourceIsInterface plus une des valeurs SIZENORMAL, SIZEICONIC, SIZEFULLSCREEN.<br />
<br />
==== Ensuite, un message LM_MOVE est envoyé ====<br />
<br />
* MoveType := Move_SourceIsInterface;<br />
* XPos := Left (par rapport à 0,0 de la zone cliente du parent)<br />
* YPos := Top<br />
<br />
=== Quand une fiche est à son maximum, minimisée ou restaurée, l'interface envoie un message LM_SIZE ===<br />
<br />
* Width<br />
* Height <br />
* SizeType est un drapeau d'un bit contenant Size_SourceIsInterface plus une des valeurs SIZENORMAL, SIZEICONIC, SIZEFULLSCREEN.<br />
<br />
== Comment la bibliothèque LCL obtient la taille/la position de la poignée de l'interface de la bibliothèque LCL ==<br />
<br />
=== LCLIntf.GetWindowSize(Handle, InterfaceWidth, InterfaceHeight) ===<br />
<br />
Renvoie la largeur et la hauteur courante d'une poignée.<br />
<br />
=== LCLIntf.GetClientRect(Handle, Result) ===<br />
<br />
Retourne la largeur et la hauteur actuelles(gauche et haut sont toujours à 0) de la zone cliente d'une poignée (= zone intérieure à l'intérieur des frontières / cadre d'un contrôle).<br />
<br />
=== TWSWinControlClass(WidgetSetClass).GetDefaultClientRect(Self, Left, Top, Width, Height, Result) ===<br />
<br />
Cette fonction est appelée en premier lieu par la bibliothèque LCL pour obtenir le ClientRect. Si elle retourne false, la bibliothèque LCL va utiliser la fonction GetClientRect si une poignée a déjà été créée, sinon les valeurs chargées à partir du fichier .lfm. Si tout cela échoue, la valeur par défaut est Rect(0,0,Width,Height).<br />
GetDefaultClientRect peut être utilisée par l'interface de la bibliothèque LCL pour réduire le scintillement en offrant de bonnes valeurs avant que la poignée ne soit créée.<br />
<br />
=== GetWindowRelativePosition(Handle,NewLeft,NewTop) ===<br />
<br />
Renvoie les Left et Top actuels d'une poignée relative à l'espace client (0,0) de son parent.<br />
<br />
== Contraintes ==<br />
<br />
La bibliothèque LCL demande à l'interface les contraintes(min, max pour la largeur et la hauteur) avec la fonction<br />
GetControlConstraints<br />
<br />
Par exemple: sous gtk, une barre de défilement horizontale a une hauteur fixe.<br />
<br />
== Taille préférée ==<br />
<br />
Pour un redimensionnement automatique d'un contrôle (par exemple, un TButton ou un TLabel), la bibliothèque LCL demande à l'interface la taille minimale pour rendre le contrôle agréable :<br />
<br />
TWSWinControlClass(WidgetSetClass).GetPreferredSize(Self, PreferredWidth, PreferredHeight, WithThemeSpace);<br />
<br />
== Défilement ==<br />
<br />
La bibliothèque LCL fait défiler les contrôles fils seulement virtuellement. Cela signifie que leurs propriétés Left et Top ne changent pas. Pour les faire défiler, utilisez la fonction d'interface <br />
TWSScrollingWinControlClass(WidgetSetClass).ScrollBy(Self, DeltaX, DeltaY);<br />
<br />
== Divers ==<br />
<br />
=== LCLIntf.GetClientBounds(Handle,Result); ===<br />
<br />
Retourne le rectangle du client qui n'a pas défilé par rapport aux propriétés Top et Left de la poignée. En d'autres termes, c'est équivalent à :<br />
CurClientBounds := GetClientRect(Handle)<br />
OffsetRect(CurClientBounds,FrameBorderLeft,FrameBorderTop);</div>Gillou58https://wiki.freepascal.org/index.php?title=Installing_Lazarus/fr&diff=120215Installing Lazarus/fr2018-10-09T07:45:48Z<p>Gillou58: /* Généralités */</p>
<hr />
<div>{{Installing Lazarus}}<br />
<br />
== Généralités ==<br />
<br />
Pour ceux qui veulent seulement installer Lazarus et l'utiliser pour programmer, la meilleure solution est de télécharger et d'installer une version binaire, récente et stable (pour Linux un paquet '.rpm', ou un exécutable d'installation pour Windows '.exe' ou encore un paquet '.dmg' pour Mac OS X). Vous pouvez lire les sections relatives à Linux ou Windows intitulées 'fpc binaries', ou les premiers paragraphes des sections qui traitent de l'installation de Lazarus sous Linux or Windows. La plupart des autres informations peuvent être ignorées sans risque.<br />
<br />
Pour ceux qui veulent participer au développement du compilateur ou de l'IDE, ou ceux qui veulent les outils les plus récents, une installation à partir des fichiers sources est nécessaire, et la plupart des informations de ce document sont importantes.<br />
<br />
Lazarus a deux composantes : <br />
* LCL - la bibliothèque de composants (Lazarus Component Library)<br />
* IDE - l'interface de développement (RAD tool) <br />
<br />
Les deux utilisent :<br />
* FPC - le compilateur FreePascal <br />
* FCL - la bibliothèque de composants de FreePascal, qui contient l'essentiel des composants ou objets non visuels utilisés par Lazarus.<br />
<br />
=== Ce dont a besoin Lazarus pour fonctionner ===<br />
<br />
# Le compilateur FreePascal, ses paquets et ses sources. (*important*: ils doivent être de la même version et date)<br />
# Des interfaces adaptées :<br />
#:;Win32 : l'API Win32 peut être utilisée <br />
#:;Mac OS X : vous avez besoin des Developer tools d'Apple (ceux-ci se trouvent sur le DVD d'installation de MacOS X fourni avec votre ordinateur). Voir l'installation pour Mac OS X plus loin. <br />
#:;GTK+ 2.x ou Qt : la plupart des distributions Linux installent par défaut les bibliothèques GTK+ 2.x. Pour le code source voir : http://www.gtk.org. Qt est de même pris en charge pour toutes les ditributions (aut-installé si vous préférez KDE).<br />
<br />
La FAQ – Le fichier de la Foire Aux Questions est sur : http://www.lazarus.freepascal.org . Certaines questions sont dans le fichier local : 'FAQ'. <br />
<br />
Qt est pris en charge avec Linux 32/64 bits, Windows 32/64 bits, Mac OS X, Haiku et les plates-formes Linux embarquées (qtopia).<br />
Pour en savoir plus à propos de son installation : http://wiki.lazarus.freepascal.org/index.php/Qt_Interface<br />
<br />
Les paragraphes suivants décrivent comment se procurer FreePascal et comment installer Lazarus correctement.<br />
<br />
== Installer le Compilateur Free Pascal ==<br />
<br />
L'installation et la construction du compilateur Free Pascal fait l'objet d'une discussion très ouverte sur http://www.stack.nl/~marcov/buildfaq.pdf – C'est peut être un peu trop détaillé pour certains utilisateurs, mais cela reste toujours très compréhensible. <br />
<br />
Lazarus a besoin de fpc (FreePascal) version 2.0.2 ou plus, ainsi que des bibliothèques compilées fpc libs (binaires) et des code source fpc, le tout dans les mêmes versions. <br />
<br />
=== Installer Free Pascal sous Linux ===<br />
<br />
==== FPC Binaries ====<br />
<br />
La dernière version de FreePascal, actuellement la version 2.0.2, peut être téléchargée sur le site de FreePascal (http://www.freepascal.org/download.html, puis choisir un miroir) ou a partir de sourceforge (http://sourceforge.net/projects/lazarus). <br />
<br />
A la partie téléchargement de lazarus (http://www.lazarus.freepascal.org ) vous avez les RPM du compilateur Free Pascal (compiler / linux) ainsi que ses 'packages'. Si vous n'avez pas une distribution basée sur les RPM, vous pouvez télécharger et installer les 'tarballs' (je ne connais rien en Linux désolé) à partir de http://www.freepascal.org. Si vous souhaitez compiler votre version vous même, consultez la section BSD.<br />
<br />
Instructions: <br />
<br />
ATTENTION: Si vous n'utilisez pas les RPMs (même si vous prévoyez d'utiliser alien) le mieux est de télécharger la denière version stable fpc (2.0.2 actuellement) et d'installer Lazarus à partir du code source.<br><br />
<br />
Démarrer Linux et se logger sous ROOT.<br><br />
<br />
Télécharger les derniers fichers à : http://sourceforge.net/project/showfiles.php?group_id=89339.<br />
Par exemple :<br />
:* fpc-2.0.2-0.i386.rpm<br />
:* fpcsrc-2.0.2-0.i386.rpm<br />
:* lazarus-0.9.14-1.i386.rpm<br><br />
et les installer avec :<br />
:* rpm -Uvh fpc-2.0.2-0.i386.rpm<br />
:* rpm -Uvh fpcsrc-2.0.2-0.i386.rpm<br />
:* rpm -Uvh lazarus-0.9.14-1.i386.rpm<br><br />
<br />
Les utilisateurs de Debian doivent ressortir leur alien (attention, il ne génére pas fpc.cfg) ou les tarball install.<br />
<br />
==== Sources FPC ====<br />
<br />
Depuis la sortie de la version 2.0, FPC a migré vers Subversion (SVN). Actuellement il n'y a pas de mirroir pour les CVS, vous devez donc utiliser SVN pour récupérer les sources FPC.<br />
<br />
===== Télécharger les instantanés journaliers du Development Tree (version 2.1.x) =====<br />
Vous pouvez télécharger les évolutions journalières des codes sources (v 2.1.x) sous forme d'un packet instantané à partir du SVN source repository: ces instantanés sont mis à jour chaque jour, et sont le reflet du source repository. Les fichiers sont conservés sur le site des archives SVN.<br />
La totalité des archives publiques de v2.1.x : [ftp://ftp.freepascal.org/pub/fpc/snapshot/v21/source/fpc.zip fpc.zip] (24 MB)<br />
<br />
===== Télécharger les instantanés journaliers du Release Tree (version 2.0.x) =====<br />
Vous pouvez télécharger journellement les codes sources (v 2.0.x) qui vont intégrer la prochaine release stable sous forme d'un packet instantané à partir du SVN source repository: ces instantanés sont mis à jour chaque jour, et sont le reflet du source repository. Les fichiers sont conservés sur le site des archives SVN.<br />
La totalité des archives publiques de v2.0.x: [ftp://ftp.freepascal.org/pub/fpc/snapshot/v20/source/fpc.zip fpc.zip] (24 MB)<br />
<br />
<br />
===== Connection au Source Repository avec SVN (remplace la section Connection au CVS) =====<br />
Comme alternative aux fichiers zip quotidiens du 'SVN sources', le 'SVN repository' s'est ouvert à tous avec un accès en lecture seule. Ainsi vous pouvez donc accéder directement aux codes source, et vous avez accès à la toute dernière mouture disponible. C'est aussi une méthode qui demande moins de bande passante à partir du moment où vous avez fait le premier téléchargement (checkout in SVN lingo).<br />
<br />
===== Accéder aux derniers développements =====<br />
Comment faire ? <br />
(Il est indispensable d'avoir SVN installé. Mode d'emploi ici : [http://subversion.tigris.org/ here] .)<br />
<br />
Aller dans le répertoire racine de votre espace de développement Ex : <br />
<br />
[]$ cd /home/username/FreePascal<br />
<br />
Pour accéder à tous les fichiers sources et à tous les modules disponibles taper :<br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpc/trunk fpc<br />
<br />
Normalement ceci n'est à faire que la première fois.<br />
<br />
Pour mettre à jour les fichiers chargés avec la méthode ci-dessus(checkout) :<br />
[]$svn update fpc<br />
<br />
===== Les dépannages de la version 2.0.x =====<br />
<br />
Les fix ont besoin d'un répertoire séparé, créer un répertoire séparé 'fixes', entrez le, et répéter la commande de contrôle ci-dessous avec l'URL http://svn.freepascal.org/svn/fpc/branches/fixes_2_0:<br />
<br />
[]$ cd mysvn/fixes<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpc/branches/fixes_2_0 fpc<br />
<br />
et pour mettre à jour :<br />
<br />
[]$ svn update fpc<br />
<br />
Les sources de documents sont dans un dépôt séparé appelé fpcdocs, ainsi la commande pour les obtenir est <br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpcdocs/trunk fpcdocs<br />
<br />
Si vous voulez apprendre plus au sujet de subversion , lire cet excellent [http://svnbook.red-bean.com/ livre sur Subversion] qui est également accessible en ligne dans différents formats libre.<br />
<br />
Pour le curieux : Vous avez seulement un accès lecture seule, ainsi essayer de ne rien commettre :-)<br />
<br />
Pour plus d'information , voir le site [http://www.freepascal.org/develop.html FreePascal]<br />
<br />
=== Installer Free Pascal sous Windows ===<br />
<br />
==== Version binaire de FPC pour Windows ====<br />
<br />
La meilleure façon d'installer correctement Free Pascal est de télécharger la dernière version binaire de Lazarus pour Windows à partir du dépôt SourceForge - vous avez ainsi la dernière version du compilateur FreePascal, ses bibliothèques ainsi que l'IDE Lazarus. Pour ceux qui veulent faire une installation à partir des fichiers source, lire la suite !<br />
<br />
Vous trouverez le zip d'installation de fpc 2.0.2 dans les téléchargements de Free Pascal : http://www.freepascal.org/download.html, ensuite vous choisissez un site mirroir.<br />
Installer à partir des sources -- voir le paragraphe suivant pour savoir comment se les procurer-- ce n'est pas pour les débutants, et à condition d'avoir démarré le compilateur correctement.<br />
<br />
==== Code source de FPC pour Windows ====<br />
<<<< Voir la section [[#Sources FPC|Sources FPC]] pour Linux, où l'utilisation du SVN est décrite>>>><br />
<br />
La méthode la plus simple pour se procurer les codes source du Free Pascal est d'utiliser le SVN; reportez vous au paragraphe suivant pour plus d'informations. Vous pouvez aussi télécharger le packet complet -- http://www.freepascal.org/develop.html pour l'instantané de la journée de l'arbre de réalisation version 2.1.x .<br />
<br />
Sources windows FPC via SVN ()<br />
<br />
Vous avez besoin d'un client SVN par exemple TortoiseSVN installé pour pouvoir suivre les étapes suivantes. Les commandes exactes dépandent des clients SVN utilisés; celles qui sont utilisées ci-dessous sont celles de 'SVN home's client', qui est disponible au téléchargement ici.<br />
<br />
Pour commencer créer un répertoire pour mettre les fichiers source (par exemple C:\Source). N'importe quel utilisateur est capable de faire cela. Créer un répertoire pour fpc (par exemple C:\Source\FPC), ensuite au prompt faire ce qui suit :<br />
C:\Source> svn co http://svn.freepascal.org/svn/svn/trunk fpc<br />
Nota : Pour télécharger/mettre à jour les derniers changements faire seulement :<br />
C:\> cd Source\FPC<br />
C:\Source\FPC> svn up<br />
<br />
<br />
Voir: http://www.freepascal.org/down-win32.html . Vous avez une liste des sites mirroirs à : http://www.freepascal.org/sdown.html. Téléchargez FPC (un seul gros fichier), dézippez le et lancez l'install.exe. <br />
<br />
Ajouter le répertoire de FPC à votre variable PATH:<br />
<br />
* Win98: Editez autoexec.bat et ajouter la ligne : PATH=%PATH%;C:\pp\bin\bin\win32<br />
* WinXP/2k: Poste de travail(Click droit) -> Propriétés -> Advancé (Page) -> Variables d'environnement-> Variables système-> Modifier "PATH", ajouter "C:\pp\bin\bin\win32" .<br />
<br />
Redémarrer windows.<br />
<br />
''ToDo: Expliquer comment télécharger les sources et construire le compilateur''<br />
<br />
=== Installer Free Pascal sous FreeBSD automatiquement ===<br />
<br />
La dernière FreeBSD ports collection à la version stable 2.0.4 dans ports/lang/fpc2.<br />
Tout ce qu'il y a à faire c'est d'installer le port. <br />
<br />
Cela peut être fait à la main en étant root.<br />
<br />
[]# cd /usr/ports/lang/fpc2 && make install && make clean<br />
<br />
Une autre possibilité est d'utiliser portinstall.<br />
<br />
[]# portinstall fpc2<br />
<br />
Un fois fpc installé, pour tester le fonctionnement il suffit de lancer : <br />
<br />
[]$ fpc<br />
<br />
=== Installer Free Pascal sous BSD/manuellement ===<br />
<br />
Opérationnellement, vous avez besoin d'un fichier avec toutes les sources, ou de deux (fpc et lazarus)<br />
<br />
1. Par exemple pour fpc ftp://ftp.freepascal.org/fpc/dist/Linux/separate/sources.tar de préférence une exportation (pas de CVS/ répertoires). Le fichier ci-dessus manque ça.<br />
<br />
2. Source instantanée de Lazarus.<br />
* n'importe quel compilateur qui démarre à partir de la branche 2.0.2 . Vous pouvez faire un contrôle en analysant la sortie de ppc386 -i ;Si c'est la version 2.0.2 .. 2.1.x c'est ok.<br />
* paquets dépendants . (pour FreeBSD c'est gtk12, glib12 et gdk_pixbuf et GNU make, iconv et gettext)<br />
<br />
Construction de FPC:<br />
<br />
1. (chercher ) les fichier nécessaires(sources FPC, compilateur de départ)<br />
<br />
2. (extraire ) ensuite de-tgz dans le répertoire de travail,<br />
<br />
3. (construire ) entrer dans le répertoire work/fpc/ et executer<br />
<br />
$MAKE all OPT='-gl' PP=/path/to/startingcompiler-name-ppc386<br />
(/path/to/ peut être omis quand ppc386 est dans le path)<br />
($MAKE est make sous linux et gmake sous BSD)<br />
<br />
4. (installer ) ensuite, à nouveau dans le répertoire work/fpc, executer<br />
<br />
$MAKE install PP=compiler/ppc386 PREFIX=$THEPREFIX<br />
(THEPREFIX= usuellement est /usr/local, mais par exemple sous NetBSD c'est /usr/pkg for ports)<br />
Create a symlink:<br />
ln -s $THEPREFIX/lib/fpc/2.0.2/ppc386 $THEPREFIX/bin/ppc386<br />
install sourceinstall PREFIX=$THEPREFIX<br />
<br />
5. (configurer ) executer compiler/utils/samplecfg $THEPREFIX/lib/fpc/2.0.1 $ETCDIR<br />
<br />
6. (facultatif , test), voir si ppc386 -i donne une sortie, sinon donner un avertissement que l'utilisateur doit ajouter $PREFIX/bin à son chemin courant. Essayez de compiler un programme avec -viwn, et voir si cela donne des erreurs .<br />
Notes:<br />
<br />
* Si vous avez besoin de listes de paquet fpcmake, vous devez les produire ou les fournir vous-même, (dans le portage, ou dans une archive supplémentaire) de l'une ou l'autre manière, faire un simulacre d'installation vers /tmp/pack et déterminez les fichiers installés avec find . >ll<br />
<br />
* $THEPREFIX et $ETCDIR devrait être configurable par l'utilisateur. Autrement les installations en local ne sont pas possibles.<br />
<br />
* BSDHIER=1 sur toutes les commandes make force conventions de hiérarchie BDS.<br />
<br />
=== Installation de Free Pascal sous Mac OS X ===<br />
<br />
Vous avez besoin également des outils de développement d'Apple ("Developper Tools"):<br />
<br />
Outils de développement: sont inclus sur le DVD d'installation original de MacOS X, ou télécharger à l'adresse d'ADC (enregistrement libre requis ): http://developer.apple.com/.<br />
DVD MacOS X Tiger(10.4): "/Mac OS X Install Disc 1/Xcode Tools/XcodeTools.mpkg"<br />
DVD MacOS X Leopard(10.5): "/Mac OS X Install DVD/Installations facultatives/Xcode Tools/XcodeTools.mpkg"<br />
<br />
<br />
;Free Pascal Compiler:<br />
Ensuite télécharger et installer le compilateur Free Pascal à partir de l'adresse:<br />
: https://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Pour Lazarus vous avez aussi besoin des sources de FPC :<br />
Télécharger et installer les sources Free Pascal (fpcsrc) à partir de l'adresse:<br />
: https://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Ce qui suit est optionnel...<br />
<br />
*Installer SVN pour MacOS X: Un bon paquet est fourni par [http://www.codingmonkeys.de/mbo/ Martin Ott].<br />
<br />
Créer un répertoire, là où vous voudriez mettre les sources. Vous n'avez pas besoin d'être root pour faire ceci . N'importe quel utilisateur normal peut faire ceci . <br />
Créer d'abord un répertoire for fpc <br />
: (Par exemple /Users/username/freepascal) <br />
ouvrir alors un terminal et faire ce qui suit :<br />
[]$ svn co http://svn.freepascal.org/svn/svn/trunk fpc<br />
Ceci créera un répertoire appelé 'fpc', qui pourra être utilisé plus tard dans l'IDE.<br />
Conseil : Pour télécharger/mettre à jour les derniers changements vous pouvez simplement faire <br />
[]$ cd /Users/username/freepascal/fpc<br />
[]$ svn up<br />
<br />
== Installer Lazarus ==<br />
<br />
=== Installer Lazarus pour Linux ===<br />
==== Ubuntu / Debian ====<br />
<br />
La meilleure façon d'obtenir une installation fonctionnelle courante de Lazarus est de télécharger les fichiers .deb pour FreePascal et Lazarus à partir du dépôt du site sourceforge.<br />
<br />
Il y a trois paquets<br />
* Le compilateur pascal (eg : fpc_2.6.4-150228_i386.deb)<br />
* Le code source du compilateur ( eg: fpc-src_2.6.4-150228_i386.deb)<br />
* Le code de Lazarus (eg : lazarus_1.4.0-0_i386.deb)<br />
<br />
Déplacez-vous dans le dossier ou sont déposés les paquets et assurez-vous que seuls les paquets nécessaires s'y trouvent. Selon la version de linux il est nécessaire d'installer la libgtk2. <br />
<br />
Executez les commandes suivantes<br />
<syntaxhighlight lang="bash"><br />
cd Téléchargements<br />
sudo apt-get install libgtk2.0-dev<br />
sudo dpkg -i *.deb<br />
</syntaxhighlight><br />
L'instalation est terminée. Recherchez Lazarus avec l'outils de recherche et glissez l'icone dans la barre du lanceur.<br />
<br />
Il est nécessaire de mettre à jour les dépôts sinon il y aura des conflits avec les mises à jour.<br />
Pour cela télécharger la clef public du serveur puis ajoutez-la au système apt.<br />
<syntaxhighlight lang="bash"><br />
gpg --keyserver hkp://pgp.mit.edu:11371 --recv-keys 6A11800F<br />
gpg --export 6A11800F | sudo apt-key add -<br />
</syntaxhighlight><br />
<br />
Ensuite ajoutez les dépôts avec Synaptic ou en éditant le fichier /etc/apt/sources.list. Ajouter les indications suivantes :<br />
<syntaxhighlight lang="bash"><br />
deb http://www.hu.freepascal.org/lazarus/ lazarus-stable universe<br />
deb http://www.hu.freepascal.org/lazarus/ lazarus-testing universe<br />
</syntaxhighlight><br />
<br />
<br />
<br />
Expérimental : [[How to setup a FPC and Lazarus Ubuntu repository/fr|Comment paramétrer un dépôt avec FPC et Lazarus pour Ubuntu]]<br />
<br />
==== Installation utilisant les rpms ====<br />
La meilleure façon pour avoir une installation efficace de Lazarus c'est de télécharger les rpms pour FreePascal et Lazarus à partir du SourceForge repository.<br />
<br />
Vous devez télécharger les versions :<br />
* du compilateur (eg fpc-1.9.5-041207.i386.rpm)<br />
* des sources de la bibliothèque (eg fpcsrc-1.9.5-041207.i386.rpm)<br />
* de Lazarus (eg lazarus-0.9.2.4-fpc_1.9.5_041207.i386.rpm).<br />
<br />
Vous exécuter ensuite les commandes suivantes (vous devez avoir les droit d'administrateur - use su or sudo)<br />
rpm -Uvh fpc-1.9.5-041207.i386.rpm<br />
rpm -Uvh fpcsrc-1.9.5-041207.i386.rpm<br />
rpm -Uvh lazarus-0.9.2.4-fpc_1.9.5_041207.i386.rpm<br />
<br />
'''Installing Lazarus 0.9.16. For Suse 10.1 users:'''<br><br />
<br />
Demarrer Linux et se logger en "Root"<br><br><br />
Free Pascal Compiler nécessite:<br><br />
- Gnu binutils (gnu as, gnu ld, gnu make) - check it out with "YAST"<br />
<br />
Télécharger les fichiers binaires suivants (RPM)<br />
:* fpc-2.0.2-0.i586.rpm (oui i586 et pas i386)<br />
:* fpcsrc-2.0.2-0.i386.rpm<br />
<br />
install them opening a terminal session (mouse's rigth button -> Menu: Open in terminal)<br />
:* rpm -Uvh fpc-2.0.2-0.i586.rpm<br />
:* rpm -Uvh fpcsrc-2.0.2-0.i386.rpm<br />
<br />
Lazarus demande ces composants:<br />
1) glib devel<br />
2) gtk devel<br />
3) gdk-pixbuf-devel<br />
4) gtk+-devel.<br><br />
Il semble que le dernier ne fonctionne pas avec Suse, mais une fois les trois premiers installé il est possible de forcer l'installation avec l'option -nodeps :<br />
:*rpm -Uvh --nodeps lazarus-0.9.16-1.i386.rpm<br />
<br />
==== Installation à partir des fichiers source ====<br />
Si vous préférez faire l'installation à partir des sources et compiler les fichiers vous-même,suivre ces instructions . Puisque toute l'ensemble lazarus est installé sur un répertoire, la désinstallation est très facile et vous n'avez pas d'être root pour installer Lazarus. Vous pouvez obtenir les fichiers tgz pour fpc, fpcsrc et lazarus à partir de la section de téléchargements ou vous pouvez le télécharger via svn.<br />
<br />
===== Téléchargement de Lazarus via SVN =====<br />
<br />
Le dépot lazarus s'est déplacé de cvs à svn (Subversion). SVN fournit une manière facile pour mettre à jour vos sources en téléchargeant seulement les changements . C'est la manière recommandée et vous permet de sauver beaucoup de temps. Un raccordement à l'Internet est nécessaire pour cela: vous n'avez pas besoin d'être root. Lazarus n'a besoin d'aucune permission spéciale, ni pendant l'installation ni pendant exécution .<br />
<br />
Avec le déplacement nous avons également changé la disposition du répertoire des sources lazarus. La différence principale <br />
est que toutes les sources de l'ide sont déplacés de la racine vers un sous-répertoire séparé de l'ide. Comme quiconque pourrait le comprendre, ceci a un impact sur les Makefiles, les chemins de recherche etc. Nous sommes en marche pour réparer les choses, ainsi si quelque chose ne fonctionne pas , svp faire nous le savoir.<br />
<br />
;Maintenant la chose la plus importante .... obtenir les sources :<br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/lazarus/trunk/ lazarus<br />
(ou tout autre répertoire là où vous voulez placer vos sources )<br />
<br />
Aux occasions suivantes , pour mettre à jour taper simplement au clavier <br />
<br />
[]$ svn update lazarus<br />
<br />
Pour plus d'informations sur Subversion, voir :<br />
http://subversion.tigris.org/<br />
<br />
Note: CVS est encore accessible, mais est figé. Ceci signifie <br />
qu'aucune nouvelle mise à jour n'est commise .<br />
<br />
===== Compilation et execution =====<br />
que vous ayez checkout a partir de cvs ou de svn, la prochaine étape est : <br />
<br />
;compile lazarus:<br />
[]$ cd lazarus<br />
[]$ make (gmake on BSD)<br />
<br />
<br />
Si fpc est installé correctement , la compilation devrait fonctionner sans problèmes . Sinon , voir FAQ.<br />
<br />
;Start lazarus<br />
[]$ ./lazarus<br />
<br />
L'IDE devrait démarrer.Si vous avez démarré lazarus dans un terminal, vous pouvez voir quelques notes au sujet des paramètres manquants. C'est normal au premier démarrage. L'IDE essaye automatiquement de découvrir où le compilateur freepascal et ses sources sont installés par la recherche dans les répertoires les plus communs .<br />
<br />
;Vérifier les chemins :<br />
: Employer le menu de l'ide pour aller à <br />
:: Configuration -> Options d'environment Options... -> Fichiers<br />
<br />
Le 'répertoire source de FPC' devrait pointer vers le répertoire source de fpc . Ce répertoire se termine normallement avec /fpc/ ou /fpcsrc/ (Par exemple /usr/src/fpcsrc ou /home/username/freepascal/fpc) et contient des répertoire comme 'compiler', 'docs', 'fcl', 'rtl' et 'packages'.<br />
<br />
''ToDo: expliquer les autres chemins ''<br />
<br />
;Conseil :<br />
Pour mettre à jour lazarus vous pouvez employer <br />
[]$ svn update lazarus<br />
then for either update pathway:<br />
[]$ make clean all (gmake sur BSD)<br />
Ceci reconstruira lazarus et créer un IDE sans paquet lazarus. Pour lier vos paquets installés faire '''après''' ce qui précède :<br />
[]$ ./lazbuild --build-ide=<br />
Il se peut que vous deviez ajouter d'autres options si par exemple vous lancer lazarus avec un répertoire de configuration personnalisé (ex : ajoutez --pcp="C:\Documents and Settings\<USER>\Local Settings\Application Data\lazarus-tests")<br />
<br />
==== Installation de Lazarus sous Debian GNU/Linux ====<br />
<br />
Il y a des paquets préliminaires de Debian pour lazarus disponible pour le téléchargement. Ce ne sont pas les dernières versions, cependant. Assurez-vous d'avoir lu /usr/share/doc/lazarus/README.Debian soigneusement avant de commencer à l'employer. Un Feedback est nécessaire et apprécié; veuillez envoyer vos commentaires à Carlos Laviola <claviola@debian.org>.<br />
<br />
Notez que pour une installation de Lazarus fonctionnant entièrement, des versions pas plus anciennes ou incompatibles , par exemple, des sources fpc ou du compilateur fpc doivent être installées. Les enlever par la tapant au clavier <br />
<br />
dpkg -r <package name> <br />
<br />
sans l'extension .deb. Et installer alors les nouvelles versions comme décrit .<br />
<br />
==== Une autre manière pour installer Lazarus sous Debian ====<br />
Ajouté par [[User:Kirkpatc]].<br />
<br />
;Installation simple de Lazarus dans Debian<br />
(supposons ube nouvelle installation Debian, sans bibliothèques de développement chargées)<br />
<br />
A partir du dépot sourceforge, télécharger les dernieres réalisations fpc, fpclib et lazarus ; suivre les liens de http://lazarus.freepascal.org, cliquer sur le boutton "downloads" du côté gauche , puis cliquer sur "binaries" puis "linux" puis "Current Lazarus RPM". Ceci vous amènera à <br />
: http://sourceforge.net/project/showfiles.php?group_id=89339<br />
télécharger alors les fichiers suivants (ou plus récent , si disponible )<br />
* fpc-2.0.0-0.i586.rpm<br />
* fpcsrc-2.0.0-0.i386.rpm<br />
* lazarus-0.9.8-fpc_2.0.0_0.i386.rpm<br />
cd vers le répertoire où ces fichiers sont stockés,alors devenez root (su) et tapez au clavier:<br />
<br />
alien -c fpc* //ceci convertira les deux fichiers fpc et fpcsrc files au format debian et convertira les scripts d'installation<br />
alien -c laz*<br />
installer alors les paquet Debian (.deb) générés par (en tant que root):<br />
<br />
dpkg -i fpc*.deb laz*.deb<br />
ou utilisez kpackage ou un utilitaire semblable pour installer les fichiers fpc, fpcsrc et lazarus .deb générés.<br />
<br />
Et si vous n'avez pas l'alien taper au clavier:<br />
<br />
apt-get install alien <br />
<br />
SVP notez que, sur les distributions Linux comme Ubuntu, vous devrez ajouter 'sudo' devant toutes les commandes . Dans Ubuntu la commande précédente serait <br />
<br />
sudo apt-get install alien<br />
<br />
Vous devez produire un fichier de configuration, qui résidera dans /etc/fpc.cfg. Toujours en tant que root, cd vers le répertoire principal de fpc /usr/lib/fpc/2.0.0 et ensuite taper au clavier<br />
sh ./samplecfg /usr/lib/fpc/2.0.0 /etc<br />
Vérifier le contenu de votre nouveau fichier de configuration (cat /etc/fpc.cfg) et faire tous les changements que vous voulez en utilisant vi ou un autre éditeur de texte . S'assurer en outre qu'il n'y a de vieux fichiers de configurationdans par exemple votre répertoire d'accueil (~/.fpc.cfg).<br />
<br />
Vous devez installer les paquets de développement de GTK et les bibliothèques pixbuf, ainsi <br />
apt-get install libgtk2.0-dev<br />
apt-get install libgdk-pixbuf-dev<br />
Alors vous devriez être prêt pour commencer à programmer !<br />
<br />
=== Installer Lazarus sous Windows ===<br />
<br />
La release actuelle de Lazarus pour windows sous forme binaire est très facile à installer et doit fonctionner sans soucis.<br />
<br />
Il est aussi possible d'installer l'ensemble Lazarus/FPC sur un disque USB (Il faut au minimum 256 MB de disponibles), pour travailler dans les cas où vous ne pouvez pas installer de logiciels sur la machine ou des le cas ou vous n'avez pas les droits de niveau administrateur. Il faut soignement régler les chemins pour le compilateur, dans les options d'environnement ainsi que dans le fichier fpc.cfg. Il peut également être nécessaire de mettre vos répertoires de compilation et de tests sur le disque amovible.<br />
Question : <br />
Comment paramétrer des chemins relatifs dans ces fichiers de configuration pour l'adressage continue à focntionner lorsque l'on change le disque USB de machine et qu'il est reconnu sous une autre lettre ?<br />
<br />
<br />
Les fichiers binaires sont disponible pour Linux et Windows à : <br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Télécharger la dernière mise à jour and lancer l'application. C'est une installation classique de Windows qui va mettre le compilateur FPC et les sources des bibliothèques dans une structure de répertoires commune avec Lazarus et l'IDE doit se lancer et fonctionner sans problèmes particuliers, en partant du principe que vous aurez au préalable désintallé toutes les éventuelles versions précédentes de Lazarus et/ou FPC (souvent on le trouve dans le répertoire c:\pp).<br />
<br />
Vous pouvez aussi trouver les dernieres mises à jour de Lazarus pour Windows a: http://www.de.freepascal.org/lazarus/<br />
<br />
==== Installation à partir des sources ====<br />
Si vous préferrer faire l'installation à partir des codes source, alors suivez les instructions suivantes.<br />
(Thanks to Joe for the initial Step-by-step description)<br />
<br />
Il faut télécharger les sources de lazarus :<br />
http://www.de.freepascal.org/lazarus/<br />
<br />
Ensuite dézipper dans c:\lazarus par exemple. Vous devez installer au minimum fpc-2.0.2, mais fpc-2.0.3 voir fpc 2.1.1 snapshot est aussi possible. Compiler Lazarus et lazarus.exe fonctionne. Le chemin pour fpc est : c:\pp\bin\win32. Dans le même répertoire, il y a d'autres exe (make, grep, ppc386...).<br />
<br />
Ouvrir une session DOS : Démarrer -> Executer...>command ou lancer par l'icône MS-DOS<br />
<br />
Taper:<br />
cd c:\lazarus<br />
set path=c:\pp\bin\win32;c:\lazarus //Bien sur donnez le bon chemin !<br />
<br />
windres -i lazarus.rc -o lazarus.res<br />
make<br />
<br />
Si vous avez de la chance, vous pouvez taper : lazarus.exe. L'IDE, les dialogues et l'éditeur de propriétés doivent marchoter ! Essayez par vous même.<br />
<br />
Vous pouvez aussi compiler les exemples :<br />
<br />
cd examples<br />
make<br />
<br />
Si vous décompressez lazarus dans un autre disque : d:\lazarus par exemple, il est possible que vous ayez besoin de l'utilitaire gnu pour le make. Si vous l'avez, vous devez paramétrer son path=...;<gmakepath> mais il est plus simple de ne pas choisir le disque d:\<br />
<br />
C'est tout.<br />
<br />
=== Installation de Lazarus sous FreeBSD ===<br />
<br />
'''FreeBSD 5+'''<br />
<br />
La dernière version portée de Lazarus dans FreeBSD est 0.9.20. Nous pouvons installer lazarus en utilisant le portage à FreeBSD.<br />
<br />
[]# cd /usr/ports/editors/lazarus && make install clean clean-depends<br />
<br />
Si vous obtenez des messages à propos de fichiers source manquants, allez dans [menu bar >> Environment >> Environment Options >> Files Tab: FPC source library] et entrez le dossier des fichirs sources de FPC. Il peut être obtenu depuis /usr/ports/distfiles/freepascal<br />
<br />
Bonne chance, cela a fonctionné pour moi. --[[User:Jrmarino|Jrmarino]] 21:29, 4 Jan 2006 (CET)<br />
<br />
=== Installer Lazarus sous PC-BSD 1.0rc1+ ===<br />
<br />
Vous pouvez installer Lazarus sous PB-BSD simplement en téléchargeant le PBI de Lazarus depuis [http://www.pbidir.com/PBI Dir]<br />
<br />
Notez que vous devez installer le portage de glib* depuis /usr/port/devel/glib* ou les packages glib avec pkg_add -r glib12 glib20.<br />
Cela sera résolu dans les nouvelles versions de PBI.<br />
<br />
'''[other OpenBSD/NetBSD/DragonFlyBSD goes here]'''<br />
<br />
=== Installer Lazarus sous Mac OS X ===<br />
<br />
<br />
1. Installez les Outils de Développement d'Apple si ce n'est fait:<br />
<br />
DVD MacOS X Tiger(10.4): "/Mac OS X Install Disc 1/Xcode Tools/XcodeTools.mpkg" <br />
<br />
DVD MacOS X Leopard(10.5): "/Mac OS X Install DVD/Installations facultatives/Xcode Tools/XcodeTools.mpkg"<br />
<br />
2. Téléchargez les 3 fichiers *.dmg (fpc, fpcsrc, lazarus) correspondant à votre processeur (versions: fpc 2.2.x, fpcsrc 2.2.x, lazarus 0.9.26.x au moins) ici:<br />
<br />
http://sourceforge.net/projects/lazarus/files/<br />
<br />
3. A partir des fichiers *.dmg téléchargés, installez dans l'ordre:<br />
<br />
Fpc<br />
<br />
Fpcsrc<br />
<br />
Lazarus<br />
<br />
<br />
<br />
Lazarus est maintenant installé dans le dossier:<br />
<br />
Disque dur ("MacintoshHD")/Developer/lazarus/<br />
<br />
=== Expériences additionnelles et conseil pour l'installation de FPC et Lazarus ===<br />
<br />
Faire fonctionner Lazarus sous Linux peut être compliqué. Si vous avez déjà installé une version plus ancienne de FPC et/ou Lazarus, vous devez faire très attention à ce que les PATHS soient ajustés pour que seules vos nouvelles versions soient appelées.<br />
<br />
Les pièges que j'ai connu lors de diverses tentatives avec SuSE Linux incluent:<br />
<br />
La version rpm installe souvent FPC dans /bin ou /usr/bin, avec les bibliothèques dans /lib ou /usr/lib.<br />
<br />
Si vous faites un make install sur une version source ou utilisez un .tar.gz, le compilateur est habituellement installé dans /usr/local/bin avec les bibliothèques dans /usr/local/lib.<br />
<br />
Donc si des versions plus anciennes on été installées depuis un rpm, assurez-vous que tous els liens ont été changés pour refléter la nouvelle structure de dossiers du nouveau compilateur. 'emplacement pour faire les modifications est dans /etc/fpc.cfg ; assurez-vous qu'il n'y ait pas de fichier de configuration rémanant dans votre dossier home ou votre dossier de téléchargement de FPC. Typiquement, ils se trouvent dans ~/.fpc.cfg<br />
<br />
Assurez-vous que les liens dans /etc/fpc.cfg pointent vers les versions correctes des bibliothèques (particulièrement si vous avez d'anciennent versions qui trainent dans le coin).<br />
<br />
Dans /usr/local/bin ou /usr/bin se trouve un fichier nommé fpc ; c'est l'exécutable qui est appelé lorsque vous invoquez le compilateur. Une des premières choses qu'il fait est d'ouvrir ppc386 dans le même dossier. Il doit être de la même version que le fichier fpc, ou il peut être un lien pointant vers le vrai ppp386 dans un autre dossier (comme un dossier de bibliothèque, ou le dossier de fpc dans votre propre espace de développement); assuez-vous de mettre à jour votre lien si vous installez une nouvelle version du compilateur.<br />
<br />
Essayez de lancer le compilateur depuis la ligne de commande en utilisant un des exemples de programmes simples ou un que vous avez écrit vous même.<br />
<br />
Concernant Lazarus:<br />
<br />
Si vous utilisez une version snapshot (.tar.gz) ou si vous obtenez la source depuis le CVS, allez dans votre dossier de Lazarus et entrez<br />
<br />
make<br />
./lazarus <br />
<br />
et heureusement l'IDE devrait se charger. Il se peut qu'il y ait un message disant qu'il ne peut trouver les sources; si c'est le cas, allez dans le menu en haut et sélectionnez Environnement -> Options d'Environnement et insérez le nom du dossier où sont situées vos fichiers de Lazarus (par ex: ~/FreePascal/lazarus), votre compilateur (par ex: /usr/local/bin/ppc386), le dossier des sources de FreePascal (par ex: /usr/local/lib/fpc/$version/fpc ou un dossier dans votre propre espace par ex: ~/FreePascal/fpc). Puis fermez le dialogue et commencez à programmer.<br />
<br />
Vous pouvez rencontrer d'autres problèmes quand vous commencerez à programmer ou à compiler; la plupart d'entre eux concernent la sélection du PATH.<br />
<br />
Beaucoup des difficultés sont traitées dans la FAQ de Lazarus, trouvées sur le site du WiKi, ou une liste plus complète sur le site principale de Lazarus<br />
<br />
http://www.lazarus.freepascal.org/modules.php?op=modload&name=FAQ&file=index<br />
<br />
Dans le menu du haut sélectionnez Lancer -> Options du Compilateur (ou Projet -> Options du Compilateur dans les versions plus récentes de Lazarus) et sélectionnez l'onglet des chemins dans le dialogue qui s'affiche. Il y a plusieurs boîtes pour les entrées de dossier des chemins pour les fichiers Units, Include, Autres fichiers source, Bibliothèques, etc. Pour chacune d'elles, pressez le bouton ... (ellipsis) à leur droite, vous obtiendrez une fenêtre vierge pour insérer les informations de chemin, et une fenêtre en bas donnant quelques suggestions. Sélectionnez-en autant que vous voulez (ou TOUS!) et pressez le bouton AJOUTER pour transférer les sélections dans la fenêtre située au dessus. Quand vous avez fini votre sélection, pressez OK et déplacez vous sur la boîte suivante. Si vous savez quels sont les autres dossiers qui doivent être suivis,pressez le bouton Parcourir associé à chaque boîte, et insérez les dossiers additionnels.<br />
<br />
Quand vous pensez que vos chemins sont les bons, essayez de compiler votre application. S'il reste des erreurs relatives aux chemins ('ne peut trouver l'unité .......') retournez en arrière et vérifiez vos chemins, à la fois dans /etc/fpc.cfg et dans votre dialogue Lancer -> Options du Compilateur (ou Projet -> Options du Compilateur selon votre version).<br />
<br />
Une fois que votre environnement et votre PATH sont corrects, il serait bien de conserver votre configuration dans un fichier, sinon vous devrez refaire la même chose pour chaque nouveau projet.<br />
Dans la boîte de dialogue Lancer -> Options du Compilateur se trouve un bouton Charger/Sauver; sélectionez le et sauvegardez la configuration dans le fichier du nom de votre choix: le mien est ~/FreePascal/default.cfg. Chaque fois que je démarre un nouveau projet, Je peux aller dans le dialogue Lancer -> Options du Compilateur (ou Projet -> Options du Compilateur), sélectionner Charger/Sauver, et charger mon fichier default.cfg pour le nouveau projet. Vous pouvez bien sûr modifier les options pour chaque nouveau projet si tel est votre désir.<br />
<br />
== Contributeurs d'origine et changements ==<br />
Cette page a été convertie à partir de epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=InstallingLazarus version].<br />
* Initially imported and formatted. [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Changed Joe's part for Windows to require fpc 1.0.10. [[User:Vincent | Vincent]] 9/25/2003<br />
* Updated "What is required for lazarus". AndrewJohnson 10/1/2003<br />
* Finished formatted the InstallingLazarus page [[User:Tom | VlxAdmin]] 2/22/2004<br />
* Posted some notes about Installing FPC and Lazarus: mostly reflecting experiences in trying to get the PATHS right in Linux. 3/11/2004 [[User:Kirkpatc]]<br />
* Copied the contents of my note into the main InstallingLazarus section, edited it slightly. I don't know how to remove the original note. 3/12/2004 [[User:Kirkpatc]]<br />
* Removed the original note. Tidied the wiki and formatting a bit. [[User:Tom | VlxAdmin]]<br />
* Corrected a couple of typos - 3/12/2004 [[User:Kirkpatc]]<br />
* Added link for daily snapshot deb packages - 3/27/2004 [[User:Vincent | Vincent]]<br />
* Fixed links in GettingLazarus (downloading binaries) and several other pages. 22 July 2004 [[User:Kirkpatc]]<br />
* Added link for lazarus deb packages - 19 August 2004 VincentSnijders<br />
* Added a short note on installing in Debian - 23 Nov 2004 [[User:Kirkpatc]]<br />
* Considerable re-write and re-organization of installation section - 11 Dec 2004 [[User:Kirkpatc]]<br />
* Fixed broken link - 9 Oct 2005 [[User:Avantman42]]<br />
* Début de traduction de l'anglais vers le français - 16 August 2006 [[User:Bernard | Bernard]]<br />
<br />
<br />
{{AutoCategory}}<br />
[[Category:FPC/fr]]<br />
[[Category:Lazarus/fr]]<br />
[[Category:Install/fr]]</div>Gillou58https://wiki.freepascal.org/index.php?title=Installing_Lazarus/fr&diff=120214Installing Lazarus/fr2018-10-09T07:41:26Z<p>Gillou58: /* Généralités */</p>
<hr />
<div>{{Installing Lazarus}}<br />
<br />
== Généralités ==<br />
<br />
Pour ceux qui veulent seulement installer Lazarus et l'utiliser pour programmer, la meilleure solution est de télécharger et d'installer une version binaire, récente et stable (pour Linux un paquet '.rpm', ou un exécutable d'installation pour Windows '.exe' ou encore un paquet '.dmg' pour Mac OS X). Vous pouvez lire les sections relatives à Linux ou Windows intitulées 'fpc binaries', ou les premiers paragraphes des sections qui traitent de l'installation de Lazarus sous Linux or Windows. La plupart des autres informations peuvent être ignorées sans risque.<br />
<br />
Pour ceux qui veulent participer au développement du compilateur ou de l'IDE, ou ceux qui veulent les outils les plus récents, une installation à partir des fichiers sources est nécessaire, et la plupart des informations de ce document sont importantes.<br />
<br />
Lazarus a deux composantes : <br />
* LCL - la bibliothèque de composants (Lazarus Component Library)<br />
* IDE - l'interface de développement (RAD tool) <br />
<br />
Les deux utilisent :<br />
* FPC - le compilateur FreePascal <br />
* FCL -la bibliothèque de composants de FreePascal, qui contient l'essentiel des composants ou objets non visuels utilisés par Lazarus.<br />
<br />
=== Ce dont a besoin Lazarus pour fonctionner ===<br />
<br />
# Le compilateur FreePascal, ses paquets et ses sources. (*important*: ils doivent être de la même version et date)<br />
# Des interfaces adaptées :<br />
#:;Win32 : l'API Win32 peut être utilisée <br />
#:;Mac OS X : vous avez besoin des Developer tools d'Apple (ceux-ci se trouvent sur le DVD d'installation de MacOS X fourni avec votre ordinateur). Voir l'installation pour Mac OS X plus loin. <br />
#:;GTK+ 2.x ou Qt : la plupart des distributions Linux installent par défaut les bibliothèques GTK+ 2.x. Pour le code source voir : http://www.gtk.org. Qt est de même pris en charge pour toutes les ditributions (aut-installé si vous préférez KDE).<br />
<br />
La FAQ – Le fichier de la Foire Aux Questions est sur : http://www.lazarus.freepascal.org . Certaines questions sont dans le fichier local : 'FAQ'. <br />
<br />
Les paragraphes suivants décrivent comment se procurer FreePascal et comment installer Lazarus correctement.<br />
<br />
== Installer le Compilateur Free Pascal ==<br />
<br />
L'installation et la construction du compilateur Free Pascal fait l'objet d'une discussion très ouverte sur http://www.stack.nl/~marcov/buildfaq.pdf – C'est peut être un peu trop détaillé pour certains utilisateurs, mais cela reste toujours très compréhensible. <br />
<br />
Lazarus a besoin de fpc (FreePascal) version 2.0.2 ou plus, ainsi que des bibliothèques compilées fpc libs (binaires) et des code source fpc, le tout dans les mêmes versions. <br />
<br />
=== Installer Free Pascal sous Linux ===<br />
<br />
==== FPC Binaries ====<br />
<br />
La dernière version de FreePascal, actuellement la version 2.0.2, peut être téléchargée sur le site de FreePascal (http://www.freepascal.org/download.html, puis choisir un miroir) ou a partir de sourceforge (http://sourceforge.net/projects/lazarus). <br />
<br />
A la partie téléchargement de lazarus (http://www.lazarus.freepascal.org ) vous avez les RPM du compilateur Free Pascal (compiler / linux) ainsi que ses 'packages'. Si vous n'avez pas une distribution basée sur les RPM, vous pouvez télécharger et installer les 'tarballs' (je ne connais rien en Linux désolé) à partir de http://www.freepascal.org. Si vous souhaitez compiler votre version vous même, consultez la section BSD.<br />
<br />
Instructions: <br />
<br />
ATTENTION: Si vous n'utilisez pas les RPMs (même si vous prévoyez d'utiliser alien) le mieux est de télécharger la denière version stable fpc (2.0.2 actuellement) et d'installer Lazarus à partir du code source.<br><br />
<br />
Démarrer Linux et se logger sous ROOT.<br><br />
<br />
Télécharger les derniers fichers à : http://sourceforge.net/project/showfiles.php?group_id=89339.<br />
Par exemple :<br />
:* fpc-2.0.2-0.i386.rpm<br />
:* fpcsrc-2.0.2-0.i386.rpm<br />
:* lazarus-0.9.14-1.i386.rpm<br><br />
et les installer avec :<br />
:* rpm -Uvh fpc-2.0.2-0.i386.rpm<br />
:* rpm -Uvh fpcsrc-2.0.2-0.i386.rpm<br />
:* rpm -Uvh lazarus-0.9.14-1.i386.rpm<br><br />
<br />
Les utilisateurs de Debian doivent ressortir leur alien (attention, il ne génére pas fpc.cfg) ou les tarball install.<br />
<br />
==== Sources FPC ====<br />
<br />
Depuis la sortie de la version 2.0, FPC a migré vers Subversion (SVN). Actuellement il n'y a pas de mirroir pour les CVS, vous devez donc utiliser SVN pour récupérer les sources FPC.<br />
<br />
===== Télécharger les instantanés journaliers du Development Tree (version 2.1.x) =====<br />
Vous pouvez télécharger les évolutions journalières des codes sources (v 2.1.x) sous forme d'un packet instantané à partir du SVN source repository: ces instantanés sont mis à jour chaque jour, et sont le reflet du source repository. Les fichiers sont conservés sur le site des archives SVN.<br />
La totalité des archives publiques de v2.1.x : [ftp://ftp.freepascal.org/pub/fpc/snapshot/v21/source/fpc.zip fpc.zip] (24 MB)<br />
<br />
===== Télécharger les instantanés journaliers du Release Tree (version 2.0.x) =====<br />
Vous pouvez télécharger journellement les codes sources (v 2.0.x) qui vont intégrer la prochaine release stable sous forme d'un packet instantané à partir du SVN source repository: ces instantanés sont mis à jour chaque jour, et sont le reflet du source repository. Les fichiers sont conservés sur le site des archives SVN.<br />
La totalité des archives publiques de v2.0.x: [ftp://ftp.freepascal.org/pub/fpc/snapshot/v20/source/fpc.zip fpc.zip] (24 MB)<br />
<br />
<br />
===== Connection au Source Repository avec SVN (remplace la section Connection au CVS) =====<br />
Comme alternative aux fichiers zip quotidiens du 'SVN sources', le 'SVN repository' s'est ouvert à tous avec un accès en lecture seule. Ainsi vous pouvez donc accéder directement aux codes source, et vous avez accès à la toute dernière mouture disponible. C'est aussi une méthode qui demande moins de bande passante à partir du moment où vous avez fait le premier téléchargement (checkout in SVN lingo).<br />
<br />
===== Accéder aux derniers développements =====<br />
Comment faire ? <br />
(Il est indispensable d'avoir SVN installé. Mode d'emploi ici : [http://subversion.tigris.org/ here] .)<br />
<br />
Aller dans le répertoire racine de votre espace de développement Ex : <br />
<br />
[]$ cd /home/username/FreePascal<br />
<br />
Pour accéder à tous les fichiers sources et à tous les modules disponibles taper :<br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpc/trunk fpc<br />
<br />
Normalement ceci n'est à faire que la première fois.<br />
<br />
Pour mettre à jour les fichiers chargés avec la méthode ci-dessus(checkout) :<br />
[]$svn update fpc<br />
<br />
===== Les dépannages de la version 2.0.x =====<br />
<br />
Les fix ont besoin d'un répertoire séparé, créer un répertoire séparé 'fixes', entrez le, et répéter la commande de contrôle ci-dessous avec l'URL http://svn.freepascal.org/svn/fpc/branches/fixes_2_0:<br />
<br />
[]$ cd mysvn/fixes<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpc/branches/fixes_2_0 fpc<br />
<br />
et pour mettre à jour :<br />
<br />
[]$ svn update fpc<br />
<br />
Les sources de documents sont dans un dépôt séparé appelé fpcdocs, ainsi la commande pour les obtenir est <br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpcdocs/trunk fpcdocs<br />
<br />
Si vous voulez apprendre plus au sujet de subversion , lire cet excellent [http://svnbook.red-bean.com/ livre sur Subversion] qui est également accessible en ligne dans différents formats libre.<br />
<br />
Pour le curieux : Vous avez seulement un accès lecture seule, ainsi essayer de ne rien commettre :-)<br />
<br />
Pour plus d'information , voir le site [http://www.freepascal.org/develop.html FreePascal]<br />
<br />
=== Installer Free Pascal sous Windows ===<br />
<br />
==== Version binaire de FPC pour Windows ====<br />
<br />
La meilleure façon d'installer correctement Free Pascal est de télécharger la dernière version binaire de Lazarus pour Windows à partir du dépôt SourceForge - vous avez ainsi la dernière version du compilateur FreePascal, ses bibliothèques ainsi que l'IDE Lazarus. Pour ceux qui veulent faire une installation à partir des fichiers source, lire la suite !<br />
<br />
Vous trouverez le zip d'installation de fpc 2.0.2 dans les téléchargements de Free Pascal : http://www.freepascal.org/download.html, ensuite vous choisissez un site mirroir.<br />
Installer à partir des sources -- voir le paragraphe suivant pour savoir comment se les procurer-- ce n'est pas pour les débutants, et à condition d'avoir démarré le compilateur correctement.<br />
<br />
==== Code source de FPC pour Windows ====<br />
<<<< Voir la section [[#Sources FPC|Sources FPC]] pour Linux, où l'utilisation du SVN est décrite>>>><br />
<br />
La méthode la plus simple pour se procurer les codes source du Free Pascal est d'utiliser le SVN; reportez vous au paragraphe suivant pour plus d'informations. Vous pouvez aussi télécharger le packet complet -- http://www.freepascal.org/develop.html pour l'instantané de la journée de l'arbre de réalisation version 2.1.x .<br />
<br />
Sources windows FPC via SVN ()<br />
<br />
Vous avez besoin d'un client SVN par exemple TortoiseSVN installé pour pouvoir suivre les étapes suivantes. Les commandes exactes dépandent des clients SVN utilisés; celles qui sont utilisées ci-dessous sont celles de 'SVN home's client', qui est disponible au téléchargement ici.<br />
<br />
Pour commencer créer un répertoire pour mettre les fichiers source (par exemple C:\Source). N'importe quel utilisateur est capable de faire cela. Créer un répertoire pour fpc (par exemple C:\Source\FPC), ensuite au prompt faire ce qui suit :<br />
C:\Source> svn co http://svn.freepascal.org/svn/svn/trunk fpc<br />
Nota : Pour télécharger/mettre à jour les derniers changements faire seulement :<br />
C:\> cd Source\FPC<br />
C:\Source\FPC> svn up<br />
<br />
<br />
Voir: http://www.freepascal.org/down-win32.html . Vous avez une liste des sites mirroirs à : http://www.freepascal.org/sdown.html. Téléchargez FPC (un seul gros fichier), dézippez le et lancez l'install.exe. <br />
<br />
Ajouter le répertoire de FPC à votre variable PATH:<br />
<br />
* Win98: Editez autoexec.bat et ajouter la ligne : PATH=%PATH%;C:\pp\bin\bin\win32<br />
* WinXP/2k: Poste de travail(Click droit) -> Propriétés -> Advancé (Page) -> Variables d'environnement-> Variables système-> Modifier "PATH", ajouter "C:\pp\bin\bin\win32" .<br />
<br />
Redémarrer windows.<br />
<br />
''ToDo: Expliquer comment télécharger les sources et construire le compilateur''<br />
<br />
=== Installer Free Pascal sous FreeBSD automatiquement ===<br />
<br />
La dernière FreeBSD ports collection à la version stable 2.0.4 dans ports/lang/fpc2.<br />
Tout ce qu'il y a à faire c'est d'installer le port. <br />
<br />
Cela peut être fait à la main en étant root.<br />
<br />
[]# cd /usr/ports/lang/fpc2 && make install && make clean<br />
<br />
Une autre possibilité est d'utiliser portinstall.<br />
<br />
[]# portinstall fpc2<br />
<br />
Un fois fpc installé, pour tester le fonctionnement il suffit de lancer : <br />
<br />
[]$ fpc<br />
<br />
=== Installer Free Pascal sous BSD/manuellement ===<br />
<br />
Opérationnellement, vous avez besoin d'un fichier avec toutes les sources, ou de deux (fpc et lazarus)<br />
<br />
1. Par exemple pour fpc ftp://ftp.freepascal.org/fpc/dist/Linux/separate/sources.tar de préférence une exportation (pas de CVS/ répertoires). Le fichier ci-dessus manque ça.<br />
<br />
2. Source instantanée de Lazarus.<br />
* n'importe quel compilateur qui démarre à partir de la branche 2.0.2 . Vous pouvez faire un contrôle en analysant la sortie de ppc386 -i ;Si c'est la version 2.0.2 .. 2.1.x c'est ok.<br />
* paquets dépendants . (pour FreeBSD c'est gtk12, glib12 et gdk_pixbuf et GNU make, iconv et gettext)<br />
<br />
Construction de FPC:<br />
<br />
1. (chercher ) les fichier nécessaires(sources FPC, compilateur de départ)<br />
<br />
2. (extraire ) ensuite de-tgz dans le répertoire de travail,<br />
<br />
3. (construire ) entrer dans le répertoire work/fpc/ et executer<br />
<br />
$MAKE all OPT='-gl' PP=/path/to/startingcompiler-name-ppc386<br />
(/path/to/ peut être omis quand ppc386 est dans le path)<br />
($MAKE est make sous linux et gmake sous BSD)<br />
<br />
4. (installer ) ensuite, à nouveau dans le répertoire work/fpc, executer<br />
<br />
$MAKE install PP=compiler/ppc386 PREFIX=$THEPREFIX<br />
(THEPREFIX= usuellement est /usr/local, mais par exemple sous NetBSD c'est /usr/pkg for ports)<br />
Create a symlink:<br />
ln -s $THEPREFIX/lib/fpc/2.0.2/ppc386 $THEPREFIX/bin/ppc386<br />
install sourceinstall PREFIX=$THEPREFIX<br />
<br />
5. (configurer ) executer compiler/utils/samplecfg $THEPREFIX/lib/fpc/2.0.1 $ETCDIR<br />
<br />
6. (facultatif , test), voir si ppc386 -i donne une sortie, sinon donner un avertissement que l'utilisateur doit ajouter $PREFIX/bin à son chemin courant. Essayez de compiler un programme avec -viwn, et voir si cela donne des erreurs .<br />
Notes:<br />
<br />
* Si vous avez besoin de listes de paquet fpcmake, vous devez les produire ou les fournir vous-même, (dans le portage, ou dans une archive supplémentaire) de l'une ou l'autre manière, faire un simulacre d'installation vers /tmp/pack et déterminez les fichiers installés avec find . >ll<br />
<br />
* $THEPREFIX et $ETCDIR devrait être configurable par l'utilisateur. Autrement les installations en local ne sont pas possibles.<br />
<br />
* BSDHIER=1 sur toutes les commandes make force conventions de hiérarchie BDS.<br />
<br />
=== Installation de Free Pascal sous Mac OS X ===<br />
<br />
Vous avez besoin également des outils de développement d'Apple ("Developper Tools"):<br />
<br />
Outils de développement: sont inclus sur le DVD d'installation original de MacOS X, ou télécharger à l'adresse d'ADC (enregistrement libre requis ): http://developer.apple.com/.<br />
DVD MacOS X Tiger(10.4): "/Mac OS X Install Disc 1/Xcode Tools/XcodeTools.mpkg"<br />
DVD MacOS X Leopard(10.5): "/Mac OS X Install DVD/Installations facultatives/Xcode Tools/XcodeTools.mpkg"<br />
<br />
<br />
;Free Pascal Compiler:<br />
Ensuite télécharger et installer le compilateur Free Pascal à partir de l'adresse:<br />
: https://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Pour Lazarus vous avez aussi besoin des sources de FPC :<br />
Télécharger et installer les sources Free Pascal (fpcsrc) à partir de l'adresse:<br />
: https://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Ce qui suit est optionnel...<br />
<br />
*Installer SVN pour MacOS X: Un bon paquet est fourni par [http://www.codingmonkeys.de/mbo/ Martin Ott].<br />
<br />
Créer un répertoire, là où vous voudriez mettre les sources. Vous n'avez pas besoin d'être root pour faire ceci . N'importe quel utilisateur normal peut faire ceci . <br />
Créer d'abord un répertoire for fpc <br />
: (Par exemple /Users/username/freepascal) <br />
ouvrir alors un terminal et faire ce qui suit :<br />
[]$ svn co http://svn.freepascal.org/svn/svn/trunk fpc<br />
Ceci créera un répertoire appelé 'fpc', qui pourra être utilisé plus tard dans l'IDE.<br />
Conseil : Pour télécharger/mettre à jour les derniers changements vous pouvez simplement faire <br />
[]$ cd /Users/username/freepascal/fpc<br />
[]$ svn up<br />
<br />
== Installer Lazarus ==<br />
<br />
=== Installer Lazarus pour Linux ===<br />
==== Ubuntu / Debian ====<br />
<br />
La meilleure façon d'obtenir une installation fonctionnelle courante de Lazarus est de télécharger les fichiers .deb pour FreePascal et Lazarus à partir du dépôt du site sourceforge.<br />
<br />
Il y a trois paquets<br />
* Le compilateur pascal (eg : fpc_2.6.4-150228_i386.deb)<br />
* Le code source du compilateur ( eg: fpc-src_2.6.4-150228_i386.deb)<br />
* Le code de Lazarus (eg : lazarus_1.4.0-0_i386.deb)<br />
<br />
Déplacez-vous dans le dossier ou sont déposés les paquets et assurez-vous que seuls les paquets nécessaires s'y trouvent. Selon la version de linux il est nécessaire d'installer la libgtk2. <br />
<br />
Executez les commandes suivantes<br />
<syntaxhighlight lang="bash"><br />
cd Téléchargements<br />
sudo apt-get install libgtk2.0-dev<br />
sudo dpkg -i *.deb<br />
</syntaxhighlight><br />
L'instalation est terminée. Recherchez Lazarus avec l'outils de recherche et glissez l'icone dans la barre du lanceur.<br />
<br />
Il est nécessaire de mettre à jour les dépôts sinon il y aura des conflits avec les mises à jour.<br />
Pour cela télécharger la clef public du serveur puis ajoutez-la au système apt.<br />
<syntaxhighlight lang="bash"><br />
gpg --keyserver hkp://pgp.mit.edu:11371 --recv-keys 6A11800F<br />
gpg --export 6A11800F | sudo apt-key add -<br />
</syntaxhighlight><br />
<br />
Ensuite ajoutez les dépôts avec Synaptic ou en éditant le fichier /etc/apt/sources.list. Ajouter les indications suivantes :<br />
<syntaxhighlight lang="bash"><br />
deb http://www.hu.freepascal.org/lazarus/ lazarus-stable universe<br />
deb http://www.hu.freepascal.org/lazarus/ lazarus-testing universe<br />
</syntaxhighlight><br />
<br />
<br />
<br />
Expérimental : [[How to setup a FPC and Lazarus Ubuntu repository/fr|Comment paramétrer un dépôt avec FPC et Lazarus pour Ubuntu]]<br />
<br />
==== Installation utilisant les rpms ====<br />
La meilleure façon pour avoir une installation efficace de Lazarus c'est de télécharger les rpms pour FreePascal et Lazarus à partir du SourceForge repository.<br />
<br />
Vous devez télécharger les versions :<br />
* du compilateur (eg fpc-1.9.5-041207.i386.rpm)<br />
* des sources de la bibliothèque (eg fpcsrc-1.9.5-041207.i386.rpm)<br />
* de Lazarus (eg lazarus-0.9.2.4-fpc_1.9.5_041207.i386.rpm).<br />
<br />
Vous exécuter ensuite les commandes suivantes (vous devez avoir les droit d'administrateur - use su or sudo)<br />
rpm -Uvh fpc-1.9.5-041207.i386.rpm<br />
rpm -Uvh fpcsrc-1.9.5-041207.i386.rpm<br />
rpm -Uvh lazarus-0.9.2.4-fpc_1.9.5_041207.i386.rpm<br />
<br />
'''Installing Lazarus 0.9.16. For Suse 10.1 users:'''<br><br />
<br />
Demarrer Linux et se logger en "Root"<br><br><br />
Free Pascal Compiler nécessite:<br><br />
- Gnu binutils (gnu as, gnu ld, gnu make) - check it out with "YAST"<br />
<br />
Télécharger les fichiers binaires suivants (RPM)<br />
:* fpc-2.0.2-0.i586.rpm (oui i586 et pas i386)<br />
:* fpcsrc-2.0.2-0.i386.rpm<br />
<br />
install them opening a terminal session (mouse's rigth button -> Menu: Open in terminal)<br />
:* rpm -Uvh fpc-2.0.2-0.i586.rpm<br />
:* rpm -Uvh fpcsrc-2.0.2-0.i386.rpm<br />
<br />
Lazarus demande ces composants:<br />
1) glib devel<br />
2) gtk devel<br />
3) gdk-pixbuf-devel<br />
4) gtk+-devel.<br><br />
Il semble que le dernier ne fonctionne pas avec Suse, mais une fois les trois premiers installé il est possible de forcer l'installation avec l'option -nodeps :<br />
:*rpm -Uvh --nodeps lazarus-0.9.16-1.i386.rpm<br />
<br />
==== Installation à partir des fichiers source ====<br />
Si vous préférez faire l'installation à partir des sources et compiler les fichiers vous-même,suivre ces instructions . Puisque toute l'ensemble lazarus est installé sur un répertoire, la désinstallation est très facile et vous n'avez pas d'être root pour installer Lazarus. Vous pouvez obtenir les fichiers tgz pour fpc, fpcsrc et lazarus à partir de la section de téléchargements ou vous pouvez le télécharger via svn.<br />
<br />
===== Téléchargement de Lazarus via SVN =====<br />
<br />
Le dépot lazarus s'est déplacé de cvs à svn (Subversion). SVN fournit une manière facile pour mettre à jour vos sources en téléchargeant seulement les changements . C'est la manière recommandée et vous permet de sauver beaucoup de temps. Un raccordement à l'Internet est nécessaire pour cela: vous n'avez pas besoin d'être root. Lazarus n'a besoin d'aucune permission spéciale, ni pendant l'installation ni pendant exécution .<br />
<br />
Avec le déplacement nous avons également changé la disposition du répertoire des sources lazarus. La différence principale <br />
est que toutes les sources de l'ide sont déplacés de la racine vers un sous-répertoire séparé de l'ide. Comme quiconque pourrait le comprendre, ceci a un impact sur les Makefiles, les chemins de recherche etc. Nous sommes en marche pour réparer les choses, ainsi si quelque chose ne fonctionne pas , svp faire nous le savoir.<br />
<br />
;Maintenant la chose la plus importante .... obtenir les sources :<br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/lazarus/trunk/ lazarus<br />
(ou tout autre répertoire là où vous voulez placer vos sources )<br />
<br />
Aux occasions suivantes , pour mettre à jour taper simplement au clavier <br />
<br />
[]$ svn update lazarus<br />
<br />
Pour plus d'informations sur Subversion, voir :<br />
http://subversion.tigris.org/<br />
<br />
Note: CVS est encore accessible, mais est figé. Ceci signifie <br />
qu'aucune nouvelle mise à jour n'est commise .<br />
<br />
===== Compilation et execution =====<br />
que vous ayez checkout a partir de cvs ou de svn, la prochaine étape est : <br />
<br />
;compile lazarus:<br />
[]$ cd lazarus<br />
[]$ make (gmake on BSD)<br />
<br />
<br />
Si fpc est installé correctement , la compilation devrait fonctionner sans problèmes . Sinon , voir FAQ.<br />
<br />
;Start lazarus<br />
[]$ ./lazarus<br />
<br />
L'IDE devrait démarrer.Si vous avez démarré lazarus dans un terminal, vous pouvez voir quelques notes au sujet des paramètres manquants. C'est normal au premier démarrage. L'IDE essaye automatiquement de découvrir où le compilateur freepascal et ses sources sont installés par la recherche dans les répertoires les plus communs .<br />
<br />
;Vérifier les chemins :<br />
: Employer le menu de l'ide pour aller à <br />
:: Configuration -> Options d'environment Options... -> Fichiers<br />
<br />
Le 'répertoire source de FPC' devrait pointer vers le répertoire source de fpc . Ce répertoire se termine normallement avec /fpc/ ou /fpcsrc/ (Par exemple /usr/src/fpcsrc ou /home/username/freepascal/fpc) et contient des répertoire comme 'compiler', 'docs', 'fcl', 'rtl' et 'packages'.<br />
<br />
''ToDo: expliquer les autres chemins ''<br />
<br />
;Conseil :<br />
Pour mettre à jour lazarus vous pouvez employer <br />
[]$ svn update lazarus<br />
then for either update pathway:<br />
[]$ make clean all (gmake sur BSD)<br />
Ceci reconstruira lazarus et créer un IDE sans paquet lazarus. Pour lier vos paquets installés faire '''après''' ce qui précède :<br />
[]$ ./lazbuild --build-ide=<br />
Il se peut que vous deviez ajouter d'autres options si par exemple vous lancer lazarus avec un répertoire de configuration personnalisé (ex : ajoutez --pcp="C:\Documents and Settings\<USER>\Local Settings\Application Data\lazarus-tests")<br />
<br />
==== Installation de Lazarus sous Debian GNU/Linux ====<br />
<br />
Il y a des paquets préliminaires de Debian pour lazarus disponible pour le téléchargement. Ce ne sont pas les dernières versions, cependant. Assurez-vous d'avoir lu /usr/share/doc/lazarus/README.Debian soigneusement avant de commencer à l'employer. Un Feedback est nécessaire et apprécié; veuillez envoyer vos commentaires à Carlos Laviola <claviola@debian.org>.<br />
<br />
Notez que pour une installation de Lazarus fonctionnant entièrement, des versions pas plus anciennes ou incompatibles , par exemple, des sources fpc ou du compilateur fpc doivent être installées. Les enlever par la tapant au clavier <br />
<br />
dpkg -r <package name> <br />
<br />
sans l'extension .deb. Et installer alors les nouvelles versions comme décrit .<br />
<br />
==== Une autre manière pour installer Lazarus sous Debian ====<br />
Ajouté par [[User:Kirkpatc]].<br />
<br />
;Installation simple de Lazarus dans Debian<br />
(supposons ube nouvelle installation Debian, sans bibliothèques de développement chargées)<br />
<br />
A partir du dépot sourceforge, télécharger les dernieres réalisations fpc, fpclib et lazarus ; suivre les liens de http://lazarus.freepascal.org, cliquer sur le boutton "downloads" du côté gauche , puis cliquer sur "binaries" puis "linux" puis "Current Lazarus RPM". Ceci vous amènera à <br />
: http://sourceforge.net/project/showfiles.php?group_id=89339<br />
télécharger alors les fichiers suivants (ou plus récent , si disponible )<br />
* fpc-2.0.0-0.i586.rpm<br />
* fpcsrc-2.0.0-0.i386.rpm<br />
* lazarus-0.9.8-fpc_2.0.0_0.i386.rpm<br />
cd vers le répertoire où ces fichiers sont stockés,alors devenez root (su) et tapez au clavier:<br />
<br />
alien -c fpc* //ceci convertira les deux fichiers fpc et fpcsrc files au format debian et convertira les scripts d'installation<br />
alien -c laz*<br />
installer alors les paquet Debian (.deb) générés par (en tant que root):<br />
<br />
dpkg -i fpc*.deb laz*.deb<br />
ou utilisez kpackage ou un utilitaire semblable pour installer les fichiers fpc, fpcsrc et lazarus .deb générés.<br />
<br />
Et si vous n'avez pas l'alien taper au clavier:<br />
<br />
apt-get install alien <br />
<br />
SVP notez que, sur les distributions Linux comme Ubuntu, vous devrez ajouter 'sudo' devant toutes les commandes . Dans Ubuntu la commande précédente serait <br />
<br />
sudo apt-get install alien<br />
<br />
Vous devez produire un fichier de configuration, qui résidera dans /etc/fpc.cfg. Toujours en tant que root, cd vers le répertoire principal de fpc /usr/lib/fpc/2.0.0 et ensuite taper au clavier<br />
sh ./samplecfg /usr/lib/fpc/2.0.0 /etc<br />
Vérifier le contenu de votre nouveau fichier de configuration (cat /etc/fpc.cfg) et faire tous les changements que vous voulez en utilisant vi ou un autre éditeur de texte . S'assurer en outre qu'il n'y a de vieux fichiers de configurationdans par exemple votre répertoire d'accueil (~/.fpc.cfg).<br />
<br />
Vous devez installer les paquets de développement de GTK et les bibliothèques pixbuf, ainsi <br />
apt-get install libgtk2.0-dev<br />
apt-get install libgdk-pixbuf-dev<br />
Alors vous devriez être prêt pour commencer à programmer !<br />
<br />
=== Installer Lazarus sous Windows ===<br />
<br />
La release actuelle de Lazarus pour windows sous forme binaire est très facile à installer et doit fonctionner sans soucis.<br />
<br />
Il est aussi possible d'installer l'ensemble Lazarus/FPC sur un disque USB (Il faut au minimum 256 MB de disponibles), pour travailler dans les cas où vous ne pouvez pas installer de logiciels sur la machine ou des le cas ou vous n'avez pas les droits de niveau administrateur. Il faut soignement régler les chemins pour le compilateur, dans les options d'environnement ainsi que dans le fichier fpc.cfg. Il peut également être nécessaire de mettre vos répertoires de compilation et de tests sur le disque amovible.<br />
Question : <br />
Comment paramétrer des chemins relatifs dans ces fichiers de configuration pour l'adressage continue à focntionner lorsque l'on change le disque USB de machine et qu'il est reconnu sous une autre lettre ?<br />
<br />
<br />
Les fichiers binaires sont disponible pour Linux et Windows à : <br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Télécharger la dernière mise à jour and lancer l'application. C'est une installation classique de Windows qui va mettre le compilateur FPC et les sources des bibliothèques dans une structure de répertoires commune avec Lazarus et l'IDE doit se lancer et fonctionner sans problèmes particuliers, en partant du principe que vous aurez au préalable désintallé toutes les éventuelles versions précédentes de Lazarus et/ou FPC (souvent on le trouve dans le répertoire c:\pp).<br />
<br />
Vous pouvez aussi trouver les dernieres mises à jour de Lazarus pour Windows a: http://www.de.freepascal.org/lazarus/<br />
<br />
==== Installation à partir des sources ====<br />
Si vous préferrer faire l'installation à partir des codes source, alors suivez les instructions suivantes.<br />
(Thanks to Joe for the initial Step-by-step description)<br />
<br />
Il faut télécharger les sources de lazarus :<br />
http://www.de.freepascal.org/lazarus/<br />
<br />
Ensuite dézipper dans c:\lazarus par exemple. Vous devez installer au minimum fpc-2.0.2, mais fpc-2.0.3 voir fpc 2.1.1 snapshot est aussi possible. Compiler Lazarus et lazarus.exe fonctionne. Le chemin pour fpc est : c:\pp\bin\win32. Dans le même répertoire, il y a d'autres exe (make, grep, ppc386...).<br />
<br />
Ouvrir une session DOS : Démarrer -> Executer...>command ou lancer par l'icône MS-DOS<br />
<br />
Taper:<br />
cd c:\lazarus<br />
set path=c:\pp\bin\win32;c:\lazarus //Bien sur donnez le bon chemin !<br />
<br />
windres -i lazarus.rc -o lazarus.res<br />
make<br />
<br />
Si vous avez de la chance, vous pouvez taper : lazarus.exe. L'IDE, les dialogues et l'éditeur de propriétés doivent marchoter ! Essayez par vous même.<br />
<br />
Vous pouvez aussi compiler les exemples :<br />
<br />
cd examples<br />
make<br />
<br />
Si vous décompressez lazarus dans un autre disque : d:\lazarus par exemple, il est possible que vous ayez besoin de l'utilitaire gnu pour le make. Si vous l'avez, vous devez paramétrer son path=...;<gmakepath> mais il est plus simple de ne pas choisir le disque d:\<br />
<br />
C'est tout.<br />
<br />
=== Installation de Lazarus sous FreeBSD ===<br />
<br />
'''FreeBSD 5+'''<br />
<br />
La dernière version portée de Lazarus dans FreeBSD est 0.9.20. Nous pouvons installer lazarus en utilisant le portage à FreeBSD.<br />
<br />
[]# cd /usr/ports/editors/lazarus && make install clean clean-depends<br />
<br />
Si vous obtenez des messages à propos de fichiers source manquants, allez dans [menu bar >> Environment >> Environment Options >> Files Tab: FPC source library] et entrez le dossier des fichirs sources de FPC. Il peut être obtenu depuis /usr/ports/distfiles/freepascal<br />
<br />
Bonne chance, cela a fonctionné pour moi. --[[User:Jrmarino|Jrmarino]] 21:29, 4 Jan 2006 (CET)<br />
<br />
=== Installer Lazarus sous PC-BSD 1.0rc1+ ===<br />
<br />
Vous pouvez installer Lazarus sous PB-BSD simplement en téléchargeant le PBI de Lazarus depuis [http://www.pbidir.com/PBI Dir]<br />
<br />
Notez que vous devez installer le portage de glib* depuis /usr/port/devel/glib* ou les packages glib avec pkg_add -r glib12 glib20.<br />
Cela sera résolu dans les nouvelles versions de PBI.<br />
<br />
'''[other OpenBSD/NetBSD/DragonFlyBSD goes here]'''<br />
<br />
=== Installer Lazarus sous Mac OS X ===<br />
<br />
<br />
1. Installez les Outils de Développement d'Apple si ce n'est fait:<br />
<br />
DVD MacOS X Tiger(10.4): "/Mac OS X Install Disc 1/Xcode Tools/XcodeTools.mpkg" <br />
<br />
DVD MacOS X Leopard(10.5): "/Mac OS X Install DVD/Installations facultatives/Xcode Tools/XcodeTools.mpkg"<br />
<br />
2. Téléchargez les 3 fichiers *.dmg (fpc, fpcsrc, lazarus) correspondant à votre processeur (versions: fpc 2.2.x, fpcsrc 2.2.x, lazarus 0.9.26.x au moins) ici:<br />
<br />
http://sourceforge.net/projects/lazarus/files/<br />
<br />
3. A partir des fichiers *.dmg téléchargés, installez dans l'ordre:<br />
<br />
Fpc<br />
<br />
Fpcsrc<br />
<br />
Lazarus<br />
<br />
<br />
<br />
Lazarus est maintenant installé dans le dossier:<br />
<br />
Disque dur ("MacintoshHD")/Developer/lazarus/<br />
<br />
=== Expériences additionnelles et conseil pour l'installation de FPC et Lazarus ===<br />
<br />
Faire fonctionner Lazarus sous Linux peut être compliqué. Si vous avez déjà installé une version plus ancienne de FPC et/ou Lazarus, vous devez faire très attention à ce que les PATHS soient ajustés pour que seules vos nouvelles versions soient appelées.<br />
<br />
Les pièges que j'ai connu lors de diverses tentatives avec SuSE Linux incluent:<br />
<br />
La version rpm installe souvent FPC dans /bin ou /usr/bin, avec les bibliothèques dans /lib ou /usr/lib.<br />
<br />
Si vous faites un make install sur une version source ou utilisez un .tar.gz, le compilateur est habituellement installé dans /usr/local/bin avec les bibliothèques dans /usr/local/lib.<br />
<br />
Donc si des versions plus anciennes on été installées depuis un rpm, assurez-vous que tous els liens ont été changés pour refléter la nouvelle structure de dossiers du nouveau compilateur. 'emplacement pour faire les modifications est dans /etc/fpc.cfg ; assurez-vous qu'il n'y ait pas de fichier de configuration rémanant dans votre dossier home ou votre dossier de téléchargement de FPC. Typiquement, ils se trouvent dans ~/.fpc.cfg<br />
<br />
Assurez-vous que les liens dans /etc/fpc.cfg pointent vers les versions correctes des bibliothèques (particulièrement si vous avez d'anciennent versions qui trainent dans le coin).<br />
<br />
Dans /usr/local/bin ou /usr/bin se trouve un fichier nommé fpc ; c'est l'exécutable qui est appelé lorsque vous invoquez le compilateur. Une des premières choses qu'il fait est d'ouvrir ppc386 dans le même dossier. Il doit être de la même version que le fichier fpc, ou il peut être un lien pointant vers le vrai ppp386 dans un autre dossier (comme un dossier de bibliothèque, ou le dossier de fpc dans votre propre espace de développement); assuez-vous de mettre à jour votre lien si vous installez une nouvelle version du compilateur.<br />
<br />
Essayez de lancer le compilateur depuis la ligne de commande en utilisant un des exemples de programmes simples ou un que vous avez écrit vous même.<br />
<br />
Concernant Lazarus:<br />
<br />
Si vous utilisez une version snapshot (.tar.gz) ou si vous obtenez la source depuis le CVS, allez dans votre dossier de Lazarus et entrez<br />
<br />
make<br />
./lazarus <br />
<br />
et heureusement l'IDE devrait se charger. Il se peut qu'il y ait un message disant qu'il ne peut trouver les sources; si c'est le cas, allez dans le menu en haut et sélectionnez Environnement -> Options d'Environnement et insérez le nom du dossier où sont situées vos fichiers de Lazarus (par ex: ~/FreePascal/lazarus), votre compilateur (par ex: /usr/local/bin/ppc386), le dossier des sources de FreePascal (par ex: /usr/local/lib/fpc/$version/fpc ou un dossier dans votre propre espace par ex: ~/FreePascal/fpc). Puis fermez le dialogue et commencez à programmer.<br />
<br />
Vous pouvez rencontrer d'autres problèmes quand vous commencerez à programmer ou à compiler; la plupart d'entre eux concernent la sélection du PATH.<br />
<br />
Beaucoup des difficultés sont traitées dans la FAQ de Lazarus, trouvées sur le site du WiKi, ou une liste plus complète sur le site principale de Lazarus<br />
<br />
http://www.lazarus.freepascal.org/modules.php?op=modload&name=FAQ&file=index<br />
<br />
Dans le menu du haut sélectionnez Lancer -> Options du Compilateur (ou Projet -> Options du Compilateur dans les versions plus récentes de Lazarus) et sélectionnez l'onglet des chemins dans le dialogue qui s'affiche. Il y a plusieurs boîtes pour les entrées de dossier des chemins pour les fichiers Units, Include, Autres fichiers source, Bibliothèques, etc. Pour chacune d'elles, pressez le bouton ... (ellipsis) à leur droite, vous obtiendrez une fenêtre vierge pour insérer les informations de chemin, et une fenêtre en bas donnant quelques suggestions. Sélectionnez-en autant que vous voulez (ou TOUS!) et pressez le bouton AJOUTER pour transférer les sélections dans la fenêtre située au dessus. Quand vous avez fini votre sélection, pressez OK et déplacez vous sur la boîte suivante. Si vous savez quels sont les autres dossiers qui doivent être suivis,pressez le bouton Parcourir associé à chaque boîte, et insérez les dossiers additionnels.<br />
<br />
Quand vous pensez que vos chemins sont les bons, essayez de compiler votre application. S'il reste des erreurs relatives aux chemins ('ne peut trouver l'unité .......') retournez en arrière et vérifiez vos chemins, à la fois dans /etc/fpc.cfg et dans votre dialogue Lancer -> Options du Compilateur (ou Projet -> Options du Compilateur selon votre version).<br />
<br />
Une fois que votre environnement et votre PATH sont corrects, il serait bien de conserver votre configuration dans un fichier, sinon vous devrez refaire la même chose pour chaque nouveau projet.<br />
Dans la boîte de dialogue Lancer -> Options du Compilateur se trouve un bouton Charger/Sauver; sélectionez le et sauvegardez la configuration dans le fichier du nom de votre choix: le mien est ~/FreePascal/default.cfg. Chaque fois que je démarre un nouveau projet, Je peux aller dans le dialogue Lancer -> Options du Compilateur (ou Projet -> Options du Compilateur), sélectionner Charger/Sauver, et charger mon fichier default.cfg pour le nouveau projet. Vous pouvez bien sûr modifier les options pour chaque nouveau projet si tel est votre désir.<br />
<br />
== Contributeurs d'origine et changements ==<br />
Cette page a été convertie à partir de epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=InstallingLazarus version].<br />
* Initially imported and formatted. [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Changed Joe's part for Windows to require fpc 1.0.10. [[User:Vincent | Vincent]] 9/25/2003<br />
* Updated "What is required for lazarus". AndrewJohnson 10/1/2003<br />
* Finished formatted the InstallingLazarus page [[User:Tom | VlxAdmin]] 2/22/2004<br />
* Posted some notes about Installing FPC and Lazarus: mostly reflecting experiences in trying to get the PATHS right in Linux. 3/11/2004 [[User:Kirkpatc]]<br />
* Copied the contents of my note into the main InstallingLazarus section, edited it slightly. I don't know how to remove the original note. 3/12/2004 [[User:Kirkpatc]]<br />
* Removed the original note. Tidied the wiki and formatting a bit. [[User:Tom | VlxAdmin]]<br />
* Corrected a couple of typos - 3/12/2004 [[User:Kirkpatc]]<br />
* Added link for daily snapshot deb packages - 3/27/2004 [[User:Vincent | Vincent]]<br />
* Fixed links in GettingLazarus (downloading binaries) and several other pages. 22 July 2004 [[User:Kirkpatc]]<br />
* Added link for lazarus deb packages - 19 August 2004 VincentSnijders<br />
* Added a short note on installing in Debian - 23 Nov 2004 [[User:Kirkpatc]]<br />
* Considerable re-write and re-organization of installation section - 11 Dec 2004 [[User:Kirkpatc]]<br />
* Fixed broken link - 9 Oct 2005 [[User:Avantman42]]<br />
* Début de traduction de l'anglais vers le français - 16 August 2006 [[User:Bernard | Bernard]]<br />
<br />
<br />
{{AutoCategory}}<br />
[[Category:FPC/fr]]<br />
[[Category:Lazarus/fr]]<br />
[[Category:Install/fr]]</div>Gillou58https://wiki.freepascal.org/index.php?title=Installing_Lazarus/fr&diff=120213Installing Lazarus/fr2018-10-09T07:36:28Z<p>Gillou58: /* Généralités */</p>
<hr />
<div>{{Installing Lazarus}}<br />
<br />
== Généralités ==<br />
<br />
Pour ceux qui veulent seulement installer Lazarus et l'utiliser pour programmer, la meilleure solution est de télécharger et d'installer une version binaire, récente et stable (pour Linux un paquet '.rpm', ou un exécutable d'installation pour Windows '.exe' ou encore un paquet '.dmg' pour Mac OS X). Vous pouvez lire les sections relatives à Linux ou Windows intitulées 'fpc binaries', ou les premiers paragraphes des sections qui traitent de l'installation de Lazarus sous Linux or Windows. La plupart des autres informations peuvent être ignorées sans risque.<br />
<br />
Pour ceux qui veulent participer au développement du compilateur ou de l'IDE, ou ceux qui veulent les outils les plus récents, une installation à partir des fichiers sources est nécessaire, et la plupart des informations de ce document sont importantes.<br />
<br />
Lazarus a deux composantes : <br />
* LCL - la bibliothèque de composants (Lazarus Component Library)<br />
* IDE - l'interface de développement (RAD tool) <br />
<br />
Les deux utilisent :<br />
* FPC - le compilateur FreePascal <br />
* FCL -la bibliothèque de composants de FreePascal, qui contient l'essentiel des composants ou objets non visuels utilisés par Lazarus.<br />
<br />
=== Ce dont a besoin Lazarus pour fonctionner ===<br />
<br />
# Le compilateur FreePascal, ses paquets et ses sources. (*important*: ils doivent être de la même version et date)<br />
# Des interfaces adaptées :<br />
#:;Win32 : L'API Win32 peut être utilisée <br />
#:;Linux/xxxBSD : GTK+ 1.2.x : Attention : cette interface n'est plus prise en charge ! Vous pouvez aussi les trouver à : http://www.gtk.org. <br> Si vous voulez la gdk-pixbuf, 0.13 ou plus récente (de préférence 0.18 ou plus), elle est également incluse dans les distributions les plus récentes depuis plusieurs années. Le code source est disponible à : ftp://ftp.gnome.org/pub/GNOME/sources/gdk-pixbuf/<br />
#:;Mac OS X : Vous avez besoin des Developer tools d'Apple (ceux-ci se trouvent sur le DVD d'installation de MacOS X fourni avec votre ordinateur). Voir l'installation pour Mac OS X plus loin. <br />
#:;GTK+ 2.x : Elle est dans les distributions les plus récentes. Pour le code source voir : http://www.gtk.org.<br />
<br />
La FAQ – Le fichier de la Foire Aux Questions est sur : http://www.lazarus.freepascal.org . Certaines questions sont dans le fichier local : 'FAQ'. <br />
<br />
Les paragraphes suivants décrivent comment se procurer FreePascal et comment installer Lazarus correctement.<br />
<br />
== Installer le Compilateur Free Pascal ==<br />
<br />
L'installation et la construction du compilateur Free Pascal fait l'objet d'une discussion très ouverte sur http://www.stack.nl/~marcov/buildfaq.pdf – C'est peut être un peu trop détaillé pour certains utilisateurs, mais cela reste toujours très compréhensible. <br />
<br />
Lazarus a besoin de fpc (FreePascal) version 2.0.2 ou plus, ainsi que des bibliothèques compilées fpc libs (binaires) et des code source fpc, le tout dans les mêmes versions. <br />
<br />
=== Installer Free Pascal sous Linux ===<br />
<br />
==== FPC Binaries ====<br />
<br />
La dernière version de FreePascal, actuellement la version 2.0.2, peut être téléchargée sur le site de FreePascal (http://www.freepascal.org/download.html, puis choisir un miroir) ou a partir de sourceforge (http://sourceforge.net/projects/lazarus). <br />
<br />
A la partie téléchargement de lazarus (http://www.lazarus.freepascal.org ) vous avez les RPM du compilateur Free Pascal (compiler / linux) ainsi que ses 'packages'. Si vous n'avez pas une distribution basée sur les RPM, vous pouvez télécharger et installer les 'tarballs' (je ne connais rien en Linux désolé) à partir de http://www.freepascal.org. Si vous souhaitez compiler votre version vous même, consultez la section BSD.<br />
<br />
Instructions: <br />
<br />
ATTENTION: Si vous n'utilisez pas les RPMs (même si vous prévoyez d'utiliser alien) le mieux est de télécharger la denière version stable fpc (2.0.2 actuellement) et d'installer Lazarus à partir du code source.<br><br />
<br />
Démarrer Linux et se logger sous ROOT.<br><br />
<br />
Télécharger les derniers fichers à : http://sourceforge.net/project/showfiles.php?group_id=89339.<br />
Par exemple :<br />
:* fpc-2.0.2-0.i386.rpm<br />
:* fpcsrc-2.0.2-0.i386.rpm<br />
:* lazarus-0.9.14-1.i386.rpm<br><br />
et les installer avec :<br />
:* rpm -Uvh fpc-2.0.2-0.i386.rpm<br />
:* rpm -Uvh fpcsrc-2.0.2-0.i386.rpm<br />
:* rpm -Uvh lazarus-0.9.14-1.i386.rpm<br><br />
<br />
Les utilisateurs de Debian doivent ressortir leur alien (attention, il ne génére pas fpc.cfg) ou les tarball install.<br />
<br />
==== Sources FPC ====<br />
<br />
Depuis la sortie de la version 2.0, FPC a migré vers Subversion (SVN). Actuellement il n'y a pas de mirroir pour les CVS, vous devez donc utiliser SVN pour récupérer les sources FPC.<br />
<br />
===== Télécharger les instantanés journaliers du Development Tree (version 2.1.x) =====<br />
Vous pouvez télécharger les évolutions journalières des codes sources (v 2.1.x) sous forme d'un packet instantané à partir du SVN source repository: ces instantanés sont mis à jour chaque jour, et sont le reflet du source repository. Les fichiers sont conservés sur le site des archives SVN.<br />
La totalité des archives publiques de v2.1.x : [ftp://ftp.freepascal.org/pub/fpc/snapshot/v21/source/fpc.zip fpc.zip] (24 MB)<br />
<br />
===== Télécharger les instantanés journaliers du Release Tree (version 2.0.x) =====<br />
Vous pouvez télécharger journellement les codes sources (v 2.0.x) qui vont intégrer la prochaine release stable sous forme d'un packet instantané à partir du SVN source repository: ces instantanés sont mis à jour chaque jour, et sont le reflet du source repository. Les fichiers sont conservés sur le site des archives SVN.<br />
La totalité des archives publiques de v2.0.x: [ftp://ftp.freepascal.org/pub/fpc/snapshot/v20/source/fpc.zip fpc.zip] (24 MB)<br />
<br />
<br />
===== Connection au Source Repository avec SVN (remplace la section Connection au CVS) =====<br />
Comme alternative aux fichiers zip quotidiens du 'SVN sources', le 'SVN repository' s'est ouvert à tous avec un accès en lecture seule. Ainsi vous pouvez donc accéder directement aux codes source, et vous avez accès à la toute dernière mouture disponible. C'est aussi une méthode qui demande moins de bande passante à partir du moment où vous avez fait le premier téléchargement (checkout in SVN lingo).<br />
<br />
===== Accéder aux derniers développements =====<br />
Comment faire ? <br />
(Il est indispensable d'avoir SVN installé. Mode d'emploi ici : [http://subversion.tigris.org/ here] .)<br />
<br />
Aller dans le répertoire racine de votre espace de développement Ex : <br />
<br />
[]$ cd /home/username/FreePascal<br />
<br />
Pour accéder à tous les fichiers sources et à tous les modules disponibles taper :<br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpc/trunk fpc<br />
<br />
Normalement ceci n'est à faire que la première fois.<br />
<br />
Pour mettre à jour les fichiers chargés avec la méthode ci-dessus(checkout) :<br />
[]$svn update fpc<br />
<br />
===== Les dépannages de la version 2.0.x =====<br />
<br />
Les fix ont besoin d'un répertoire séparé, créer un répertoire séparé 'fixes', entrez le, et répéter la commande de contrôle ci-dessous avec l'URL http://svn.freepascal.org/svn/fpc/branches/fixes_2_0:<br />
<br />
[]$ cd mysvn/fixes<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpc/branches/fixes_2_0 fpc<br />
<br />
et pour mettre à jour :<br />
<br />
[]$ svn update fpc<br />
<br />
Les sources de documents sont dans un dépôt séparé appelé fpcdocs, ainsi la commande pour les obtenir est <br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpcdocs/trunk fpcdocs<br />
<br />
Si vous voulez apprendre plus au sujet de subversion , lire cet excellent [http://svnbook.red-bean.com/ livre sur Subversion] qui est également accessible en ligne dans différents formats libre.<br />
<br />
Pour le curieux : Vous avez seulement un accès lecture seule, ainsi essayer de ne rien commettre :-)<br />
<br />
Pour plus d'information , voir le site [http://www.freepascal.org/develop.html FreePascal]<br />
<br />
=== Installer Free Pascal sous Windows ===<br />
<br />
==== Version binaire de FPC pour Windows ====<br />
<br />
La meilleure façon d'installer correctement Free Pascal est de télécharger la dernière version binaire de Lazarus pour Windows à partir du dépôt SourceForge - vous avez ainsi la dernière version du compilateur FreePascal, ses bibliothèques ainsi que l'IDE Lazarus. Pour ceux qui veulent faire une installation à partir des fichiers source, lire la suite !<br />
<br />
Vous trouverez le zip d'installation de fpc 2.0.2 dans les téléchargements de Free Pascal : http://www.freepascal.org/download.html, ensuite vous choisissez un site mirroir.<br />
Installer à partir des sources -- voir le paragraphe suivant pour savoir comment se les procurer-- ce n'est pas pour les débutants, et à condition d'avoir démarré le compilateur correctement.<br />
<br />
==== Code source de FPC pour Windows ====<br />
<<<< Voir la section [[#Sources FPC|Sources FPC]] pour Linux, où l'utilisation du SVN est décrite>>>><br />
<br />
La méthode la plus simple pour se procurer les codes source du Free Pascal est d'utiliser le SVN; reportez vous au paragraphe suivant pour plus d'informations. Vous pouvez aussi télécharger le packet complet -- http://www.freepascal.org/develop.html pour l'instantané de la journée de l'arbre de réalisation version 2.1.x .<br />
<br />
Sources windows FPC via SVN ()<br />
<br />
Vous avez besoin d'un client SVN par exemple TortoiseSVN installé pour pouvoir suivre les étapes suivantes. Les commandes exactes dépandent des clients SVN utilisés; celles qui sont utilisées ci-dessous sont celles de 'SVN home's client', qui est disponible au téléchargement ici.<br />
<br />
Pour commencer créer un répertoire pour mettre les fichiers source (par exemple C:\Source). N'importe quel utilisateur est capable de faire cela. Créer un répertoire pour fpc (par exemple C:\Source\FPC), ensuite au prompt faire ce qui suit :<br />
C:\Source> svn co http://svn.freepascal.org/svn/svn/trunk fpc<br />
Nota : Pour télécharger/mettre à jour les derniers changements faire seulement :<br />
C:\> cd Source\FPC<br />
C:\Source\FPC> svn up<br />
<br />
<br />
Voir: http://www.freepascal.org/down-win32.html . Vous avez une liste des sites mirroirs à : http://www.freepascal.org/sdown.html. Téléchargez FPC (un seul gros fichier), dézippez le et lancez l'install.exe. <br />
<br />
Ajouter le répertoire de FPC à votre variable PATH:<br />
<br />
* Win98: Editez autoexec.bat et ajouter la ligne : PATH=%PATH%;C:\pp\bin\bin\win32<br />
* WinXP/2k: Poste de travail(Click droit) -> Propriétés -> Advancé (Page) -> Variables d'environnement-> Variables système-> Modifier "PATH", ajouter "C:\pp\bin\bin\win32" .<br />
<br />
Redémarrer windows.<br />
<br />
''ToDo: Expliquer comment télécharger les sources et construire le compilateur''<br />
<br />
=== Installer Free Pascal sous FreeBSD automatiquement ===<br />
<br />
La dernière FreeBSD ports collection à la version stable 2.0.4 dans ports/lang/fpc2.<br />
Tout ce qu'il y a à faire c'est d'installer le port. <br />
<br />
Cela peut être fait à la main en étant root.<br />
<br />
[]# cd /usr/ports/lang/fpc2 && make install && make clean<br />
<br />
Une autre possibilité est d'utiliser portinstall.<br />
<br />
[]# portinstall fpc2<br />
<br />
Un fois fpc installé, pour tester le fonctionnement il suffit de lancer : <br />
<br />
[]$ fpc<br />
<br />
=== Installer Free Pascal sous BSD/manuellement ===<br />
<br />
Opérationnellement, vous avez besoin d'un fichier avec toutes les sources, ou de deux (fpc et lazarus)<br />
<br />
1. Par exemple pour fpc ftp://ftp.freepascal.org/fpc/dist/Linux/separate/sources.tar de préférence une exportation (pas de CVS/ répertoires). Le fichier ci-dessus manque ça.<br />
<br />
2. Source instantanée de Lazarus.<br />
* n'importe quel compilateur qui démarre à partir de la branche 2.0.2 . Vous pouvez faire un contrôle en analysant la sortie de ppc386 -i ;Si c'est la version 2.0.2 .. 2.1.x c'est ok.<br />
* paquets dépendants . (pour FreeBSD c'est gtk12, glib12 et gdk_pixbuf et GNU make, iconv et gettext)<br />
<br />
Construction de FPC:<br />
<br />
1. (chercher ) les fichier nécessaires(sources FPC, compilateur de départ)<br />
<br />
2. (extraire ) ensuite de-tgz dans le répertoire de travail,<br />
<br />
3. (construire ) entrer dans le répertoire work/fpc/ et executer<br />
<br />
$MAKE all OPT='-gl' PP=/path/to/startingcompiler-name-ppc386<br />
(/path/to/ peut être omis quand ppc386 est dans le path)<br />
($MAKE est make sous linux et gmake sous BSD)<br />
<br />
4. (installer ) ensuite, à nouveau dans le répertoire work/fpc, executer<br />
<br />
$MAKE install PP=compiler/ppc386 PREFIX=$THEPREFIX<br />
(THEPREFIX= usuellement est /usr/local, mais par exemple sous NetBSD c'est /usr/pkg for ports)<br />
Create a symlink:<br />
ln -s $THEPREFIX/lib/fpc/2.0.2/ppc386 $THEPREFIX/bin/ppc386<br />
install sourceinstall PREFIX=$THEPREFIX<br />
<br />
5. (configurer ) executer compiler/utils/samplecfg $THEPREFIX/lib/fpc/2.0.1 $ETCDIR<br />
<br />
6. (facultatif , test), voir si ppc386 -i donne une sortie, sinon donner un avertissement que l'utilisateur doit ajouter $PREFIX/bin à son chemin courant. Essayez de compiler un programme avec -viwn, et voir si cela donne des erreurs .<br />
Notes:<br />
<br />
* Si vous avez besoin de listes de paquet fpcmake, vous devez les produire ou les fournir vous-même, (dans le portage, ou dans une archive supplémentaire) de l'une ou l'autre manière, faire un simulacre d'installation vers /tmp/pack et déterminez les fichiers installés avec find . >ll<br />
<br />
* $THEPREFIX et $ETCDIR devrait être configurable par l'utilisateur. Autrement les installations en local ne sont pas possibles.<br />
<br />
* BSDHIER=1 sur toutes les commandes make force conventions de hiérarchie BDS.<br />
<br />
=== Installation de Free Pascal sous Mac OS X ===<br />
<br />
Vous avez besoin également des outils de développement d'Apple ("Developper Tools"):<br />
<br />
Outils de développement: sont inclus sur le DVD d'installation original de MacOS X, ou télécharger à l'adresse d'ADC (enregistrement libre requis ): http://developer.apple.com/.<br />
DVD MacOS X Tiger(10.4): "/Mac OS X Install Disc 1/Xcode Tools/XcodeTools.mpkg"<br />
DVD MacOS X Leopard(10.5): "/Mac OS X Install DVD/Installations facultatives/Xcode Tools/XcodeTools.mpkg"<br />
<br />
<br />
;Free Pascal Compiler:<br />
Ensuite télécharger et installer le compilateur Free Pascal à partir de l'adresse:<br />
: https://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Pour Lazarus vous avez aussi besoin des sources de FPC :<br />
Télécharger et installer les sources Free Pascal (fpcsrc) à partir de l'adresse:<br />
: https://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Ce qui suit est optionnel...<br />
<br />
*Installer SVN pour MacOS X: Un bon paquet est fourni par [http://www.codingmonkeys.de/mbo/ Martin Ott].<br />
<br />
Créer un répertoire, là où vous voudriez mettre les sources. Vous n'avez pas besoin d'être root pour faire ceci . N'importe quel utilisateur normal peut faire ceci . <br />
Créer d'abord un répertoire for fpc <br />
: (Par exemple /Users/username/freepascal) <br />
ouvrir alors un terminal et faire ce qui suit :<br />
[]$ svn co http://svn.freepascal.org/svn/svn/trunk fpc<br />
Ceci créera un répertoire appelé 'fpc', qui pourra être utilisé plus tard dans l'IDE.<br />
Conseil : Pour télécharger/mettre à jour les derniers changements vous pouvez simplement faire <br />
[]$ cd /Users/username/freepascal/fpc<br />
[]$ svn up<br />
<br />
== Installer Lazarus ==<br />
<br />
=== Installer Lazarus pour Linux ===<br />
==== Ubuntu / Debian ====<br />
<br />
La meilleure façon d'obtenir une installation fonctionnelle courante de Lazarus est de télécharger les fichiers .deb pour FreePascal et Lazarus à partir du dépôt du site sourceforge.<br />
<br />
Il y a trois paquets<br />
* Le compilateur pascal (eg : fpc_2.6.4-150228_i386.deb)<br />
* Le code source du compilateur ( eg: fpc-src_2.6.4-150228_i386.deb)<br />
* Le code de Lazarus (eg : lazarus_1.4.0-0_i386.deb)<br />
<br />
Déplacez-vous dans le dossier ou sont déposés les paquets et assurez-vous que seuls les paquets nécessaires s'y trouvent. Selon la version de linux il est nécessaire d'installer la libgtk2. <br />
<br />
Executez les commandes suivantes<br />
<syntaxhighlight lang="bash"><br />
cd Téléchargements<br />
sudo apt-get install libgtk2.0-dev<br />
sudo dpkg -i *.deb<br />
</syntaxhighlight><br />
L'instalation est terminée. Recherchez Lazarus avec l'outils de recherche et glissez l'icone dans la barre du lanceur.<br />
<br />
Il est nécessaire de mettre à jour les dépôts sinon il y aura des conflits avec les mises à jour.<br />
Pour cela télécharger la clef public du serveur puis ajoutez-la au système apt.<br />
<syntaxhighlight lang="bash"><br />
gpg --keyserver hkp://pgp.mit.edu:11371 --recv-keys 6A11800F<br />
gpg --export 6A11800F | sudo apt-key add -<br />
</syntaxhighlight><br />
<br />
Ensuite ajoutez les dépôts avec Synaptic ou en éditant le fichier /etc/apt/sources.list. Ajouter les indications suivantes :<br />
<syntaxhighlight lang="bash"><br />
deb http://www.hu.freepascal.org/lazarus/ lazarus-stable universe<br />
deb http://www.hu.freepascal.org/lazarus/ lazarus-testing universe<br />
</syntaxhighlight><br />
<br />
<br />
<br />
Expérimental : [[How to setup a FPC and Lazarus Ubuntu repository/fr|Comment paramétrer un dépôt avec FPC et Lazarus pour Ubuntu]]<br />
<br />
==== Installation utilisant les rpms ====<br />
La meilleure façon pour avoir une installation efficace de Lazarus c'est de télécharger les rpms pour FreePascal et Lazarus à partir du SourceForge repository.<br />
<br />
Vous devez télécharger les versions :<br />
* du compilateur (eg fpc-1.9.5-041207.i386.rpm)<br />
* des sources de la bibliothèque (eg fpcsrc-1.9.5-041207.i386.rpm)<br />
* de Lazarus (eg lazarus-0.9.2.4-fpc_1.9.5_041207.i386.rpm).<br />
<br />
Vous exécuter ensuite les commandes suivantes (vous devez avoir les droit d'administrateur - use su or sudo)<br />
rpm -Uvh fpc-1.9.5-041207.i386.rpm<br />
rpm -Uvh fpcsrc-1.9.5-041207.i386.rpm<br />
rpm -Uvh lazarus-0.9.2.4-fpc_1.9.5_041207.i386.rpm<br />
<br />
'''Installing Lazarus 0.9.16. For Suse 10.1 users:'''<br><br />
<br />
Demarrer Linux et se logger en "Root"<br><br><br />
Free Pascal Compiler nécessite:<br><br />
- Gnu binutils (gnu as, gnu ld, gnu make) - check it out with "YAST"<br />
<br />
Télécharger les fichiers binaires suivants (RPM)<br />
:* fpc-2.0.2-0.i586.rpm (oui i586 et pas i386)<br />
:* fpcsrc-2.0.2-0.i386.rpm<br />
<br />
install them opening a terminal session (mouse's rigth button -> Menu: Open in terminal)<br />
:* rpm -Uvh fpc-2.0.2-0.i586.rpm<br />
:* rpm -Uvh fpcsrc-2.0.2-0.i386.rpm<br />
<br />
Lazarus demande ces composants:<br />
1) glib devel<br />
2) gtk devel<br />
3) gdk-pixbuf-devel<br />
4) gtk+-devel.<br><br />
Il semble que le dernier ne fonctionne pas avec Suse, mais une fois les trois premiers installé il est possible de forcer l'installation avec l'option -nodeps :<br />
:*rpm -Uvh --nodeps lazarus-0.9.16-1.i386.rpm<br />
<br />
==== Installation à partir des fichiers source ====<br />
Si vous préférez faire l'installation à partir des sources et compiler les fichiers vous-même,suivre ces instructions . Puisque toute l'ensemble lazarus est installé sur un répertoire, la désinstallation est très facile et vous n'avez pas d'être root pour installer Lazarus. Vous pouvez obtenir les fichiers tgz pour fpc, fpcsrc et lazarus à partir de la section de téléchargements ou vous pouvez le télécharger via svn.<br />
<br />
===== Téléchargement de Lazarus via SVN =====<br />
<br />
Le dépot lazarus s'est déplacé de cvs à svn (Subversion). SVN fournit une manière facile pour mettre à jour vos sources en téléchargeant seulement les changements . C'est la manière recommandée et vous permet de sauver beaucoup de temps. Un raccordement à l'Internet est nécessaire pour cela: vous n'avez pas besoin d'être root. Lazarus n'a besoin d'aucune permission spéciale, ni pendant l'installation ni pendant exécution .<br />
<br />
Avec le déplacement nous avons également changé la disposition du répertoire des sources lazarus. La différence principale <br />
est que toutes les sources de l'ide sont déplacés de la racine vers un sous-répertoire séparé de l'ide. Comme quiconque pourrait le comprendre, ceci a un impact sur les Makefiles, les chemins de recherche etc. Nous sommes en marche pour réparer les choses, ainsi si quelque chose ne fonctionne pas , svp faire nous le savoir.<br />
<br />
;Maintenant la chose la plus importante .... obtenir les sources :<br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/lazarus/trunk/ lazarus<br />
(ou tout autre répertoire là où vous voulez placer vos sources )<br />
<br />
Aux occasions suivantes , pour mettre à jour taper simplement au clavier <br />
<br />
[]$ svn update lazarus<br />
<br />
Pour plus d'informations sur Subversion, voir :<br />
http://subversion.tigris.org/<br />
<br />
Note: CVS est encore accessible, mais est figé. Ceci signifie <br />
qu'aucune nouvelle mise à jour n'est commise .<br />
<br />
===== Compilation et execution =====<br />
que vous ayez checkout a partir de cvs ou de svn, la prochaine étape est : <br />
<br />
;compile lazarus:<br />
[]$ cd lazarus<br />
[]$ make (gmake on BSD)<br />
<br />
<br />
Si fpc est installé correctement , la compilation devrait fonctionner sans problèmes . Sinon , voir FAQ.<br />
<br />
;Start lazarus<br />
[]$ ./lazarus<br />
<br />
L'IDE devrait démarrer.Si vous avez démarré lazarus dans un terminal, vous pouvez voir quelques notes au sujet des paramètres manquants. C'est normal au premier démarrage. L'IDE essaye automatiquement de découvrir où le compilateur freepascal et ses sources sont installés par la recherche dans les répertoires les plus communs .<br />
<br />
;Vérifier les chemins :<br />
: Employer le menu de l'ide pour aller à <br />
:: Configuration -> Options d'environment Options... -> Fichiers<br />
<br />
Le 'répertoire source de FPC' devrait pointer vers le répertoire source de fpc . Ce répertoire se termine normallement avec /fpc/ ou /fpcsrc/ (Par exemple /usr/src/fpcsrc ou /home/username/freepascal/fpc) et contient des répertoire comme 'compiler', 'docs', 'fcl', 'rtl' et 'packages'.<br />
<br />
''ToDo: expliquer les autres chemins ''<br />
<br />
;Conseil :<br />
Pour mettre à jour lazarus vous pouvez employer <br />
[]$ svn update lazarus<br />
then for either update pathway:<br />
[]$ make clean all (gmake sur BSD)<br />
Ceci reconstruira lazarus et créer un IDE sans paquet lazarus. Pour lier vos paquets installés faire '''après''' ce qui précède :<br />
[]$ ./lazbuild --build-ide=<br />
Il se peut que vous deviez ajouter d'autres options si par exemple vous lancer lazarus avec un répertoire de configuration personnalisé (ex : ajoutez --pcp="C:\Documents and Settings\<USER>\Local Settings\Application Data\lazarus-tests")<br />
<br />
==== Installation de Lazarus sous Debian GNU/Linux ====<br />
<br />
Il y a des paquets préliminaires de Debian pour lazarus disponible pour le téléchargement. Ce ne sont pas les dernières versions, cependant. Assurez-vous d'avoir lu /usr/share/doc/lazarus/README.Debian soigneusement avant de commencer à l'employer. Un Feedback est nécessaire et apprécié; veuillez envoyer vos commentaires à Carlos Laviola <claviola@debian.org>.<br />
<br />
Notez que pour une installation de Lazarus fonctionnant entièrement, des versions pas plus anciennes ou incompatibles , par exemple, des sources fpc ou du compilateur fpc doivent être installées. Les enlever par la tapant au clavier <br />
<br />
dpkg -r <package name> <br />
<br />
sans l'extension .deb. Et installer alors les nouvelles versions comme décrit .<br />
<br />
==== Une autre manière pour installer Lazarus sous Debian ====<br />
Ajouté par [[User:Kirkpatc]].<br />
<br />
;Installation simple de Lazarus dans Debian<br />
(supposons ube nouvelle installation Debian, sans bibliothèques de développement chargées)<br />
<br />
A partir du dépot sourceforge, télécharger les dernieres réalisations fpc, fpclib et lazarus ; suivre les liens de http://lazarus.freepascal.org, cliquer sur le boutton "downloads" du côté gauche , puis cliquer sur "binaries" puis "linux" puis "Current Lazarus RPM". Ceci vous amènera à <br />
: http://sourceforge.net/project/showfiles.php?group_id=89339<br />
télécharger alors les fichiers suivants (ou plus récent , si disponible )<br />
* fpc-2.0.0-0.i586.rpm<br />
* fpcsrc-2.0.0-0.i386.rpm<br />
* lazarus-0.9.8-fpc_2.0.0_0.i386.rpm<br />
cd vers le répertoire où ces fichiers sont stockés,alors devenez root (su) et tapez au clavier:<br />
<br />
alien -c fpc* //ceci convertira les deux fichiers fpc et fpcsrc files au format debian et convertira les scripts d'installation<br />
alien -c laz*<br />
installer alors les paquet Debian (.deb) générés par (en tant que root):<br />
<br />
dpkg -i fpc*.deb laz*.deb<br />
ou utilisez kpackage ou un utilitaire semblable pour installer les fichiers fpc, fpcsrc et lazarus .deb générés.<br />
<br />
Et si vous n'avez pas l'alien taper au clavier:<br />
<br />
apt-get install alien <br />
<br />
SVP notez que, sur les distributions Linux comme Ubuntu, vous devrez ajouter 'sudo' devant toutes les commandes . Dans Ubuntu la commande précédente serait <br />
<br />
sudo apt-get install alien<br />
<br />
Vous devez produire un fichier de configuration, qui résidera dans /etc/fpc.cfg. Toujours en tant que root, cd vers le répertoire principal de fpc /usr/lib/fpc/2.0.0 et ensuite taper au clavier<br />
sh ./samplecfg /usr/lib/fpc/2.0.0 /etc<br />
Vérifier le contenu de votre nouveau fichier de configuration (cat /etc/fpc.cfg) et faire tous les changements que vous voulez en utilisant vi ou un autre éditeur de texte . S'assurer en outre qu'il n'y a de vieux fichiers de configurationdans par exemple votre répertoire d'accueil (~/.fpc.cfg).<br />
<br />
Vous devez installer les paquets de développement de GTK et les bibliothèques pixbuf, ainsi <br />
apt-get install libgtk2.0-dev<br />
apt-get install libgdk-pixbuf-dev<br />
Alors vous devriez être prêt pour commencer à programmer !<br />
<br />
=== Installer Lazarus sous Windows ===<br />
<br />
La release actuelle de Lazarus pour windows sous forme binaire est très facile à installer et doit fonctionner sans soucis.<br />
<br />
Il est aussi possible d'installer l'ensemble Lazarus/FPC sur un disque USB (Il faut au minimum 256 MB de disponibles), pour travailler dans les cas où vous ne pouvez pas installer de logiciels sur la machine ou des le cas ou vous n'avez pas les droits de niveau administrateur. Il faut soignement régler les chemins pour le compilateur, dans les options d'environnement ainsi que dans le fichier fpc.cfg. Il peut également être nécessaire de mettre vos répertoires de compilation et de tests sur le disque amovible.<br />
Question : <br />
Comment paramétrer des chemins relatifs dans ces fichiers de configuration pour l'adressage continue à focntionner lorsque l'on change le disque USB de machine et qu'il est reconnu sous une autre lettre ?<br />
<br />
<br />
Les fichiers binaires sont disponible pour Linux et Windows à : <br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Télécharger la dernière mise à jour and lancer l'application. C'est une installation classique de Windows qui va mettre le compilateur FPC et les sources des bibliothèques dans une structure de répertoires commune avec Lazarus et l'IDE doit se lancer et fonctionner sans problèmes particuliers, en partant du principe que vous aurez au préalable désintallé toutes les éventuelles versions précédentes de Lazarus et/ou FPC (souvent on le trouve dans le répertoire c:\pp).<br />
<br />
Vous pouvez aussi trouver les dernieres mises à jour de Lazarus pour Windows a: http://www.de.freepascal.org/lazarus/<br />
<br />
==== Installation à partir des sources ====<br />
Si vous préferrer faire l'installation à partir des codes source, alors suivez les instructions suivantes.<br />
(Thanks to Joe for the initial Step-by-step description)<br />
<br />
Il faut télécharger les sources de lazarus :<br />
http://www.de.freepascal.org/lazarus/<br />
<br />
Ensuite dézipper dans c:\lazarus par exemple. Vous devez installer au minimum fpc-2.0.2, mais fpc-2.0.3 voir fpc 2.1.1 snapshot est aussi possible. Compiler Lazarus et lazarus.exe fonctionne. Le chemin pour fpc est : c:\pp\bin\win32. Dans le même répertoire, il y a d'autres exe (make, grep, ppc386...).<br />
<br />
Ouvrir une session DOS : Démarrer -> Executer...>command ou lancer par l'icône MS-DOS<br />
<br />
Taper:<br />
cd c:\lazarus<br />
set path=c:\pp\bin\win32;c:\lazarus //Bien sur donnez le bon chemin !<br />
<br />
windres -i lazarus.rc -o lazarus.res<br />
make<br />
<br />
Si vous avez de la chance, vous pouvez taper : lazarus.exe. L'IDE, les dialogues et l'éditeur de propriétés doivent marchoter ! Essayez par vous même.<br />
<br />
Vous pouvez aussi compiler les exemples :<br />
<br />
cd examples<br />
make<br />
<br />
Si vous décompressez lazarus dans un autre disque : d:\lazarus par exemple, il est possible que vous ayez besoin de l'utilitaire gnu pour le make. Si vous l'avez, vous devez paramétrer son path=...;<gmakepath> mais il est plus simple de ne pas choisir le disque d:\<br />
<br />
C'est tout.<br />
<br />
=== Installation de Lazarus sous FreeBSD ===<br />
<br />
'''FreeBSD 5+'''<br />
<br />
La dernière version portée de Lazarus dans FreeBSD est 0.9.20. Nous pouvons installer lazarus en utilisant le portage à FreeBSD.<br />
<br />
[]# cd /usr/ports/editors/lazarus && make install clean clean-depends<br />
<br />
Si vous obtenez des messages à propos de fichiers source manquants, allez dans [menu bar >> Environment >> Environment Options >> Files Tab: FPC source library] et entrez le dossier des fichirs sources de FPC. Il peut être obtenu depuis /usr/ports/distfiles/freepascal<br />
<br />
Bonne chance, cela a fonctionné pour moi. --[[User:Jrmarino|Jrmarino]] 21:29, 4 Jan 2006 (CET)<br />
<br />
=== Installer Lazarus sous PC-BSD 1.0rc1+ ===<br />
<br />
Vous pouvez installer Lazarus sous PB-BSD simplement en téléchargeant le PBI de Lazarus depuis [http://www.pbidir.com/PBI Dir]<br />
<br />
Notez que vous devez installer le portage de glib* depuis /usr/port/devel/glib* ou les packages glib avec pkg_add -r glib12 glib20.<br />
Cela sera résolu dans les nouvelles versions de PBI.<br />
<br />
'''[other OpenBSD/NetBSD/DragonFlyBSD goes here]'''<br />
<br />
=== Installer Lazarus sous Mac OS X ===<br />
<br />
<br />
1. Installez les Outils de Développement d'Apple si ce n'est fait:<br />
<br />
DVD MacOS X Tiger(10.4): "/Mac OS X Install Disc 1/Xcode Tools/XcodeTools.mpkg" <br />
<br />
DVD MacOS X Leopard(10.5): "/Mac OS X Install DVD/Installations facultatives/Xcode Tools/XcodeTools.mpkg"<br />
<br />
2. Téléchargez les 3 fichiers *.dmg (fpc, fpcsrc, lazarus) correspondant à votre processeur (versions: fpc 2.2.x, fpcsrc 2.2.x, lazarus 0.9.26.x au moins) ici:<br />
<br />
http://sourceforge.net/projects/lazarus/files/<br />
<br />
3. A partir des fichiers *.dmg téléchargés, installez dans l'ordre:<br />
<br />
Fpc<br />
<br />
Fpcsrc<br />
<br />
Lazarus<br />
<br />
<br />
<br />
Lazarus est maintenant installé dans le dossier:<br />
<br />
Disque dur ("MacintoshHD")/Developer/lazarus/<br />
<br />
=== Expériences additionnelles et conseil pour l'installation de FPC et Lazarus ===<br />
<br />
Faire fonctionner Lazarus sous Linux peut être compliqué. Si vous avez déjà installé une version plus ancienne de FPC et/ou Lazarus, vous devez faire très attention à ce que les PATHS soient ajustés pour que seules vos nouvelles versions soient appelées.<br />
<br />
Les pièges que j'ai connu lors de diverses tentatives avec SuSE Linux incluent:<br />
<br />
La version rpm installe souvent FPC dans /bin ou /usr/bin, avec les bibliothèques dans /lib ou /usr/lib.<br />
<br />
Si vous faites un make install sur une version source ou utilisez un .tar.gz, le compilateur est habituellement installé dans /usr/local/bin avec les bibliothèques dans /usr/local/lib.<br />
<br />
Donc si des versions plus anciennes on été installées depuis un rpm, assurez-vous que tous els liens ont été changés pour refléter la nouvelle structure de dossiers du nouveau compilateur. 'emplacement pour faire les modifications est dans /etc/fpc.cfg ; assurez-vous qu'il n'y ait pas de fichier de configuration rémanant dans votre dossier home ou votre dossier de téléchargement de FPC. Typiquement, ils se trouvent dans ~/.fpc.cfg<br />
<br />
Assurez-vous que les liens dans /etc/fpc.cfg pointent vers les versions correctes des bibliothèques (particulièrement si vous avez d'anciennent versions qui trainent dans le coin).<br />
<br />
Dans /usr/local/bin ou /usr/bin se trouve un fichier nommé fpc ; c'est l'exécutable qui est appelé lorsque vous invoquez le compilateur. Une des premières choses qu'il fait est d'ouvrir ppc386 dans le même dossier. Il doit être de la même version que le fichier fpc, ou il peut être un lien pointant vers le vrai ppp386 dans un autre dossier (comme un dossier de bibliothèque, ou le dossier de fpc dans votre propre espace de développement); assuez-vous de mettre à jour votre lien si vous installez une nouvelle version du compilateur.<br />
<br />
Essayez de lancer le compilateur depuis la ligne de commande en utilisant un des exemples de programmes simples ou un que vous avez écrit vous même.<br />
<br />
Concernant Lazarus:<br />
<br />
Si vous utilisez une version snapshot (.tar.gz) ou si vous obtenez la source depuis le CVS, allez dans votre dossier de Lazarus et entrez<br />
<br />
make<br />
./lazarus <br />
<br />
et heureusement l'IDE devrait se charger. Il se peut qu'il y ait un message disant qu'il ne peut trouver les sources; si c'est le cas, allez dans le menu en haut et sélectionnez Environnement -> Options d'Environnement et insérez le nom du dossier où sont situées vos fichiers de Lazarus (par ex: ~/FreePascal/lazarus), votre compilateur (par ex: /usr/local/bin/ppc386), le dossier des sources de FreePascal (par ex: /usr/local/lib/fpc/$version/fpc ou un dossier dans votre propre espace par ex: ~/FreePascal/fpc). Puis fermez le dialogue et commencez à programmer.<br />
<br />
Vous pouvez rencontrer d'autres problèmes quand vous commencerez à programmer ou à compiler; la plupart d'entre eux concernent la sélection du PATH.<br />
<br />
Beaucoup des difficultés sont traitées dans la FAQ de Lazarus, trouvées sur le site du WiKi, ou une liste plus complète sur le site principale de Lazarus<br />
<br />
http://www.lazarus.freepascal.org/modules.php?op=modload&name=FAQ&file=index<br />
<br />
Dans le menu du haut sélectionnez Lancer -> Options du Compilateur (ou Projet -> Options du Compilateur dans les versions plus récentes de Lazarus) et sélectionnez l'onglet des chemins dans le dialogue qui s'affiche. Il y a plusieurs boîtes pour les entrées de dossier des chemins pour les fichiers Units, Include, Autres fichiers source, Bibliothèques, etc. Pour chacune d'elles, pressez le bouton ... (ellipsis) à leur droite, vous obtiendrez une fenêtre vierge pour insérer les informations de chemin, et une fenêtre en bas donnant quelques suggestions. Sélectionnez-en autant que vous voulez (ou TOUS!) et pressez le bouton AJOUTER pour transférer les sélections dans la fenêtre située au dessus. Quand vous avez fini votre sélection, pressez OK et déplacez vous sur la boîte suivante. Si vous savez quels sont les autres dossiers qui doivent être suivis,pressez le bouton Parcourir associé à chaque boîte, et insérez les dossiers additionnels.<br />
<br />
Quand vous pensez que vos chemins sont les bons, essayez de compiler votre application. S'il reste des erreurs relatives aux chemins ('ne peut trouver l'unité .......') retournez en arrière et vérifiez vos chemins, à la fois dans /etc/fpc.cfg et dans votre dialogue Lancer -> Options du Compilateur (ou Projet -> Options du Compilateur selon votre version).<br />
<br />
Une fois que votre environnement et votre PATH sont corrects, il serait bien de conserver votre configuration dans un fichier, sinon vous devrez refaire la même chose pour chaque nouveau projet.<br />
Dans la boîte de dialogue Lancer -> Options du Compilateur se trouve un bouton Charger/Sauver; sélectionez le et sauvegardez la configuration dans le fichier du nom de votre choix: le mien est ~/FreePascal/default.cfg. Chaque fois que je démarre un nouveau projet, Je peux aller dans le dialogue Lancer -> Options du Compilateur (ou Projet -> Options du Compilateur), sélectionner Charger/Sauver, et charger mon fichier default.cfg pour le nouveau projet. Vous pouvez bien sûr modifier les options pour chaque nouveau projet si tel est votre désir.<br />
<br />
== Contributeurs d'origine et changements ==<br />
Cette page a été convertie à partir de epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=InstallingLazarus version].<br />
* Initially imported and formatted. [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Changed Joe's part for Windows to require fpc 1.0.10. [[User:Vincent | Vincent]] 9/25/2003<br />
* Updated "What is required for lazarus". AndrewJohnson 10/1/2003<br />
* Finished formatted the InstallingLazarus page [[User:Tom | VlxAdmin]] 2/22/2004<br />
* Posted some notes about Installing FPC and Lazarus: mostly reflecting experiences in trying to get the PATHS right in Linux. 3/11/2004 [[User:Kirkpatc]]<br />
* Copied the contents of my note into the main InstallingLazarus section, edited it slightly. I don't know how to remove the original note. 3/12/2004 [[User:Kirkpatc]]<br />
* Removed the original note. Tidied the wiki and formatting a bit. [[User:Tom | VlxAdmin]]<br />
* Corrected a couple of typos - 3/12/2004 [[User:Kirkpatc]]<br />
* Added link for daily snapshot deb packages - 3/27/2004 [[User:Vincent | Vincent]]<br />
* Fixed links in GettingLazarus (downloading binaries) and several other pages. 22 July 2004 [[User:Kirkpatc]]<br />
* Added link for lazarus deb packages - 19 August 2004 VincentSnijders<br />
* Added a short note on installing in Debian - 23 Nov 2004 [[User:Kirkpatc]]<br />
* Considerable re-write and re-organization of installation section - 11 Dec 2004 [[User:Kirkpatc]]<br />
* Fixed broken link - 9 Oct 2005 [[User:Avantman42]]<br />
* Début de traduction de l'anglais vers le français - 16 August 2006 [[User:Bernard | Bernard]]<br />
<br />
<br />
{{AutoCategory}}<br />
[[Category:FPC/fr]]<br />
[[Category:Lazarus/fr]]<br />
[[Category:Install/fr]]</div>Gillou58https://wiki.freepascal.org/index.php?title=fileutil/fr&diff=114150fileutil/fr2017-12-07T12:57:43Z<p>Gillou58: </p>
<hr />
<div>{{fileutil}}<br />
<br />
L'unité Lazarus '''fileutil''' contient des fonctions et des procédures pour maintenir la compatibilité avec l'unité FileUtil de Delphi.<br />
Les routines de fichier qui traitent spécialement les noms de fichiers UTF8 sont dans l'unité [[LazFileUtils/fr|LazFileUtils]].<br />
<br />
'''Attention''' : de nombreuses fonctions de cette unité sont marquées comme '''deprecated'''. Avec la version 1.8 de Lazarus, elles sont même inaccessibles par défaut. Il est par conséquent nécessaire d'utiliser soit l'unité '''UTF8''' soit l'unité '''LazFileUtils''' pour la plupart de ces fonctions.<br />
<br />
Les seuls constantes, types, classes et routines encore utilisables sont :<br />
<br />
// constantes<br />
const<br />
UTF8FileHeader = #$ef#$bb#$bf;<br />
FilenamesCaseSensitive = {$IFDEF CaseInsensitiveFilenames}false{$ELSE}true{$ENDIF};<br />
FilenamesLiteral = {$IFDEF NotLiteralFilenames}false{$ELSE}true{$ENDIF};<br />
<br />
// opérations sur les répertoires et les fichiers<br />
function ComparePhysicalFilenames(const Filename1, Filename2: string): integer;<br />
function CompareFilenames(Filename1: PChar; Len1: integer; Filename2: PChar; Len2: integer; ResolveLinks: boolean): integer; overload;<br />
function ExtractShortPathNameUTF8(Const FileName : String) : String;<br />
function DeleteDirectory(const DirectoryName: string; OnlyChildren: boolean): boolean;<br />
function ProgramDirectory: string;<br />
function ExpandUNCFileNameUTF8(const FileName: string): string;<br />
function FileSize(const Filename: string): int64; overload; inline;<br />
function ExtractFileNameWithoutExt(const AFilename: string): string;<br />
function FilenameIsPascalUnit(const Filename: string): boolean;<br />
function CreateAbsoluteSearchPath(const SearchPath, BaseDirectory: string): string;<br />
function CreateAbsolutePath(const Filename, BaseDirectory: string): string;<br />
function FileIsInPath(const Filename, Path: string): boolean;<br />
function FileIsInDirectory(const Filename, Directory: string): boolean;<br />
function GetAllFilesMask: string; inline;<br />
function GetExeExt: string; inline;<br />
function ReadFileToString(const Filename: string): string;<br />
<br />
// recherche de fichiers<br />
type<br />
TSearchFileInPathFlag = (<br />
sffDontSearchInBasePath, // do not search in BasePath, search only in SearchPath.<br />
sffSearchLoUpCase<br />
);<br />
TSearchFileInPathFlags = set of TSearchFileInPathFlag;<br />
function SearchFileInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): string; overload;<br />
function SearchAllFilesInPath(const Filename, BasePath, SearchPath,Delimiter: string; Flags: TSearchFileInPathFlags): TStrings;<br />
function FindDiskFilename(const Filename: string): string;<br />
function FindDiskFileCaseInsensitive(const Filename: string): string;<br />
function FindDefaultExecutablePath(const Executable: string; const BaseDir: string = ''): string;<br />
<br />
type<br />
{ TFileIterator }<br />
TFileIterator = class<br />
private<br />
FPath: String;<br />
FLevel: Integer;<br />
FFileInfo: TSearchRec;<br />
FSearching: Boolean;<br />
function GetFileName: String;<br />
public<br />
procedure Stop;<br />
function IsDirectory: Boolean;<br />
public<br />
property FileName: String read GetFileName;<br />
property FileInfo: TSearchRec read FFileInfo;<br />
property Level: Integer read FLevel;<br />
property Path: String read FPath;<br />
property Searching: Boolean read FSearching;<br />
end;<br />
<br />
TFileFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryEnterEvent = procedure (FileIterator: TFileIterator) of object;<br />
<br />
{ TFileSearcher }<br />
TFileSearcher = class(TFileIterator)<br />
private<br />
FMaskSeparator: char;<br />
FFollowSymLink: Boolean;<br />
FOnFileFound: TFileFoundEvent;<br />
FOnDirectoryFound: TDirectoryFoundEvent;<br />
FOnDirectoryEnter: TDirectoryEnterEvent;<br />
FFileAttribute: Word;<br />
FDirectoryAttribute: Word;<br />
procedure RaiseSearchingError;<br />
protected<br />
procedure DoDirectoryEnter; virtual;<br />
procedure DoDirectoryFound; virtual;<br />
procedure DoFileFound; virtual;<br />
public<br />
constructor Create;<br />
procedure Search(ASearchPath: String; ASearchMask: String = '';<br />
ASearchSubDirs: Boolean = True; CaseSensitive: Boolean = False);<br />
public<br />
property MaskSeparator: char read FMaskSeparator write FMaskSeparator;<br />
property FollowSymLink: Boolean read FFollowSymLink write FFollowSymLink;<br />
property FileAttribute: Word read FFileAttribute write FFileAttribute default faAnyfile;<br />
property DirectoryAttribute: Word read FDirectoryAttribute write FDirectoryAttribute default faDirectory;<br />
property OnDirectoryFound: TDirectoryFoundEvent read FOnDirectoryFound write FOnDirectoryFound;<br />
property OnFileFound: TFileFoundEvent read FOnFileFound write FOnFileFound;<br />
property OnDirectoryEnter: TDirectoryEnterEvent read FOnDirectoryEnter write FOnDirectoryEnter;<br />
end;<br />
<br />
{ TListFileSearcher }<br />
TListFileSearcher = class(TFileSearcher)<br />
private<br />
FList: TStrings;<br />
protected<br />
procedure DoFileFound; override;<br />
public<br />
constructor Create(AList: TStrings);<br />
end;<br />
<br />
{ TListDirectoriesSearcher }<br />
TListDirectoriesSearcher = class(TFileSearcher)<br />
private<br />
FDirectoriesList :TStrings;<br />
protected<br />
procedure DoDirectoryFound; override;<br />
public<br />
constructor Create(AList: TStrings);<br />
end;<br />
<br />
function FindAllFiles(const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory): TStringList; overload;<br />
procedure FindAllFiles(AList: TStrings; const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory); overload;<br />
function FindAllDirectories(const SearchPath: string; SearchSubDirs: Boolean = True): TStringList; overload;<br />
procedure FindAllDirectories(AList: TStrings; const SearchPath: String; SearchSubDirs: Boolean = true); overload;<br />
<br />
// drapeaux pour les copies<br />
type<br />
TCopyFileFlag = (<br />
cffOverwriteFile,<br />
cffCreateDestDirectory,<br />
cffPreserveTime<br />
);<br />
TCopyFileFlags = set of TCopyFileFlag;<br />
<br />
// copies<br />
function CopyFile(const SrcFilename, DestFilename: string; Flags: TCopyFileFlags=[cffOverwriteFile]; ExceptionOnError: Boolean=False): boolean;<br />
function CopyFile(const SrcFilename, DestFilename: string; PreserveTime: boolean; ExceptionOnError: Boolean=False): boolean;<br />
function CopyDirTree(const SourceDir, TargetDir: string; Flags: TCopyFileFlags=[]): Boolean;<br />
<br />
// noms de fichiers<br />
const<br />
PascalFileExt: array[1..3] of string = ('.pas','.pp','.p');<br />
PascalSourceExt: array[1..6] of string = ('.pas','.pp','.p','.lpr','.dpr','.dpk');<br />
AllDirectoryEntriesMask = '*';<br />
<br />
Ce qui suit ne s'applique que pour les versions antérieures à la version 1.8. La version 1.6.4 mentionne déjà bon nombre de ces fonctions comme '''deprecated'''.<br />
<br />
// file attributes and states<br />
function CompareFilenames(const Filename1, Filename2: string): integer; inline;<br />
function CompareFilenamesIgnoreCase(const Filename1, Filename2: string): integer; inline;<br />
function CompareFilenames(const Filename1, Filename2: string; ResolveLinks: boolean): integer;<br />
function CompareFilenames(Filename1: PChar; Len1: integer; Filename2: PChar; Len2: integer; ResolveLinks: boolean): integer;<br />
function FilenameIsAbsolute(const TheFilename: string):boolean; inline;<br />
function FilenameIsWinAbsolute(const TheFilename: string):boolean; inline;<br />
function FilenameIsUnixAbsolute(const TheFilename: string):boolean; inline;<br />
procedure CheckIfFileIsExecutable(const AFilename: string); inline;<br />
procedure CheckIfFileIsSymlink(const AFilename: string); inline;<br />
function FileIsReadable(const AFilename: string): boolean; inline;<br />
function FileIsWritable(const AFilename: string): boolean; inline;<br />
function FileIsText(const AFilename: string): boolean; inline;<br />
function FileIsText(const AFilename: string; out FileReadable: boolean): boolean; inline;<br />
function FileIsExecutable(const AFilename: string): boolean; inline;<br />
function FileIsSymlink(const AFilename: string): boolean; inline;<br />
function FileIsHardLink(const AFilename: string): boolean; inline;<br />
function FileSize(const Filename: string): int64; overload; inline;<br />
function GetFileDescription(const AFilename: string): string; inline;<br />
function ReadAllLinks(const Filename: string; ExceptionOnError: boolean): string; // if a link is broken returns ''<br />
function TryReadAllLinks(const Filename: string): string; // if a link is broken returns Filename <br />
<br />
// directories<br />
function DirPathExists(const FileName: String): Boolean; inline;<br />
function ForceDirectory(DirectoryName: string): boolean; inline;<br />
function DeleteDirectory(const DirectoryName: string; OnlyChildren: boolean): boolean;<br />
function ProgramDirectory: string;<br />
function DirectoryIsWritable(const DirectoryName: string): boolean; inline;<br />
<br />
// filename parts<br />
function ExtractFileNameOnly(const AFilename: string): string; inline;<br />
function ExtractFileNameWithoutExt(const AFilename: string): string;<br />
function CompareFileExt(const Filename, Ext: string; CaseSensitive: boolean): integer; overload; inline;<br />
function CompareFileExt(const Filename, Ext: string): integer; overload; inline;<br />
function FilenameIsPascalUnit(const Filename: string): boolean;<br />
function AppendPathDelim(const Path: string): string; inline;<br />
function ChompPathDelim(const Path: string): string; inline;<br />
function TrimFilename(const AFilename: string): string; inline;<br />
function CleanAndExpandFilename(const Filename: string): string; inline;<br />
function CleanAndExpandDirectory(const Filename: string): string; inline;<br />
function CreateAbsoluteSearchPath(const SearchPath, BaseDirectory: string): string;<br />
function CreateRelativePath(const Filename, BaseDirectory: string; UsePointDirectory: boolean = false; AlwaysRequireSharedBaseFolder: Boolean = True): string; inline;<br />
function CreateAbsolutePath(const Filename, BaseDirectory: string): string;<br />
function FileIsInPath(const Filename, Path: string): boolean;<br />
function FileIsInDirectory(const Filename, Directory: string): boolean; <br />
<br />
// file search<br />
type<br />
TSearchFileInPathFlag = (<br />
sffDontSearchInBasePath,<br />
sffSearchLoUpCase<br />
);<br />
TSearchFileInPathFlags = set of TSearchFileInPathFlag;<br />
const<br />
AllDirectoryEntriesMask = '*';<br />
<br />
function GetAllFilesMask: string; inline;<br />
function GetExeExt: string; inline;<br />
function SearchFileInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): string;<br />
function SearchAllFilesInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): TStrings;<br />
function FindDiskFilename(const Filename: string): string;<br />
function FindDiskFileCaseInsensitive(const Filename: string): string;<br />
function FindDefaultExecutablePath(const Executable: string; const BaseDir: string = ''): string;<br />
<br />
type<br />
TFileIterator = class<br />
private<br />
FPath: String;<br />
FLevel: Integer;<br />
FFileInfo: TSearchRec;<br />
FSearching: Boolean;<br />
function GetFileName: String;<br />
public<br />
procedure Stop;<br />
function IsDirectory: Boolean;<br />
public<br />
property FileName: String read GetFileName;<br />
property FileInfo: TSearchRec read FFileInfo;<br />
property Level: Integer read FLevel;<br />
property Path: String read FPath;<br />
property Searching: Boolean read FSearching;<br />
end;<br />
<br />
TFileFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryEnterEvent = procedure (FileIterator: TFileIterator) of object;<br />
<br />
TFileSearcher = class(TFileIterator)<br />
private<br />
FMaskSeparator: char;<br />
FFollowSymLink: Boolean;<br />
FOnFileFound: TFileFoundEvent;<br />
FOnDirectoryFound: TDirectoryFoundEvent;<br />
FOnDirectoryEnter: TDirectoryEnterEvent;<br />
FFileAttribute: Word;<br />
FDirectoryAttribute: Word;<br />
procedure RaiseSearchingError;<br />
protected<br />
procedure DoDirectoryEnter; virtual;<br />
procedure DoDirectoryFound; virtual;<br />
procedure DoFileFound; virtual;<br />
public<br />
constructor Create;<br />
procedure Search(const ASearchPath: String; ASearchMask: String = '';<br />
ASearchSubDirs: Boolean = True; CaseSensitive: Boolean = False);<br />
public<br />
property MaskSeparator: char read FMaskSeparator write FMaskSeparator;<br />
property FollowSymLink: Boolean read FFollowSymLink write FFollowSymLink;<br />
property FileAttribute: Word read FFileAttribute write FFileAttribute default faAnyfile;<br />
property DirectoryAttribute: Word read FDirectoryAttribute write FDirectoryAttribute default faDirectory;<br />
property OnDirectoryFound: TDirectoryFoundEvent read FOnDirectoryFound write FOnDirectoryFound;<br />
property OnFileFound: TFileFoundEvent read FOnFileFound write FOnFileFound;<br />
property OnDirectoryEnter: TDirectoryEnterEvent read FOnDirectoryEnter write FOnDirectoryEnter;<br />
end;<br />
<br />
function [[FindAllFiles/fr|FindAllFiles]]( const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True): TStringList;<br />
function FindAllDirectories(const SearchPath: string; SearchSubDirs: Boolean = True): TStringList;<br />
<br />
// Copy a file or a whole directory tree<br />
function [[CopyFile/fr|CopyFile]](const SrcFilename, DestFilename: string; Flags: TCopyFileFlags=[cffOverwriteFile]): boolean;<br />
function [[CopyFile/fr|CopyFile]](const SrcFilename, DestFilename: string; PreserveTime: boolean): boolean;<br />
function CopyDirTree(const SourceDir, TargetDir: string; Flags: TCopyFileFlags=[]): Boolean; <br />
<br />
// file actions<br />
function ReadFileToString(const Filename: string): string;<br />
function GetTempFilename(const Directory, Prefix: string): string; inline; <br />
<br />
// basic functions similar to the RTL but working with UTF-8 instead of the system encoding<br />
// AnsiToUTF8 and UTF8ToAnsi need a widestring manager under Linux, BSD, MacOSX <br />
// but normally these OS use UTF-8 as system encoding so the widestringmanager is not needed.<br />
function NeedRTLAnsi: boolean; inline;// true if system encoding is not UTF-8<br />
procedure SetNeedRTLAnsi(NewValue: boolean); inline;<br />
function UTF8ToSys(const s: string): string; inline;// as UTF8ToAnsi but more independent of widestringmanager<br />
function SysToUTF8(const s: string): string; inline;// as AnsiToUTF8 but more independent of widestringmanager<br />
function ConsoleToUTF8(const s: string): string; inline;// converts OEM encoded string to UTF8 (used with some Windows specific functions )<br />
function UTF8ToConsole(const s: string): string; inline;// converts UTF8 string to console encoding (used by Write, WriteLn)<br />
<br />
// file operations<br />
function FileExistsUTF8(const Filename: string): boolean; inline;<br />
function FileAgeUTF8(const FileName: string): Longint; inline;<br />
function DirectoryExistsUTF8(const Directory: string): Boolean; inline;<br />
function ExpandFileNameUTF8(const FileName: string): string; inline;<br />
function ExpandUNCFileNameUTF8(const FileName: string): string;<br />
function ExtractShortPathNameUTF8(Const FileName : String) : String;<br />
function FindFirstUTF8(const Path: string; Attr: Longint; out Rslt: TSearchRec): Longint; inline;<br />
function FindNextUTF8(var Rslt: TSearchRec): Longint; inline;<br />
procedure FindCloseUTF8(var F: TSearchrec); inline;<br />
function FileSetDateUTF8(const FileName: String; Age: Longint): Longint; inline;<br />
function FileGetAttrUTF8(const FileName: String): Longint; inline;<br />
function FileSetAttrUTF8(const Filename: String; Attr: longint): Longint; inline;<br />
function DeleteFileUTF8(const FileName: String): Boolean; inline;<br />
function RenameFileUTF8(const OldName, NewName: String): Boolean; inline;<br />
function FileSearchUTF8(const Name, DirList : String; ImplicitCurrentDir : Boolean = True): String; inline;<br />
function FileIsReadOnlyUTF8(const FileName: String): Boolean; inline;<br />
function GetCurrentDirUTF8: String; inline;<br />
function SetCurrentDirUTF8(const NewDir: String): Boolean; inline;<br />
function CreateDirUTF8(const NewDir: String): Boolean; inline;<br />
function RemoveDirUTF8(const Dir: String): Boolean; inline;<br />
function ForceDirectoriesUTF8(const Dir: string): Boolean; inline;<br />
function FileOpenUTF8(Const FileName : string; Mode : Integer) : THandle; inline;<br />
function FileCreateUTF8(Const FileName : string) : THandle; overload; inline;<br />
function FileCreateUTF8(Const FileName : string; Rights: Cardinal) : THandle; overload; inline; <br />
<br />
// environment<br />
function ParamStrUTF8(Param: Integer): string; inline;<br />
function GetEnvironmentStringUTF8(Index: Integer): string; inline;<br />
function GetEnvironmentVariableUTF8(const EnvVar: string): String; inline;<br />
function GetAppConfigDirUTF8(Global: Boolean; Create: boolean = false): string; inline;<br />
function GetAppConfigFileUTF8(Global: Boolean; SubDir: boolean = false; CreateDir: boolean = false): string; inline; <br />
<br />
// other<br />
function SysErrorMessageUTF8(ErrorCode: Integer): String; inline;</div>Gillou58https://wiki.freepascal.org/index.php?title=fileutil/fr&diff=114149fileutil/fr2017-12-07T12:55:02Z<p>Gillou58: </p>
<hr />
<div>{{fileutil}}<br />
<br />
L'unité Lazarus '''fileutil''' contient des fonctions et des procédures pour maintenir la compatibilité avec l'unité FileUtil de Delphi.<br />
Les routines de fichier qui traitent spécialement les noms de fichiers UTF8 sont dans l'unité [[LazFileUtils/fr|LazFileUtils]].<br />
<br />
'''Attention''' : de nombreuses fonctions de cette unité sont marquées comme '''deprecated'''. Avec la version 1.8 de Lazarus, elles sont même inaccessibles par défaut. Il est par conséquent nécessaire d'utiliser soit l'unité '''UTF8''' soit l'unité '''LazFileUtils''' pour la plupart de ces fonctions.<br />
<br />
Les seuls constantes, types, classes et routines encore utilisables sont :<br />
<br />
// constantes<br />
const<br />
UTF8FileHeader = #$ef#$bb#$bf;<br />
FilenamesCaseSensitive = {$IFDEF CaseInsensitiveFilenames}false{$ELSE}true{$ENDIF};<br />
FilenamesLiteral = {$IFDEF NotLiteralFilenames}false{$ELSE}true{$ENDIF};<br />
// opérations sur les répertoires et les fichiers<br />
function ComparePhysicalFilenames(const Filename1, Filename2: string): integer;<br />
function CompareFilenames(Filename1: PChar; Len1: integer; Filename2: PChar; Len2: integer; ResolveLinks: boolean): integer; overload;<br />
function ExtractShortPathNameUTF8(Const FileName : String) : String;<br />
function DeleteDirectory(const DirectoryName: string; OnlyChildren: boolean): boolean;<br />
function ProgramDirectory: string;<br />
function ExpandUNCFileNameUTF8(const FileName: string): string;<br />
function FileSize(const Filename: string): int64; overload; inline;<br />
function ExtractFileNameWithoutExt(const AFilename: string): string;<br />
function FilenameIsPascalUnit(const Filename: string): boolean;<br />
function CreateAbsoluteSearchPath(const SearchPath, BaseDirectory: string): string;<br />
function CreateAbsolutePath(const Filename, BaseDirectory: string): string;<br />
function FileIsInPath(const Filename, Path: string): boolean;<br />
function FileIsInDirectory(const Filename, Directory: string): boolean;<br />
function GetAllFilesMask: string; inline;<br />
function GetExeExt: string; inline;<br />
function ReadFileToString(const Filename: string): string;<br />
<br />
// recherche de fichiers<br />
type<br />
TSearchFileInPathFlag = (<br />
sffDontSearchInBasePath, // do not search in BasePath, search only in SearchPath.<br />
sffSearchLoUpCase<br />
);<br />
TSearchFileInPathFlags = set of TSearchFileInPathFlag;<br />
function SearchFileInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): string; overload;<br />
function SearchAllFilesInPath(const Filename, BasePath, SearchPath,Delimiter: string; Flags: TSearchFileInPathFlags): TStrings;<br />
function FindDiskFilename(const Filename: string): string;<br />
function FindDiskFileCaseInsensitive(const Filename: string): string;<br />
function FindDefaultExecutablePath(const Executable: string; const BaseDir: string = ''): string;<br />
type<br />
{ TFileIterator }<br />
TFileIterator = class<br />
private<br />
FPath: String;<br />
FLevel: Integer;<br />
FFileInfo: TSearchRec;<br />
FSearching: Boolean;<br />
function GetFileName: String;<br />
public<br />
procedure Stop;<br />
function IsDirectory: Boolean;<br />
public<br />
property FileName: String read GetFileName;<br />
property FileInfo: TSearchRec read FFileInfo;<br />
property Level: Integer read FLevel;<br />
property Path: String read FPath;<br />
property Searching: Boolean read FSearching;<br />
end;<br />
TFileFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryEnterEvent = procedure (FileIterator: TFileIterator) of object;<br />
{ TFileSearcher }<br />
TFileSearcher = class(TFileIterator)<br />
private<br />
FMaskSeparator: char;<br />
FFollowSymLink: Boolean;<br />
FOnFileFound: TFileFoundEvent;<br />
FOnDirectoryFound: TDirectoryFoundEvent;<br />
FOnDirectoryEnter: TDirectoryEnterEvent;<br />
FFileAttribute: Word;<br />
FDirectoryAttribute: Word;<br />
procedure RaiseSearchingError;<br />
protected<br />
procedure DoDirectoryEnter; virtual;<br />
procedure DoDirectoryFound; virtual;<br />
procedure DoFileFound; virtual;<br />
public<br />
constructor Create;<br />
procedure Search(ASearchPath: String; ASearchMask: String = '';<br />
ASearchSubDirs: Boolean = True; CaseSensitive: Boolean = False);<br />
public<br />
property MaskSeparator: char read FMaskSeparator write FMaskSeparator;<br />
property FollowSymLink: Boolean read FFollowSymLink write FFollowSymLink;<br />
property FileAttribute: Word read FFileAttribute write FFileAttribute default faAnyfile;<br />
property DirectoryAttribute: Word read FDirectoryAttribute write FDirectoryAttribute default faDirectory;<br />
property OnDirectoryFound: TDirectoryFoundEvent read FOnDirectoryFound write FOnDirectoryFound;<br />
property OnFileFound: TFileFoundEvent read FOnFileFound write FOnFileFound;<br />
property OnDirectoryEnter: TDirectoryEnterEvent read FOnDirectoryEnter write FOnDirectoryEnter;<br />
end;<br />
{ TListFileSearcher }<br />
TListFileSearcher = class(TFileSearcher)<br />
private<br />
FList: TStrings;<br />
protected<br />
procedure DoFileFound; override;<br />
public<br />
constructor Create(AList: TStrings);<br />
end;<br />
{ TListDirectoriesSearcher }<br />
TListDirectoriesSearcher = class(TFileSearcher)<br />
private<br />
FDirectoriesList :TStrings;<br />
protected<br />
procedure DoDirectoryFound; override;<br />
public<br />
constructor Create(AList: TStrings);<br />
end;<br />
function FindAllFiles(const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory): TStringList; overload;<br />
procedure FindAllFiles(AList: TStrings; const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory); overload;<br />
function FindAllDirectories(const SearchPath: string; SearchSubDirs: Boolean = True): TStringList; overload;<br />
procedure FindAllDirectories(AList: TStrings; const SearchPath: String; SearchSubDirs: Boolean = true); overload;<br />
<br />
// drapeaux pour les copies<br />
type<br />
TCopyFileFlag = (<br />
cffOverwriteFile,<br />
cffCreateDestDirectory,<br />
cffPreserveTime<br />
);<br />
TCopyFileFlags = set of TCopyFileFlag;<br />
<br />
// copies<br />
function CopyFile(const SrcFilename, DestFilename: string; Flags: TCopyFileFlags=[cffOverwriteFile]; ExceptionOnError: Boolean=False): boolean;<br />
function CopyFile(const SrcFilename, DestFilename: string; PreserveTime: boolean; ExceptionOnError: Boolean=False): boolean;<br />
function CopyDirTree(const SourceDir, TargetDir: string; Flags: TCopyFileFlags=[]): Boolean;<br />
<br />
// noms de fichiers<br />
const<br />
PascalFileExt: array[1..3] of string = ('.pas','.pp','.p');<br />
PascalSourceExt: array[1..6] of string = ('.pas','.pp','.p','.lpr','.dpr','.dpk');<br />
AllDirectoryEntriesMask = '*';<br />
<br />
Ce qui suit ne s'applique que pour les versions antérieures à la version 1.8. La version 1.6.4 mentionne déjà bon nombre de ces fonctions comme '''deprecated'''.<br />
<br />
// file attributes and states<br />
function CompareFilenames(const Filename1, Filename2: string): integer; inline;<br />
function CompareFilenamesIgnoreCase(const Filename1, Filename2: string): integer; inline;<br />
function CompareFilenames(const Filename1, Filename2: string; ResolveLinks: boolean): integer;<br />
function CompareFilenames(Filename1: PChar; Len1: integer; Filename2: PChar; Len2: integer; ResolveLinks: boolean): integer;<br />
function FilenameIsAbsolute(const TheFilename: string):boolean; inline;<br />
function FilenameIsWinAbsolute(const TheFilename: string):boolean; inline;<br />
function FilenameIsUnixAbsolute(const TheFilename: string):boolean; inline;<br />
procedure CheckIfFileIsExecutable(const AFilename: string); inline;<br />
procedure CheckIfFileIsSymlink(const AFilename: string); inline;<br />
function FileIsReadable(const AFilename: string): boolean; inline;<br />
function FileIsWritable(const AFilename: string): boolean; inline;<br />
function FileIsText(const AFilename: string): boolean; inline;<br />
function FileIsText(const AFilename: string; out FileReadable: boolean): boolean; inline;<br />
function FileIsExecutable(const AFilename: string): boolean; inline;<br />
function FileIsSymlink(const AFilename: string): boolean; inline;<br />
function FileIsHardLink(const AFilename: string): boolean; inline;<br />
function FileSize(const Filename: string): int64; overload; inline;<br />
function GetFileDescription(const AFilename: string): string; inline;<br />
function ReadAllLinks(const Filename: string; ExceptionOnError: boolean): string; // if a link is broken returns ''<br />
function TryReadAllLinks(const Filename: string): string; // if a link is broken returns Filename <br />
<br />
// directories<br />
function DirPathExists(const FileName: String): Boolean; inline;<br />
function ForceDirectory(DirectoryName: string): boolean; inline;<br />
function DeleteDirectory(const DirectoryName: string; OnlyChildren: boolean): boolean;<br />
function ProgramDirectory: string;<br />
function DirectoryIsWritable(const DirectoryName: string): boolean; inline;<br />
<br />
// filename parts<br />
function ExtractFileNameOnly(const AFilename: string): string; inline;<br />
function ExtractFileNameWithoutExt(const AFilename: string): string;<br />
function CompareFileExt(const Filename, Ext: string; CaseSensitive: boolean): integer; overload; inline;<br />
function CompareFileExt(const Filename, Ext: string): integer; overload; inline;<br />
function FilenameIsPascalUnit(const Filename: string): boolean;<br />
function AppendPathDelim(const Path: string): string; inline;<br />
function ChompPathDelim(const Path: string): string; inline;<br />
function TrimFilename(const AFilename: string): string; inline;<br />
function CleanAndExpandFilename(const Filename: string): string; inline;<br />
function CleanAndExpandDirectory(const Filename: string): string; inline;<br />
function CreateAbsoluteSearchPath(const SearchPath, BaseDirectory: string): string;<br />
function CreateRelativePath(const Filename, BaseDirectory: string; UsePointDirectory: boolean = false; AlwaysRequireSharedBaseFolder: Boolean = True): string; inline;<br />
function CreateAbsolutePath(const Filename, BaseDirectory: string): string;<br />
function FileIsInPath(const Filename, Path: string): boolean;<br />
function FileIsInDirectory(const Filename, Directory: string): boolean; <br />
<br />
// file search<br />
type<br />
TSearchFileInPathFlag = (<br />
sffDontSearchInBasePath,<br />
sffSearchLoUpCase<br />
);<br />
TSearchFileInPathFlags = set of TSearchFileInPathFlag;<br />
const<br />
AllDirectoryEntriesMask = '*';<br />
<br />
function GetAllFilesMask: string; inline;<br />
function GetExeExt: string; inline;<br />
function SearchFileInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): string;<br />
function SearchAllFilesInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): TStrings;<br />
function FindDiskFilename(const Filename: string): string;<br />
function FindDiskFileCaseInsensitive(const Filename: string): string;<br />
function FindDefaultExecutablePath(const Executable: string; const BaseDir: string = ''): string;<br />
<br />
type<br />
TFileIterator = class<br />
private<br />
FPath: String;<br />
FLevel: Integer;<br />
FFileInfo: TSearchRec;<br />
FSearching: Boolean;<br />
function GetFileName: String;<br />
public<br />
procedure Stop;<br />
function IsDirectory: Boolean;<br />
public<br />
property FileName: String read GetFileName;<br />
property FileInfo: TSearchRec read FFileInfo;<br />
property Level: Integer read FLevel;<br />
property Path: String read FPath;<br />
property Searching: Boolean read FSearching;<br />
end;<br />
<br />
TFileFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryEnterEvent = procedure (FileIterator: TFileIterator) of object;<br />
<br />
TFileSearcher = class(TFileIterator)<br />
private<br />
FMaskSeparator: char;<br />
FFollowSymLink: Boolean;<br />
FOnFileFound: TFileFoundEvent;<br />
FOnDirectoryFound: TDirectoryFoundEvent;<br />
FOnDirectoryEnter: TDirectoryEnterEvent;<br />
FFileAttribute: Word;<br />
FDirectoryAttribute: Word;<br />
procedure RaiseSearchingError;<br />
protected<br />
procedure DoDirectoryEnter; virtual;<br />
procedure DoDirectoryFound; virtual;<br />
procedure DoFileFound; virtual;<br />
public<br />
constructor Create;<br />
procedure Search(const ASearchPath: String; ASearchMask: String = '';<br />
ASearchSubDirs: Boolean = True; CaseSensitive: Boolean = False);<br />
public<br />
property MaskSeparator: char read FMaskSeparator write FMaskSeparator;<br />
property FollowSymLink: Boolean read FFollowSymLink write FFollowSymLink;<br />
property FileAttribute: Word read FFileAttribute write FFileAttribute default faAnyfile;<br />
property DirectoryAttribute: Word read FDirectoryAttribute write FDirectoryAttribute default faDirectory;<br />
property OnDirectoryFound: TDirectoryFoundEvent read FOnDirectoryFound write FOnDirectoryFound;<br />
property OnFileFound: TFileFoundEvent read FOnFileFound write FOnFileFound;<br />
property OnDirectoryEnter: TDirectoryEnterEvent read FOnDirectoryEnter write FOnDirectoryEnter;<br />
end;<br />
<br />
function [[FindAllFiles/fr|FindAllFiles]]( const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True): TStringList;<br />
function FindAllDirectories(const SearchPath: string; SearchSubDirs: Boolean = True): TStringList;<br />
<br />
// Copy a file or a whole directory tree<br />
function [[CopyFile/fr|CopyFile]](const SrcFilename, DestFilename: string; Flags: TCopyFileFlags=[cffOverwriteFile]): boolean;<br />
function [[CopyFile/fr|CopyFile]](const SrcFilename, DestFilename: string; PreserveTime: boolean): boolean;<br />
function CopyDirTree(const SourceDir, TargetDir: string; Flags: TCopyFileFlags=[]): Boolean; <br />
<br />
// file actions<br />
function ReadFileToString(const Filename: string): string;<br />
function GetTempFilename(const Directory, Prefix: string): string; inline; <br />
<br />
// basic functions similar to the RTL but working with UTF-8 instead of the system encoding<br />
// AnsiToUTF8 and UTF8ToAnsi need a widestring manager under Linux, BSD, MacOSX <br />
// but normally these OS use UTF-8 as system encoding so the widestringmanager is not needed.<br />
function NeedRTLAnsi: boolean; inline;// true if system encoding is not UTF-8<br />
procedure SetNeedRTLAnsi(NewValue: boolean); inline;<br />
function UTF8ToSys(const s: string): string; inline;// as UTF8ToAnsi but more independent of widestringmanager<br />
function SysToUTF8(const s: string): string; inline;// as AnsiToUTF8 but more independent of widestringmanager<br />
function ConsoleToUTF8(const s: string): string; inline;// converts OEM encoded string to UTF8 (used with some Windows specific functions )<br />
function UTF8ToConsole(const s: string): string; inline;// converts UTF8 string to console encoding (used by Write, WriteLn)<br />
<br />
// file operations<br />
function FileExistsUTF8(const Filename: string): boolean; inline;<br />
function FileAgeUTF8(const FileName: string): Longint; inline;<br />
function DirectoryExistsUTF8(const Directory: string): Boolean; inline;<br />
function ExpandFileNameUTF8(const FileName: string): string; inline;<br />
function ExpandUNCFileNameUTF8(const FileName: string): string;<br />
function ExtractShortPathNameUTF8(Const FileName : String) : String;<br />
function FindFirstUTF8(const Path: string; Attr: Longint; out Rslt: TSearchRec): Longint; inline;<br />
function FindNextUTF8(var Rslt: TSearchRec): Longint; inline;<br />
procedure FindCloseUTF8(var F: TSearchrec); inline;<br />
function FileSetDateUTF8(const FileName: String; Age: Longint): Longint; inline;<br />
function FileGetAttrUTF8(const FileName: String): Longint; inline;<br />
function FileSetAttrUTF8(const Filename: String; Attr: longint): Longint; inline;<br />
function DeleteFileUTF8(const FileName: String): Boolean; inline;<br />
function RenameFileUTF8(const OldName, NewName: String): Boolean; inline;<br />
function FileSearchUTF8(const Name, DirList : String; ImplicitCurrentDir : Boolean = True): String; inline;<br />
function FileIsReadOnlyUTF8(const FileName: String): Boolean; inline;<br />
function GetCurrentDirUTF8: String; inline;<br />
function SetCurrentDirUTF8(const NewDir: String): Boolean; inline;<br />
function CreateDirUTF8(const NewDir: String): Boolean; inline;<br />
function RemoveDirUTF8(const Dir: String): Boolean; inline;<br />
function ForceDirectoriesUTF8(const Dir: string): Boolean; inline;<br />
function FileOpenUTF8(Const FileName : string; Mode : Integer) : THandle; inline;<br />
function FileCreateUTF8(Const FileName : string) : THandle; overload; inline;<br />
function FileCreateUTF8(Const FileName : string; Rights: Cardinal) : THandle; overload; inline; <br />
<br />
// environment<br />
function ParamStrUTF8(Param: Integer): string; inline;<br />
function GetEnvironmentStringUTF8(Index: Integer): string; inline;<br />
function GetEnvironmentVariableUTF8(const EnvVar: string): String; inline;<br />
function GetAppConfigDirUTF8(Global: Boolean; Create: boolean = false): string; inline;<br />
function GetAppConfigFileUTF8(Global: Boolean; SubDir: boolean = false; CreateDir: boolean = false): string; inline; <br />
<br />
// other<br />
function SysErrorMessageUTF8(ErrorCode: Integer): String; inline;</div>Gillou58https://wiki.freepascal.org/index.php?title=fileutil/fr&diff=114148fileutil/fr2017-12-07T12:46:21Z<p>Gillou58: </p>
<hr />
<div>{{fileutil}}<br />
<br />
L'unité Lazarus '''fileutil''' contient des fonctions et des procédures pour maintenir la compatibilité avec l'unité FileUtil de Delphi.<br />
Les routines de fichier qui traitent spécialement les noms de fichiers UTF8 sont dans l'unité [[LazFileUtils/fr|LazFileUtils]].<br />
<br />
'''Attention''' : de nombreuses fonctions de cette unité sont marquées comme '''deprecated'''. Avec la version 1.8 de Lazarus, elles sont même inaccessibles par défaut. Il est par conséquent nécessaire d'utiliser soit l'unité '''UTF8''' soit l'unité '''LazFileUtils''' pour la plupart de ces fonctions.<br />
<br />
Les seuls constantes, types, classes et routines encore utilisables sont :<br />
<br />
const<br />
UTF8FileHeader = #$ef#$bb#$bf;<br />
FilenamesCaseSensitive = {$IFDEF CaseInsensitiveFilenames}false{$ELSE}true{$ENDIF};<br />
FilenamesLiteral = {$IFDEF NotLiteralFilenames}false{$ELSE}true{$ENDIF};<br />
[...]<br />
// opérations sur les répertoires et les fichiers<br />
function ComparePhysicalFilenames(const Filename1, Filename2: string): integer;<br />
function CompareFilenames(Filename1: PChar; Len1: integer; Filename2: PChar; Len2: integer; ResolveLinks: boolean): integer; overload;<br />
function ExtractShortPathNameUTF8(Const FileName : String) : String;<br />
function DeleteDirectory(const DirectoryName: string; OnlyChildren: boolean): boolean;<br />
function ProgramDirectory: string;<br />
function ExpandUNCFileNameUTF8(const FileName: string): string;<br />
function FileSize(const Filename: string): int64; overload; inline;<br />
function ExtractFileNameWithoutExt(const AFilename: string): string;<br />
function FilenameIsPascalUnit(const Filename: string): boolean;<br />
function CreateAbsoluteSearchPath(const SearchPath, BaseDirectory: string): string;<br />
function CreateAbsolutePath(const Filename, BaseDirectory: string): string;<br />
function FileIsInPath(const Filename, Path: string): boolean;<br />
function FileIsInDirectory(const Filename, Directory: string): boolean;<br />
function GetAllFilesMask: string; inline;<br />
function GetExeExt: string; inline;<br />
function ReadFileToString(const Filename: string): string;<br />
<br />
// recherche de fichiers<br />
type<br />
TSearchFileInPathFlag = (<br />
sffDontSearchInBasePath, // do not search in BasePath, search only in SearchPath.<br />
sffSearchLoUpCase<br />
);<br />
TSearchFileInPathFlags = set of TSearchFileInPathFlag;<br />
function SearchFileInPath(const Filename, BasePath, SearchPath,<br />
Delimiter: string; Flags: TSearchFileInPathFlags): string; overload;<br />
function SearchAllFilesInPath(const Filename, BasePath, SearchPath,<br />
Delimiter: string; Flags: TSearchFileInPathFlags): TStrings;<br />
function FindDiskFilename(const Filename: string): string;<br />
function FindDiskFileCaseInsensitive(const Filename: string): string;<br />
function FindDefaultExecutablePath(const Executable: string; const BaseDir: string = ''): string;<br />
type<br />
{ TFileIterator }<br />
TFileIterator = class<br />
private<br />
FPath: String;<br />
FLevel: Integer;<br />
FFileInfo: TSearchRec;<br />
FSearching: Boolean;<br />
function GetFileName: String;<br />
public<br />
procedure Stop;<br />
function IsDirectory: Boolean;<br />
public<br />
property FileName: String read GetFileName;<br />
property FileInfo: TSearchRec read FFileInfo;<br />
property Level: Integer read FLevel;<br />
property Path: String read FPath;<br />
property Searching: Boolean read FSearching;<br />
end;<br />
TFileFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryEnterEvent = procedure (FileIterator: TFileIterator) of object;<br />
{ TFileSearcher }<br />
TFileSearcher = class(TFileIterator)<br />
private<br />
FMaskSeparator: char;<br />
FFollowSymLink: Boolean;<br />
FOnFileFound: TFileFoundEvent;<br />
FOnDirectoryFound: TDirectoryFoundEvent;<br />
FOnDirectoryEnter: TDirectoryEnterEvent;<br />
FFileAttribute: Word;<br />
FDirectoryAttribute: Word;<br />
procedure RaiseSearchingError;<br />
protected<br />
procedure DoDirectoryEnter; virtual;<br />
procedure DoDirectoryFound; virtual;<br />
procedure DoFileFound; virtual;<br />
public<br />
constructor Create;<br />
procedure Search(ASearchPath: String; ASearchMask: String = '';<br />
ASearchSubDirs: Boolean = True; CaseSensitive: Boolean = False);<br />
public<br />
property MaskSeparator: char read FMaskSeparator write FMaskSeparator;<br />
property FollowSymLink: Boolean read FFollowSymLink write FFollowSymLink;<br />
property FileAttribute: Word read FFileAttribute write FFileAttribute default faAnyfile;<br />
property DirectoryAttribute: Word read FDirectoryAttribute write FDirectoryAttribute default faDirectory;<br />
property OnDirectoryFound: TDirectoryFoundEvent read FOnDirectoryFound write FOnDirectoryFound;<br />
property OnFileFound: TFileFoundEvent read FOnFileFound write FOnFileFound;<br />
property OnDirectoryEnter: TDirectoryEnterEvent read FOnDirectoryEnter write FOnDirectoryEnter;<br />
end;<br />
{ TListFileSearcher }<br />
TListFileSearcher = class(TFileSearcher)<br />
private<br />
FList: TStrings;<br />
protected<br />
procedure DoFileFound; override;<br />
public<br />
constructor Create(AList: TStrings);<br />
end;<br />
{ TListDirectoriesSearcher }<br />
TListDirectoriesSearcher = class(TFileSearcher)<br />
private<br />
FDirectoriesList :TStrings;<br />
protected<br />
procedure DoDirectoryFound; override;<br />
public<br />
constructor Create(AList: TStrings);<br />
end;<br />
function FindAllFiles(const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory): TStringList; overload;<br />
procedure FindAllFiles(AList: TStrings; const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory); overload;<br />
function FindAllDirectories(const SearchPath: string; SearchSubDirs: Boolean = True): TStringList; overload;<br />
procedure FindAllDirectories(AList: TStrings; const SearchPath: String; SearchSubDirs: Boolean = true); overload;<br />
<br />
// drapeaux pour les copies<br />
type<br />
TCopyFileFlag = (<br />
cffOverwriteFile,<br />
cffCreateDestDirectory,<br />
cffPreserveTime<br />
);<br />
TCopyFileFlags = set of TCopyFileFlag;<br />
<br />
// copies<br />
function CopyFile(const SrcFilename, DestFilename: string; Flags: TCopyFileFlags=[cffOverwriteFile]; ExceptionOnError: Boolean=False): boolean;<br />
function CopyFile(const SrcFilename, DestFilename: string; PreserveTime: boolean; ExceptionOnError: Boolean=False): boolean;<br />
function CopyDirTree(const SourceDir, TargetDir: string; Flags: TCopyFileFlags=[]): Boolean;<br />
<br />
// noms de fichiers<br />
const<br />
PascalFileExt: array[1..3] of string = ('.pas','.pp','.p');<br />
PascalSourceExt: array[1..6] of string = ('.pas','.pp','.p','.lpr','.dpr','.dpk');<br />
AllDirectoryEntriesMask = '*';<br />
<br />
Ce qui suit ne s'applique que pour les versions antérieures à la version 1.8. La version 1.6.4 mentionne déjà bon nombre de ces fonctions comme '''deprecated'''.<br />
<br />
// file attributes and states<br />
function CompareFilenames(const Filename1, Filename2: string): integer; inline;<br />
function CompareFilenamesIgnoreCase(const Filename1, Filename2: string): integer; inline;<br />
function CompareFilenames(const Filename1, Filename2: string; ResolveLinks: boolean): integer;<br />
function CompareFilenames(Filename1: PChar; Len1: integer; Filename2: PChar; Len2: integer; ResolveLinks: boolean): integer;<br />
function FilenameIsAbsolute(const TheFilename: string):boolean; inline;<br />
function FilenameIsWinAbsolute(const TheFilename: string):boolean; inline;<br />
function FilenameIsUnixAbsolute(const TheFilename: string):boolean; inline;<br />
procedure CheckIfFileIsExecutable(const AFilename: string); inline;<br />
procedure CheckIfFileIsSymlink(const AFilename: string); inline;<br />
function FileIsReadable(const AFilename: string): boolean; inline;<br />
function FileIsWritable(const AFilename: string): boolean; inline;<br />
function FileIsText(const AFilename: string): boolean; inline;<br />
function FileIsText(const AFilename: string; out FileReadable: boolean): boolean; inline;<br />
function FileIsExecutable(const AFilename: string): boolean; inline;<br />
function FileIsSymlink(const AFilename: string): boolean; inline;<br />
function FileIsHardLink(const AFilename: string): boolean; inline;<br />
function FileSize(const Filename: string): int64; overload; inline;<br />
function GetFileDescription(const AFilename: string): string; inline;<br />
function ReadAllLinks(const Filename: string; ExceptionOnError: boolean): string; // if a link is broken returns ''<br />
function TryReadAllLinks(const Filename: string): string; // if a link is broken returns Filename <br />
<br />
// directories<br />
function DirPathExists(const FileName: String): Boolean; inline;<br />
function ForceDirectory(DirectoryName: string): boolean; inline;<br />
function DeleteDirectory(const DirectoryName: string; OnlyChildren: boolean): boolean;<br />
function ProgramDirectory: string;<br />
function DirectoryIsWritable(const DirectoryName: string): boolean; inline;<br />
<br />
// filename parts<br />
function ExtractFileNameOnly(const AFilename: string): string; inline;<br />
function ExtractFileNameWithoutExt(const AFilename: string): string;<br />
function CompareFileExt(const Filename, Ext: string; CaseSensitive: boolean): integer; overload; inline;<br />
function CompareFileExt(const Filename, Ext: string): integer; overload; inline;<br />
function FilenameIsPascalUnit(const Filename: string): boolean;<br />
function AppendPathDelim(const Path: string): string; inline;<br />
function ChompPathDelim(const Path: string): string; inline;<br />
function TrimFilename(const AFilename: string): string; inline;<br />
function CleanAndExpandFilename(const Filename: string): string; inline;<br />
function CleanAndExpandDirectory(const Filename: string): string; inline;<br />
function CreateAbsoluteSearchPath(const SearchPath, BaseDirectory: string): string;<br />
function CreateRelativePath(const Filename, BaseDirectory: string; UsePointDirectory: boolean = false; AlwaysRequireSharedBaseFolder: Boolean = True): string; inline;<br />
function CreateAbsolutePath(const Filename, BaseDirectory: string): string;<br />
function FileIsInPath(const Filename, Path: string): boolean;<br />
function FileIsInDirectory(const Filename, Directory: string): boolean; <br />
<br />
// file search<br />
type<br />
TSearchFileInPathFlag = (<br />
sffDontSearchInBasePath,<br />
sffSearchLoUpCase<br />
);<br />
TSearchFileInPathFlags = set of TSearchFileInPathFlag;<br />
const<br />
AllDirectoryEntriesMask = '*';<br />
<br />
function GetAllFilesMask: string; inline;<br />
function GetExeExt: string; inline;<br />
function SearchFileInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): string;<br />
function SearchAllFilesInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): TStrings;<br />
function FindDiskFilename(const Filename: string): string;<br />
function FindDiskFileCaseInsensitive(const Filename: string): string;<br />
function FindDefaultExecutablePath(const Executable: string; const BaseDir: string = ''): string;<br />
<br />
type<br />
TFileIterator = class<br />
private<br />
FPath: String;<br />
FLevel: Integer;<br />
FFileInfo: TSearchRec;<br />
FSearching: Boolean;<br />
function GetFileName: String;<br />
public<br />
procedure Stop;<br />
function IsDirectory: Boolean;<br />
public<br />
property FileName: String read GetFileName;<br />
property FileInfo: TSearchRec read FFileInfo;<br />
property Level: Integer read FLevel;<br />
property Path: String read FPath;<br />
property Searching: Boolean read FSearching;<br />
end;<br />
<br />
TFileFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryEnterEvent = procedure (FileIterator: TFileIterator) of object;<br />
<br />
TFileSearcher = class(TFileIterator)<br />
private<br />
FMaskSeparator: char;<br />
FFollowSymLink: Boolean;<br />
FOnFileFound: TFileFoundEvent;<br />
FOnDirectoryFound: TDirectoryFoundEvent;<br />
FOnDirectoryEnter: TDirectoryEnterEvent;<br />
FFileAttribute: Word;<br />
FDirectoryAttribute: Word;<br />
procedure RaiseSearchingError;<br />
protected<br />
procedure DoDirectoryEnter; virtual;<br />
procedure DoDirectoryFound; virtual;<br />
procedure DoFileFound; virtual;<br />
public<br />
constructor Create;<br />
procedure Search(const ASearchPath: String; ASearchMask: String = '';<br />
ASearchSubDirs: Boolean = True; CaseSensitive: Boolean = False);<br />
public<br />
property MaskSeparator: char read FMaskSeparator write FMaskSeparator;<br />
property FollowSymLink: Boolean read FFollowSymLink write FFollowSymLink;<br />
property FileAttribute: Word read FFileAttribute write FFileAttribute default faAnyfile;<br />
property DirectoryAttribute: Word read FDirectoryAttribute write FDirectoryAttribute default faDirectory;<br />
property OnDirectoryFound: TDirectoryFoundEvent read FOnDirectoryFound write FOnDirectoryFound;<br />
property OnFileFound: TFileFoundEvent read FOnFileFound write FOnFileFound;<br />
property OnDirectoryEnter: TDirectoryEnterEvent read FOnDirectoryEnter write FOnDirectoryEnter;<br />
end;<br />
<br />
function [[FindAllFiles/fr|FindAllFiles]]( const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True): TStringList;<br />
function FindAllDirectories(const SearchPath: string; SearchSubDirs: Boolean = True): TStringList;<br />
<br />
// Copy a file or a whole directory tree<br />
function [[CopyFile/fr|CopyFile]](const SrcFilename, DestFilename: string; Flags: TCopyFileFlags=[cffOverwriteFile]): boolean;<br />
function [[CopyFile/fr|CopyFile]](const SrcFilename, DestFilename: string; PreserveTime: boolean): boolean;<br />
function CopyDirTree(const SourceDir, TargetDir: string; Flags: TCopyFileFlags=[]): Boolean; <br />
<br />
// file actions<br />
function ReadFileToString(const Filename: string): string;<br />
function GetTempFilename(const Directory, Prefix: string): string; inline; <br />
<br />
// basic functions similar to the RTL but working with UTF-8 instead of the system encoding<br />
// AnsiToUTF8 and UTF8ToAnsi need a widestring manager under Linux, BSD, MacOSX <br />
// but normally these OS use UTF-8 as system encoding so the widestringmanager is not needed.<br />
function NeedRTLAnsi: boolean; inline;// true if system encoding is not UTF-8<br />
procedure SetNeedRTLAnsi(NewValue: boolean); inline;<br />
function UTF8ToSys(const s: string): string; inline;// as UTF8ToAnsi but more independent of widestringmanager<br />
function SysToUTF8(const s: string): string; inline;// as AnsiToUTF8 but more independent of widestringmanager<br />
function ConsoleToUTF8(const s: string): string; inline;// converts OEM encoded string to UTF8 (used with some Windows specific functions )<br />
function UTF8ToConsole(const s: string): string; inline;// converts UTF8 string to console encoding (used by Write, WriteLn)<br />
<br />
// file operations<br />
function FileExistsUTF8(const Filename: string): boolean; inline;<br />
function FileAgeUTF8(const FileName: string): Longint; inline;<br />
function DirectoryExistsUTF8(const Directory: string): Boolean; inline;<br />
function ExpandFileNameUTF8(const FileName: string): string; inline;<br />
function ExpandUNCFileNameUTF8(const FileName: string): string;<br />
function ExtractShortPathNameUTF8(Const FileName : String) : String;<br />
function FindFirstUTF8(const Path: string; Attr: Longint; out Rslt: TSearchRec): Longint; inline;<br />
function FindNextUTF8(var Rslt: TSearchRec): Longint; inline;<br />
procedure FindCloseUTF8(var F: TSearchrec); inline;<br />
function FileSetDateUTF8(const FileName: String; Age: Longint): Longint; inline;<br />
function FileGetAttrUTF8(const FileName: String): Longint; inline;<br />
function FileSetAttrUTF8(const Filename: String; Attr: longint): Longint; inline;<br />
function DeleteFileUTF8(const FileName: String): Boolean; inline;<br />
function RenameFileUTF8(const OldName, NewName: String): Boolean; inline;<br />
function FileSearchUTF8(const Name, DirList : String; ImplicitCurrentDir : Boolean = True): String; inline;<br />
function FileIsReadOnlyUTF8(const FileName: String): Boolean; inline;<br />
function GetCurrentDirUTF8: String; inline;<br />
function SetCurrentDirUTF8(const NewDir: String): Boolean; inline;<br />
function CreateDirUTF8(const NewDir: String): Boolean; inline;<br />
function RemoveDirUTF8(const Dir: String): Boolean; inline;<br />
function ForceDirectoriesUTF8(const Dir: string): Boolean; inline;<br />
function FileOpenUTF8(Const FileName : string; Mode : Integer) : THandle; inline;<br />
function FileCreateUTF8(Const FileName : string) : THandle; overload; inline;<br />
function FileCreateUTF8(Const FileName : string; Rights: Cardinal) : THandle; overload; inline; <br />
<br />
// environment<br />
function ParamStrUTF8(Param: Integer): string; inline;<br />
function GetEnvironmentStringUTF8(Index: Integer): string; inline;<br />
function GetEnvironmentVariableUTF8(const EnvVar: string): String; inline;<br />
function GetAppConfigDirUTF8(Global: Boolean; Create: boolean = false): string; inline;<br />
function GetAppConfigFileUTF8(Global: Boolean; SubDir: boolean = false; CreateDir: boolean = false): string; inline; <br />
<br />
// other<br />
function SysErrorMessageUTF8(ErrorCode: Integer): String; inline;</div>Gillou58https://wiki.freepascal.org/index.php?title=fileutil/fr&diff=114147fileutil/fr2017-12-07T12:42:41Z<p>Gillou58: </p>
<hr />
<div>{{fileutil}}<br />
<br />
L'unité Lazarus '''fileutil''' contient des fonctions et des procédures pour maintenir la compatibilité avec l'unité FileUtil de Delphi.<br />
Les routines de fichier qui traitent spécialement les noms de fichiers UTF8 sont dans l'unité [[LazFileUtils/fr|LazFileUtils]].<br />
<br />
'''Attention''' : de nombreuses fonctions de cette unité sont marquées comme '''deprecated'''. Avec la version 1.8 de Lazarus, elles sont même inaccessibles par défaut. Il est par conséquent nécessaire d'utiliser soit l'unité '''UTF8''' soit l'unité '''LazFileUtils''' pour la plupart de ces fonctions.<br />
<br />
Les seuls constantes, types, classes et routines encore utilisables sont :<br />
<br />
const<br />
UTF8FileHeader = #$ef#$bb#$bf;<br />
FilenamesCaseSensitive = {$IFDEF CaseInsensitiveFilenames}false{$ELSE}true{$ENDIF};<br />
FilenamesLiteral = {$IFDEF NotLiteralFilenames}false{$ELSE}true{$ENDIF};<br />
[...]<br />
// opérations sur les répertoires et les fichiers<br />
function ComparePhysicalFilenames(const Filename1, Filename2: string): integer;<br />
function CompareFilenames(Filename1: PChar; Len1: integer;<br />
Filename2: PChar; Len2: integer; ResolveLinks: boolean): integer; overload;<br />
function ExtractShortPathNameUTF8(Const FileName : String) : String;<br />
function DeleteDirectory(const DirectoryName: string; OnlyChildren: boolean): boolean;<br />
function ProgramDirectory: string;<br />
<br />
function ExpandUNCFileNameUTF8(const FileName: string): string;<br />
function FileSize(const Filename: string): int64; overload; inline;<br />
function ExtractFileNameWithoutExt(const AFilename: string): string;<br />
function FilenameIsPascalUnit(const Filename: string): boolean;<br />
function CreateAbsoluteSearchPath(const SearchPath, BaseDirectory: string): string;<br />
function CreateAbsolutePath(const Filename, BaseDirectory: string): string;<br />
function FileIsInPath(const Filename, Path: string): boolean;<br />
function FileIsInDirectory(const Filename, Directory: string): boolean;<br />
<br />
function GetAllFilesMask: string; inline;<br />
function GetExeExt: string; inline;<br />
function ReadFileToString(const Filename: string): string;<br />
<br />
// recherche de fichiers<br />
type<br />
TSearchFileInPathFlag = (<br />
sffDontSearchInBasePath, // do not search in BasePath, search only in SearchPath.<br />
sffSearchLoUpCase<br />
);<br />
TSearchFileInPathFlags = set of TSearchFileInPathFlag;<br />
<br />
function SearchFileInPath(const Filename, BasePath, SearchPath,<br />
Delimiter: string; Flags: TSearchFileInPathFlags): string; overload;<br />
function SearchAllFilesInPath(const Filename, BasePath, SearchPath,<br />
Delimiter: string; Flags: TSearchFileInPathFlags): TStrings;<br />
function FindDiskFilename(const Filename: string): string;<br />
function FindDiskFileCaseInsensitive(const Filename: string): string;<br />
function FindDefaultExecutablePath(const Executable: string; const BaseDir: string = ''): string;<br />
<br />
type<br />
<br />
{ TFileIterator }<br />
<br />
TFileIterator = class<br />
private<br />
FPath: String;<br />
FLevel: Integer;<br />
FFileInfo: TSearchRec;<br />
FSearching: Boolean;<br />
function GetFileName: String;<br />
public<br />
procedure Stop;<br />
<br />
function IsDirectory: Boolean;<br />
public<br />
property FileName: String read GetFileName;<br />
property FileInfo: TSearchRec read FFileInfo;<br />
property Level: Integer read FLevel;<br />
property Path: String read FPath;<br />
<br />
property Searching: Boolean read FSearching;<br />
end;<br />
<br />
TFileFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryEnterEvent = procedure (FileIterator: TFileIterator) of object;<br />
<br />
{ TFileSearcher }<br />
<br />
TFileSearcher = class(TFileIterator)<br />
private<br />
FMaskSeparator: char;<br />
FFollowSymLink: Boolean;<br />
FOnFileFound: TFileFoundEvent;<br />
FOnDirectoryFound: TDirectoryFoundEvent;<br />
FOnDirectoryEnter: TDirectoryEnterEvent;<br />
FFileAttribute: Word;<br />
FDirectoryAttribute: Word;<br />
procedure RaiseSearchingError;<br />
protected<br />
procedure DoDirectoryEnter; virtual;<br />
procedure DoDirectoryFound; virtual;<br />
procedure DoFileFound; virtual;<br />
public<br />
constructor Create;<br />
procedure Search(ASearchPath: String; ASearchMask: String = '';<br />
ASearchSubDirs: Boolean = True; CaseSensitive: Boolean = False);<br />
public<br />
property MaskSeparator: char read FMaskSeparator write FMaskSeparator;<br />
property FollowSymLink: Boolean read FFollowSymLink write FFollowSymLink;<br />
property FileAttribute: Word read FFileAttribute write FFileAttribute default faAnyfile;<br />
property DirectoryAttribute: Word read FDirectoryAttribute write FDirectoryAttribute default faDirectory;<br />
property OnDirectoryFound: TDirectoryFoundEvent read FOnDirectoryFound write FOnDirectoryFound;<br />
property OnFileFound: TFileFoundEvent read FOnFileFound write FOnFileFound;<br />
property OnDirectoryEnter: TDirectoryEnterEvent read FOnDirectoryEnter write FOnDirectoryEnter;<br />
end;<br />
<br />
{ TListFileSearcher }<br />
<br />
TListFileSearcher = class(TFileSearcher)<br />
private<br />
FList: TStrings;<br />
protected<br />
procedure DoFileFound; override;<br />
public<br />
constructor Create(AList: TStrings);<br />
end;<br />
<br />
{ TListDirectoriesSearcher }<br />
<br />
TListDirectoriesSearcher = class(TFileSearcher)<br />
private<br />
FDirectoriesList :TStrings;<br />
protected<br />
procedure DoDirectoryFound; override;<br />
public<br />
constructor Create(AList: TStrings);<br />
end;<br />
<br />
function FindAllFiles(const SearchPath: String; SearchMask: String = '';<br />
SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory): TStringList; overload;<br />
procedure FindAllFiles(AList: TStrings; const SearchPath: String;<br />
SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory); overload;<br />
<br />
function FindAllDirectories(const SearchPath: string;<br />
SearchSubDirs: Boolean = True): TStringList; overload;<br />
procedure FindAllDirectories(AList: TStrings; const SearchPath: String;<br />
SearchSubDirs: Boolean = true); overload;<br />
<br />
// drapeaux pour les copies<br />
type<br />
TCopyFileFlag = (<br />
cffOverwriteFile,<br />
cffCreateDestDirectory,<br />
cffPreserveTime<br />
);<br />
TCopyFileFlags = set of TCopyFileFlag;<br />
<br />
// copies<br />
function CopyFile(const SrcFilename, DestFilename: string;<br />
Flags: TCopyFileFlags=[cffOverwriteFile]; ExceptionOnError: Boolean=False): boolean;<br />
function CopyFile(const SrcFilename, DestFilename: string; PreserveTime: boolean; ExceptionOnError: Boolean=False): boolean;<br />
function CopyDirTree(const SourceDir, TargetDir: string; Flags: TCopyFileFlags=[]): Boolean;<br />
<br />
// noms de fichiers<br />
const<br />
PascalFileExt: array[1..3] of string = ('.pas','.pp','.p');<br />
PascalSourceExt: array[1..6] of string = ('.pas','.pp','.p','.lpr','.dpr','.dpk');<br />
<br />
AllDirectoryEntriesMask = '*';<br />
<br />
Ce qui suit ne s'applique que pour les versions antérieures à la version 1.8. La version 1.6.4 mentionne déjà bon nombre de ces fonctions comme '''deprecated'''.<br />
<br />
// file attributes and states<br />
function CompareFilenames(const Filename1, Filename2: string): integer; inline;<br />
function CompareFilenamesIgnoreCase(const Filename1, Filename2: string): integer; inline;<br />
function CompareFilenames(const Filename1, Filename2: string; ResolveLinks: boolean): integer;<br />
function CompareFilenames(Filename1: PChar; Len1: integer; Filename2: PChar; Len2: integer; ResolveLinks: boolean): integer;<br />
function FilenameIsAbsolute(const TheFilename: string):boolean; inline;<br />
function FilenameIsWinAbsolute(const TheFilename: string):boolean; inline;<br />
function FilenameIsUnixAbsolute(const TheFilename: string):boolean; inline;<br />
procedure CheckIfFileIsExecutable(const AFilename: string); inline;<br />
procedure CheckIfFileIsSymlink(const AFilename: string); inline;<br />
function FileIsReadable(const AFilename: string): boolean; inline;<br />
function FileIsWritable(const AFilename: string): boolean; inline;<br />
function FileIsText(const AFilename: string): boolean; inline;<br />
function FileIsText(const AFilename: string; out FileReadable: boolean): boolean; inline;<br />
function FileIsExecutable(const AFilename: string): boolean; inline;<br />
function FileIsSymlink(const AFilename: string): boolean; inline;<br />
function FileIsHardLink(const AFilename: string): boolean; inline;<br />
function FileSize(const Filename: string): int64; overload; inline;<br />
function GetFileDescription(const AFilename: string): string; inline;<br />
function ReadAllLinks(const Filename: string; ExceptionOnError: boolean): string; // if a link is broken returns ''<br />
function TryReadAllLinks(const Filename: string): string; // if a link is broken returns Filename <br />
<br />
// directories<br />
function DirPathExists(const FileName: String): Boolean; inline;<br />
function ForceDirectory(DirectoryName: string): boolean; inline;<br />
function DeleteDirectory(const DirectoryName: string; OnlyChildren: boolean): boolean;<br />
function ProgramDirectory: string;<br />
function DirectoryIsWritable(const DirectoryName: string): boolean; inline;<br />
<br />
// filename parts<br />
function ExtractFileNameOnly(const AFilename: string): string; inline;<br />
function ExtractFileNameWithoutExt(const AFilename: string): string;<br />
function CompareFileExt(const Filename, Ext: string; CaseSensitive: boolean): integer; overload; inline;<br />
function CompareFileExt(const Filename, Ext: string): integer; overload; inline;<br />
function FilenameIsPascalUnit(const Filename: string): boolean;<br />
function AppendPathDelim(const Path: string): string; inline;<br />
function ChompPathDelim(const Path: string): string; inline;<br />
function TrimFilename(const AFilename: string): string; inline;<br />
function CleanAndExpandFilename(const Filename: string): string; inline;<br />
function CleanAndExpandDirectory(const Filename: string): string; inline;<br />
function CreateAbsoluteSearchPath(const SearchPath, BaseDirectory: string): string;<br />
function CreateRelativePath(const Filename, BaseDirectory: string; UsePointDirectory: boolean = false; AlwaysRequireSharedBaseFolder: Boolean = True): string; inline;<br />
function CreateAbsolutePath(const Filename, BaseDirectory: string): string;<br />
function FileIsInPath(const Filename, Path: string): boolean;<br />
function FileIsInDirectory(const Filename, Directory: string): boolean; <br />
<br />
// file search<br />
type<br />
TSearchFileInPathFlag = (<br />
sffDontSearchInBasePath,<br />
sffSearchLoUpCase<br />
);<br />
TSearchFileInPathFlags = set of TSearchFileInPathFlag;<br />
const<br />
AllDirectoryEntriesMask = '*';<br />
<br />
function GetAllFilesMask: string; inline;<br />
function GetExeExt: string; inline;<br />
function SearchFileInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): string;<br />
function SearchAllFilesInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): TStrings;<br />
function FindDiskFilename(const Filename: string): string;<br />
function FindDiskFileCaseInsensitive(const Filename: string): string;<br />
function FindDefaultExecutablePath(const Executable: string; const BaseDir: string = ''): string;<br />
<br />
type<br />
TFileIterator = class<br />
private<br />
FPath: String;<br />
FLevel: Integer;<br />
FFileInfo: TSearchRec;<br />
FSearching: Boolean;<br />
function GetFileName: String;<br />
public<br />
procedure Stop;<br />
function IsDirectory: Boolean;<br />
public<br />
property FileName: String read GetFileName;<br />
property FileInfo: TSearchRec read FFileInfo;<br />
property Level: Integer read FLevel;<br />
property Path: String read FPath;<br />
property Searching: Boolean read FSearching;<br />
end;<br />
<br />
TFileFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryEnterEvent = procedure (FileIterator: TFileIterator) of object;<br />
<br />
TFileSearcher = class(TFileIterator)<br />
private<br />
FMaskSeparator: char;<br />
FFollowSymLink: Boolean;<br />
FOnFileFound: TFileFoundEvent;<br />
FOnDirectoryFound: TDirectoryFoundEvent;<br />
FOnDirectoryEnter: TDirectoryEnterEvent;<br />
FFileAttribute: Word;<br />
FDirectoryAttribute: Word;<br />
procedure RaiseSearchingError;<br />
protected<br />
procedure DoDirectoryEnter; virtual;<br />
procedure DoDirectoryFound; virtual;<br />
procedure DoFileFound; virtual;<br />
public<br />
constructor Create;<br />
procedure Search(const ASearchPath: String; ASearchMask: String = '';<br />
ASearchSubDirs: Boolean = True; CaseSensitive: Boolean = False);<br />
public<br />
property MaskSeparator: char read FMaskSeparator write FMaskSeparator;<br />
property FollowSymLink: Boolean read FFollowSymLink write FFollowSymLink;<br />
property FileAttribute: Word read FFileAttribute write FFileAttribute default faAnyfile;<br />
property DirectoryAttribute: Word read FDirectoryAttribute write FDirectoryAttribute default faDirectory;<br />
property OnDirectoryFound: TDirectoryFoundEvent read FOnDirectoryFound write FOnDirectoryFound;<br />
property OnFileFound: TFileFoundEvent read FOnFileFound write FOnFileFound;<br />
property OnDirectoryEnter: TDirectoryEnterEvent read FOnDirectoryEnter write FOnDirectoryEnter;<br />
end;<br />
<br />
function [[FindAllFiles/fr|FindAllFiles]]( const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True): TStringList;<br />
function FindAllDirectories(const SearchPath: string; SearchSubDirs: Boolean = True): TStringList;<br />
<br />
// Copy a file or a whole directory tree<br />
function [[CopyFile/fr|CopyFile]](const SrcFilename, DestFilename: string; Flags: TCopyFileFlags=[cffOverwriteFile]): boolean;<br />
function [[CopyFile/fr|CopyFile]](const SrcFilename, DestFilename: string; PreserveTime: boolean): boolean;<br />
function CopyDirTree(const SourceDir, TargetDir: string; Flags: TCopyFileFlags=[]): Boolean; <br />
<br />
// file actions<br />
function ReadFileToString(const Filename: string): string;<br />
function GetTempFilename(const Directory, Prefix: string): string; inline; <br />
<br />
// basic functions similar to the RTL but working with UTF-8 instead of the system encoding<br />
// AnsiToUTF8 and UTF8ToAnsi need a widestring manager under Linux, BSD, MacOSX <br />
// but normally these OS use UTF-8 as system encoding so the widestringmanager is not needed.<br />
function NeedRTLAnsi: boolean; inline;// true if system encoding is not UTF-8<br />
procedure SetNeedRTLAnsi(NewValue: boolean); inline;<br />
function UTF8ToSys(const s: string): string; inline;// as UTF8ToAnsi but more independent of widestringmanager<br />
function SysToUTF8(const s: string): string; inline;// as AnsiToUTF8 but more independent of widestringmanager<br />
function ConsoleToUTF8(const s: string): string; inline;// converts OEM encoded string to UTF8 (used with some Windows specific functions )<br />
function UTF8ToConsole(const s: string): string; inline;// converts UTF8 string to console encoding (used by Write, WriteLn)<br />
<br />
// file operations<br />
function FileExistsUTF8(const Filename: string): boolean; inline;<br />
function FileAgeUTF8(const FileName: string): Longint; inline;<br />
function DirectoryExistsUTF8(const Directory: string): Boolean; inline;<br />
function ExpandFileNameUTF8(const FileName: string): string; inline;<br />
function ExpandUNCFileNameUTF8(const FileName: string): string;<br />
function ExtractShortPathNameUTF8(Const FileName : String) : String;<br />
function FindFirstUTF8(const Path: string; Attr: Longint; out Rslt: TSearchRec): Longint; inline;<br />
function FindNextUTF8(var Rslt: TSearchRec): Longint; inline;<br />
procedure FindCloseUTF8(var F: TSearchrec); inline;<br />
function FileSetDateUTF8(const FileName: String; Age: Longint): Longint; inline;<br />
function FileGetAttrUTF8(const FileName: String): Longint; inline;<br />
function FileSetAttrUTF8(const Filename: String; Attr: longint): Longint; inline;<br />
function DeleteFileUTF8(const FileName: String): Boolean; inline;<br />
function RenameFileUTF8(const OldName, NewName: String): Boolean; inline;<br />
function FileSearchUTF8(const Name, DirList : String; ImplicitCurrentDir : Boolean = True): String; inline;<br />
function FileIsReadOnlyUTF8(const FileName: String): Boolean; inline;<br />
function GetCurrentDirUTF8: String; inline;<br />
function SetCurrentDirUTF8(const NewDir: String): Boolean; inline;<br />
function CreateDirUTF8(const NewDir: String): Boolean; inline;<br />
function RemoveDirUTF8(const Dir: String): Boolean; inline;<br />
function ForceDirectoriesUTF8(const Dir: string): Boolean; inline;<br />
function FileOpenUTF8(Const FileName : string; Mode : Integer) : THandle; inline;<br />
function FileCreateUTF8(Const FileName : string) : THandle; overload; inline;<br />
function FileCreateUTF8(Const FileName : string; Rights: Cardinal) : THandle; overload; inline; <br />
<br />
// environment<br />
function ParamStrUTF8(Param: Integer): string; inline;<br />
function GetEnvironmentStringUTF8(Index: Integer): string; inline;<br />
function GetEnvironmentVariableUTF8(const EnvVar: string): String; inline;<br />
function GetAppConfigDirUTF8(Global: Boolean; Create: boolean = false): string; inline;<br />
function GetAppConfigFileUTF8(Global: Boolean; SubDir: boolean = false; CreateDir: boolean = false): string; inline; <br />
<br />
// other<br />
function SysErrorMessageUTF8(ErrorCode: Integer): String; inline;</div>Gillou58https://wiki.freepascal.org/index.php?title=Codetools/fr&diff=114098Codetools/fr2017-12-05T09:19:51Z<p>Gillou58: </p>
<hr />
<div>{{Codetools}}<br />
<br />
== Que sont les outils de code(codetools) ==<br />
<br />
Le paquet "outils de code" est un paquet de Lazarus fournissant des outils pour analyser, explorer, éditer et refactoriser les sources en langage Pascal.<br />
Les outils de code sont un module par eux-mêmes et sont proposés sous la licence GPL. Il existe de nombreux exemples sur comment utiliser les outils de code dans vos propres programmes dans le répertoire components/codetools/examples.<br />
<br />
svn:<br />
*Lazarus : http://svn.freepascal.org/svn/lazarus/trunk<br />
*Seulement les outils de code : http://svn.freepascal.org/svn/lazarus/trunk/components/codetools<br />
<br />
== Utilisation des outils de code sans l'IDE ==<br />
<br />
Vous pouvez utiliser les outils de code sans l'IDE. Ceci peut être utile pour tester un nouvel outil. Un exemple simple est proposé avec <br />
<lazarusdir>/components/codetools/examples/methodjumping.lpi<br />
<br />
Pour tester et trouver les déclarations, les outils de code ont besoin d'analyser les sources, notamment les sources RTL et FCL. <br />
Les exemples utilisent les variables d'environnement suivantes :<br />
<br />
*FPCDIR : chemin des sources FPC, par défaut ''~/freepascal/fpc''. <br />
*PP : chemin de l'exécutable du compilateur (/usr/bin/fpc ou /usr/bin/ppc386 ou C:\lazarus\ppc386.exe). Les codetools ont besoin de demander au compilateurs les paramètres d'exécution. Par défaut, la recherche s'effectue grâce à 'fpc' ''via'' la variable PATH.<br />
*FPCTARGETOS : indique aux codetools de travailler pour un autre système d'exploitation (compilation transversale). Par exemple : linux, freebsd, darwin, win32, win64, wince.<br />
*FPCTARGETCPU : lors d'un travail avec un autre CPU. Par exemple : i386, powerpc, x86_64, arm, sparc.<br />
*LAZARUSDIR: chemin des sources de Lazarus. Utile seulement si vous travaillez avec elles.<br />
<br />
FPC is a very complex project with lots of search paths, include files and macros. The codetools need to know all these paths and macros in order to parse this jungle. To setup all this easily the codetools contain predefined templates for FPC, Lazarus, Delphi and Kylix source directories. <br />
See for a find declaration example<br />
<lazarusdir>/components/codetools/examples/finddeclaration.lpi<br />
<br />
Because the FPC sources contain multiple versions of some units, and the FPC sources changes often, the codetools does not use a fixed path table, but instead scan first the whole FPC directory structure and try to guess, what source is the right for the current TargetOS and TargetCPU. This scan may take a while depending on your disk speed. All examples save the result in '''codetools.config''', so that on next start the scan is skipped. <br />
<br />
Whenever the FPC sources have moved or a unit is renamed, just delete the file '''codetools.config'''. The Lazarus IDE has its own config file and does the rescan, whenever the compiler executable has changed or the user forces a 'Environment > Rescan FPC source directory'.<br />
<br />
== Using the codetools in the IDE with the IDEIntf ==<br />
<br />
See <lazarusdir>/examples/idequickfix/quickfixexample.lpk package. It demonstrates:<br />
* How to write an IDE package.<br />
When You install it will register a Quick Fix item.<br />
* How to write Quick Fix item for compiler messages 'Parameter "Sender" not used'<br />
* How to use the codetools to<br />
* parsing a unit<br />
* conversion of Filename,Line,Column to codetools source position<br />
* finding a codetools node at a cursor position<br />
* finding a procedure node and the begin..end node<br />
* creating a nice insertion position for a statement at the beginning of<br />
the begin..end block<br />
* getting the indentation of a line, so that the new line will<br />
work in sub procedure as well<br />
* inserting code with the codetools<br />
<br />
<br />
{{AutoCategory}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Extending_the_IDE/fr&diff=113963Extending the IDE/fr2017-11-26T11:50:21Z<p>Gillou58: /* Vue d'ensemble */</p>
<hr />
<div>{{Extending the IDE}}<br />
<br />
= Étendre l'IDE =<br />
<br />
== Vue d'ensemble ==<br />
<br />
L'IDE supporte plusieurs types de plugins :<br />
<br />
; Composants : Ce sont les éléments de la palette des composants. Par exemple, TButton peut être employé pour créer des boutons. <br />
<br />
; Éditeurs de composants : Les éditeurs de composants sont employés quand on double-clique sur un composant dans le concepteur. Ils peuvent aussi servir à ajouter un élément au menu surgissant du concepteur quand on clique sur un composant avec le bouton droit de la souris. <br />
<br />
; Éditeurs de propriétés : Ceux-ci sont utilisés par chaque ligne de l'inspecteur d'objet afin de pouvoir établir ou modifier la valeur d'une propriété du composant sélectionné.<br />
<br />
; Experts : Ceux-ci représentent tous les autres types. Ils comprennent les nouveaux éléments d'un menu, les combinaisons de touches pour les raccourcis, ou encore de nouvelles fonctionnalités pour l'IDE.<br />
<br />
<br />
Il y a deux possibilités pour ajouter vos propres plugins à Lazarus : <br />
<br />
# écrire un paquet, l'installer et enregistrer les plugins dans la procédure «register» d'une unité ; <br />
# étendre le code de Lazarus, et envoyer le fichier diff CVS(Concurrent Versions System) à la liste de courriel de Lazarus.<br />
<br />
== Écrire des Composants ==<br />
<br />
ToDo<br />
Conseil: Créer un nouveau composant par l'intermédiaire de l'éditeur de paquet.<br />
<br />
== Écrire un éditeurs de composant ==<br />
<br />
ToDo<br />
Conseil: voir le fichier componenteditors.pas pour des exemples <br />
<br />
== Écrire un éditeurs de propriété ==<br />
<br />
ToDo<br />
Conseil: voir le fichier propedits.pp pour des exemples <br />
<br />
== Traiter les registres d'événement ==<br />
<br />
Il y a plusieurs événements dans l'IDE, pour quelles plugins peuvent ajouter leurs propres traitement. Dans propedits.pp il y a un objet "GlobalDesignHook", qui maintient plusieurs évènements de conception. Chaque événement appelle une liste de traitement. Les traitements par défaut sont ajoutés par l'IDE. Vous pouvez ajouter vos propres traitements avec les méthodes AddHandlerXXX et RemoveHandlerXXX. Ils s'appelleront avant les traitements par défaut. <br />
<br />
Exemples :<br />
<br />
Ajoutez votre traitement (ceci est normalement fait dans le constructeur de votre objet):<br />
GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);<br> <br />
Enlevez votre traitement : <br />
GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);<br><br />
Vous pouvez enlever tous les traitements immédiatement.<br />
Par exemple, c'est une bonne idée d'ajouter cette ligne dans le destructeur de l'objet : <br />
GlobalDesignHook.RemoveAllHandlersForObject(Self);<br />
<br />
Les traitements de GlobalDesignHook : <br />
<br />
// racine de consultation <br />
ChangeLookupRoot<br />
Appelé quand le "LookupRoot" a changé. <br />
Le "LookupRoot" est l'objet du propriétaire des composants actuellement choisis. <br />
Normalement c'est un TForm. <br><br />
// méthodes <br />
CreateMethod<br />
GetMethodName<br />
GetMethods<br />
MethodExists<br />
RenameMethod<br />
ShowMethod<br />
Called<br />
MethodFromAncestor<br />
ChainCall<br><br />
// composants <br />
GetComponent<br />
GetComponentName<br />
GetComponentNames<br />
GetRootClassName<br />
ComponentRenamed<br />
Appelé quand un composant a été renommé.<br />
ComponentAdded<br />
Appelé quand un nouveau composant a été ajouté au LookupRoot <br />
ComponentDeleting<br />
Appelé avant qu'un composant soit libéré. <br />
DeleteComponent<br />
Appelé par l'IDE pour supprimer un composant. <br />
GetSelectedComponents<br />
Obtenir le choix courant des composants.<br><br />
// objets persistants <br />
GetObject<br />
GetObjectName<br />
GetObjectNames<br><br />
// modifing <br />
Modified<br />
Revert<br />
RefreshPropertyValues<br />
<br />
==Ajouter de l'aide pour des sources ==<br />
<br />
Créer d'abord un THelpDatabase :<br />
HelpDB:=TFPDocHTMLHelpDatabase(<br />
HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase',<br />
TFPDocHTMLHelpDatabase,true));<br />
HelpDB.DefaultBaseURL:='http://your.help.org/';<br />
<br />
FPDocNode:=THelpNode.CreateURL(HelpDB,<br />
'Package1 - A new package',<br />
'file://index.html');<br />
HelpDB.TOCNode:=THelpNode.Create(HelpDB,FPDocNode);// once as TOC<br />
DirectoryItem:=THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl',<br />
'*.pp;*.pas',false);// and once as normal page<br />
HelpDB.RegisterItem(DirectoryItem);<br />
<br />
<br />
<br />
{{AutoCategory}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Extending_the_IDE/fr&diff=113962Extending the IDE/fr2017-11-26T11:47:49Z<p>Gillou58: /* Vue d'ensemble */</p>
<hr />
<div>{{Extending the IDE}}<br />
<br />
= Étendre l'IDE =<br />
<br />
== Vue d'ensemble ==<br />
<br />
L'IDE supporte plusieurs types de plugins :<br />
<br />
; Composants : Ce sont les éléments dans la palette composants. Par exemple, TButton peut être employé pour créer des boutons. <br />
<br />
; Éditeurs de composants : Les éditeurs de composants sont employés quand on double-clique sur un composant dans le concepteur. Ils peuvent aussi servir à ajouter un élément au menu surgissant du concepteur quand on clique sur un composant avec le bouton droit de la souris. <br />
<br />
; Éditeurs de propriétés : Ceux-ci sont utilisés par chaque ligne de l'inspecteur d'objet afin de pouvoir établir ou modifier la valeur d'une propriété du composant sélectionné.<br />
<br />
; Experts : Ceux-ci représentent tous les autres types. Ils comprennent les nouveaux éléments d'un menu, les combinaisons de touches pour les raccourcis, ou encore de nouvelles fonctionnalités pour l'IDE.<br />
<br />
<br />
Il y a deux possibilités pour ajouter vos propres plugins à Lazarus : <br />
<br />
# Écrire un paquet, l'installer et enregistrer les plugins dans la procédure «register» d'une unité. <br />
# Étendre le code de Lazarus, et envoyer le fichier diff CVS(Concurrent Versions System) à la liste de courriel de Lazarus.<br />
<br />
== Écrire des Composants ==<br />
<br />
ToDo<br />
Conseil: Créer un nouveau composant par l'intermédiaire de l'éditeur de paquet.<br />
<br />
== Écrire un éditeurs de composant ==<br />
<br />
ToDo<br />
Conseil: voir le fichier componenteditors.pas pour des exemples <br />
<br />
== Écrire un éditeurs de propriété ==<br />
<br />
ToDo<br />
Conseil: voir le fichier propedits.pp pour des exemples <br />
<br />
== Traiter les registres d'événement ==<br />
<br />
Il y a plusieurs événements dans l'IDE, pour quelles plugins peuvent ajouter leurs propres traitement. Dans propedits.pp il y a un objet "GlobalDesignHook", qui maintient plusieurs évènements de conception. Chaque événement appelle une liste de traitement. Les traitements par défaut sont ajoutés par l'IDE. Vous pouvez ajouter vos propres traitements avec les méthodes AddHandlerXXX et RemoveHandlerXXX. Ils s'appelleront avant les traitements par défaut. <br />
<br />
Exemples :<br />
<br />
Ajoutez votre traitement (ceci est normalement fait dans le constructeur de votre objet):<br />
GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);<br> <br />
Enlevez votre traitement : <br />
GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);<br><br />
Vous pouvez enlever tous les traitements immédiatement.<br />
Par exemple, c'est une bonne idée d'ajouter cette ligne dans le destructeur de l'objet : <br />
GlobalDesignHook.RemoveAllHandlersForObject(Self);<br />
<br />
Les traitements de GlobalDesignHook : <br />
<br />
// racine de consultation <br />
ChangeLookupRoot<br />
Appelé quand le "LookupRoot" a changé. <br />
Le "LookupRoot" est l'objet du propriétaire des composants actuellement choisis. <br />
Normalement c'est un TForm. <br><br />
// méthodes <br />
CreateMethod<br />
GetMethodName<br />
GetMethods<br />
MethodExists<br />
RenameMethod<br />
ShowMethod<br />
Called<br />
MethodFromAncestor<br />
ChainCall<br><br />
// composants <br />
GetComponent<br />
GetComponentName<br />
GetComponentNames<br />
GetRootClassName<br />
ComponentRenamed<br />
Appelé quand un composant a été renommé.<br />
ComponentAdded<br />
Appelé quand un nouveau composant a été ajouté au LookupRoot <br />
ComponentDeleting<br />
Appelé avant qu'un composant soit libéré. <br />
DeleteComponent<br />
Appelé par l'IDE pour supprimer un composant. <br />
GetSelectedComponents<br />
Obtenir le choix courant des composants.<br><br />
// objets persistants <br />
GetObject<br />
GetObjectName<br />
GetObjectNames<br><br />
// modifing <br />
Modified<br />
Revert<br />
RefreshPropertyValues<br />
<br />
==Ajouter de l'aide pour des sources ==<br />
<br />
Créer d'abord un THelpDatabase :<br />
HelpDB:=TFPDocHTMLHelpDatabase(<br />
HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase',<br />
TFPDocHTMLHelpDatabase,true));<br />
HelpDB.DefaultBaseURL:='http://your.help.org/';<br />
<br />
FPDocNode:=THelpNode.CreateURL(HelpDB,<br />
'Package1 - A new package',<br />
'file://index.html');<br />
HelpDB.TOCNode:=THelpNode.Create(HelpDB,FPDocNode);// once as TOC<br />
DirectoryItem:=THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl',<br />
'*.pp;*.pas',false);// and once as normal page<br />
HelpDB.RegisterItem(DirectoryItem);<br />
<br />
<br />
<br />
{{AutoCategory}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Extending_the_IDE/fr&diff=113961Extending the IDE/fr2017-11-26T11:46:51Z<p>Gillou58: /* Vue d'ensemble */</p>
<hr />
<div>{{Extending the IDE}}<br />
<br />
= Étendre l'IDE =<br />
<br />
== Vue d'ensemble ==<br />
<br />
L'IDE supporte plusieurs types de plugins :<br />
<br />
; Composants : Ce sont les éléments dans la palette composants. Par exemple, TButton peut être employé pour créer des boutons. <br />
<br />
; Éditeurs de composants : Les éditeurs de composants sont employés quand on double-clique sur un composant dans le concepteur. Ils peuvent aussi servir à ajouter un élément au menu surgissant du concepteur quand on clique sur un composant avec le bouton droit de la souris. <br />
<br />
; Éditeurs de propriétés : Ceux-ci sont utilisés par chaque ligne de l'inspecteur d'objet afin de pouvoir établir ou modifier la valeur d'une propriété du composant sélectionné.<br />
<br />
; Experts : ceux-ci représentent tous les autres types. Ils comprennent les nouveaux éléments d'un menu, les combinaisons de touches pour les raccourcis, ou encore de nouvelles fonctionnalités pour l'IDE.<br />
<br />
<br />
Il y a deux possibilités pour ajouter vos propres plugins à Lazarus : <br />
<br />
# Écrire un paquet, l'installer et enregistrer les plugins dans la procédure «register» d'une unité. <br />
# Étendre le code de Lazarus, et envoyer le fichier diff CVS(Concurrent Versions System) à la liste de courriel de Lazarus.<br />
<br />
== Écrire des Composants ==<br />
<br />
ToDo<br />
Conseil: Créer un nouveau composant par l'intermédiaire de l'éditeur de paquet.<br />
<br />
== Écrire un éditeurs de composant ==<br />
<br />
ToDo<br />
Conseil: voir le fichier componenteditors.pas pour des exemples <br />
<br />
== Écrire un éditeurs de propriété ==<br />
<br />
ToDo<br />
Conseil: voir le fichier propedits.pp pour des exemples <br />
<br />
== Traiter les registres d'événement ==<br />
<br />
Il y a plusieurs événements dans l'IDE, pour quelles plugins peuvent ajouter leurs propres traitement. Dans propedits.pp il y a un objet "GlobalDesignHook", qui maintient plusieurs évènements de conception. Chaque événement appelle une liste de traitement. Les traitements par défaut sont ajoutés par l'IDE. Vous pouvez ajouter vos propres traitements avec les méthodes AddHandlerXXX et RemoveHandlerXXX. Ils s'appelleront avant les traitements par défaut. <br />
<br />
Exemples :<br />
<br />
Ajoutez votre traitement (ceci est normalement fait dans le constructeur de votre objet):<br />
GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);<br> <br />
Enlevez votre traitement : <br />
GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);<br><br />
Vous pouvez enlever tous les traitements immédiatement.<br />
Par exemple, c'est une bonne idée d'ajouter cette ligne dans le destructeur de l'objet : <br />
GlobalDesignHook.RemoveAllHandlersForObject(Self);<br />
<br />
Les traitements de GlobalDesignHook : <br />
<br />
// racine de consultation <br />
ChangeLookupRoot<br />
Appelé quand le "LookupRoot" a changé. <br />
Le "LookupRoot" est l'objet du propriétaire des composants actuellement choisis. <br />
Normalement c'est un TForm. <br><br />
// méthodes <br />
CreateMethod<br />
GetMethodName<br />
GetMethods<br />
MethodExists<br />
RenameMethod<br />
ShowMethod<br />
Called<br />
MethodFromAncestor<br />
ChainCall<br><br />
// composants <br />
GetComponent<br />
GetComponentName<br />
GetComponentNames<br />
GetRootClassName<br />
ComponentRenamed<br />
Appelé quand un composant a été renommé.<br />
ComponentAdded<br />
Appelé quand un nouveau composant a été ajouté au LookupRoot <br />
ComponentDeleting<br />
Appelé avant qu'un composant soit libéré. <br />
DeleteComponent<br />
Appelé par l'IDE pour supprimer un composant. <br />
GetSelectedComponents<br />
Obtenir le choix courant des composants.<br><br />
// objets persistants <br />
GetObject<br />
GetObjectName<br />
GetObjectNames<br><br />
// modifing <br />
Modified<br />
Revert<br />
RefreshPropertyValues<br />
<br />
==Ajouter de l'aide pour des sources ==<br />
<br />
Créer d'abord un THelpDatabase :<br />
HelpDB:=TFPDocHTMLHelpDatabase(<br />
HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase',<br />
TFPDocHTMLHelpDatabase,true));<br />
HelpDB.DefaultBaseURL:='http://your.help.org/';<br />
<br />
FPDocNode:=THelpNode.CreateURL(HelpDB,<br />
'Package1 - A new package',<br />
'file://index.html');<br />
HelpDB.TOCNode:=THelpNode.Create(HelpDB,FPDocNode);// once as TOC<br />
DirectoryItem:=THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl',<br />
'*.pp;*.pas',false);// and once as normal page<br />
HelpDB.RegisterItem(DirectoryItem);<br />
<br />
<br />
<br />
{{AutoCategory}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Extending_the_IDE/fr&diff=113960Extending the IDE/fr2017-11-26T11:46:22Z<p>Gillou58: /* Vue d'ensemble */</p>
<hr />
<div>{{Extending the IDE}}<br />
<br />
= Étendre l'IDE =<br />
<br />
== Vue d'ensemble ==<br />
<br />
L'IDE supporte plusieurs types de plugins :<br />
<br />
; Composants : Ce sont les éléments dans la palette composants. Par exemple, TButton peut être employé pour créer des boutons. <br />
<br />
; Éditeurs de composants : Les éditeurs de composants sont employés quand on double-clique sur un composant dans le concepteur. Ils peuvent aussi servir à ajouter un élément au menu surgissant du concepteur quand on clique sur un composant avec le bouton droit de la souris. <br />
<br />
; Éditeurs de propriétés : Ceux-ci sont utilisés par chaque ligne de l'inspecteur d'objet afin de pouvoir établir ou modifier la valeur d'une propriété du composant sélectionné.<br />
<br />
; Experts : ceux-ci représentent tous les autres types. Ils comprennent les nouveaux éléments d'un menu, les combinaisons de touches pour les raccourcis, ou encore de nouvelles fonctionnalités pour l'IDE.<br />
<br />
<br />
Il y a deux possibilités pour ajouter vos propres plugins à Lazarus : <br />
<br />
# Écrire un paquet, l'installer et enregistrer les plugins dans la procédure «register» d'une unité. <br />
# Étendre le code de Lazarus, et envoyer le fichier diff CVS(Concurrent Versions System) à la liste de courriel de Lazarus.<br />
<br />
Each row in the grid section of the Object Inspector uses a property editor to allow that property's value to be set or altered. <br />
<br />
Experts <br />
Experts encompass all other plugin types. They might register new menu item(s), register short cuts, or extend other IDE features.<br />
<br />
== Écrire des Composants ==<br />
<br />
ToDo<br />
Conseil: Créer un nouveau composant par l'intermédiaire de l'éditeur de paquet.<br />
<br />
== Écrire un éditeurs de composant ==<br />
<br />
ToDo<br />
Conseil: voir le fichier componenteditors.pas pour des exemples <br />
<br />
== Écrire un éditeurs de propriété ==<br />
<br />
ToDo<br />
Conseil: voir le fichier propedits.pp pour des exemples <br />
<br />
== Traiter les registres d'événement ==<br />
<br />
Il y a plusieurs événements dans l'IDE, pour quelles plugins peuvent ajouter leurs propres traitement. Dans propedits.pp il y a un objet "GlobalDesignHook", qui maintient plusieurs évènements de conception. Chaque événement appelle une liste de traitement. Les traitements par défaut sont ajoutés par l'IDE. Vous pouvez ajouter vos propres traitements avec les méthodes AddHandlerXXX et RemoveHandlerXXX. Ils s'appelleront avant les traitements par défaut. <br />
<br />
Exemples :<br />
<br />
Ajoutez votre traitement (ceci est normalement fait dans le constructeur de votre objet):<br />
GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);<br> <br />
Enlevez votre traitement : <br />
GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);<br><br />
Vous pouvez enlever tous les traitements immédiatement.<br />
Par exemple, c'est une bonne idée d'ajouter cette ligne dans le destructeur de l'objet : <br />
GlobalDesignHook.RemoveAllHandlersForObject(Self);<br />
<br />
Les traitements de GlobalDesignHook : <br />
<br />
// racine de consultation <br />
ChangeLookupRoot<br />
Appelé quand le "LookupRoot" a changé. <br />
Le "LookupRoot" est l'objet du propriétaire des composants actuellement choisis. <br />
Normalement c'est un TForm. <br><br />
// méthodes <br />
CreateMethod<br />
GetMethodName<br />
GetMethods<br />
MethodExists<br />
RenameMethod<br />
ShowMethod<br />
Called<br />
MethodFromAncestor<br />
ChainCall<br><br />
// composants <br />
GetComponent<br />
GetComponentName<br />
GetComponentNames<br />
GetRootClassName<br />
ComponentRenamed<br />
Appelé quand un composant a été renommé.<br />
ComponentAdded<br />
Appelé quand un nouveau composant a été ajouté au LookupRoot <br />
ComponentDeleting<br />
Appelé avant qu'un composant soit libéré. <br />
DeleteComponent<br />
Appelé par l'IDE pour supprimer un composant. <br />
GetSelectedComponents<br />
Obtenir le choix courant des composants.<br><br />
// objets persistants <br />
GetObject<br />
GetObjectName<br />
GetObjectNames<br><br />
// modifing <br />
Modified<br />
Revert<br />
RefreshPropertyValues<br />
<br />
==Ajouter de l'aide pour des sources ==<br />
<br />
Créer d'abord un THelpDatabase :<br />
HelpDB:=TFPDocHTMLHelpDatabase(<br />
HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase',<br />
TFPDocHTMLHelpDatabase,true));<br />
HelpDB.DefaultBaseURL:='http://your.help.org/';<br />
<br />
FPDocNode:=THelpNode.CreateURL(HelpDB,<br />
'Package1 - A new package',<br />
'file://index.html');<br />
HelpDB.TOCNode:=THelpNode.Create(HelpDB,FPDocNode);// once as TOC<br />
DirectoryItem:=THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl',<br />
'*.pp;*.pas',false);// and once as normal page<br />
HelpDB.RegisterItem(DirectoryItem);<br />
<br />
<br />
<br />
{{AutoCategory}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Extending_the_IDE/fr&diff=113959Extending the IDE/fr2017-11-26T11:41:40Z<p>Gillou58: /* Vue d'ensemble */</p>
<hr />
<div>{{Extending the IDE}}<br />
<br />
= Étendre l'IDE =<br />
<br />
== Vue d'ensemble ==<br />
<br />
L'IDE supporte plusieurs types de plugins :<br />
<br />
; Composants : Ce sont les éléments dans la palette composants. Par exemple, TButton peut être employé pour créer des boutons. <br />
<br />
; Éditeurs de composants : Les éditeurs de composants sont employés quand on double-clique sur un composant dans le concepteur. Ils peuvent aussi servir à ajouter un élément au menu surgissant du concepteur quand on clique sur un composant avec le bouton droit de la souris. <br />
<br />
; Éditeurs de propriétés : ceux-ci sont utilisés par les lignes de l'inspecteur d'objet. <br />
<br />
; Experts : ceux-ci représentent tous les autres types.<br />
<br />
<br />
Il y a deux possibilités pour ajouter vos propres plugins à Lazarus : <br />
<br />
# Écrire un paquet, l'installer et enregistrer les plugins dans la procédure «register» d'une unité. <br />
# Étendre le code de Lazarus, et envoyer le fichier diff CVS(Concurrent Versions System) à la liste de courriel de Lazarus.<br />
<br />
== Écrire des Composants ==<br />
<br />
ToDo<br />
Conseil: Créer un nouveau composant par l'intermédiaire de l'éditeur de paquet.<br />
<br />
== Écrire un éditeurs de composant ==<br />
<br />
ToDo<br />
Conseil: voir le fichier componenteditors.pas pour des exemples <br />
<br />
== Écrire un éditeurs de propriété ==<br />
<br />
ToDo<br />
Conseil: voir le fichier propedits.pp pour des exemples <br />
<br />
== Traiter les registres d'événement ==<br />
<br />
Il y a plusieurs événements dans l'IDE, pour quelles plugins peuvent ajouter leurs propres traitement. Dans propedits.pp il y a un objet "GlobalDesignHook", qui maintient plusieurs évènements de conception. Chaque événement appelle une liste de traitement. Les traitements par défaut sont ajoutés par l'IDE. Vous pouvez ajouter vos propres traitements avec les méthodes AddHandlerXXX et RemoveHandlerXXX. Ils s'appelleront avant les traitements par défaut. <br />
<br />
Exemples :<br />
<br />
Ajoutez votre traitement (ceci est normalement fait dans le constructeur de votre objet):<br />
GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);<br> <br />
Enlevez votre traitement : <br />
GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);<br><br />
Vous pouvez enlever tous les traitements immédiatement.<br />
Par exemple, c'est une bonne idée d'ajouter cette ligne dans le destructeur de l'objet : <br />
GlobalDesignHook.RemoveAllHandlersForObject(Self);<br />
<br />
Les traitements de GlobalDesignHook : <br />
<br />
// racine de consultation <br />
ChangeLookupRoot<br />
Appelé quand le "LookupRoot" a changé. <br />
Le "LookupRoot" est l'objet du propriétaire des composants actuellement choisis. <br />
Normalement c'est un TForm. <br><br />
// méthodes <br />
CreateMethod<br />
GetMethodName<br />
GetMethods<br />
MethodExists<br />
RenameMethod<br />
ShowMethod<br />
Called<br />
MethodFromAncestor<br />
ChainCall<br><br />
// composants <br />
GetComponent<br />
GetComponentName<br />
GetComponentNames<br />
GetRootClassName<br />
ComponentRenamed<br />
Appelé quand un composant a été renommé.<br />
ComponentAdded<br />
Appelé quand un nouveau composant a été ajouté au LookupRoot <br />
ComponentDeleting<br />
Appelé avant qu'un composant soit libéré. <br />
DeleteComponent<br />
Appelé par l'IDE pour supprimer un composant. <br />
GetSelectedComponents<br />
Obtenir le choix courant des composants.<br><br />
// objets persistants <br />
GetObject<br />
GetObjectName<br />
GetObjectNames<br><br />
// modifing <br />
Modified<br />
Revert<br />
RefreshPropertyValues<br />
<br />
==Ajouter de l'aide pour des sources ==<br />
<br />
Créer d'abord un THelpDatabase :<br />
HelpDB:=TFPDocHTMLHelpDatabase(<br />
HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase',<br />
TFPDocHTMLHelpDatabase,true));<br />
HelpDB.DefaultBaseURL:='http://your.help.org/';<br />
<br />
FPDocNode:=THelpNode.CreateURL(HelpDB,<br />
'Package1 - A new package',<br />
'file://index.html');<br />
HelpDB.TOCNode:=THelpNode.Create(HelpDB,FPDocNode);// once as TOC<br />
DirectoryItem:=THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl',<br />
'*.pp;*.pas',false);// and once as normal page<br />
HelpDB.RegisterItem(DirectoryItem);<br />
<br />
<br />
<br />
{{AutoCategory}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Extending_the_IDE/fr&diff=113958Extending the IDE/fr2017-11-26T11:38:11Z<p>Gillou58: /* Traiter les registre d'évènement */</p>
<hr />
<div>{{Extending the IDE}}<br />
<br />
= Étendre l'IDE =<br />
<br />
== Vue d'ensemble ==<br />
<br />
L'IDE supporte plusieurs types de plugins :<br />
<br />
; Composants : ce sont les éléments dans la palette composants. Par exemple, TButton peut être employé pour créer des boutons. <br />
<br />
; Éditeurs de composants : les éditeurs de composants sont employés quand on double-clique sur un composant dans le concepteur ou pour ajouter quelques éléments au menu automatique du concepteur quand on clique sur un composant. <br />
<br />
; Éditeurs de propriétés : ceux-ci sont utilisés par les lignes de l'inspecteur d'objet. <br />
<br />
; Experts : ceux-ci représentent tous les autres types.<br />
<br />
<br />
Il y a deux possibilités pour ajouter vos propres plugins à Lazarus : <br />
<br />
# Écrire un paquet, l'installer et enregistrer les plugins dans la procédure «register» d'une unité. <br />
# Étendre le code de Lazarus, et envoyer le fichier diff CVS(Concurrent Versions System) à la liste de courriel de Lazarus.<br />
<br />
== Écrire des Composants ==<br />
<br />
ToDo<br />
Conseil: Créer un nouveau composant par l'intermédiaire de l'éditeur de paquet.<br />
<br />
== Écrire un éditeurs de composant ==<br />
<br />
ToDo<br />
Conseil: voir le fichier componenteditors.pas pour des exemples <br />
<br />
== Écrire un éditeurs de propriété ==<br />
<br />
ToDo<br />
Conseil: voir le fichier propedits.pp pour des exemples <br />
<br />
== Traiter les registres d'événement ==<br />
<br />
Il y a plusieurs événements dans l'IDE, pour quelles plugins peuvent ajouter leurs propres traitement. Dans propedits.pp il y a un objet "GlobalDesignHook", qui maintient plusieurs évènements de conception. Chaque événement appelle une liste de traitement. Les traitements par défaut sont ajoutés par l'IDE. Vous pouvez ajouter vos propres traitements avec les méthodes AddHandlerXXX et RemoveHandlerXXX. Ils s'appelleront avant les traitements par défaut. <br />
<br />
Exemples :<br />
<br />
Ajoutez votre traitement (ceci est normalement fait dans le constructeur de votre objet):<br />
GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);<br> <br />
Enlevez votre traitement : <br />
GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);<br><br />
Vous pouvez enlever tous les traitements immédiatement.<br />
Par exemple, c'est une bonne idée d'ajouter cette ligne dans le destructeur de l'objet : <br />
GlobalDesignHook.RemoveAllHandlersForObject(Self);<br />
<br />
Les traitements de GlobalDesignHook : <br />
<br />
// racine de consultation <br />
ChangeLookupRoot<br />
Appelé quand le "LookupRoot" a changé. <br />
Le "LookupRoot" est l'objet du propriétaire des composants actuellement choisis. <br />
Normalement c'est un TForm. <br><br />
// méthodes <br />
CreateMethod<br />
GetMethodName<br />
GetMethods<br />
MethodExists<br />
RenameMethod<br />
ShowMethod<br />
Called<br />
MethodFromAncestor<br />
ChainCall<br><br />
// composants <br />
GetComponent<br />
GetComponentName<br />
GetComponentNames<br />
GetRootClassName<br />
ComponentRenamed<br />
Appelé quand un composant a été renommé.<br />
ComponentAdded<br />
Appelé quand un nouveau composant a été ajouté au LookupRoot <br />
ComponentDeleting<br />
Appelé avant qu'un composant soit libéré. <br />
DeleteComponent<br />
Appelé par l'IDE pour supprimer un composant. <br />
GetSelectedComponents<br />
Obtenir le choix courant des composants.<br><br />
// objets persistants <br />
GetObject<br />
GetObjectName<br />
GetObjectNames<br><br />
// modifing <br />
Modified<br />
Revert<br />
RefreshPropertyValues<br />
<br />
==Ajouter de l'aide pour des sources ==<br />
<br />
Créer d'abord un THelpDatabase :<br />
HelpDB:=TFPDocHTMLHelpDatabase(<br />
HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase',<br />
TFPDocHTMLHelpDatabase,true));<br />
HelpDB.DefaultBaseURL:='http://your.help.org/';<br />
<br />
FPDocNode:=THelpNode.CreateURL(HelpDB,<br />
'Package1 - A new package',<br />
'file://index.html');<br />
HelpDB.TOCNode:=THelpNode.Create(HelpDB,FPDocNode);// once as TOC<br />
DirectoryItem:=THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl',<br />
'*.pp;*.pas',false);// and once as normal page<br />
HelpDB.RegisterItem(DirectoryItem);<br />
<br />
<br />
<br />
{{AutoCategory}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Extending_the_IDE/fr&diff=113957Extending the IDE/fr2017-11-26T11:35:39Z<p>Gillou58: /* Étendre l'IDE */</p>
<hr />
<div>{{Extending the IDE}}<br />
<br />
= Étendre l'IDE =<br />
<br />
== Vue d'ensemble ==<br />
<br />
L'IDE supporte plusieurs types de plugins :<br />
<br />
; Composants : ce sont les éléments dans la palette composants. Par exemple, TButton peut être employé pour créer des boutons. <br />
<br />
; Éditeurs de composants : les éditeurs de composants sont employés quand on double-clique sur un composant dans le concepteur ou pour ajouter quelques éléments au menu automatique du concepteur quand on clique sur un composant. <br />
<br />
; Éditeurs de propriétés : ceux-ci sont utilisés par les lignes de l'inspecteur d'objet. <br />
<br />
; Experts : ceux-ci représentent tous les autres types.<br />
<br />
<br />
Il y a deux possibilités pour ajouter vos propres plugins à Lazarus : <br />
<br />
# Écrire un paquet, l'installer et enregistrer les plugins dans la procédure «register» d'une unité. <br />
# Étendre le code de Lazarus, et envoyer le fichier diff CVS(Concurrent Versions System) à la liste de courriel de Lazarus.<br />
<br />
== Écrire des Composants ==<br />
<br />
ToDo<br />
Conseil: Créer un nouveau composant par l'intermédiaire de l'éditeur de paquet.<br />
<br />
== Écrire un éditeurs de composant ==<br />
<br />
ToDo<br />
Conseil: voir le fichier componenteditors.pas pour des exemples <br />
<br />
== Écrire un éditeurs de propriété ==<br />
<br />
ToDo<br />
Conseil: voir le fichier propedits.pp pour des exemples <br />
<br />
== Traiter les registre d'évènement ==<br />
<br />
Il y a plusieurs évènements dans l'IDE, pour quelles plugins peuvent ajouter leurs propres traitement. Dans propedits.pp il y a un objet "GlobalDesignHook", qui maintient plusieurs évènements de conception. Chaque évènement appelle une liste de traitement. Les traitement par défaut sont ajoutés par l'ide. Vous pouvez ajouter vos propres traitement avec les méthodes AddHandlerXXX et RemoveHandlerXXX. Ils s'appelleront avant les traitements par défaut. <br />
<br />
Exemples:<br />
<br />
Ajouter votre traitement (ceci est normalement fait dans le constructeur de votre objet):<br />
GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);<br> <br />
Enlever votre traitement: <br />
GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);<br><br />
Vous pouvez enlever tous les traitements immédiatement.<br />
Par exemple, c'est une bonne idée d'ajouter cette ligne dans le destructeur de l'objet: <br />
GlobalDesignHook.RemoveAllHandlersForObject(Self);<br />
<br />
Les traitements de GlobalDesignHook : <br />
<br />
// racine de consultation <br />
ChangeLookupRoot<br />
Appelé quand le "LookupRoot" a changé. <br />
Le "LookupRoot" est l'objet du propriétaire des composants actuellement choisis. <br />
Normalement c'est un TForm. <br><br />
// méthodes <br />
CreateMethod<br />
GetMethodName<br />
GetMethods<br />
MethodExists<br />
RenameMethod<br />
ShowMethod<br />
Called<br />
MethodFromAncestor<br />
ChainCall<br><br />
// composants <br />
GetComponent<br />
GetComponentName<br />
GetComponentNames<br />
GetRootClassName<br />
ComponentRenamed<br />
Appelé quand un composant a été renommé<br />
ComponentAdded<br />
Appelé quand un nouveau composant a été ajouté au LookupRoot <br />
ComponentDeleting<br />
Appelé avant q'un composant soit libéré. <br />
DeleteComponent<br />
Appelé par l'IDE pour supprimer un composant. <br />
GetSelectedComponents<br />
Obtenir le choix courant des composants.<br><br />
// objets persistants <br />
GetObject<br />
GetObjectName<br />
GetObjectNames<br><br />
// modifing <br />
Modified<br />
Revert<br />
RefreshPropertyValues<br />
<br />
==Ajouter de l'aide pour des sources ==<br />
<br />
Créer d'abord un THelpDatabase :<br />
HelpDB:=TFPDocHTMLHelpDatabase(<br />
HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase',<br />
TFPDocHTMLHelpDatabase,true));<br />
HelpDB.DefaultBaseURL:='http://your.help.org/';<br />
<br />
FPDocNode:=THelpNode.CreateURL(HelpDB,<br />
'Package1 - A new package',<br />
'file://index.html');<br />
HelpDB.TOCNode:=THelpNode.Create(HelpDB,FPDocNode);// once as TOC<br />
DirectoryItem:=THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl',<br />
'*.pp;*.pas',false);// and once as normal page<br />
HelpDB.RegisterItem(DirectoryItem);<br />
<br />
<br />
<br />
{{AutoCategory}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Extending_the_IDE/fr&diff=113956Extending the IDE/fr2017-11-26T11:34:56Z<p>Gillou58: /* Vue d'ensemble */</p>
<hr />
<div>{{Extending the IDE}}<br />
<br />
= Étendre l'IDE =<br />
<br />
== Vue d'ensemble ==<br />
<br />
L'IDE supporte plusieurs types de plugins :<br />
<br />
; Composants : ce sont les éléments dans la palette composants. Par exemple, TButton peut être employé pour créer des boutons. <br />
<br />
; Éditeurs de composants : les éditeurs de composants sont employés quand on double-clique sur un composant dans le concepteur ou pour ajouter quelques éléments au menu automatique du concepteur quand on clique sur un composant. <br />
<br />
; Éditeurs de propriété : ceux-ci sont utilisés par les lignes de l'inspecteur d'objet. <br />
<br />
; Experts : ceux-ci représentent tous les autres types.<br />
<br />
<br />
Il y a deux possibilités pour ajouter vos propres plugins à Lazarus : <br />
<br />
# Écrire un paquet, l'installer et enregistrer les plugins dans la procédure «register» d'une unité. <br />
# Étendre le code de Lazarus, et envoyer le fichier diff CVS(Concurrent Versions System) à la liste de courriel de Lazarus.<br />
<br />
== Écrire des Composants ==<br />
<br />
ToDo<br />
Conseil: Créer un nouveau composant par l'intermédiaire de l'éditeur de paquet.<br />
<br />
== Écrire un éditeurs de composant ==<br />
<br />
ToDo<br />
Conseil: voir le fichier componenteditors.pas pour des exemples <br />
<br />
== Écrire un éditeurs de propriété ==<br />
<br />
ToDo<br />
Conseil: voir le fichier propedits.pp pour des exemples <br />
<br />
== Traiter les registre d'évènement ==<br />
<br />
Il y a plusieurs évènements dans l'IDE, pour quelles plugins peuvent ajouter leurs propres traitement. Dans propedits.pp il y a un objet "GlobalDesignHook", qui maintient plusieurs évènements de conception. Chaque évènement appelle une liste de traitement. Les traitement par défaut sont ajoutés par l'ide. Vous pouvez ajouter vos propres traitement avec les méthodes AddHandlerXXX et RemoveHandlerXXX. Ils s'appelleront avant les traitements par défaut. <br />
<br />
Exemples:<br />
<br />
Ajouter votre traitement (ceci est normalement fait dans le constructeur de votre objet):<br />
GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);<br> <br />
Enlever votre traitement: <br />
GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);<br><br />
Vous pouvez enlever tous les traitements immédiatement.<br />
Par exemple, c'est une bonne idée d'ajouter cette ligne dans le destructeur de l'objet: <br />
GlobalDesignHook.RemoveAllHandlersForObject(Self);<br />
<br />
Les traitements de GlobalDesignHook : <br />
<br />
// racine de consultation <br />
ChangeLookupRoot<br />
Appelé quand le "LookupRoot" a changé. <br />
Le "LookupRoot" est l'objet du propriétaire des composants actuellement choisis. <br />
Normalement c'est un TForm. <br><br />
// méthodes <br />
CreateMethod<br />
GetMethodName<br />
GetMethods<br />
MethodExists<br />
RenameMethod<br />
ShowMethod<br />
Called<br />
MethodFromAncestor<br />
ChainCall<br><br />
// composants <br />
GetComponent<br />
GetComponentName<br />
GetComponentNames<br />
GetRootClassName<br />
ComponentRenamed<br />
Appelé quand un composant a été renommé<br />
ComponentAdded<br />
Appelé quand un nouveau composant a été ajouté au LookupRoot <br />
ComponentDeleting<br />
Appelé avant q'un composant soit libéré. <br />
DeleteComponent<br />
Appelé par l'IDE pour supprimer un composant. <br />
GetSelectedComponents<br />
Obtenir le choix courant des composants.<br><br />
// objets persistants <br />
GetObject<br />
GetObjectName<br />
GetObjectNames<br><br />
// modifing <br />
Modified<br />
Revert<br />
RefreshPropertyValues<br />
<br />
==Ajouter de l'aide pour des sources ==<br />
<br />
Créer d'abord un THelpDatabase :<br />
HelpDB:=TFPDocHTMLHelpDatabase(<br />
HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase',<br />
TFPDocHTMLHelpDatabase,true));<br />
HelpDB.DefaultBaseURL:='http://your.help.org/';<br />
<br />
FPDocNode:=THelpNode.CreateURL(HelpDB,<br />
'Package1 - A new package',<br />
'file://index.html');<br />
HelpDB.TOCNode:=THelpNode.Create(HelpDB,FPDocNode);// once as TOC<br />
DirectoryItem:=THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl',<br />
'*.pp;*.pas',false);// and once as normal page<br />
HelpDB.RegisterItem(DirectoryItem);<br />
<br />
<br />
<br />
{{AutoCategory}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Data_type/fr&diff=110130Data type/fr2017-06-02T07:36:20Z<p>Gillou58: </p>
<hr />
<div>{{Data type}}<br />
<br />
<!-- Ancienne version remplacée <br />
Un '''type de donnée''' est une classification d'une variable ou d'une constante. Certains types de données sont prédéfinis dans tout compilateur Pascal (parce que vous avez besoin d'eux pour faire tout autre chose), ce sont :<br />
<br />
* [[Byte/fr|byte]] - un nombre non signé variant de 0 à 255.<br />
* [[Boolean/fr|boolean]] - valeur booléenne (True ou False)<br />
* [[Char/fr|char]] - Caractère (sur 1 octet)<br />
* [[Integer/fr|integer]] - un nombre entier. FPC utilise actuellement 4 octets pour stocker des entiers.<br />
* [[Real/fr|real]] - un nombre décimal avec éventuellement un exposant<br />
* [[Cardinal/fr|cardinal]] - un entier non signé positif<br />
* [[Set/fr|set]] - une collection d'éléments apparentés; la taille occupée dépend du nombre d'éléments <br />
* [[Pointer/fr|pointer]] - une référence à un emplacement mémoire, généralement employée pour de l'allocation dynamique de mémoire<br />
* [[Record/fr|record]] - une combinaison des types de données ci-dessus assemblés<br />
* [[Class/fr|class]]<br />
* [[object/fr|object]] - une entité hybride qui peut contenir des données et des routines pour manipuler ces données<br />
<br />
Les autres types de données sont en général construits à partir des types ci-dessus. FPC ajoutes des types de données supplémentaires.<br />
<br><br />
<br><br />
<br />
[[Category:Pascal/fr]]<br />
--><br />
=Informations générales sur les types de données=<br />
Cette page propose une sélection de types de données Free Pascal.<br><br />
Un '' 'type' '' est un modèle pour un [[Data field/fr|champ de données]]. <br><br />
Le type d'un champ de données détermine la façon dont le contenu de ce champ de données doit être interprété par le compilateur et le processeur, notamment la place mémoire occupée par la donnée et les opérations permises dessus.<br><br />
Nous allons passer en revue les types de base de FPC en les regroupant par familles.<br />
<br />
=Types de donnée entier=<br />
==Types non signés==<br />
Les valeurs de ces types ne peuvent contenir que des entiers '''positifs'''.<br />
* [[UInt8/fr|UInt8]] - plage de valeurs : (0 .. 255)<br />
* [[Byte/fr|Byte]] - plage de valeurs : (0 .. 255)<br />
* [[UInt16/fr|UInt16]] - plage de valeurs : (0 .. 65 535)<br />
* [[Word/fr|Word]] - plage de valeurs : (0 .. 65 535)<br />
* [[NativeUInt/fr|NativeUInt]] - plage de valeurs : dépendante du processeur<br />
* [[DWord/fr|DWord]] - correspond au type de donnée Longword<br />
* [[Cardinal/fr|Cardinal]] - correspond au type de donnée Longword<br />
* [[UInt32/fr|UInt32]] - plage de valeurs : (0 .. 4 294 967 295)<br />
* [[Longword/fr|Longword]] - plage de valeurs : (0 .. 4 294 967 295)<br />
* [[UInt64/fr|UInt64]] - plage de valeurs : (0 .. 18 446 744 073 709 551 615)<br />
* [[QWord/fr|QWord]] - plage de valeurs : (0 .. 18 446 744 073 709 551 615)<br />
<br><br />
<br />
==Types signés==<br />
Les valeurs de ces types peuvent contenir des entiers '''positifs''' et '''négatifs'''.<br />
* [[Int8/fr|Int8]] - plage de valeurs : (-128 .. 127)<br />
* [[Shortint/fr|Shortint]] - plage de valeurs : (-128 .. 127)<br />
* [[Int16/fr|Int16]] - plage de valeurs : (-32 768 .. 32 767)<br />
* [[Smallint/fr|Smallint]] - plage de valeurs : (-32 768 .. 32 767)<br />
* [[Integer/fr|Integer]] - correspond au type Smallint ou au type Longint selon le mode de compilation<br />
* [[Int32/fr|Int32]] - plage de valeurs : (-2 147 483 648 .. 2 147 483 647)<br />
* [[NativeInt/fr|NativeInt]] - plage de valeurs : dépendante du processeur<br />
* [[Longint/fr|Longint]] - plage de valeurs : (-2 147 483 648 .. 2 147 483 647)<br />
* [[Int64/fr|Int64]] - plage de valeurs : (-9 223 372 036 854 775 808 .. 9 223 372 036 854 775 807)<br />
<br><br />
<br />
=Types à virgule flottante=<br />
Les types de données à virgule flottante sont les suivants :<br />
# stockage entier positif '''et''' négatif ;<br />
# stockage virgule flottante positif '''et''' négatif.<br />
<br><br />
* [[Single/fr|Single]] - plage de valeurs : (1.5E-45 .. 3.4E38)<br />
* [[Real/fr|Real]] - plage de valeurs : dépendante de la plate-forme<br />
* [[Real48/fr|Real48]] - plage de valeurs : 2.9E-39 .. 1.7E38<br />
* [[Double/fr|Double]] - plage de valeurs : (5.0E-324 .. 1.7E308)<br />
* [[Extended/fr|Extended]] - plage de valeurs : dépendante de la plate-forme<br />
* [[Comp/fr|Comp]] - plage de valeurs : (-2E64+1 .. 2E63-1)<br />
* [[Currency/fr|Currency]] - plage de valeurs : (-922 337 203 685 477.5808 .. 922 337 203 685 477.5807)<br />
<br><br />
<br />
=Types booléens=<br />
Les valeurs de ces types contiennent des valeurs booléennes :<br />
* [[Boolean/fr|Boolean]] - plage de valeurs : (Vrai, Faux)<br />
* [[Bytebool/fr|Bytebool]] - plage de valeurs : (Vrai, Faux)<br />
* [[Wordbool/fr|Wordbool]] - plage de valeurs : (Vrai, Faux)<br />
* [[Longbool/fr|Longbool]] - plage de valeurs : (Vrai, Faux)<br />
<br><br />
<br />
=Types énumérés=<br />
Les valeurs, constantes entières non signées sont nommées dans la déclaration du type.<br />
* [[Enum Type/fr|Type énumérées]] - plage de valeurs : (type entier)<br />
<br/><br />
<br />
=Types caractère=<br />
==Types caractère dans lequel un caractère est codé par un octet==<br />
* [[Char/fr|Char]] - longueur : 1 caractère (8 bits) - représentation : 1 caractère.<br />
* [[Shortstring/fr|ShortString]] - longueur maximale : 255 caractères. La taille est dans le caractère d'indice.<br />
* [[String/fr|String]] - longueur maximale : Shortstring ou Ansistring (selon la directive de compilation $H)<br />
* [[PChar/fr|PChar]] - pointeur vers une chaîne terminée par zéro sans limite de longueur.<br />
* [[Ansistring/fr|AnsiString]] - aucune limite de longueur<br />
* [[Pansichar/fr|PAnsiChar]] - pointeur vers une chaîne terminée par zéro sans limite de longueur<br />
Aperçu des diverses [[Character and string types/fr|types de caractère et String]]<br />
<br><br />
<br />
==Types caractère dans lequel un caractère est codé par deux ou quatre octets==<br />
(L'[[String Encoding/fr|encodage]] du caractère représenté par 2 ou 4 octets dépend du système d'exploitation))<br><br />
* [[Widechar/fr|WideChar]] - représente un caractère encodé sur 2 ou 4 octets<br />
* [[Widestring/fr|WideString]] - aucune limite de taille<br />
* [[Pwidechar/fr|PWideChar]] - pointeur vers une WideString terminée par zéro sans limite de longueur<br />
* [[Unicodechar/fr|UnicodeChar]] - représente un caractère encodé sur 2 ou 4 octets<br />
* [[Unicodestring/fr|UnicodeString]] - aucune limite de taille<br />
* [[Punicodechar/fr|PUnicodeChar]] - pointeur vers une UnicodeString terminée par zéro sans limite de longueur<br />
Aperçu des diverses [[Character and string types/fr|types de caractère et String]]<br />
<br><br />
<br />
=Type variant=<br />
*[[Variant/fr|Variant]]<br />
*[[Olevariant/fr|OleVariant]]<br />
<br><br />
<br />
=Constantes=<br />
*Constantes non typées (type non spécifié dans la déclaration)<br />
**[[Const/fr|Const]] - seuls des types simples (reconnaissables par le compilateur) peuvent être utilisés<br />
*Constantes typées<br />
**[[Const/fr|Const]] - des types simples peuvent être utilisés, ainsi que des enregistrements et des tableaux<br />
*Chaînes de ressource<br />
**Resourcestring - pour les libellés cibles de traduction (non disponible dans tous les modes de compilation))<br />
<br><br />
<br />
=Types structurés=<br />
* [[Array/fr|Array]] - la taille du tableau dépend du type et du nombre d'éléments utilisés<br />
* [[Record/fr|Record]] - une combinaison des types de données ci-dessus (voir le résumé)<br />
* [[Set/fr|Set]] - un ensemble d'éléments énumérables, la taille étant fonction du nombre d'éléments<br />
<br><br />
<br />
=Types intervalles=<br />
* Les [[subrange types/fr|intervalles]] sont des sous-ensembles de types de données de base (entier ou caractère).<br />
<br><br />
<br />
=Pointeur=<br />
* [[Pointer/fr|Pointer]] - taille: celle de Longint ou celle de Int64<br />
<br><br />
<br />
=Classes et Objets=<br />
* [[Object/fr|Object]] - développé pour Turbo Pascal 5.5 sous DOS et un précurseur de type Class<br />
* [[Class/fr|Class]] - développé pour Delphi 1.0 sous Windows et un successeur du type Object<br />
<br></div>Gillou58https://wiki.freepascal.org/index.php?title=Standard_Pascal/fr&diff=110129Standard Pascal/fr2017-06-02T07:27:34Z<p>Gillou58: </p>
<hr />
<div>{{Standard_Pascal}}<br />
<br />
'''Pascal Standard''' est une spécification pour le langage [[Pascal/fr|Pascal]] qui définit le minimum qu'un [[Compiler/fr|compilateur Pascal]] doit fournir pour être un véritable compilateur du langage Pascal. Voici les [[Keyword/fr|mots-clefs]] standard que tout compilateur doit interpréter :<br />
<br />
:[[Begin/fr|begin]] &middot; [[End/fr|end]] &middot; [[For/fr|for]] &middot; [[Goto/fr|goto]] &middot; [[If/fr|if]] &middot; [[Label/fr|label]] &middot; [[Repeat/fr|repeat]] &middot; [[Then/fr|then]] &middot; [[Until/fr|until]] &middot; [[While/fr|while]] &middot; [[Do/fr|do]] &middot; [[Type/fr|type]] &middot; [[Var/fr|var]]<br />
<br />
Les symboles suivants font aussi partie du langage :<br />
<br />
:<nowiki>:=</nowiki> ([[Becomes/fr|devient]]) &middot; = ([[Equal/fr|égal]]) &middot; > ([[Greater than/fr|plus grand que]]) &middot; < ([[Less than/fr|plus petit que]]) <> ([[Not equal/fr|différents]])<br />
<br />
Il y a des mots-clefs qui ne font techniquement pas partie du Pascal Standard mais qui sont utilisés par [[FPC/fr|FPC]] pour ajouter des fonctionnalités telles que l'implémentation d'objets, la compatibilité avec le concept de récupération d'erreur proposé par le C++ ou pour fournir une compatibilité avec le [[Borland Pascal/fr|Borland Pascal]] et les compilateurs plus anciens, ce qui inclut :<br />
<br />
:[[Implementation/fr|implementation]] &middot; [[Finally/fr|finally]] &middot; [[Try/fr|try]] &middot; [[Unit/fr|unit]].<br />
<br />
== Types ==<br />
Les types standard sont : [[Data type/fr]]</div>Gillou58https://wiki.freepascal.org/index.php?title=Standard_Pascal/fr&diff=110128Standard Pascal/fr2017-06-02T07:27:04Z<p>Gillou58: </p>
<hr />
<div>{{Standard_Pascal}}<br />
<br />
'''Pascal Standard''' est une spécification pour le langage [[Pascal/fr|Pascal]] qui définit le minimum qu'un [[Compiler/fr|compilateur Pascal]] doit fournir pour être un véritable compilateur du langage Pascal. Voici les [[Keyword/fr|mots-clefs]] standard que tout compilateur doit interpréter :<br />
<br />
:[[Begin/fr|begin]] &middot; [[End/fr|end]] &middot; [[For/fr|for]] &middot; [[Goto/fr|goto]] &middot; [[If/fr|if]] &middot; [[Label/fr|label]] &middot; [[Repeat/fr|repeat]] &middot; [[Then/fr|then]] &middot; [[Until/fr|until]] &middot; [[While/fr|while]] &middot; [[Do/fr|do]] &middot; [[Type/fr|type]] &middot; [[Var/fr|var]]<br />
<br />
Les symboles suivants font aussi partie du langage :<br />
<br />
:<nowiki>:=</nowiki> ([[Becomes/fr|devient]]) &middot; = ([[Equal/fr|égal]]) &middot; > ([[Greater than/fr|plus grand que]]) &middot; < ([[Less than/fr|plus petit que]]) <> ([[Not equal/fr|différents]])<br />
<br />
Il y a des mots-clefs qui ne font techniquement pas partie du Pascal Standard mais qui sont utilisés par [[FPC/fr|FPC]] pour ajouter des fonctionnalités telles que l'implémentation d'objets, la compatibilité avec le concept de récupération d'erreur proposé par le C++ ou pour fournir une compatibilité avec le [[Borland Pascal/fr|Borland Pascal]] et les compilateurs plus anciens, ce qui inclut :<br />
<br />
:[[Implementation/fr|implementation]] &middot; [[Finally/fr|finally]] &middot; [[Try/fr|try]] &middot; [[Unit/fr|unit]].<br />
<br />
== Types ==<br />
Les types standard sont :[[Data type/fr]]</div>Gillou58https://wiki.freepascal.org/index.php?title=History/fr&diff=110087History/fr2017-05-31T18:21:39Z<p>Gillou58: </p>
<hr />
<div>{{History}}<br />
<br />
Le projet Lazarus trouve ses racines dans le projet Megido. A partir des groupes de discussion de Google et d'autres listes de discussion nous pouvons retrouver les traces laissées par Megido. C'était un projet qui a essayé de réaliser un clone open source de Delphi, en commençant par le code source de Sybil qui était lui-même un clone de Delphi pour l'OS/2, mais dont le concepteur était plus restreint. Megido a démarré en 1998, mais est mort courant 1999, en raison du manque d'attention portée au projet et du manque d'intérêt pour un clone fondé sur Sybil avec les restrictions que cela impliquait.<br />
<br />
Ainsi, Lazarus a démarré au mois de février de l'année 1999. Il a été principalement fondé par trois individus : Cliff Baeseman, Shane Miller, et Michael A. Hess. Des trois fondateurs, seul Michael A. Hess est encore impliqué dans le projet.<br />
<br />
Chacun des trois avait essayé de s'impliquer dans le projet Megido dorénavant dissous. Devant leur frustration ils ont commencé leurs propre projet : Lazarus.<br />
<br />
Ensuite, le membre le plus âgé de l'équipe est [[User:Marc|Marc Weustink]]. Il s'est impliqué dans le projet en août 1999. Marc recherchait une solution Delphi sur Linux (car il n'y en avait aucune alors de la part de Borland), et était également intéressé par Linux en général, d'où l'idée de se joindre au projet Lazarus. A ce moment-là, Lazarus n'était pas beaucoup plus qu'une barre d'outils vide, quelques éléments de menu gtk et quelques articles du noyau gtk. On discutait toujours de l'éditeur. Marc est toujours un contributeur du noyau, l'interface de débogage étant un sous-projet qui lui est très familier.<br />
<br />
Le suivant est [[User:Mattias2|Mattias Gaertner]] qui s'est impliqué en septembre 2000. Avec Mattias dans l'équipe, le projet a fait un pas en avant énorme. Mattias a porté Synedit et a codé de grandes parts des outils de code et du concepteur. Avec ces additions, Lazarus a commencé à revêtir la forme qu'on lui connaît. Trois ans après, Mattias a ajouté le système de paquets et beaucoup d'autres dispositifs de l'EDI. <br />
<br />
[[User:Neli|Micha Nelissen]] a commencé sa contribution en juin 2003, principalement avec l'envoi de patches pour l'interface Win32. Il a utilisé Borland C++ Builder, mais voulait aussi examiner plus de plates-formes. Comme Borland ajoute ses propres extensions propriétaires à C++ pour soutenir sa VCL, la chance que des applications BCB soient portables était mince. Un changement de langage n'était pas vraiment un problème : ainsi, après avoir regardé autour de lui, il a pensé que Lazarus était le plus prometteur. À ce moment-là, Lazarus était basé sur gtk pour Win32 et Linux. Sur Linux, cela fonctionnait très bien, mais sur Win32, c'était bogué. Les utilisateurs de Lazarus demandaient de plus en plus une interface native Win32 et Micha a foncé pour aider à écrire cette nouvelle interface.<br />
<br />
[[User:Vincent|Vincent Snijders]] a découvert Lazarus et FPC pendant l'été 1999 alors qu'il avait venait d'acheter son premier ordinateur Linux et qu'il avait commencé sa thèse qui mettait en œuvre quelques simulations mathématiques écrites en Delphi. Il a suivi le projet et a essayé principalement d'obtenir que Lazarus fonctionne sur Windows. Après avoir été repéré en 2003, il a passé beaucoup d'heures sur Lazarus et a commencé à contribuer avec des patches. Son principal but est faire fonctionner Lazarus sur Windows aussi bien que sur Linux et les [[Lazarus Snapshots Downloads/fr|Instantanés de Lazarus]].<br />
<br />
[todo: d'autres ]</div>Gillou58https://wiki.freepascal.org/index.php?title=History/fr&diff=110086History/fr2017-05-31T18:15:21Z<p>Gillou58: </p>
<hr />
<div>{{History}}<br />
<br />
Le projet Lazarus trouve ses racines dans le projet Megido. A partir des groupes de discussion de Google et d'autres listes de discussion nous pouvons retrouver les traces laissées par Megido. C'était un projet qui a essayé de réaliser un clone open source de Delphi, en commençant par le code source de Sybil qui était lui-même un clone de Delphi pour l'OS/2, mais dont le concepteur était plus restreint. Megido a démarré en 1998, mais est mort courant 1999, en raison du manque d'attention portée au projet et du manque d'intérêt pour un clone fondé sur Sybil avec les restrictions que cela impliquait.<br />
<br />
Ainsi, Lazarus a démarré au mois de février de l'année 1999. Il a été principalement fondé par trois individus : Cliff Baeseman, Shane Miller, et Michael A. Hess. Des trois fondateurs, seulement Michael A. Hess est encore impliqué dans le projet.<br />
<br />
Chacun des trois avait essayé de s'impliquer dans le projet Megido à présent dissous. Devant leur frustration ils ont commencé leurs propre projet, Lazarus.<br />
<br />
Le prochain membre le plus âgé de l'équipe est [[User:Marc|Marc Weustink]]. Il s'est impliqué dans le projet en Août 1999. Marc recherchait une solution Delphi sur Linux (car il n'y en avait aucune alors de Borland), et était également intéressé par Linux en général, donc il s'est joint au projet Lazarus. Lorsque Marc s'est joint, Lazarus n'était pas beaucoup plus qu'une barre d'outils vide, quelques éléments de menu gtk et quelques articles du noyau gtk. On discutait toujours de l'éditeur. Marc est toujours un contributeur du noyau, l'interface de débogage étant son sous-projet comme un animal de compagnie.<br />
<br />
Le suivant est [[User:Mattias2|Mattias Gaertner]] qui s'est impliqué en septembre 2000. Avec Mattias dans l'équipe, le projet a fait un pas en avant énorme. Mattias a porté Synedit et a codé de grandes parts des outils de code et du concepteur. Avec ces additions, Lazarus a commencé à revêtir la forme qu'on lui connaît. Trois ans après, il a ajouté le système de paquet et beaucoup d'autres dispositifs de l'EDI . <br />
<br />
[[User:Neli|Micha Nelissen]] a commencé sa contribution en juin 2003, principalement avec l'envoi de patches pour l'interface win32. Il a utilisé Borland C++ Builder, mais voulait aussi examiner plus de plates-formes. Comme Borland ajoute ses propres extensions propriétaires à C++ pour soutenir sa VCL, la chance que des applications BCB soient portables était mince. Un changement de langage n'était pas vraiment un problème : ainsi, après avoir regardé autour de lui, il a pensé que Lazarus était le plus prometteur. À ce moment-là, Lazarus était basé sur gtk pour Win32 et Linux. Sur Linux, cela fonctionnait très bien, mais sur Win32 c'était bogué. Les utilisateurs de Lazarus demandaient de plus en plus une interface native Win32 et Micha a foncé pour aider à écrire cette nouvelle interface.<br />
<br />
[[User:Vincent|Vincent Snijders]] a découvert Lazarus et FPC pendant l'été 1999, alors qu'il avait juste acheté son premier ordinateur Linux et avait commencé sa thèse qui mettait en œuvre quelques simulations mathématiques écrites en Delphi. Il a suivi le projet et a essayé principalement d'obtenir que Lazarus fonctionne sur Windows. Après avoir été repéré en 2003, il a passé beaucoup d'heures sur Lazarus et a commencé à contribuer avec des patches. Son principal but est faire fonctionner Lazarus sur Windows aussi bien que sur Linux et les [[Lazarus Snapshots Downloads/fr|Instantanés de Lazarus]].<br />
<br />
[todo: d'autres ]</div>Gillou58https://wiki.freepascal.org/index.php?title=Streaming_components/fr&diff=110046Streaming components/fr2017-05-30T08:38:25Z<p>Gillou58: </p>
<hr />
<div>{{Streaming components}}<br />
<br />
== Introduction ==<br />
<br />
Normalement, quand vous voulez stocker des données sur le disque ou le réseau, vous devez écrire le code pour le chargement et l'enregistrement de chaque propriété.<br />
Ce tutoriel décrit comment écrire des classes qui peuvent être chargées et enregistrées à partir de flux sans charge supplémentaire de code de chargement/enregistrement, tout cela en utilisant la '''RTTI'''.<br />
<br />
Vous trouverez un exemple dans les sources de Lazarus démontrant comment enregistrer un '''TGroupBox''' avec un enfant '''TCheckBox''' vers un flux et relire ce flux pour créer une copie des deux composants. Voir <lazaruspath>/examples/componentstreaming/<br />
<br />
En combinaison avec [[RTTI controls/fr|Les contrôles RTTI]], vous pouvez réduire au minimum la quantité de code nécessaire pour connecter les données du programme avec le GUI et le Disque/Réseau.<br />
<br />
== TComponent / TPersistent ==<br />
<br />
La classe '''TPersistent''' est définie dans l'unité '''Classes''' et utilise la directive de compilation '''{$M+}''' . Cette directive dit au compilateur de créer de l'information pendant le temps d'exécution ('''RTTI'''). Lui et tous ses descendants comprennent alors une nouvelle section de classe '''published'''. Les propriétés '''published''' sont visibles comme si elles étaient '''public''', mais leur structure est aussi accessible pendant le temps d'exécution. Cela signifie que toute propriété '''published''' peut être lue et écrite pendant ce temps d'exécution. Par exemple, l'EDI emploie cette technique pour travailler avec des composants dont il n'a jamais entendu parler.<br />
<br />
'''TComponent''' étend les possibilités de '''TPersistent''' par sa capacité à posséder des composants enfants. Cette capacité est importante pour le traitement des flux : un composant est le composant racine (appelé parfois '''lookup root''') qui gère une liste de composants enfants.<br />
<br />
== TReader / TWriter ==<br />
<br />
Ce sont les classes qui permettent d'écrire/de lire un '''TComponent''' vers/depuis un flux (Voir '''CreateLRSReader''' et '''CreateLRSWriter''').<br />
Elles emploient un '''Pilote''' pour lire/écrire dans un format spécial. A l'heure actuelle, il y a un lecteur ('''TLRSObjectReader'''), un outil d'écriture ('''TLRSObjectWriter''') pour le format d'objet binaire défini dans l'unité '''LResources''' et un outil d'écriture ('''TXMLObjectWriter''') pour '''TDOMDocument''' défini dans '''Laz_XMLStreaming'''.<br />
L'unité '''LResources''' contient également des fonctions pour convertir le format binaire en texte et l'inverse ('''LRSObjectBinaryToText''', '''LRSObjectTextToBinary'''). La bibliothèque LCL utilise de préférence le codage '''UTF8''' pour les chaînes de caractères tandis que Delphi préfère '''Widestrings''' . Par conséquent, vous disposez aussi de quelques fonctions de conversion si bien que vous pouvez tout aussi bien travailler avec des données de flux provenant de Lazarus qu'avec des données au format binaire de Delphi.<br />
<br />
== Streaming Collections ==<br />
<br />
Consultez [[TCollection/fr#Streaming]]<br />
<br />
Il s'agit d'un exemple complet qui montre comment utiliser les classes '''TCollectionItem''', '''TCollection''' et les gérer par des flux grâce à '''TComponent'''.<br />
<br />
== Écrire votre propre composant - Partie 1 ==<br />
<br />
Un composant personnalisé peut être aussi simple que :<br />
<br />
type<br />
TMyComponent = class(TComponent)<br />
private<br />
FID: integer;<br />
published<br />
property ID: integer read FID write FID;<br />
end;<br />
<br />
== Écrire un composant dans un flux ==<br />
<br />
L'unité [[doc:lcl/lresources|LResources]] a une fonction pour cela : <br />
procedure WriteComponentAsBinaryToStream(AStream: TStream; AComponent: TComponent);<br />
<br />
Elle écrit un composant dans le format binaire du flux.<br />
Par exemple :<br />
<pre><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
var<br />
AStream: TMemoryStream;<br />
begin<br />
AStream:=TMemoryStream.Create;<br />
try<br />
WriteComponentAsBinaryToStream(AStream,AGroupBox);<br />
... enregistre le flux quelque part ...<br />
finally<br />
AStream.Free;<br />
end;<br />
end;<br />
</pre><br />
<br />
== Lecture d'un composant depuis un flux ==<br />
<br />
L'unité '''LResources''' a une fonction pour cela : <br />
procedure ReadComponentFromBinaryStream(AStream: TStream;<br />
var RootComponent: TComponent; OnFindComponentClass: TFindComponentClassEvent; TheOwner: TComponent = nil);<br />
<br />
* '''AStream''' est le flux contenant un composant au format binaire.<br />
* '''RootComponent''' est soit un composant existant dont les données seront écrasées, soit c'est '''nil''' et un nouveau composant sera créé.<br />
* '''OnFindComponentClass''' est une fonction qui est utilisée par '''TReader''' pour obtenir la classe à partir des noms de classe dans le flux. Par exemple :<br />
<pre><br />
procedure TCompStreamDemoForm.OnFindClass(Reader: TReader;<br />
const AClassName: string; var ComponentClass: TComponentClass);<br />
begin<br />
if CompareText(AClassName,'TGroupBox')=0 then<br />
ComponentClass:=TGroupBox<br />
else if CompareText(AClassName,'TCheckBox')=0 then<br />
ComponentClass:=TCheckBox;<br />
end;<br />
</pre><br />
* '''TheOwner''' est le propriétaire du composant pendant la création d'un nouveau composant.<br />
<br />
== Propriétés pouvant être stockées dans un flux ==<br />
<br />
Il y a quelques limitations concernant les types '''TReader'''/'''TWriter''' qui peuvent être stockés dans un flux :<br />
<br />
* Les types de base sont admis pour un flux : string, integer, char, single, double, extended, byte, word, cardinal, shortint, les pointeurs de méthode, etc. ;<br />
* '''TPersistent''' et ses descendants sont aussi admis pour un flux ;<br />
* Les enregistrements ('''records'''), les objets et les classes ne descendant pas de '''TPersistent''' ne peuvent pas être stockés dans un flux . Pour les stocker dans un flux, vous devez surcharger certaines méthodes de '''TReader'''/'''TWriter'''. Voir ci-dessous [[#Streaming custom Data - DefineProperties|Mise en flux de données courantes - DefineProperties]].<br />
<br />
== Mise en flux de données courantes - DefineProperties. ==<br />
<br />
Vous pouvez mettre en flux des données arbitraires additionnelles en écrasant '''DefineProperties'''. Ceci permet de mettre en flux toutes les données qui n'ont aucun type de base. Par exemple, pour mettre en flux une variable '''FMyRect: TRect''' de votre composant , ajoutez les trois méthodes suivantes à votre composant :<br />
<pre><br />
procedure DefineProperties(Filer: TFiler); override;<br />
procedure ReadMyRect(Reader: TReader);<br />
procedure WriteMyRect(Writer: TWriter);<br />
</pre><br />
<br />
avec le code suivant :<br />
<br />
<pre><br />
procedure TMyComponent.DefineProperties(Filer: TFiler);<br />
var<br />
MyRectMustBeSaved: Boolean;<br />
begin<br />
inherited DefineProperties(Filer);<br />
MyRectMustBeSaved:=(MyRect.Left<>0)<br />
or (MyRect.Top<>0)<br />
or (MyRect.Right<>0)<br />
or (MyRect.Bottom<>0);<br />
Filer.DefineProperty('MyRect',@ReadMyRect,@WriteMyRect,MyRectMustBeSaved);<br />
end;<br />
<br />
procedure TMyComponent.ReadMyRect(Reader: TReader);<br />
begin<br />
with Reader do begin<br />
ReadListBegin;<br />
FMyRect.Left:=ReadInteger;<br />
FMyRect.Top:=ReadInteger;<br />
FMyRect.Right:=ReadInteger;<br />
FMyRect.Bottom:=ReadInteger;<br />
ReadListEnd;<br />
end;<br />
end;<br />
<br />
procedure TMyComponent.WriteMyRect(Writer: TWriter);<br />
begin<br />
with Writer do begin<br />
WriteListBegin;<br />
WriteInteger(FMyRect.Left);<br />
WriteInteger(FMyRect.Top);<br />
WriteInteger(FMyRect.Right);<br />
WriteInteger(FMyRect.Bottom);<br />
WriteListEnd;<br />
end;<br />
end;<br />
</pre><br />
<br />
Cela sauvegardera '''MyRect''' en tant que propriété '''MyRect'''.<br />
<br />
Si vous mettez en flux beaucoup de '''TRect''', vous ne voudrez probablement pas écrire ce code chaque fois.<br />
L'unité '''LResources''' contient un exemple qui montre comment écrire une procédure pour définir une propriété '''rect''' :<br />
procedure DefineRectProperty(Filer: TFiler; const Name: string; ARect, DefaultRect: PRect);<br />
<br />
De cette façon, le code ci-dessus peut être réduit à :<br />
<pre><br />
procedure TMyComponent.DefineProperties(Filer: TFiler);<br />
begin<br />
inherited DefineProperties(Filer);<br />
DefineRectProperty(Filer,'MyRect',@FMyRect,nil);<br />
end;<br />
</pre><br />
<br />
== Écrire votre propre composant - Partie 2 ==<br />
<br />
L'exemple décrit peut être étendu. Ainsi, nous pouvons employer des propriétés arbitraires avec seulement quelques lignes de code :<br />
<pre><br />
type<br />
TMyComponent = class(TComponent)<br />
private<br />
FID: integer;<br />
FRect1: TRect;<br />
FRect2: TRect;<br />
protected<br />
procedure DefineProperties(Filer: TFiler); override;<br />
public<br />
property Rect1: TRect read FRect1 write FRect1;<br />
property Rect2: TRect read FRect2 write FRect2;<br />
published<br />
property ID: integer read FID write FID;<br />
end;<br />
<br />
procedure TMyComponent.DefineProperties(Filer: TFiler);<br />
begin<br />
inherited DefineProperties(Filer);<br />
DefineRectProperty(Filer,'Rect1',@FRect1,nil);<br />
DefineRectProperty(Filer,'Rect2',@FRect2,nil);<br />
end;<br />
</pre><br />
<br />
Ce composant peut maintenant être sauvegardé, chargé ou utilisé par [[RTTI controls/fr|Les contrôles RTTI]].<br />
Vous n'avez pas besoin d'écrire quoi que ce soit d'autre.<br />
<br />
== Écrire et lire des composants depuis/vers LFM ==<br />
<br />
Consultez les fonctions '''ReadComponentFromTextStream''' et '''WriteComponentAsTextToStream''' de l'unité '''lresources''' pour des exemples.<br />
<br />
== Écrire et lire des composants depuis/vers XML ==<br />
<br />
Mettre en flux des composants est simple :<br />
Consultez l'exemple dans lazarus/examples/xmlstreaming/.<br />
<br />
== Noms ==<br />
<br />
* Tous les composants appartenant à un composant ('''Owner''') doivent porter des noms distincts. Il en est de même pour deux fiches possédées par une application ou de deux étiquettes ('''labels''') d'une fiche. Mais deux étiquettes appartenant à deux fiches distinctes peuvent porter le même nom et une fiche peut porter le même nom qu'un de ses enfants.<br />
<br />
* '''TComponent.Name''' peut rester vide et vous pouvez avoir plus d'un composant sans nom. '''TWriter''' écrira la propriété, mais '''TReader''' ne trouvera pas le composant en question si bien que la lecture échouera. Par conséquent, l'inspecteur d'objet de l'EDI ne tolère pas cette situation.<br />
<br />
* Les noms doivent être des identificateurs Pascal corrects ([http://lazarus-ccr.sourceforge.net/docs/rtl/sysutils/isvalidident.html IsValidIdent]).<br />
<br />
* Lors d'une référence à d'autres fiches, tous les composants racines ('''forms''', '''datamodules''', ...) référencés eux-mêmes par d'autres ('''forms''', etc.) doivent porter des noms uniques. Ils n'ont pas besoin d'être possédés par l'application, mais le programmeur doit alors par lui-même vérifier que leurs noms sont uniques. Les fiches et les modules de données peuvent être retrouvés grâce à l'objet '''Screen''' dans lequel toutes les fiches et tous les modules de données s'enregistrent automatiquement..<br />
<br />
* Vous pouvez créer de nombreuses fiches portant le nom '''Form1''' (par exemple, grâce à '''TForm1.Create(nil)'''). Si une '''Form2''' fait référence à '''Form1.OpenDialog''', la première '''Form1''' dans '''Screen''' sera utilisée.<br />
<br />
* Une fiche '''Form1''' et un cadre imbriqué peuvent posséder tous les deux un enfant '''Label1'''. Quand l'étiquette '''Label1''' sera référencée, ce sera de manière univoque pour la fiche entière, donc en incluant les cadres imbriqués. Il est par conséquent vivement recommandé de donner un nom unique à chaque élément.<br />
<br />
* Correction globale : '''TReader''' lit le flux d'un composant. S'il rencontre un cadre imbriqué, un second '''TReader''' est créé afin d'en lire le flux. Ensuite, le lecteur retourne à son point de départ et continue la lecture. Les référence à d'autres composants (par exemple '''Form1.Button1''') sont enregistrées dans une liste de correction dans les classes des unités (Voir [http://lazarus-ccr.sourceforge.net/docs/rtl/classes/getfixupreferencenames.html GetFixupReferenceNames]). Les références sont rectifiées après la lecture.<br />
<br />
* '''TReader''' et '''TWriter''' utilisent le nom spécial '''Owner''' pour se référer au propriétaire en cours.<br />
<br />
== Conclusion ==<br />
<br />
La RTTI est un mécanisme puissant qui peut être employé pour facilement mettre en flux des classes entières et qui évite d'écrire beaucoup de code de chargement/enregistrement pénible.<br />
<br />
Voir également :<br />
<br />
[[RTTI controls/fr|Les contrôles RTTI]]</div>Gillou58https://wiki.freepascal.org/index.php?title=Word/fr&diff=110036Word/fr2017-05-30T08:07:59Z<p>Gillou58: </p>
<hr />
<div>{{Word}}<br />
<br />
Un mot (Word) est un entier 16 bits non signé. Sa valeur va de 0 à 2<sup>16</sup>-1.<br />
<br />
Actuellement, les mots sont rarement employés dans les opérations arithmétiques (parce que les CPU ont des registres 32 ou 64 bits), mais ils sont rencontrés dans quelques API pour coder des drapeaux avec des opérations logiques (comme dans un ensemble, type de donnée inexistant en langage C).<br />
<br />
{{Data types/fr}}</div>Gillou58https://wiki.freepascal.org/index.php?title=QWord/fr&diff=110035QWord/fr2017-05-30T08:04:48Z<p>Gillou58: </p>
<hr />
<div>{{Qword}}<br />
<br/><br />
Plage de valeurs : 0 .. 18 446 744 073 709 551 615<br/><br />
Occupation en mémoire : 8 octets, soit 64 Bits<br/><br />
Propriété : Un [[Data field/fr|champ de donnée]] de [[Data type/fr|type de donnée]] '''Qword''' ne peut recevoir que des valeurs entières positives de la plage indiquée.<br/><br />
Tout autre valeur conduit à une erreur de compilation : le programme ne sera donc pas créé.<br/><br />
Déclaration d'un champ de donnée de type Qword :<br />
<syntaxhighlight><br />
Var <br />
qw: Qword; <br />
</syntaxhighlight><br />
<br/><br />
Exemples d'affectations correctes :<br />
<syntaxhighlight><br />
qw := 0;<br />
qw := 255;<br />
qw := 65535;<br />
qw := 4294967295;<br />
qw := 18446744073709551615;<br />
</syntaxhighlight><br />
<br/><br />
Exemples d'affectations incorrectes :<br />
<syntaxhighlight><br />
qw := '0';<br />
qw := '255';<br />
qw := '65535';<br />
qw := '4294967295';<br />
qw := '18446744073709551615';<br />
</syntaxhighlight><br />
Ces derniers exemples tentent d'affecter des valeurs littérales non entières (string) qui demandent une conversion explicite.<br />
<br/></div>Gillou58https://wiki.freepascal.org/index.php?title=Record/fr&diff=108174Record/fr2017-03-15T17:03:20Z<p>Gillou58: </p>
<hr />
<div>{{Record}}<br />
<br />
Un '''enregistrement''' est un [[Type/fr|type de donnée]] hautement structuré en [[Pascal/fr|Pascal]].<br />
Les enregistrements sont très largement utilisés en Pascal pour regrouper logiquement des éléments de données.<br />
<br />
Alors que de simples structures de données tels les [[Array/fr|tableaux]] ou les [[Set/fr|ensembles]] sont constitués d'éléments tous du même type, un enregistrement peut être constitué d’éléments de types différents et prendre une forme très complexe.<br />
Chaque partie séparée d'un enregistrement est appelé un champ.<br />
<br />
== Déclaration ==<br />
=== Structure fixe ===<br />
<syntaxhighlight><br />
type<br />
TMember = record<br />
firstname, surname : string;<br />
address: array [1..3] of string;<br />
phone: string;<br />
birthdate: TDateTime;<br />
paidCurrentSubscription: boolean<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Structure variable ===<br />
Des structures plus complexes sont possibles, par exemple :<br />
<syntaxhighlight><br />
type<br />
maritalStates = (single, married, widowed, divorced);<br />
TPerson = record<br />
(* PARTIE CONSTANTE *)<br />
(* les enregistrements peuvent être imbriqués *)<br />
name: record<br />
first, middle, last: string;<br />
end;<br />
sex: (male, female);<br />
(* date de naissance *)<br />
dob: TDateTime;<br />
(* PARTIE VARIABLE *)<br />
case maritalStatus: maritalStates of<br />
single: ( );<br />
married, widowed: (marriageDate: TDateTime);<br />
divorced: (marriageDate, divorceDate: TDateTime;<br />
isFirstDivorce: boolean) <br />
end;<br />
</syntaxhighlight><br />
Ce dernier type d'enregistrement est appelé enregistrement avec variantes. La variable (facultative) qui suit le case est appelé discriminant. Le type seul peut être mentionné s'il n'est pas besoin de manipuler le discriminant dans le code.<br />
Dans un enregistrement, on ne peut avoir qu'une seule partie variable qui doit se trouver à la fin de cet enregistrement ; rien n'empêche cependant d'imbriquer des enregistrements avec variantes...<br />
La taille du type est égale à la somme de celle de la partie fixe et de celle de la partie variante la plus grande. Attention : comme les différentes alternatives se superposent en mémoire, l'affectation des champs d'une variante modifie le contenu des champs des autres variantes sans vérifier la cohérence de ces changements.<br />
<br />
=== Enregistrement avancé ===<br />
Un enregistrement avec des [[Method/fr|méthodes]] et des [[Property/fr|propriétés]]. <br />
* Souvenez-vous qu'il faut ajouter la directive de compilation {$MODESWITCH ADVANCEDRECORDS}.<br />
<br />
== Adressage ==<br />
=== Champs ===<br />
On accède aux champs en plaçant un point entre le nom de l'enregistrement et le nom du champ, ainsi :<br />
<syntaxhighlight><br />
a.firstname := 'George';<br />
a.surname := 'Petersen';<br />
a.phone := '789534';<br />
a.paidCurrentSubscription := true;<br />
</syntaxhighlight><br />
<br />
Éventuellement, l'accès aux groupes de champs peut être effectué sans répéter le nom de l'enregistrement à l'aide de la construction [[With/fr|with]] :<br />
<syntaxhighlight><br />
with a do<br />
begin<br />
firstname := 'George';<br />
surname := 'Petersen';<br />
phone := '789534';<br />
paidCurrentSubscription := true<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Instances ===<br />
Un enregistrement est traité par le programme comme une entité entière. Par exemple, un enregistrement entier peut être copié dans un autre de même type à l'aide d'une seule affectation :<br />
<syntaxhighlight><br />
var<br />
a, b: TMember;<br />
<br />
(* programme principal *)<br />
begin<br />
{ ... affecte les valeurs vers le champs de a dans l'enregistrement b .. }<br />
b := a<br />
{ maintenant b contient la copie de a }<br />
{ à ne pas confondre avec les références : }<br />
{ a et b sont des entités différentes de TMember }<br />
end.<br />
</syntaxhighlight><br />
<br />
== Enregistrement constant ==<br />
<br />
<syntaxhighlight><br />
type<br />
//record declaration<br />
TSpecialDay = record<br />
DayName : string;<br />
month : integer;<br />
day : integer;<br />
end;<br />
<br />
const<br />
// TSpecialDay constant<br />
ChristmasDay : TSpecialDay = <br />
(<br />
DayName : 'Christmas Day';<br />
month : 12;<br />
day : 25;<br />
);<br />
</syntaxhighlight><br />
<br />
== Voir aussi ==<br />
* [[Records/fr|Enregistrements]], tutoriel qui couvre les enregistrements.<br />
* [[Object/fr|Object]]<br />
* [[Class/fr|Class]]<br />
<br />
{{Data types/fr}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Record/fr&diff=108173Record/fr2017-03-15T16:58:32Z<p>Gillou58: /* Structure fixe */</p>
<hr />
<div>{{Record}}<br />
<br />
Un '''enregistrement''' est un [[Type/fr|type de donnée]] hautement structuré en [[Pascal/fr|Pascal]].<br />
Les enregistrements sont très largement utilisés en Pascal pour regrouper logiquement des éléments de données.<br />
<br />
Alors que de simples structures de données tels les [[Array/fr|tableaux]] ou les [[Set/fr|ensembles]] sont constitués d'éléments tous du même type, un enregistrement peut être constitué d'un nombre d’éléments de types différents, et peut prendre une forme très complexe.<br />
Chaque partie séparée d'un enregistrement est appelé un champ.<br />
<br />
== Déclaration ==<br />
=== Structure fixe ===<br />
<syntaxhighlight><br />
type<br />
TMember = record<br />
firstname, surname : string;<br />
address: array [1..3] of string;<br />
phone: string;<br />
birthdate: TDateTime;<br />
paidCurrentSubscription: boolean<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Structure variable ===<br />
Des structures plus complexes sont possibles, par exemple :<br />
<syntaxhighlight><br />
type<br />
maritalStates = (single, married, widowed, divorced);<br />
TPerson = record<br />
(* PARTIE CONSTANTE *)<br />
(* of course records may be nested *)<br />
name: record<br />
first, middle, last: string;<br />
end;<br />
sex: (male, female);<br />
(* date of birth *)<br />
dob: TDateTime;<br />
(* PARTIE VARIABLE *)<br />
case maritalStatus: maritalStates of<br />
single: ( );<br />
married, widowed: (marriageDate: TDateTime);<br />
divorced: (marriageDate, divorceDate: TDateTime;<br />
isFirstDivorce: boolean) <br />
end;<br />
</syntaxhighlight><br />
Ce dernier type d'enregistrement est appelé enregistrement avec variantes. La variable, facultative, qui suit le case est appelé discriminant. Le type seul peut être mentionné, s'il n'est pas besoin de manipuler le discriminant dans le code.<br />
Dans un enregistrement, on ne peut avoir qu'une seule partie variable qui doit se trouver à la fin de cet enregistrement ; rien n'empêche cependant d'imbriquer des enregistrements avec variantes...<br />
La taille du type est égale à la somme de celle de la partie fixe et de celle de la partie variante la plus grande. Attention : comme les différentes alternatives se superposent en mémoire, l'affectation des champs d'une variante modifie le contenu des champs des autres variantes sans vérifier la cohérence de ces changements.<br />
<br />
=== Enregistrement avancé ===<br />
Un enregistrement avec des [[Method/fr|méthodes]] et des [[Property/fr|propriétés]]. <br />
* Souvenez-vous qu'il faut ajouter la directive de compilation {$MODESWITCH ADVANCEDRECORDS}.<br />
<br />
== Adressage ==<br />
=== Champs ===<br />
On accède aux champs en plaçant un point entre le nom de l'enregistrement et le nom du champ, ainsi :<br />
<syntaxhighlight><br />
a.firstname := 'George';<br />
a.surname := 'Petersen';<br />
a.phone := '789534';<br />
a.paidCurrentSubscription := true;<br />
</syntaxhighlight><br />
<br />
Éventuellement, l'accès aux groupes de champs peut être effectué sans répéter le nom de l'enregistrement à l'aide de la construction [[With/fr|with]] :<br />
<syntaxhighlight><br />
with a do<br />
begin<br />
firstname := 'George';<br />
surname := 'Petersen';<br />
phone := '789534';<br />
paidCurrentSubscription := true<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Instances ===<br />
Un enregistrement est traité par le programme comme une entité entière. Par exemple, un enregistrement entier peut être copié dans un autre de même type à l'aide d'une seule affectation :<br />
<syntaxhighlight><br />
var<br />
a, b: TMember;<br />
<br />
(* programme principal *)<br />
begin<br />
{ ... affecte les valeurs vers le champs de a dans l'enregistrement b .. }<br />
b := a<br />
{ maintenant b contient la copie de a }<br />
{ à ne pas confondre avec les références : }<br />
{ a et b sont des entités différentes de TMember }<br />
end.<br />
</syntaxhighlight><br />
<br />
== Enregistrement constant ==<br />
<br />
<syntaxhighlight><br />
type<br />
//record declaration<br />
TSpecialDay = record<br />
DayName : string;<br />
month : integer;<br />
day : integer;<br />
end;<br />
<br />
const<br />
// TSpecialDay constant<br />
ChristmasDay : TSpecialDay = <br />
(<br />
DayName : 'Christmas Day';<br />
month : 12;<br />
day : 25;<br />
);<br />
</syntaxhighlight><br />
<br />
== Voir aussi ==<br />
* [[Records/fr|Enregistrements]], tutoriel qui couvre les enregistrements.<br />
* [[Object/fr|Object]]<br />
* [[Class/fr|Class]]<br />
<br />
{{Data types/fr}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Record/fr&diff=108172Record/fr2017-03-15T16:57:43Z<p>Gillou58: /* Champs */</p>
<hr />
<div>{{Record}}<br />
<br />
Un '''enregistrement''' est un [[Type/fr|type de donnée]] hautement structuré en [[Pascal/fr|Pascal]].<br />
Les enregistrements sont très largement utilisés en Pascal pour regrouper logiquement des éléments de données.<br />
<br />
Alors que de simples structures de données tels les [[Array/fr|tableaux]] ou les [[Set/fr|ensembles]] sont constitués d'éléments tous du même type, un enregistrement peut être constitué d'un nombre d’éléments de types différents, et peut prendre une forme très complexe.<br />
Chaque partie séparée d'un enregistrement est appelé un champ.<br />
<br />
== Déclaration ==<br />
=== Structure fixe ===<br />
<syntaxhighlight><br />
type<br />
TMember = record<br />
firstname, surname : string;<br />
address: array [1..3] of string;<br />
phone: string;<br />
birthdate: TDateTime;<br />
paidCurrentSubscription: boolean<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Structure variable ===<br />
Des structures plus complexes sont possibles, par exemple :<br />
<syntaxhighlight><br />
type<br />
maritalStates = (single, married, widowed, divorced);<br />
TPerson = record<br />
(* PARTIE CONSTANTE *)<br />
(* of course records may be nested *)<br />
name: record<br />
first, middle, last: string;<br />
end;<br />
sex: (male, female);<br />
(* date of birth *)<br />
dob: TDateTime;<br />
(* PARTIE VARIABLE *)<br />
case maritalStatus: maritalStates of<br />
single: ( );<br />
married, widowed: (marriageDate: TDateTime);<br />
divorced: (marriageDate, divorceDate: TDateTime;<br />
isFirstDivorce: boolean) <br />
end;<br />
</syntaxhighlight><br />
Ce dernier type d'enregistrement est appelé enregistrement avec variantes. La variable, facultative, qui suit le case est appelé discriminant. Le type seul peut être mentionné, s'il n'est pas besoin de manipuler le discriminant dans le code.<br />
Dans un enregistrement, on ne peut avoir qu'une seule partie variable qui doit se trouver à la fin de cet enregistrement ; rien n'empêche cependant d'imbriquer des enregistrements avec variantes...<br />
La taille du type est égale à la somme de celle de la partie fixe et de celle de la partie variante la plus grande. Attention : comme les différentes alternatives se superposent en mémoire, l'affectation des champs d'une variante modifie le contenu des champs des autres variantes sans vérifier la cohérence de ces changements.<br />
<br />
=== Enregistrement avancé ===<br />
Un enregistrement avec des [[Method/fr|méthodes]] et des [[Property/fr|propriétés]]. <br />
* Souvenez-vous qu'il faut ajouter la directive de compilation {$MODESWITCH ADVANCEDRECORDS}.<br />
<br />
== Adressage ==<br />
=== Champs ===<br />
On accède aux champs en plaçant un point entre le nom de l'enregistrement et le nom du champ, ainsi :<br />
<syntaxhighlight><br />
a.firstname := 'George';<br />
a.surname := 'Petersen';<br />
a.phone := '789534';<br />
a.paidCurrentSubscription := true;<br />
</syntaxhighlight><br />
<br />
Éventuellement, l'accès aux groupes de champs peut être effectué sans répéter le nom de l'enregistrement à l'aide de la construction [[With/fr|with]] :<br />
<syntaxhighlight><br />
with a do<br />
begin<br />
firstname := 'George';<br />
surname := 'Petersen';<br />
phone := '789534';<br />
paidCurrentSubscription := true<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Instances ===<br />
Un enregistrement est traité par le programme comme une entité entière. Par exemple, un enregistrement entier peut être copié dans un autre de même type à l'aide d'une seule affectation :<br />
<syntaxhighlight><br />
var<br />
a, b: TMember;<br />
<br />
(* programme principal *)<br />
begin<br />
{ ... affecte les valeurs vers le champs de a dans l'enregistrement b .. }<br />
b := a<br />
{ maintenant b contient la copie de a }<br />
{ à ne pas confondre avec les références : }<br />
{ a et b sont des entités différentes de TMember }<br />
end.<br />
</syntaxhighlight><br />
<br />
== Enregistrement constant ==<br />
<br />
<syntaxhighlight><br />
type<br />
//record declaration<br />
TSpecialDay = record<br />
DayName : string;<br />
month : integer;<br />
day : integer;<br />
end;<br />
<br />
const<br />
// TSpecialDay constant<br />
ChristmasDay : TSpecialDay = <br />
(<br />
DayName : 'Christmas Day';<br />
month : 12;<br />
day : 25;<br />
);<br />
</syntaxhighlight><br />
<br />
== Voir aussi ==<br />
* [[Records/fr|Enregistrements]], tutoriel qui couvre les enregistrements.<br />
* [[Object/fr|Object]]<br />
* [[Class/fr|Class]]<br />
<br />
{{Data types/fr}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Record/fr&diff=108171Record/fr2017-03-15T16:56:42Z<p>Gillou58: /* Instances */</p>
<hr />
<div>{{Record}}<br />
<br />
Un '''enregistrement''' est un [[Type/fr|type de donnée]] hautement structuré en [[Pascal/fr|Pascal]].<br />
Les enregistrements sont très largement utilisés en Pascal pour regrouper logiquement des éléments de données.<br />
<br />
Alors que de simples structures de données tels les [[Array/fr|tableaux]] ou les [[Set/fr|ensembles]] sont constitués d'éléments tous du même type, un enregistrement peut être constitué d'un nombre d’éléments de types différents, et peut prendre une forme très complexe.<br />
Chaque partie séparée d'un enregistrement est appelé un champ.<br />
<br />
== Déclaration ==<br />
=== Structure fixe ===<br />
<syntaxhighlight><br />
type<br />
TMember = record<br />
firstname, surname : string;<br />
address: array [1..3] of string;<br />
phone: string;<br />
birthdate: TDateTime;<br />
paidCurrentSubscription: boolean<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Structure variable ===<br />
Des structures plus complexes sont possibles, par exemple :<br />
<syntaxhighlight><br />
type<br />
maritalStates = (single, married, widowed, divorced);<br />
TPerson = record<br />
(* PARTIE CONSTANTE *)<br />
(* of course records may be nested *)<br />
name: record<br />
first, middle, last: string;<br />
end;<br />
sex: (male, female);<br />
(* date of birth *)<br />
dob: TDateTime;<br />
(* PARTIE VARIABLE *)<br />
case maritalStatus: maritalStates of<br />
single: ( );<br />
married, widowed: (marriageDate: TDateTime);<br />
divorced: (marriageDate, divorceDate: TDateTime;<br />
isFirstDivorce: boolean) <br />
end;<br />
</syntaxhighlight><br />
Ce dernier type d'enregistrement est appelé enregistrement avec variantes. La variable, facultative, qui suit le case est appelé discriminant. Le type seul peut être mentionné, s'il n'est pas besoin de manipuler le discriminant dans le code.<br />
Dans un enregistrement, on ne peut avoir qu'une seule partie variable qui doit se trouver à la fin de cet enregistrement ; rien n'empêche cependant d'imbriquer des enregistrements avec variantes...<br />
La taille du type est égale à la somme de celle de la partie fixe et de celle de la partie variante la plus grande. Attention : comme les différentes alternatives se superposent en mémoire, l'affectation des champs d'une variante modifie le contenu des champs des autres variantes sans vérifier la cohérence de ces changements.<br />
<br />
=== Enregistrement avancé ===<br />
Un enregistrement avec des [[Method/fr|méthodes]] et des [[Property/fr|propriétés]]. <br />
* Souvenez-vous qu'il faut ajouter la directive de compilation {$MODESWITCH ADVANCEDRECORDS}.<br />
<br />
== Adressage ==<br />
=== Champs ===<br />
On accède aux champs en plaçant un point entre le nom de l'enregistrement et le nom du champ, ainsi :<br />
<syntaxhighlight><br />
a.firstname := 'George';<br />
a.surname := 'Petersen';<br />
a.phone := '789534';<br />
a.paidCurrentSubscription := true;<br />
</syntaxhighlight><br />
<br />
Éventuellement, l'accès aux groupes de champs peut être effectué sans répéter le nom de l'enregistrement à l'aide de la construction [[With/fr|with]] :<br />
<syntaxhighlight><br />
with a do<br />
begin<br />
firstname := 'George';<br />
surname := 'Petersen';<br />
phone := '789534';<br />
paidCurrentSubscription := true<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Instances ===<br />
Un enregistrement est traité par le programme comme une entité entière. Par exemple, un enregistrement entier peut être copié dans un autre de même type à l'aide d'une seule affectation :<br />
<syntaxhighlight><br />
var<br />
a, b: TMember;<br />
<br />
(* programme principal *)<br />
begin<br />
{ ... affecte les valeurs vers le champs de a dans l'enregistrement b .. }<br />
b := a<br />
{ maintenant b contient la copie de a }<br />
{ à ne pas confondre avec les références : }<br />
{ a et b sont des entités différentes de TMember }<br />
end.<br />
</syntaxhighlight><br />
<br />
== Enregistrement constant ==<br />
<br />
<syntaxhighlight><br />
type<br />
//record declaration<br />
TSpecialDay = record<br />
DayName : string;<br />
month : integer;<br />
day : integer;<br />
end;<br />
<br />
const<br />
// TSpecialDay constant<br />
ChristmasDay : TSpecialDay = <br />
(<br />
DayName : 'Christmas Day';<br />
month : 12;<br />
day : 25;<br />
);<br />
</syntaxhighlight><br />
<br />
== Voir aussi ==<br />
* [[Records/fr|Enregistrements]], tutoriel qui couvre les enregistrements.<br />
* [[Object/fr|Object]]<br />
* [[Class/fr|Class]]<br />
<br />
{{Data types/fr}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Record/fr&diff=108170Record/fr2017-03-15T16:55:21Z<p>Gillou58: </p>
<hr />
<div>{{Record}}<br />
<br />
Un '''enregistrement''' est un [[Type/fr|type de donnée]] hautement structuré en [[Pascal/fr|Pascal]].<br />
Les enregistrements sont très largement utilisés en Pascal pour regrouper logiquement des éléments de données.<br />
<br />
Alors que de simples structures de données tels les [[Array/fr|tableaux]] ou les [[Set/fr|ensembles]] sont constitués d'éléments tous du même type, un enregistrement peut être constitué d'un nombre d’éléments de types différents, et peut prendre une forme très complexe.<br />
Chaque partie séparée d'un enregistrement est appelé un champ.<br />
<br />
== Déclaration ==<br />
=== Structure fixe ===<br />
<syntaxhighlight><br />
type<br />
TMember = record<br />
firstname, surname : string;<br />
address: array [1..3] of string;<br />
phone: string;<br />
birthdate: TDateTime;<br />
paidCurrentSubscription: boolean<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Structure variable ===<br />
Des structures plus complexes sont possibles, par exemple :<br />
<syntaxhighlight><br />
type<br />
maritalStates = (single, married, widowed, divorced);<br />
TPerson = record<br />
(* PARTIE CONSTANTE *)<br />
(* of course records may be nested *)<br />
name: record<br />
first, middle, last: string;<br />
end;<br />
sex: (male, female);<br />
(* date of birth *)<br />
dob: TDateTime;<br />
(* PARTIE VARIABLE *)<br />
case maritalStatus: maritalStates of<br />
single: ( );<br />
married, widowed: (marriageDate: TDateTime);<br />
divorced: (marriageDate, divorceDate: TDateTime;<br />
isFirstDivorce: boolean) <br />
end;<br />
</syntaxhighlight><br />
Ce dernier type d'enregistrement est appelé enregistrement avec variantes. La variable, facultative, qui suit le case est appelé discriminant. Le type seul peut être mentionné, s'il n'est pas besoin de manipuler le discriminant dans le code.<br />
Dans un enregistrement, on ne peut avoir qu'une seule partie variable qui doit se trouver à la fin de cet enregistrement ; rien n'empêche cependant d'imbriquer des enregistrements avec variantes...<br />
La taille du type est égale à la somme de celle de la partie fixe et de celle de la partie variante la plus grande. Attention : comme les différentes alternatives se superposent en mémoire, l'affectation des champs d'une variante modifie le contenu des champs des autres variantes sans vérifier la cohérence de ces changements.<br />
<br />
=== Enregistrement avancé ===<br />
Un enregistrement avec des [[Method/fr|méthodes]] et des [[Property/fr|propriétés]]. <br />
* Souvenez-vous qu'il faut ajouter la directive de compilation {$MODESWITCH ADVANCEDRECORDS}.<br />
<br />
== Adressage ==<br />
=== Champs ===<br />
On accède aux champs en plaçant un point entre le nom de l'enregistrement et le nom du champ, ainsi :<br />
<syntaxhighlight><br />
a.firstname := 'George';<br />
a.surname := 'Petersen';<br />
a.phone := '789534';<br />
a.paidCurrentSubscription := true;<br />
</syntaxhighlight><br />
<br />
Éventuellement, l'accès aux groupes de champs peut être effectué sans répéter le nom de l'enregistrement à l'aide de la construction [[With/fr|with]] :<br />
<syntaxhighlight><br />
with a do<br />
begin<br />
firstname := 'George';<br />
surname := 'Petersen';<br />
phone := '789534';<br />
paidCurrentSubscription := true<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Instances ===<br />
Un enregistrement est traité par le programme comme une entité entière. Par exemple, un enregistrement entier peut être copié dans un autre de même type à l'aide d'une seule affectation :<br />
<syntaxhighlight><br />
var<br />
a, b: TMember;<br />
<br />
(* programme principal *)<br />
begin<br />
{ ... affecte les valeurs vers le champs de a dans l'enregistrement b .. }<br />
b := a<br />
{ maintenant b contient la copie de a }<br />
{ à ne pas confondre avec les références : }<br />
{ a et b sont des entités différentes de TMember }<br />
end.<br />
</syntaxhighlight><br />
<br />
== Enregistrement constant ==<br />
<br />
<syntaxhighlight><br />
type<br />
//record declaration<br />
TSpecialDay = record<br />
DayName : string;<br />
month : integer;<br />
day : integer;<br />
end;<br />
<br />
const<br />
// TSpecialDay constant<br />
ChristmasDay : TSpecialDay = <br />
(<br />
DayName : 'Christmas Day';<br />
month : 12;<br />
day : 25;<br />
);<br />
</syntaxhighlight><br />
<br />
== Voir aussi ==<br />
* [[Records/fr|Enregistrements]], tutoriel qui couvre les enregistrements.<br />
* [[Object/fr|Object]]<br />
* [[Class/fr|Class]]<br />
<br />
{{Data types/fr}}</div>Gillou58https://wiki.freepascal.org/index.php?title=Basic_Pascal_Tutorial/Chapter_5/Records/fr&diff=107159Basic Pascal Tutorial/Chapter 5/Records/fr2017-02-09T13:09:33Z<p>Gillou58: </p>
<hr />
<div>{{Records}}<br />
<br />
5E - Enregistrements (auteur: Tao Yue, état : traduit)<br />
<br />
Un enregistrement vous permet de garder ensemble des articles de données dans une structure. Si vous voulez de l'information sur une personne, vous pouvez vouloir le nom, l'âge, la ville, la région et le code postal.<br />
<br />
Pour déclarer un enregistrement, vous devrez utiliser :<br />
<syntaxhighlight><br />
TYPE<br />
TypeName = record<br />
identifierlist1: datatype1;<br />
...<br />
identifierlistn: datatypen;<br />
end;<br />
</syntaxhighlight><br />
<br />
Par exemple :<br />
<syntaxhighlight><br />
type<br />
InfoType = record<br />
Name: string;<br />
Age: integer;<br />
City, State: String;<br />
Zip: integer;<br />
end;<br />
</syntaxhighlight><br />
<br />
Chacun de ces identificateurs <tt>Name, Age, City, State</tt> et <tt>Zip</tt> est référencé comme un champ. Vous accédez à un champ dans une variable par :<br />
<syntaxhighlight><br />
VariableIdentifier.FieldIdentifier<br />
</syntaxhighlight><br />
<br />
Un point sépare la variable du nom du champ.<br />
<br />
Il existe une instruction très utile pour traiter les enregistrements. Si vous allez utiliser une variable enregistrement pour longtemps et que vous ne vous sentez l'envie de taper le nom de la variable encore et encore, vous pouvez éliminer le nom de la variable et utiliser seulement les identificateurs des champs. Vous le faites avec:<br />
<syntaxhighlight><br />
WITH RecordVariable DO<br />
BEGIN<br />
...<br />
END;<br />
</syntaxhighlight><br />
<br />
Example:<br />
<syntaxhighlight><br />
with Info do<br />
begin<br />
Age := 18;<br />
ZIP := 90210;<br />
end;<br />
</syntaxhighlight><br />
<br />
{|style=color-backgroud="white" cellspacing="20"<br />
|[[Multidimensional_arrays/fr|précédent]] <br />
|[[Contents/fr|table des matières]] <br />
|[[Pointers/fr|suivant]]<br />
|}</div>Gillou58https://wiki.freepascal.org/index.php?title=SQLdb_Tutorial0/fr&diff=104534SQLdb Tutorial0/fr2016-10-17T07:18:00Z<p>Gillou58: </p>
<hr />
<div>{{SQLdb Tutorial0}}<br />
[[Category:Français]]<br />
<br />
{{Infobox databases}}<br />
== Introduction ==<br />
<br />
Cet article vous aidera à configurer votre environnement de base de données avec des exemples de tables et de données utilisés dans les tutoriels SQLdb 1, 2, 3 et 4.<br />
<br />
Bien que cette page soit assez longue, vous n'en parcourrez que quelques sections, puisque cet article contient des instructions pour divers systèmes de bases de données.<br />
<br />
Si vous voulez être rapidement opérationnel(le), je suggère que vous installiez le serveur Firebird et la base de données d'exemple comme décrit ci-dessous.<br />
<br />
== Pré-requis ==<br />
Ce tutoriel a été écrit pour être utilisé avec des versions récentes de Lazarus (>= 1.0) ; il devrait aussi convenir pour de plus anciennes versions (0.9.30).<br />
<br />
En outre, vous avez besoin d'une base de données SQL relationnelle comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible version 2.0 ou plus). C'est plus facile si vous utilisez des paramètres standard (par exemple, SYSDBA comme nom d'utilisateur et masterkey comme mot de passe), et si vous avez installé la base de données d'exemple "employee".<br />
<br />
Vous pouvez utiliser une autre base de données (par exemple, Microsoft SQL Server, MySQL, PostgreSQL, Oracle, SQLite, Sybase ASE ou une autre base utilisant ODBC). Veuillez vous assurer de disposer des bibliothèques requises de client base de données (voyez les différents articles du wiki sur les bases de données). Voyez ci-dessous la section '''Firebird ou employee.fdb non installé ?''' pour la manière de configurer vos tables.<br />
<br />
== Installation de Firebird ==<br />
Au cas où vous n'auriez pas encore installé Firebird ou la base de données d'exemple utilisée dans ces tutoriels, vous trouverez des instructions ci-dessous.<br />
<br />
=== Installation du client/serveur Firebird ===<br />
Si vous n'avez encore rien installé, vous pouvez télécharger et exécuter l'installeur sur www.firebirdsql.org, et installer le serveur (par exemple, "32-bit Classic, Superclassic & Superserver").<br />
<br />
=== Bibliothèques de bases de données Firebird sur Windows ===<br />
Après installation sur Windows, les DLLs du client Firebird doivent être présentes ;<br />
* soit dans votre répertoire système (disponibles pour tous les programmes) ;<br />
* soit dans votre répertoire Lazarus (pour la conception dans l'IDE) et dans le répertoire de destination où se trouve l'exécutable (pour exécuter le programme compilé).<br />
<br />
Si vous n'avez pas installé le serveur Firebird, une manière simple d'obtenir les DLLs du client est de télécharger Firebird Embedded 2.5 sur [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Extrayez ces fichiers dans le répertoire de votre application :<br />
<syntaxhighlight lang="bash"><br />
fbclient.dll # uniquement si vous utilisez le serveur<br />
# ou<br />
fbembed.dll # uniquement si vous utilisez Firebird Embedded <br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (le nom d'un client Firebird normal, client-serveur - c'est utile sur de plus anciennes versions de Lazarus). La DLL de Firebird Embedded peut également fonctionner comme un client Firebird normal.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve dans le répertoire de votre projet. Vous pouvez la copier depuis le répertoire examples/empbuild/ du serveur Firebird 2.5.<br />
<br />
Pour finir, compilez votre projet une fois (même s'il est vide), pour créer le répertoire de destination, et copiez les DLLs ainsi que la base de données employee.fdb dans ce répertoire.<br />
<br />
=== Bibliothèques de bases de données Firebird sur d'autres systèmes ===<br />
<br />
Sur Linux/OSX, vous aurez aussi besoin des bibliothèques partagées du client Firebird.<br />
Sur Linux, vous pouvez utiliser le gestionnaire de paquets de votre distribution pour récupérer les paquets du client Firebird ; par exemple, sur Debian :<br />
<syntaxhighlight lang="bash"><br />
aptitude install libfbclient2 firebird-dev # nous avons besoin de la version dev car FPC 2.6 et précédents chercheront libfbclient.so<br />
</syntaxhighlight><br />
<br />
== Firebird ou employee.fdb non installé ? ==<br />
<br />
Si la base de données d'exemple employee n'est pas installée, ou si vous utilisez une base de données différente, voici une version minimale de la table que nous utiliserons (note : vous trouverez ci-dessous des directives pour des bases de données spécifiques).<br />
<br />
=== Création automatique ===<br />
La méthode de configuration la plus simple est de créer une base de données vide sur votre système et de vous y connecter avec le programme utilitaire d'exemple TSQLScriptSample. <br />
Ce programme est inclus dans les versions de développement courantes de Lazarus, dans le répertoire <tt>./examples/database/tsqlscript</tt>, mais il peut également être téléchargé sur : http://svn.freepascal.org/svn/lazarus/trunk/examples/database/tsqlscript/<br />
<br />
Compilez et exécutez le programme, puis connectez-vous à la base de données :<br />
<br />
[[image:tsqlscriptsample connect.png]]<br />
<br />
Cliquez ensuite sur le bouton ''Copy table creation script'', et ''Run script'' :<br />
<br />
[[image:tsqlscriptsample runfirstscript.png]]<br />
<br />
Le programme doit normalement indiquer que l'opération est couronnée de succès.<br />
Faites à présent la même chose pour ''Copy sample data script'', et ''Run script''.<br />
<br />
En cas de problème, vous pouvez essayer les étapes manuelles ci-dessous.<br />
<br />
=== Création manuelle ===<br />
Nous allons créer les tables CUSTOMER et EMPLOYEE qui seront utilisées dans un prochain tutoriel.<br />
<br />
Exécutez ces commandes SQL dans votre éditeur/utilitaire de base de données :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT CT_CUSTOMER_PK PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE EMPLOYEE<br />
(<br />
EMP_NO INTEGER NOT NULL,<br />
FIRST_NAME VARCHAR(15) NOT NULL,<br />
LAST_NAME VARCHAR(20) NOT NULL,<br />
PHONE_EXT VARCHAR(4),<br />
JOB_CODE VARCHAR(5) NOT NULL,<br />
JOB_GRADE INTEGER NOT NULL,<br />
JOB_COUNTRY VARCHAR(15) NOT NULL,<br />
SALARY NUMERIC(10,2) NOT NULL,<br />
CONSTRAINT CT_EMPLOYEE_PK PRIMARY KEY (EMP_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Quelques données pour pouvoir au moins montrer quelque chose... D'abord quelques clients :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (1, 'Michael Design', 'San Diego', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (2, 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (3, 'Klämpfl, Van Canneyt', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (4, 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (5, 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (6, 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (7, 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (8, 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (9, 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (10, 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (11, 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (12, '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (13, 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (14, 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES (15, 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Puis quelques employés :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO employee(emp_no, first_name, last_name, phone_ext, job_code, job_grade, <br />
job_country, salary)<br />
VALUES (1,'William','Shatner','1702','CEO',1,'USA',48000);<br />
INSERT INTO employee(emp_no, first_name, last_name, phone_ext, job_code, job_grade, <br />
job_country, salary)<br />
VALUES (2,'Ivan','Rzeszow','9802','Eng',2,'Russia',38000);<br />
INSERT INTO employee(emp_no, first_name, last_name, phone_ext, job_code, job_grade, <br />
job_country, salary)<br />
VALUES (3,'Erin','Powell','1703','Admin',2,'USA',45368);<br />
</syntaxhighlight><br />
<br />
Créez la base de données, les tables et insérez les données dans votre environnement de bases de données.<br />
<br />
== SQLite ==<br />
Si vous utilisez SQLite, vous pouvez créer la base de données mentionnée plus haut dans le répertoire de votre projet, en lançant l'exécutable SQLite :<br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Copiez et collez à présent les commandes CREATE TABLE et INSERT ci-avant.<br />
Pour tester si les bonnes données sont présentes, entrez cette requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminez votre session avec<br />
<syntaxhighlight lang="SQL"><br />
.quit<br />
</syntaxhighlight><br />
<br />
Un fichier appelé employee.sqlite devrait maintenant être créé dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les DLL/so SQLite requises soient installées - par exemple, sur Windows, sqlite3.dll devrait être présent dans<br />
* votre répertoire Lazarus + projet de destination, ou<br />
* votre répertoire système.<br />
<br />
En outre, si vous avez une DLL SQLite 32 bits, assurez-vous d'avoir la version 32 bits de Lazarus.<br />
<br />
Compilez votre projet une fois (même s'il est vide), pour créer le répertoire de destination, et (sour Windows) copiez-y la DLL ainsi que la base de données employee.sqlite.<br />
<br />
== PostgreSQL ==<br />
Dans cette section, nous partons du principe que vous utilisez un serveur Linux et la console ; les étapes équivalentes peuvent être réalisées sous Windows et avec des outils GUI comme PGAdmin.<br />
<br />
Connectez-vous à votre serveur et basculez vers le compte PostgreSQL :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Créez un utilisateur pour la base de données et pour les tables :<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- bien sûr, mettez un mot de passe à votre goût<br />
-- Quelque chose comme 'CREATE ROLE' devrait s'afficher pour indiquer le succès de l'opération.<br />
-- Pour changer ultérieurement le mot de passe, vous pouvez utiliser quelque chose comme<br />
-- alter user employee with password '<newpasswordhere>';<br />
<br />
-- Nous allons empêcher le mot de passe d'expirer ; si vous souhaitez plus de sécurité, passez cette étape :<br />
ALTER USER employee VALID UNTIL 'infinity'; -- le mot de passe n'expire jamais<br />
<br />
-- Nous allons encore un peu resserrer les choses :<br />
-- ne pas permettre à un utilisateur de créer une base de données ou d'autres utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- restreint la création d'objets<br />
-- Quelque chose comme 'ALTER ROLE' devrait s'afficher pour indiquer le succès de l'opération.<br />
<br />
-- Créons notre base de données :<br />
CREATE DATABASE employee;<br />
-- Quelque chose comme 'CREATE DATABASE' devrait s'afficher pour indiquer le succès de l'opération.<br />
<br />
-- Attribuons tous les privilèges sur la base de données employee à l'utilisateur employee :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- attribue à l'utilisateur toutes les permissions sur la base de données<br />
-- Quelque chose comme 'GRANT' devrait s'afficher pour indiquer le succès de l'opération.<br />
<br />
-- Créons la table customer, utilisant un type de donnée serial - aka autonumber/autoincrement :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no)<br />
);<br />
<br />
-- Créons alors la table employee :<br />
CREATE TABLE EMPLOYEE<br />
(<br />
EMP_NO SERIAL NOT NULL,<br />
FIRST_NAME VARCHAR(15) NOT NULL,<br />
LAST_NAME VARCHAR(20) NOT NULL,<br />
PHONE_EXT VARCHAR(4),<br />
JOB_CODE VARCHAR(5) NOT NULL,<br />
JOB_GRADE INTEGER NOT NULL,<br />
JOB_COUNTRY VARCHAR(15) NOT NULL,<br />
SALARY NUMERIC(10,2) NOT NULL,<br />
CONSTRAINT CT_EMPLOYEE_PK PRIMARY KEY (EMP_NO)<br />
);<br />
<br />
-- À présent, copiez et collez les commandes INSERT de la section ci-dessus pour insérer les données.<br />
<br />
-- Pour tester si les bonnes données sont présentes, entrez cette requête :<br />
SELECT * FROM customer;<br />
-- Vous devriez voir quelques clients.<br />
<br />
-- Sortie de psql :<br />
\q <br />
</syntaxhighlight><br />
<br />
À présent, vous devriez être dans la console, connecté comme utilisateur Postgres.<br />
<br />
Si votre serveur est une autre machine que celle de développement, assurez-vous d'autoriser l'accès réseau à la base de données. Consultez votre documentation PostgreSQL pour les détails, mais quelque chose comme ceci devrait fonctionner :<br />
<syntaxhighlight lang=bash><br />
# Remplacez nano (p.ex. vim, emacs, joe...) et le numéro de version Postgres selon votre environnement<br />
nano /etc/postgresql/8.4/main/pg_hba.conf<br />
</syntaxhighlight><br />
<br />
Vérifiez la présence d'une ligne comme (remplacez 192.168.0.1 par votre propre adresse IP, ou range) :<br />
<syntaxhighlight lang="bash"><br />
# Permet l'accès depuis le réseau local, en utilisant des mots de passe crypyés en MD5 :<br />
host all all 192.168.0.1/24 md5<br />
</syntaxhighlight><br />
<br />
Ou, plus restrictif :<br />
<br />
<syntaxhighlight lang="bash"><br />
# Permet uniquement l'accès réseau à la base de données employee par l'utilisateur employee :<br />
host employee employee 192.168.0.1/24 md5<br />
</syntaxhighlight><br />
<br />
Si une telle ligne n'existe pas, ajoutez-la à la fin, enregistrez et fermez votre éditeur.<br />
Consultez la documentation PostgreSQL pour plus de détails.<br />
<br />
Rechargez les réglages PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
puis<br />
<syntaxhighlight lang=SQL> <br />
SELECT pg_reload_conf(); -- recharge les réglages...<br />
-- ... et retourne au shell :<br />
\q<br />
</syntaxhighlight><br />
<br />
Testez la connexion à PostgreSQL.<br />
<br />
Note : par défaut, PostgreSQL essaie un login ident/unix domain socket qui n'autorise pas les mots de passe. Nous spécifions donc à l'hôte de forcer le login TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Login via TCP/IP. Entrez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les DLL/so PostgreSQL et les autres bibliothèques requises soient installées - par exemple, sur Windows, elles devraient se trouver soit :<br />
* dans votre répertoire Lazarus + projet de destination, soit<br />
* dans votre répertoire système.<br />
<br />
Compilez votre projet une fois (même s'il est vide), pour créer le répertoire de destination, et (sur Windows) copiez-y les DLLs.<br />
<br />
== Fin ==<br />
Maintenant que vous avez configuré votre base de données, vous pouvez aller vers [[SQLdb Tutorial1|le premier "vrai" tutoriel]].<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial1]] : 1re partie de la série de tutoriels sur les bases de données, montrant comment configurer un grid pour afficher les données.<br />
* [[SQLdb Tutorial2]] : 2e partie de la série de tutoriels, montrant l'édition, l'insertion, etc.<br />
* [[SQLdb Tutorial3]] : 3e partie de la série de tutoriels, montrant comment développer pour des bases de données multiples et utiliser une form de login.<br />
* [[SQLdb Tutorial4]] : 4e partie de la série de tutoriels, montrant comment utiliser les data modules.<br />
* [[Lazarus Database Overview]] : Information sur les bases de données supportées par Lazarus. Redirige vers des notes spécifiques à certaines bases de données.<br />
* [[SQLdb Package]] : Information sur le paquetage SQLdb.<br />
* [[SQLdb Programming Reference]] : Une vue d'ensemble de l'interaction entre les composants de bases de données SQLdb.<br />
* [[SqlDBHowto]] : Information sur l'utilisation du paquetage SQLdb.<br />
* [[Working With TSQLQuery]] : Information sur TSQLQuery.<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Gillou58https://wiki.freepascal.org/index.php?title=SQLdb_Programming_Reference/fr&diff=104533SQLdb Programming Reference/fr2016-10-17T07:09:34Z<p>Gillou58: </p>
<hr />
<div>{{SQLdb Programming Reference}}<br />
[[category:Français]]<br />
<br />
{{Infobox databases}}<br />
==Documentation==<br />
Veuillez consulter la documentation officielle sur [http://www.freepascal.org/docs-html/fcl/sqldb/index.html SQLDB documentation]. <br />
<br />
Cet article va tenter de donner davantage de détails sur SQLdb ; toutefois, la documentation officielle fait autorité.<br />
<br />
==Structure des classes==<br />
Le diagramme suivant montre la hiérarchie et les liens entre les PRINCIPAUX composants entrant en jeu dans SQLdb. Il n'est certainement pas exhaustif ni n'utilise de structure "propre" de diagramme, donc ne pensez pas y trouver trop. J'espère qu'il vous aidera à repérer quels morceaux du code source vous devez aller scruter pour vraiment en comprendre le fonctionnement.<br />
<br />
[[Image:Laz SqlDB components.png]]<br />
<br />
====Notes====<br />
* Le lien de TDatabase vers TTransaction s'appelle Transactions. C'est une liste, ce qui implique que plusieurs transactions sont possibles pour une base de données donnée. Toutefois, un nouveau lien est défini de TSQLConnection vers TSQLTransaction, qui est Transaction - une transaction unique par base de données. Cela ne cache pas réellement le lien précédent, mais seul le nouveau lien est publié et il est en général déconseillé d'utiliser le lien de l'ancêtre.<br />
* Certains des liens hérités nécessitent d'être transtypés vers les nouveaux types pour être utilisables. Vous ne pouvez pas appeler SQLQuery.Transaction.Commit, puisque Commit est seulement définie dans TSQLTransaction. Appelez SQLTransaction.Commit, ou "(SQLQuery.Transaction as TSQLTransaction).Commit".<br />
<br />
==Interaction==<br />
===TConnection===<br />
Documentation : [http://www.freepascal.org/docs-html/fcl/sqldb/tsqlconnection.html TSQLConnection documentation]<br />
<br />
Un [[TConnection]] représente une connexion vers une base de données SQL. <br />
Habituellement, vous utiliserez le descendant correspondant à une base de données spécifique (par exemple, TIBConnection pour Interbase/Firebird), mais il est possible d'utiliser TConnection si vous essayez d'écrire des applications indépendantes de toute base de données (note : il est probablement plus avisé d'utiliser [http://www.freepascal.org/docs-html/fcl/sqldb/tsqlconnector.html TSQLConnector]).<br />
Dans cet objet, vous définissez les paramètres de connexion tels que nom d'hôte, nom d'utilisateur et mot de passe.<br />
Finalement, vous vous connectez ou déconnectez (en utilisant la propriété .Active ou .Connected).<br />
<br />
La plupart des bases de données permettent de multiples connexions du même programme/utilisateur.<br />
<br />
===TSQLTransaction===<br />
Documentation : [http://www.freepascal.org/docs-html/fcl/sqldb/tsqltransaction.html TSQLTransaction]<br />
<br />
Cet objet représente une transaction avec la base de données. En pratique, au moins une transaction doit être active pour une base de données, même si vous ne l'utilisez que pour y lire des données.<br />
Lorsque vous utilisez une transaction simple, affectez la propriété TConnection.Transaction à la transaction, pour définir la transaction par défaut pour la base de données ; la propriété TSQLTransaction.Database correspondante devrait alors pointer automatiquement vers la connexion.<br />
<br />
Le fait d'affecter à une [[TSQLTransaction]] .Active/calling .StartTransaction démarre une transaction ; l'appel de .Commit ou .RollBack exécute (sauve) ou ignore (oublie/annule) la transaction. Vous devriez les utiliser pour encadrer vos transactions avec la base de données, à moins que vous utilisiez .Autocommit ou CommitRetaining.<br />
<br />
===TSQLQuery===<br />
Documentation : [http://www.freepascal.org/docs-html/fcl/sqldb/tsqlquery.html TSQLQuery documentation]<br />
<br />
Voir [[Working With TSQLQuery]] pour plus de détails.<br />
<br />
[[TSQLQuery]] est un objet qui contient un dataset issu d'une paire connexion/transaction, utilisant sa propriété SQL pour déterminer quelles données sont transférées de la base de données vers le dataset.<br />
<br />
Lorsque vous l'utilisez, vous devez donc spécifier au moins les propriétés transaction, connexion et SQL.<br />
Le TSQLQuery est un maillon important de la chaîne qui lie les contrôles à la base de données. La propriété SQL détermine quelle requête SELECT est exécutée envers la base de données pour recevoir les données.<br />
FPC essaiera de déterminer quelle commande SQL INSERT, UPDATE et DELETE correspondante doit être utilisée afin d'exécuter les modifications générées par l'utilisateur/programme.<br />
Si nécessaire, le programmeur peut régler cela finement et fixer manuellement les propriétés InsertSQL, UpdateSQL et DeleteSQL.<br />
<br />
===DataSource===<br />
Un objet [[TDataSource]] garde trace d'où se trouvent les composants liés aux données dans un dataset (comme TSQLQuery). <br />
Le programmeur doit spécifier l'objet TSQLQuery correspondant pour que cela fonctionne.<br />
<br />
===Contrôles liés aux données tels DBGrid===<br />
Ces contrôles doivent être liés à une DataSource. Ils possèdent souvent des propriétés indiquant quels champs de la DataSource ils affichent.<br />
<br />
==Data modules==<br />
Les [[Data module]]s peuvent être utilisés pour stocker des composants non visuels tels que '''T*Connection''', '''TSQLTransaction''', '''TSQLQuery''', etc. <br />
Les Data modules vous permettent également de partager des composants entre fiches.<br />
<br />
Voir [[SQLdb Tutorial4]].<br />
<br />
[[Category:Databases]]<br />
[[Category:Lazarus]]</div>Gillou58https://wiki.freepascal.org/index.php?title=for-in_loop/fr&diff=101385for-in loop/fr2016-06-09T09:04:47Z<p>Gillou58: Orthographe et syntaxe</p>
<hr />
<div>{{for-in loop}}<br />
<br />
La construction de boucle "for-in" est prise en charge dans Delphi depuis Delphi 2005. Elle a été mise en œuvre dans FPC 2.4.2.<br />
<br />
== Implémentation Delphi et FPC ==<br />
<br />
Une boucle '''for in''' respecte la syntaxe suivante:<br />
<br />
=== Boucle sur une chaîne ===<br />
<br />
<syntaxhighlight><br />
procedure StringLoop(S: String);<br />
var<br />
C: Char;<br />
begin<br />
for C in S do<br />
DoSomething(C);<br />
end; <br />
</syntaxhighlight><br />
<br />
=== Boucle sur un tableau ===<br />
<br />
<syntaxhighlight><br />
procedure ArrayLoop(A: Array of Byte);<br />
var<br />
B: Byte;<br />
begin<br />
for B in A do<br />
DoSomething(B);<br />
end; <br />
</syntaxhighlight><br />
<br />
=== Boucle sur un ensemble ===<br />
<br />
<syntaxhighlight><br />
type<br />
TColor = (cRed, cGren, cBlue);<br />
TColors = set of TColor;<br />
procedure SetLoop(Colors: TColors);<br />
var<br />
Color: TColor;<br />
begin<br />
for Color in Colors do<br />
DoSomething(Color);<br />
end; <br />
</syntaxhighlight><br />
<br />
=== Traverser un conteneur ===<br />
<br />
Pour travrser une classe conteneur, vous avez besoin d'ajouter un '''énumérateur'''. Un '''Enumérateur''' est une classe construite selon le modèle suivant :<br />
<br />
<syntaxhighlight><br />
TSomeEnumerator = class<br />
public<br />
function MoveNext: Boolean;<br />
property Current: TSomeType;<br />
end;<br />
</syntaxhighlight><br />
<br />
Il faut seulement deux choses pour définir une classe Enumerateur: une méthode '''MoveNext''' qui demande à l'énumérateur d'avancer d'un pas et une propriété '''Current''' qui peut retourner tout type approprié.<br />
<br />
Par la suite, vous devez ajouter la méthode magique '''GetEnumerator''' de la classe conteneur qui retourne un '''énumérateur''' de l'instance.<br />
<br />
Par exemple:<br />
<syntaxhighlight><br />
type<br />
TEnumerableTree = class;<br />
<br />
TTreeEnumerator = class<br />
private<br />
FTree: TEnumerableTree;<br />
FCurrent: TNode;<br />
public<br />
constructor Create(ATree: TEnumerableTree); <br />
function MoveNext: Boolean;<br />
property Current: TNode read FCurrent;<br />
end;<br />
<br />
TEnumerableTree = class<br />
public<br />
function GetEnumerator: TTreeEnumerator;<br />
end;<br />
<br />
constructor TTreeEnumerator.Create(ATree: TEnumerableTree);<br />
begin<br />
inherited Create;<br />
FTree := ATree;<br />
FCurrent := nil;<br />
end;<br />
<br />
function TTreeEnumerator.MoveNext: Boolean;<br />
begin<br />
// pour obtenir le nœud suivant dans l'arbre<br />
if FCurrent = nil then<br />
FCurrent := FTree.GetFirstNode<br />
else<br />
FCurrent := FTree.GetNextNode(FCurrent);<br />
Result := FCurrent <> nil;<br />
end;<br />
<br />
function TEnumerableTree.GetEnumerator: TTreeEnumerator;<br />
begin<br />
Result := TTreeEnumerator.Create(Self);<br />
// Important: l'objet créé est automatiquement libéré par le compilateur après la boucle.<br />
end;<br />
<br />
</syntaxhighlight><br />
<br />
Ensuite, cela vous permet de d'exécuter le code suivant:<br />
<br />
<syntaxhighlight><br />
procedure TreeLoop(ATree: TEnumerableTree);<br />
var<br />
ANode: TNode;<br />
begin<br />
for ANode in ATree do<br />
DoSomething(ANode);<br />
end; <br />
</syntaxhighlight><br />
<br />
Vos trouverez que plusieurs classes de bases (telles que TList, TStrings, TCollection, TComponent ...) ont des énumérateurs intégrés.<br />
<br />
Il est aussi possible de rendre une classe énumérable si vous implémentez l'interface suivante dans votre classe conteneur enumérable:<br />
<syntaxhighlight><br />
IEnumerable = interface(IInterface)<br />
function GetEnumerator: IEnumerator;<br />
end;<br />
</syntaxhighlight><br />
<br />
où <b>IEnumerator</b> est déclarée comme :<br />
<syntaxhighlight><br />
IEnumerator = interface(IInterface)<br />
function GetCurrent: TObject;<br />
function MoveNext: Boolean;<br />
procedure Reset;<br />
property Current: TObject read GetCurrent;<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Enumérateurs multiples pour une classe ===<br />
<br />
Vous pouvez ajouter des énumérateurs supplémentaires à des classes, des objets et des enregistrements.<br />
<br />
Voici un exemple d'ajout d'énumérateur qui traverse un TEnumerableTree en ordre inverse:<br />
<br />
<syntaxhighlight><br />
type<br />
TEnumerableTree = class;<br />
<br />
TTreeEnumerator = class<br />
// ...pour la traversée dans l'ordre, voir ci-dessus...<br />
end;<br />
<br />
TTreeReverseEnumerator = class<br />
private<br />
FTree: TEnumerableTree;<br />
FCurrent: TNode;<br />
public<br />
constructor Create(ATree: TEnumerableTree); <br />
function MoveNext: Boolean;<br />
property Current: TNode read FCurrent;<br />
function GetEnumerator: TTreeReverseEnumerator; // se retourne lui-même<br />
end;<br />
<br />
TEnumerableTree = class<br />
public<br />
function GetEnumerator: TTreeEnumerator;<br />
function GetReverseEnumerator: TTreeReverseEnumerator;<br />
end;<br />
<br />
//...voir ci-dessus l'implémentation de TTreeEnumerator...<br />
<br />
constructor TTreeReverseEnumerator.Create(ATree: TEnumerableTree);<br />
begin<br />
inherited Create;<br />
FTree := ATree;<br />
end;<br />
<br />
function TTreeReverseEnumerator.MoveNext: Boolean;<br />
begin<br />
// some logic to get the next node from a tree in reverse order<br />
if FCurrent = nil then<br />
FCurrent := FTree.GetLastNode<br />
else<br />
FCurrent := FTree.GetPrevNode(FCurrent);<br />
Result := FCurrent <> nil;<br />
end;<br />
<br />
function TTreeReverseEnumerator.GetEnumerator: TTreeReverseEnumerator;<br />
begin<br />
Result := Self;<br />
end;<br />
<br />
function TEnumerableTree.GetReverseEnumerator: TTreeReverseEnumerator;<br />
begin<br />
Result := TTreeReverseEnumerator.Create(Self);<br />
// Note: l'objet est automatiquement supprimé par le compilateur après la boucle.<br />
end;<br />
</syntaxhighlight><br />
<br />
Ensuite vous êtes en mesure d'exécuter le code suivant: <br />
<br />
<syntaxhighlight><br />
procedure TreeLoop(ATree: TEnumerableTree);<br />
var<br />
ANode: TNode;<br />
begin<br />
for ANode in ATree.GetReverseEnumerator do<br />
DoSomething(ANode);<br />
end; <br />
</syntaxhighlight><br />
<br />
== Extensions FPC ==<br />
Les exemples de code suivants illustrent les constructions implémentées uniquement dans FPC ; elles ne sont pas supportées par Delphi.<br />
<br />
=== Traversée de types énumération et intervalle ===<br />
<br />
Dans Delphi, il n'est [http://qc.embarcadero.com/wc/qcmain.aspx?d=106212 pas possible de traverser non plus les types énumérés] ou les intervalles, alors qu'en Free Pascal vous pouvez écrire ce qui suit:<br />
<br />
<syntaxhighlight><br />
type<br />
TColor = (clRed, clBlue, clBlack);<br />
TRange = 'a'..'z';<br />
var<br />
Color: TColor;<br />
ch: Char;<br />
begin<br />
for Color in TColor do<br />
DoSomething(Color);<br />
for ch in TRange do<br />
DoSomethingOther(ch);<br />
end.<br />
</syntaxhighlight><br />
<br />
=== Déclarer des énumérateurs ===<br />
<br />
Il n'est pas non plus possible dans Delphi d'ajouter un énumérateur sans modifier la classe, ni d'ajouter un énumérateur d'un type non class object/record/interface. FPC rend cela possible en utilisant la nouvelle syntaxe '''operator''' type '''Enumerator'''. Comme dans l'exemple suivant:<br />
<br />
<syntaxhighlight><br />
type<br />
TMyRecord = record F1: Integer; F2: array of TMyType; end;<br />
TMyArrayEnumerator = class<br />
private<br />
function GetCurrent: TMyType;<br />
public<br />
constructor Create(const A: TMyRecord);<br />
property Current: TMyType read GetCurrent;<br />
function MoveNext: Boolean;<br />
end;<br />
<br />
// C'est le nouveau opérateur intégré.<br />
operator Enumerator(const A: TMyRecord): TMyArrayEnumerator;<br />
begin<br />
Result := TMyArrayEnumerator.Create(A);<br />
end;<br />
<br />
var<br />
A: MyRecord;<br />
V: TMyType<br />
begin<br />
for V in A do<br />
DoSomething(V);<br />
end.<br />
</syntaxhighlight><br />
<br />
====Traversée de chaînes UTF-8====<br />
Comme exemple particulièrement utile, l'extension ci-dessous autorise une traversée très efficace des chaînes UTF-8:<br />
<br />
<syntaxhighlight><br />
uses<br />
LazUTF8;<br />
interface<br />
type<br />
{ TUTF8StringAsStringEnumerator <br />
La traversée de 'codepoint' UTF8 est utile quand vous voulez connaître l'encodage exact d'un <br />
caractère UTF-8 ou si vous aimez utiliser des constante de chaîne dans votre code.<br />
Pour des raisons de sécurité, vous pourriez utiliser les valeurs des points de code (cardinaux) à la place.<br />
Si la vitesse importe, n'utilisez pas des énumérateurs. Employez à la place directement le PChar<br />
comme montré dans la méthode MoveNext et lisez sur l'UTF8. Il a des caractéristiques intéressantes. }<br />
<br />
TUTF8StringAsStringEnumerator = class<br />
private<br />
fCurrent: UTF8String;<br />
fCurrentPos, fEndPos: PChar;<br />
function GetCurrent: UTF8String;<br />
public<br />
constructor Create(const A: UTF8String);<br />
property Current: UTF8String read GetCurrent;<br />
function MoveNext: Boolean;<br />
end;<br />
<br />
operator Enumerator(A: UTF8String): TUTF8StringAsStringEnumerator;<br />
<br />
var<br />
Form1: TForm1;<br />
<br />
implementation<br />
<br />
operator Enumerator(A: UTF8String): TUTF8StringAsStringEnumerator;<br />
begin<br />
Result := TUTF8StringAsStringEnumerator.Create(A);<br />
end;<br />
<br />
{ TUTF8StringAsStringEnumerator }<br />
<br />
function TUTF8StringAsStringEnumerator.GetCurrent: UTF8String;<br />
begin<br />
Result:=fCurrent;<br />
end;<br />
<br />
constructor TUTF8StringAsStringEnumerator.Create(const A: UTF8String);<br />
begin<br />
fCurrentPos:=PChar(A); // Note: si A='' alors PChar(A) retourne un pointeur sur une chaîne #0<br />
fEndPos:=fCurrentPos+length(A);<br />
end;<br />
<br />
function TUTF8StringAsStringEnumerator.MoveNext: Boolean;<br />
var<br />
l: Integer;<br />
begin<br />
if fCurrentPos<fEndPos then<br />
begin<br />
l:=UTF8CharacterLength(fCurrentPos);<br />
SetLength(fCurrent,l);<br />
Move(fCurrentPos^,fCurrent[1],l);<br />
inc(fCurrentPos,l);<br />
Result:=true;<br />
end else<br />
Result:=false;<br />
end;<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
var<br />
s, ch: UTF8String;<br />
i: SizeInt;<br />
begin<br />
s:='mäßig';<br />
<br />
// Utiliser UTF8Length et UTF8Copy de cette manière est très lent, nécessitant O(n)^2<br />
for i:=1 to UTF8Length(s) do<br />
writeln('ch=',UTF8Copy(s,i,1));<br />
<br />
// L'emploi de l'énumérateur du dessus est plus court et plutôt rapide, nécessitant O(n)<br />
for ch in s do<br />
writeln('ch=',ch);<br />
end;<br />
</syntaxhighlight><br />
<br />
=== Utiliser des identificateurs au lieu de MoveNext et Current ===<br />
En Delphi, vous devez utiliser une fonction avec le nom 'MoveNext' et une propriété avec le nom 'Current' dans les énumérateurs. Avec FPC, vous pouvez choisir n'importe quel nom. Cela est permis par l'emploi du modifieur '''enumerator''', avec la syntaxe des modifieurs 'enumerator MoveNext;' et 'enumerator Current;'. Comme dans l'exemple suivant :<br />
<br />
<syntaxhighlight><br />
type<br />
{ TMyListEnumerator }<br />
<br />
TMyListEnumerator = object<br />
private<br />
FCurrent: Integer;<br />
public<br />
constructor Create;<br />
destructor Destroy;<br />
function StepNext: Boolean; enumerator MoveNext;<br />
property Value: Integer read FCurrent; enumerator Current;<br />
end;<br />
<br />
TMyList = class<br />
end;<br />
<br />
{ TMyListEnumerator }<br />
<br />
constructor TMyListEnumerator.Create;<br />
begin<br />
FCurrent := 0;<br />
end;<br />
<br />
destructor TMyListEnumerator.Destroy;<br />
begin<br />
inherited;<br />
end;<br />
<br />
function TMyListEnumerator.StepNext: Boolean;<br />
begin<br />
inc(FCurrent);<br />
Result := FCurrent <= 3;<br />
end;<br />
<br />
operator enumerator (AList: TMyList): TMyListEnumerator;<br />
begin<br />
Result.Create;<br />
end;<br />
<br />
var<br />
List: TMyList;<br />
i: integer;<br />
begin<br />
List := TMyList.Create;<br />
for i in List do<br />
WriteLn(i);<br />
List.Free;<br />
end.<br />
</syntaxhighlight><br />
<br />
== Extensions proposées ==<br />
<br />
<br />
=== Donner la position de l'énumérateur si disponible ===<br />
Il est impossible d'extraire toute information de l'itérateur sauf l'article courant. Parfois d'autres informations, comme l'index courant, pourraient être utiles :<br />
<br />
<syntaxhighlight><br />
type<br />
TUTF8StringEnumerator = class<br />
private<br />
FByteIndex: Integer;<br />
FCharIndex: Integer;<br />
public<br />
constructor Create(const A: UTF8String);<br />
function Current: UTF8Char;<br />
function CurrentIndex: Integer;<br />
function MoveNext: Boolean;<br />
end;<br />
<br />
operator GetEnumerator(A: UTF8String): TUTF8StringEnumerator;<br />
begin<br />
Result := TUTF8String.Create(A);<br />
end;<br />
<br />
var<br />
s: UTF8String;<br />
ch: UTF8Char;<br />
i: Integer;<br />
begin<br />
<br />
// inefficace comme discuté plus haut<br />
for i := 1 to Length(s) do<br />
Writeln(i, ': ', ch[i]);<br />
<br />
// Ok, mais moche<br />
i := 1;<br />
for ch in s do begin<br />
Writeln(i, ': ', ch);<br />
Inc(i);<br />
end;<br />
<br />
// Extension proposée<br />
for ch in s index i do<br />
Writeln(i, ': ', ch);<br />
<br />
// Extension proposée pour traverser à l'envers (équivalent au downto)<br />
for ch in reverse s do<br />
Writeln(i, ': ', ch);<br />
<br />
// Avec l'extension d'index proposée<br />
for ch in reverse s index i do<br />
Writeln(i, ': ', ch);<br />
end.<br />
</syntaxhighlight><br />
<br />
Remarquez que l'index doit être conçu pour retourner un type arbitraire (c'est-à-dire pas forcément un entier).<br />
Par exemple, dans l'exemple d'une traversée d'arbre, l'index pourrait retourner un tableau de nœuds <br />
décrivant le chemin allant de la racine au nœud courant.<br />
<br />
== Référence ==<br />
* http://17slon.com/blogs/gabr/2007/03/fun-with-enumerators.html<br />
<br />
[[Category:FPC/fr]]<br />
[[Category:Pascal/fr]]<br />
[[Category:Control Structures/fr]]</div>Gillou58https://wiki.freepascal.org/index.php?title=Free_Pascal/fr&diff=98739Free Pascal/fr2016-01-04T15:59:51Z<p>Gillou58: /* Documentation */</p>
<hr />
<div>{{Free Pascal}}<br />
<br />
== Lazarus et le compilateur Free Pascal ==<br />
La version nécessaire/recommandée du compilateur '''Free Pascal''' pour l'EDI [[Lazarus Faq|Lazarus]] dépend de la version utilisée de Lazarus :<br />
* Lazarus de 1.0 à 1.0.6 : FPC 2.6.0<br />
* Lazarus de 1.0.8 à 1.2.2 : FPC 2.6.2 <br />
* Lazarus de 1.2.4 à 1.4.4 : FPC 2.6.4<br />
<br />
La version requise de Free pascal ainsi que l'EDI Lazarus peuvent être trouvés à l'adresse : [http://sourceforge.net/project/showfiles.php?group_id=89339 Lazarus sourceforge]. <br />
Les versions de Free Pascal seul sont présentes ici : [http://sourceforge.net/project/showfiles.php?group_id=2174 Free Pascal sourceforge].<br />
Divers paquets et fichiers binaires sont disponibles depuis ces sites de téléchargement .<br />
<br />
== Depuis le site web du compilateur Free Pascal: ==<br />
=== Vue d'ensemble ===<br />
Free Pascal (aka FPK Pascal) est un compilateur pascal 32 bit. Il est disponible pour différents processeurs (Intel 80386 et compatibles et Motorola 680x0) et logiciels d'exploitation(Linux, FreeBSD, NetBSD, DOS, Win32, OS/2, BeOS, SunOS (Solaris), QNX et Classic Amiga).<br />
<br />
=== Fonctionnalités ===<br />
La syntaxe de langage est sémantiquement compatible avec TP 7.0 aussi bien que pour la plupart des versions Delphi (classes, rtti, exceptions, ansistrings). En outre Free Pascal supporte la surcharge de fonctions, la surcharge d'opérateurs et d'autres fonctionnalités de ce type.<br />
<br />
=== Exigences ===<br />
Pour la version Intel 80x86 au moins un processeur 386 est exigé , mais un 486 est recommandé . Pour la version motorola 680x0 , un 68020 ou un processeur plus récent est recommandé. Dans tous les cas , 8 méga-octets au minimum de RAM est recommandé , mais le compilateur est sencé travailler avec 2 méga-octets de RAM .<br />
<br />
=== Licence ===<br />
Les paquets et la bibliothèque d'exécution relèvent d'une librairie modifiée à licence publique GNU pour permettre l'utilisation des bibliothèques statiques en créant des applications. Les sources du compilateur lui-même relève de la licence publique générale GNU. Les sources du compilateur et de la bibliothèque d'exécution sont disponibles ; le compilateur complet est écrit en Pascal.<br />
<br />
=== Documentation ===<br />
La documentation du compilateur Free Pascal est disponible sur [http://lazarus-ccr.sourceforge.net/fpcdoc/ ce site] ou elle peut être consultée en ligne et téléchargée sous plusieurs formats sur le principal [http://www.freepascal.org/docs.var site du compilateur Free Pascal].<br />
* [[fpc:Main Page/fr | Wiki FPC]]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/user/user.html Guide de l'utilisateur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/prog/prog.html Guide du programmeur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html Guide de référence de l'unité system , et les constructions Pascal supportées]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/units/units.html Manuel de référence des unités standard]<br />
* [http://lazarus-ccr.sourceforge.net/docs/rtl/index.html Manuel de référence des bibliothèques d'exécution]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fcl/index.html Manuel de référence de la FCL(Free Component Library)]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fpdoc/fpdoc.html Manuel de l'outil de documentation de Free Pascal]<br />
<br />
=== Page d'accueil du compilateur Free Pascal ===<br />
http://www.freepascal.org/ - Site principal <br><br />
http://sourceforge.net/projects/freepascal/ - site de téléchargement Sourceforge<br />
<br />
== Contributions originales et changements ==<br />
Cette page a été convertie depuis l'epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=FreePascal version].<br />
* Page créée, contenu initial - [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Lien supplémentaire pour les téléchargements de fpc 1.1 - [[User:Vincent|Vincent]] 9/28/2003<br />
* Ajout de la documentation de FPC et liens - [[User:Tom | VlxAdmin]] 10/20/2003<br />
* mise à jour vers la version 2.0.4</div>Gillou58https://wiki.freepascal.org/index.php?title=Free_Pascal/fr&diff=98738Free Pascal/fr2016-01-04T15:57:47Z<p>Gillou58: /* Documentation */</p>
<hr />
<div>{{Free Pascal}}<br />
<br />
== Lazarus et le compilateur Free Pascal ==<br />
La version nécessaire/recommandée du compilateur '''Free Pascal''' pour l'EDI [[Lazarus Faq|Lazarus]] dépend de la version utilisée de Lazarus :<br />
* Lazarus de 1.0 à 1.0.6 : FPC 2.6.0<br />
* Lazarus de 1.0.8 à 1.2.2 : FPC 2.6.2 <br />
* Lazarus de 1.2.4 à 1.4.4 : FPC 2.6.4<br />
<br />
La version requise de Free pascal ainsi que l'EDI Lazarus peuvent être trouvés à l'adresse : [http://sourceforge.net/project/showfiles.php?group_id=89339 Lazarus sourceforge]. <br />
Les versions de Free Pascal seul sont présentes ici : [http://sourceforge.net/project/showfiles.php?group_id=2174 Free Pascal sourceforge].<br />
Divers paquets et fichiers binaires sont disponibles depuis ces sites de téléchargement .<br />
<br />
== Depuis le site web du compilateur Free Pascal: ==<br />
=== Vue d'ensemble ===<br />
Free Pascal (aka FPK Pascal) est un compilateur pascal 32 bit. Il est disponible pour différents processeurs (Intel 80386 et compatibles et Motorola 680x0) et logiciels d'exploitation(Linux, FreeBSD, NetBSD, DOS, Win32, OS/2, BeOS, SunOS (Solaris), QNX et Classic Amiga).<br />
<br />
=== Fonctionnalités ===<br />
La syntaxe de langage est sémantiquement compatible avec TP 7.0 aussi bien que pour la plupart des versions Delphi (classes, rtti, exceptions, ansistrings). En outre Free Pascal supporte la surcharge de fonctions, la surcharge d'opérateurs et d'autres fonctionnalités de ce type.<br />
<br />
=== Exigences ===<br />
Pour la version Intel 80x86 au moins un processeur 386 est exigé , mais un 486 est recommandé . Pour la version motorola 680x0 , un 68020 ou un processeur plus récent est recommandé. Dans tous les cas , 8 méga-octets au minimum de RAM est recommandé , mais le compilateur est sencé travailler avec 2 méga-octets de RAM .<br />
<br />
=== Licence ===<br />
Les paquets et la bibliothèque d'exécution relèvent d'une librairie modifiée à licence publique GNU pour permettre l'utilisation des bibliothèques statiques en créant des applications. Les sources du compilateur lui-même relève de la licence publique générale GNU. Les sources du compilateur et de la bibliothèque d'exécution sont disponibles ; le compilateur complet est écrit en Pascal.<br />
<br />
=== Documentation ===<br />
La documentation du compilateur Free Pascal est disponible sur [http://lazarus-ccr.sourceforge.net/fpcdoc/ ce site] ou elle peut être consultée en ligne et téléchargée sous plusieurs formats sur le principal [http://www.freepascal.org/ site du compilateur Free Pascal].<br />
* [[fpc:Main Page/fr | Wiki FPC]]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/user/user.html Guide de l'utilisateur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/prog/prog.html Guide du programmeur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html Guide de référence de l'unité system , et les constructions Pascal supportées]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/units/units.html Manuel de référence des unités standard]<br />
* [http://lazarus-ccr.sourceforge.net/docs/rtl/index.html Manuel de référence des bibliothèques d'exécution]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fcl/index.html Manuel de référence de la FCL(Free Component Library)]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fpdoc/fpdoc.html Manuel de l'outil de documentation de Free Pascal]<br />
<br />
=== Page d'accueil du compilateur Free Pascal ===<br />
http://www.freepascal.org/ - Site principal <br><br />
http://sourceforge.net/projects/freepascal/ - site de téléchargement Sourceforge<br />
<br />
== Contributions originales et changements ==<br />
Cette page a été convertie depuis l'epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=FreePascal version].<br />
* Page créée, contenu initial - [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Lien supplémentaire pour les téléchargements de fpc 1.1 - [[User:Vincent|Vincent]] 9/28/2003<br />
* Ajout de la documentation de FPC et liens - [[User:Tom | VlxAdmin]] 10/20/2003<br />
* mise à jour vers la version 2.0.4</div>Gillou58https://wiki.freepascal.org/index.php?title=Free_Pascal/fr&diff=98737Free Pascal/fr2016-01-04T15:56:05Z<p>Gillou58: /* Documentation */</p>
<hr />
<div>{{Free Pascal}}<br />
<br />
== Lazarus et le compilateur Free Pascal ==<br />
La version nécessaire/recommandée du compilateur '''Free Pascal''' pour l'EDI [[Lazarus Faq|Lazarus]] dépend de la version utilisée de Lazarus :<br />
* Lazarus de 1.0 à 1.0.6 : FPC 2.6.0<br />
* Lazarus de 1.0.8 à 1.2.2 : FPC 2.6.2 <br />
* Lazarus de 1.2.4 à 1.4.4 : FPC 2.6.4<br />
<br />
La version requise de Free pascal ainsi que l'EDI Lazarus peuvent être trouvés à l'adresse : [http://sourceforge.net/project/showfiles.php?group_id=89339 Lazarus sourceforge]. <br />
Les versions de Free Pascal seul sont présentes ici : [http://sourceforge.net/project/showfiles.php?group_id=2174 Free Pascal sourceforge].<br />
Divers paquets et fichiers binaires sont disponibles depuis ces sites de téléchargement .<br />
<br />
== Depuis le site web du compilateur Free Pascal: ==<br />
=== Vue d'ensemble ===<br />
Free Pascal (aka FPK Pascal) est un compilateur pascal 32 bit. Il est disponible pour différents processeurs (Intel 80386 et compatibles et Motorola 680x0) et logiciels d'exploitation(Linux, FreeBSD, NetBSD, DOS, Win32, OS/2, BeOS, SunOS (Solaris), QNX et Classic Amiga).<br />
<br />
=== Fonctionnalités ===<br />
La syntaxe de langage est sémantiquement compatible avec TP 7.0 aussi bien que pour la plupart des versions Delphi (classes, rtti, exceptions, ansistrings). En outre Free Pascal supporte la surcharge de fonctions, la surcharge d'opérateurs et d'autres fonctionnalités de ce type.<br />
<br />
=== Exigences ===<br />
Pour la version Intel 80x86 au moins un processeur 386 est exigé , mais un 486 est recommandé . Pour la version motorola 680x0 , un 68020 ou un processeur plus récent est recommandé. Dans tous les cas , 8 méga-octets au minimum de RAM est recommandé , mais le compilateur est sencé travailler avec 2 méga-octets de RAM .<br />
<br />
=== Licence ===<br />
Les paquets et la bibliothèque d'exécution relèvent d'une librairie modifiée à licence publique GNU pour permettre l'utilisation des bibliothèques statiques en créant des applications. Les sources du compilateur lui-même relève de la licence publique générale GNU. Les sources du compilateur et de la bibliothèque d'exécution sont disponibles ; le compilateur complet est écrit en Pascal.<br />
<br />
=== Documentation ===<br />
La documentation du compilateur Free Pascal est disponible sur [http://lazarus-ccr.sourceforge.net/fpcdoc/ ce site] ou elle peut être consultée en ligne et téléchargée dans sous plusieurs formats sur le principal [http://www.freepascal.org/docs.html site du compilateur Free Pascal].<br />
* [[fpc:Main Page/fr | Wiki FPC]]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/user/user.html Guide de l'utilisateur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/prog/prog.html Guide du programmeur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html Guide de référence de l'unité system , et les constructions Pascal supportées]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/units/units.html Manuel de référence des unités standard]<br />
* [http://lazarus-ccr.sourceforge.net/docs/rtl/index.html Manuel de référence des bibliothèques d'exécution]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fcl/index.html Manuel de référence de la FCL(Free Component Library)]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fpdoc/fpdoc.html Manuel de l'outil de documentation de Free Pascal]<br />
<br />
=== Page d'accueil du compilateur Free Pascal ===<br />
http://www.freepascal.org/ - Site principal <br><br />
http://sourceforge.net/projects/freepascal/ - site de téléchargement Sourceforge<br />
<br />
== Contributions originales et changements ==<br />
Cette page a été convertie depuis l'epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=FreePascal version].<br />
* Page créée, contenu initial - [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Lien supplémentaire pour les téléchargements de fpc 1.1 - [[User:Vincent|Vincent]] 9/28/2003<br />
* Ajout de la documentation de FPC et liens - [[User:Tom | VlxAdmin]] 10/20/2003<br />
* mise à jour vers la version 2.0.4</div>Gillou58https://wiki.freepascal.org/index.php?title=Free_Pascal/fr&diff=98736Free Pascal/fr2016-01-04T15:53:36Z<p>Gillou58: /* Documentation */</p>
<hr />
<div>{{Free Pascal}}<br />
<br />
== Lazarus et le compilateur Free Pascal ==<br />
La version nécessaire/recommandée du compilateur '''Free Pascal''' pour l'EDI [[Lazarus Faq|Lazarus]] dépend de la version utilisée de Lazarus :<br />
* Lazarus de 1.0 à 1.0.6 : FPC 2.6.0<br />
* Lazarus de 1.0.8 à 1.2.2 : FPC 2.6.2 <br />
* Lazarus de 1.2.4 à 1.4.4 : FPC 2.6.4<br />
<br />
La version requise de Free pascal ainsi que l'EDI Lazarus peuvent être trouvés à l'adresse : [http://sourceforge.net/project/showfiles.php?group_id=89339 Lazarus sourceforge]. <br />
Les versions de Free Pascal seul sont présentes ici : [http://sourceforge.net/project/showfiles.php?group_id=2174 Free Pascal sourceforge].<br />
Divers paquets et fichiers binaires sont disponibles depuis ces sites de téléchargement .<br />
<br />
== Depuis le site web du compilateur Free Pascal: ==<br />
=== Vue d'ensemble ===<br />
Free Pascal (aka FPK Pascal) est un compilateur pascal 32 bit. Il est disponible pour différents processeurs (Intel 80386 et compatibles et Motorola 680x0) et logiciels d'exploitation(Linux, FreeBSD, NetBSD, DOS, Win32, OS/2, BeOS, SunOS (Solaris), QNX et Classic Amiga).<br />
<br />
=== Fonctionnalités ===<br />
La syntaxe de langage est sémantiquement compatible avec TP 7.0 aussi bien que pour la plupart des versions Delphi (classes, rtti, exceptions, ansistrings). En outre Free Pascal supporte la surcharge de fonctions, la surcharge d'opérateurs et d'autres fonctionnalités de ce type.<br />
<br />
=== Exigences ===<br />
Pour la version Intel 80x86 au moins un processeur 386 est exigé , mais un 486 est recommandé . Pour la version motorola 680x0 , un 68020 ou un processeur plus récent est recommandé. Dans tous les cas , 8 méga-octets au minimum de RAM est recommandé , mais le compilateur est sencé travailler avec 2 méga-octets de RAM .<br />
<br />
=== Licence ===<br />
Les paquets et la bibliothèque d'exécution relèvent d'une librairie modifiée à licence publique GNU pour permettre l'utilisation des bibliothèques statiques en créant des applications. Les sources du compilateur lui-même relève de la licence publique générale GNU. Les sources du compilateur et de la bibliothèque d'exécution sont disponibles ; le compilateur complet est écrit en Pascal.<br />
<br />
=== Documentation ===<br />
La documentation du compilateur Free Pascal est disponible sur [http://lazarus-ccr.sourceforge.net/fpcdoc/ ce site] ou elle peut être trouvée en ligne et dans une variété de formats téléchargeables sur le principal [http://www.freepascal.org/docs.html site du compilateur Free Pascal].<br />
* [[fpc:Main Page/fr | Wiki FPC]]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/user/user.html Guide de l'utilisateur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/prog/prog.html Guide du programmeur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html Guide de référence de l'unité system , et les constructions Pascal supportées]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/units/units.html Manuel de référence des unités standard]<br />
* [http://lazarus-ccr.sourceforge.net/docs/rtl/index.html Manuel de référence des bibliothèques d'exécution]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fcl/index.html Manuel de référence de la FCL(Free Component Library)]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fpdoc/fpdoc.html Manuel de l'outil de documentation de Free Pascal]<br />
<br />
=== Page d'accueil du compilateur Free Pascal ===<br />
http://www.freepascal.org/ - Site principal <br><br />
http://sourceforge.net/projects/freepascal/ - site de téléchargement Sourceforge<br />
<br />
== Contributions originales et changements ==<br />
Cette page a été convertie depuis l'epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=FreePascal version].<br />
* Page créée, contenu initial - [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Lien supplémentaire pour les téléchargements de fpc 1.1 - [[User:Vincent|Vincent]] 9/28/2003<br />
* Ajout de la documentation de FPC et liens - [[User:Tom | VlxAdmin]] 10/20/2003<br />
* mise à jour vers la version 2.0.4</div>Gillou58https://wiki.freepascal.org/index.php?title=Free_Pascal/fr&diff=98735Free Pascal/fr2016-01-04T15:52:17Z<p>Gillou58: /* Licence */</p>
<hr />
<div>{{Free Pascal}}<br />
<br />
== Lazarus et le compilateur Free Pascal ==<br />
La version nécessaire/recommandée du compilateur '''Free Pascal''' pour l'EDI [[Lazarus Faq|Lazarus]] dépend de la version utilisée de Lazarus :<br />
* Lazarus de 1.0 à 1.0.6 : FPC 2.6.0<br />
* Lazarus de 1.0.8 à 1.2.2 : FPC 2.6.2 <br />
* Lazarus de 1.2.4 à 1.4.4 : FPC 2.6.4<br />
<br />
La version requise de Free pascal ainsi que l'EDI Lazarus peuvent être trouvés à l'adresse : [http://sourceforge.net/project/showfiles.php?group_id=89339 Lazarus sourceforge]. <br />
Les versions de Free Pascal seul sont présentes ici : [http://sourceforge.net/project/showfiles.php?group_id=2174 Free Pascal sourceforge].<br />
Divers paquets et fichiers binaires sont disponibles depuis ces sites de téléchargement .<br />
<br />
== Depuis le site web du compilateur Free Pascal: ==<br />
=== Vue d'ensemble ===<br />
Free Pascal (aka FPK Pascal) est un compilateur pascal 32 bit. Il est disponible pour différents processeurs (Intel 80386 et compatibles et Motorola 680x0) et logiciels d'exploitation(Linux, FreeBSD, NetBSD, DOS, Win32, OS/2, BeOS, SunOS (Solaris), QNX et Classic Amiga).<br />
<br />
=== Fonctionnalités ===<br />
La syntaxe de langage est sémantiquement compatible avec TP 7.0 aussi bien que pour la plupart des versions Delphi (classes, rtti, exceptions, ansistrings). En outre Free Pascal supporte la surcharge de fonctions, la surcharge d'opérateurs et d'autres fonctionnalités de ce type.<br />
<br />
=== Exigences ===<br />
Pour la version Intel 80x86 au moins un processeur 386 est exigé , mais un 486 est recommandé . Pour la version motorola 680x0 , un 68020 ou un processeur plus récent est recommandé. Dans tous les cas , 8 méga-octets au minimum de RAM est recommandé , mais le compilateur est sencé travailler avec 2 méga-octets de RAM .<br />
<br />
=== Licence ===<br />
Les paquets et la bibliothèque d'exécution relèvent d'une librairie modifiée à licence publique GNU pour permettre l'utilisation des bibliothèques statiques en créant des applications. Les sources du compilateur lui-même relève de la licence publique générale GNU. Les sources du compilateur et de la bibliothèque d'exécution sont disponibles ; le compilateur complet est écrit en Pascal.<br />
<br />
=== Documentation ===<br />
La documentation du compilateur Free Pascal est disponible sur [http://lazarus-ccr.sourceforge.net/fpcdoc/ ce site] ou il peut trouver en ligne et dans une variété de formats téléchargeable sur le principal [http://www.freepascal.org/docs.html site du compilateur Free Pascal].<br />
* [[fpc:Main Page/fr | Wiki FPC]]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/user/user.html Guide de l'utilisateur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/prog/prog.html Guide du programmeur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html Guide de référence de l'unité system , et les constructions Pascal supportées]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/units/units.html Manuel de référence des unités standard]<br />
* [http://lazarus-ccr.sourceforge.net/docs/rtl/index.html Manuel de référence des bibliothèques d'exécution]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fcl/index.html Manuel de référence de la FCL(Free componant Library)]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fpdoc/fpdoc.html Manuel de l'outil de documentation de Free Pascal]<br />
<br />
=== Page d'accueil du compilateur Free Pascal ===<br />
http://www.freepascal.org/ - Site principal <br><br />
http://sourceforge.net/projects/freepascal/ - site de téléchargement Sourceforge<br />
<br />
== Contributions originales et changements ==<br />
Cette page a été convertie depuis l'epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=FreePascal version].<br />
* Page créée, contenu initial - [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Lien supplémentaire pour les téléchargements de fpc 1.1 - [[User:Vincent|Vincent]] 9/28/2003<br />
* Ajout de la documentation de FPC et liens - [[User:Tom | VlxAdmin]] 10/20/2003<br />
* mise à jour vers la version 2.0.4</div>Gillou58https://wiki.freepascal.org/index.php?title=Free_Pascal/fr&diff=98734Free Pascal/fr2016-01-04T15:50:11Z<p>Gillou58: /* Lazarus et le compilateur Free Pascal */</p>
<hr />
<div>{{Free Pascal}}<br />
<br />
== Lazarus et le compilateur Free Pascal ==<br />
La version nécessaire/recommandée du compilateur '''Free Pascal''' pour l'EDI [[Lazarus Faq|Lazarus]] dépend de la version utilisée de Lazarus :<br />
* Lazarus de 1.0 à 1.0.6 : FPC 2.6.0<br />
* Lazarus de 1.0.8 à 1.2.2 : FPC 2.6.2 <br />
* Lazarus de 1.2.4 à 1.4.4 : FPC 2.6.4<br />
<br />
La version requise de Free pascal ainsi que l'EDI Lazarus peuvent être trouvés à l'adresse : [http://sourceforge.net/project/showfiles.php?group_id=89339 Lazarus sourceforge]. <br />
Les versions de Free Pascal seul sont présentes ici : [http://sourceforge.net/project/showfiles.php?group_id=2174 Free Pascal sourceforge].<br />
Divers paquets et fichiers binaires sont disponibles depuis ces sites de téléchargement .<br />
<br />
== Depuis le site web du compilateur Free Pascal: ==<br />
=== Vue d'ensemble ===<br />
Free Pascal (aka FPK Pascal) est un compilateur pascal 32 bit. Il est disponible pour différents processeurs (Intel 80386 et compatibles et Motorola 680x0) et logiciels d'exploitation(Linux, FreeBSD, NetBSD, DOS, Win32, OS/2, BeOS, SunOS (Solaris), QNX et Classic Amiga).<br />
<br />
=== Fonctionnalités ===<br />
La syntaxe de langage est sémantiquement compatible avec TP 7.0 aussi bien que pour la plupart des versions Delphi (classes, rtti, exceptions, ansistrings). En outre Free Pascal supporte la surcharge de fonctions, la surcharge d'opérateurs et d'autres fonctionnalités de ce type.<br />
<br />
=== Exigences ===<br />
Pour la version Intel 80x86 au moins un processeur 386 est exigé , mais un 486 est recommandé . Pour la version motorola 680x0 , un 68020 ou un processeur plus récent est recommandé. Dans tous les cas , 8 méga-octets au minimum de RAM est recommandé , mais le compilateur est sencé travailler avec 2 méga-octets de RAM .<br />
<br />
=== Licence ===<br />
Les paquets et la bibliothèque d'exécution relèvent d'une librairie modifiée à licence publique GNU pour permettre l'utilisation des bibliothèques statiques en créant des applications . Les sources du compilateur lui-même relève de la licence publique générale GNU . Les sources du compilateur et de la bibliothèque dexécution sont disponibles ; le compilateur complet est écrit en Pascal .<br />
<br />
=== Documentation ===<br />
La documentation du compilateur Free Pascal est disponible sur [http://lazarus-ccr.sourceforge.net/fpcdoc/ ce site] ou il peut trouver en ligne et dans une variété de formats téléchargeable sur le principal [http://www.freepascal.org/docs.html site du compilateur Free Pascal].<br />
* [[fpc:Main Page/fr | Wiki FPC]]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/user/user.html Guide de l'utilisateur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/prog/prog.html Guide du programmeur]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html Guide de référence de l'unité system , et les constructions Pascal supportées]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/units/units.html Manuel de référence des unités standard]<br />
* [http://lazarus-ccr.sourceforge.net/docs/rtl/index.html Manuel de référence des bibliothèques d'exécution]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fcl/index.html Manuel de référence de la FCL(Free componant Library)]<br />
* [http://lazarus-ccr.sourceforge.net/fpcdoc/fpdoc/fpdoc.html Manuel de l'outil de documentation de Free Pascal]<br />
<br />
=== Page d'accueil du compilateur Free Pascal ===<br />
http://www.freepascal.org/ - Site principal <br><br />
http://sourceforge.net/projects/freepascal/ - site de téléchargement Sourceforge<br />
<br />
== Contributions originales et changements ==<br />
Cette page a été convertie depuis l'epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=FreePascal version].<br />
* Page créée, contenu initial - [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Lien supplémentaire pour les téléchargements de fpc 1.1 - [[User:Vincent|Vincent]] 9/28/2003<br />
* Ajout de la documentation de FPC et liens - [[User:Tom | VlxAdmin]] 10/20/2003<br />
* mise à jour vers la version 2.0.4</div>Gillou58https://wiki.freepascal.org/index.php?title=Colors/fr&diff=97842Colors/fr2015-11-21T16:44:24Z<p>Gillou58: /* Table des couleurs standard */</p>
<hr />
<div>{{Colors}}<br />
<br><br />
<br><br />
=Vue d'ensemble=<br />
<br />
Dans la LCL, '''TColor''' est le type couleur standard. Il est compatible avec le '''TColor''' de Delphi. '''TColor''' peut représenter ''soit'' une valeur RGB (3x8bits), ''soit'' une couleur ''système'' comme ''crDefault''. La LCL peut aussi travailler avec le système fpImage qui emploie le type '''TFPColor''' qui est du RGBA (4x16bits), et non du RGB (3x8bits comme '''TColor''').<br />
<br />
==Conversions entre '''TColor''' et une valeur RGB==<br />
<br />
L'unité '''Graphics''' fournit les fonctions suivantes :<br />
<br />
<syntaxhighlight>function Blue(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function Green(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function Red(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function RGBToColor(R, G, B: Byte): TColor;<br />
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte); // ne fonctionne pas avec les couleurs système<br />
function FPColorToTColor(const FPColor: TFPColor): TColor;<br />
function TColorToFPColor(const c: TColor): TFPColor; // ne fonctionne pas avec les couleurs système<br />
function IsSysColor(AColor: TColorRef): Boolean;</syntaxhighlight><br />
<br />
==Conversion entre '''TColor''' et une chaîne de caractères==<br />
Fonctions pour convertir des chaînes comme "25500" ou "$AA0088" ou "clNavy" vers le type '''TColor''':<br />
<br />
* StringToColor<br />
* StringToColorDef<br />
<br />
Pour convertir '''TColor''' vers une chaîne qui peut être adaptée à la langue de travail:<br />
<br />
* ColorToString<br />
<br />
=Table des couleurs standard=<br />
<br />
Environ une vingtaine de constantes de couleur prédéfinies sont fournies. Elles sont compatibles avec Delphi:<br />
<br />
<!--<syntaxhighlight> // couleurs standard<br />
clBlack = TColor($000000);<br />
clMaroon = TColor($000080);<br />
clGreen = TColor($008000);<br />
clOlive = TColor($008080);<br />
clNavy = TColor($800000);<br />
clPurple = TColor($800080);<br />
clTeal = TColor($808000);<br />
clGray = TColor($808080);<br />
clSilver = TColor($C0C0C0);<br />
clRed = TColor($0000FF);<br />
clLime = TColor($00FF00);<br />
clYellow = TColor($00FFFF);<br />
clBlue = TColor($FF0000);<br />
clFuchsia = TColor($FF00FF);<br />
clAqua = TColor($FFFF00);<br />
clLtGray = TColor($C0C0C0); // alias de clSilver<br />
clDkGray = TColor($808080); // alais de clGray<br />
clWhite = TColor($FFFFFF);</syntaxhighlight>--><br />
<br />
{| class="wikitable"<br />
|-<br />
! Constante de couleur<br />
! Signification<br />
! Valeur hexadécimale pour emploi avec '''TColor'''<br />
! Exemple<br />
|-<br />
| clBlack<br />
| Noir<br />
| TColor($000000);<br />
| style="background: #000000" |<br />
|-<br />
| clMaroon<br />
| Marron<br />
| TColor($000080);<br />
| style="background: #800000" |<br />
|-<br />
| clGreen <br />
| Vert<br />
| TColor($008000);<br />
| style="background: #008000" |<br />
|-<br />
| clOlive <br />
| Vert Olive<br />
| TColor($008080);<br />
| style="background: #808000" |<br />
|-<br />
| clNavy <br />
| Bleu marine<br />
| TColor($800000);<br />
| style="background: #000080" |<br />
|-<br />
| clPurple <br />
| Violet<br />
| TColor($800080);<br />
| style="background: #800080" |<br />
|-<br />
| clTeal <br />
| Bleu canard<br />
| TColor($808000);<br />
| style="background: #008080" |<br />
|-<br />
| clGray <br />
| Gris<br />
| TColor($808080);<br />
| style="background: #808080" |<br />
|-<br />
| clSilver <br />
| Argent<br />
| TColor($C0C0C0);<br />
| style="background: #C0C0C0" |<br />
|-<br />
| clRed <br />
| Rouge<br />
| TColor($0000FF);<br />
| style="background: #FF0000" |<br />
|-<br />
| clLime <br />
| Vert Citron<br />
| TColor($00FF00);<br />
| style="background: #00FF00" |<br />
|-<br />
| clYellow <br />
| Jaune<br />
| TColor($00FFFF);<br />
| style="background: #FFFF00" |<br />
|-<br />
| clBlue <br />
| Bleu<br />
| TColor($FF0000);<br />
| style="background: #0000FF" |<br />
|-<br />
| clFuchsia<br />
| Fuchsia<br />
| TColor($FF00FF);<br />
| style="background: #FF00FF" |<br />
|-<br />
| clAqua <br />
| Bleu vert<br />
| TColor($FFFF00);<br />
| style="background: #00FFFF" |<br />
|-<br />
| clLtGray <br />
| Gris clair<br />
| TColor($C0C0C0);<br />
| style="background: #D3D3D3" | alias de clSilver<br />
|-<br />
| clDkGray <br />
| Gris foncé<br />
| TColor($808080);<br />
| style="background: #808080; color: white;" | alias de clGray<br />
|-<br />
| clWhite <br />
| Blanc<br />
| TColor($FFFFFF);<br />
| style="background: #FFFFFF" |<br />
|-<br />
| clCream <br />
| Crème<br />
| TColor($F0FBFF);<br />
| style="background: #FFFBF0;" | <br />
|-<br />
| clMedGray <br />
| Gris Moyen<br />
| TColor($A4A0A0);<br />
| style="background: #A0A0A4;" | <br />
|-<br />
| clMoneyGreen <br />
| Vert menthe<br />
| TColor($C0DCC0);<br />
| style="background: #C0DCC0;" | <br />
|-<br />
| clSkyBlue <br />
| Bleu ciel<br />
| TColor($F0CAA6);<br />
| style="background: #A6CAF0;" | <br />
|}<br />
<br />
=Couleurs système=<br />
<br />
==Exemples : clInfoBk, clInfoText==<br />
<br />
Les couleurs système sont des constantes avec une signification particulière. Leur valeur réelle dépend du contexte et du thème. Ce ne sont pas de simples couleurs. Par exemple '''clInfoBk''':<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // use the default background brush of a hint window<br />
Form1.Canvas.FillRect(10,10,50,50);</syntaxhighlight><br />
<br />
Une bulle d'aide dans MS Windows ayant un fond blanc, le code ci-dessus va dessiner en blanc. Dans Linux/gtk2, ce code pouvant correspondre à une texture métallique, le code va dessiner la texture. Si vous voulez placer du texte dessus, vous avez besoin d'une couleur correspondante comme '''clInfoText''', sinon votre texte sera illisible pour l'utilisateur. Par exemple:<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // utilise le fond par défaut d'une bulle d'aide<br />
Form1.Canvas.FillRect(10,10,50,50);<br />
Form1.Canvas.Font.Color:=clInfoText; // utilise la couleur du ttexte par défaut d'une bulle d'aide<br />
Form1.Canvas.TextOut(10,10,'Hint');</syntaxhighlight><br />
<br />
La couleur système '''clInfoBk''' ne peut pas être utilisée avec Pen.Color ni pour Font.Color. Si vous faites ainsi, le résultat est indéfini et dépend du widgetset et du thème de l'utilisateur.<br />
<br />
Idem pour '''clInfoText''': il ne peut être utilisé que comme une Font.Color. L'utiliser comme Brush.Color peut ne pas convenir. Actuellement, tous les widgetsets permettent de l'utiliser comme Pen.Color aussi.<br />
<br />
==Changements de thème==<br />
<br />
Quand l'utilisateur bascule le thème, les couleurs système changent. Une '''clInfoBk''' peut passer du blanc au vert ou d'une couleur à une texture. Ce changement surgira quand vous allouerez une nouveau handle de brosse. Gardez à l'esprit que la simple affectation Brush.Color:=clInfoBk n'alloue pas un handle de brosse. Le handle est alloué à l'utilisation. Par exemple:<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // Cela ne créera pas une nouveau handle de brosse<br />
Form1.Canvas.FillRect(10,10,50,50); // Cela va le créer avec la brosse du thème actif pour les bulles d'aide<br />
...<br />
// Si le thème change maintenant, le Brush.Handle est toujours alloué avec les anciennes valeurs<br />
...<br />
Form1.Canvas.FillRect(10,10,50,50); // cela va peindre avec la brosse de l'ancien thème<br />
Form1.Canvas.Brush.Color:=clInfoBk; // affecter l'ancienne valeur ne créera pas un nouveau handle de brosse<br />
Form1.Canvas.FillRect(10,10,50,50); // cela va peindre avec la brosse de l'ancien thème<br />
Form1.Canvas.Brush.Color:=clRed; // affectant une nouvelle couleur, l'ancien handle est invalide<br />
Form1.Canvas.Brush.Color:=clInfoBk; // affectant une nouvelle couleur, l'ancien handle est invalide<br />
Form1.Canvas.FillRect(10,10,50,50); // cela créera un nouveau handle et peindra avec le nouveau thème<br />
</syntaxhighlight><br />
<br />
==Table des couleurs système==<br />
<br />
La table suivante liste les couleurs système et leur sens. Les employer en dehors du champ de leur définition est indéfini et le résultat dépend du widgetset et du thème. Par exemple, '''clDefault''' est la brosse du fond normale du contexte de périphérique utilisé. Si vous voulez peindre des éléments de boutons sur vos contrôles personnalisés, employez les fonctions de dessin de l'unité '''Themes'''.<br />
<br />
{| class="wikitable"<br />
! Constante !! Définition LCL !! Notes Delphi !! Widgetset supporté<br />
|----<br />
|clNone||Indique "ne pas peindre". L'employer comme couleur de contrôle est indéfini. Le contrôle ne deviendra pas transparent.|| - || Tous<br />
|----<br />
|clDefault||L'employer pour une brosse revient à employer la couleur de fond normal pour le contexte de périphérique cible.<br />
* Sur le canevas d'une fiche, un ''FillRect'' peindra une surface rectangulaire remplie avec le fond normal d'une fenêtre standard. Cela quelque puissent définir le widgetset et le thème. Cela peut être la couleur grise, un dégradé ou une image.<br />
* Sur le canevas d'une TListBox, cela peindra avec le fond normal, qui est souvent blanc dans Windows. Ainsi, pour une TListBox, clDefault est identique à clWindow. <br />
* L'utiliser comme couleur de crayon utilisera la couleur de ligne par défaut pour le contexte de périphérique. <br />
* L'utiliser comme couleur de fonte utilisera la couleur de texte par défaut pour le contexte de périphérique. <br />
|| - || Tous<br />
|----<br />
|clScrollBar|| Couleur du corps de barre de défilement || - || Tous<br />
|----<br />
|clBackground|| ? || - || Tous<br />
|----<br />
|clActiveCaption|| Barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clInactiveCaption|| Barre de titre de fenêtre inactive || - || Aucun<br />
|----<br />
|clMenu|| Couleur de fond d'article de menu ordinaire || - || Aucun<br />
|----<br />
|clWindow|| La brosse de fond normal d'un texte non sélectionné. Défini pour des contrôles comme TEdit, TComboBox, TMemo, TListBox, TTreeView.|| - || Aucun<br />
|----<br />
|clWindowFrame|| Couleur du cadre autour de la fenêtre || - || Aucun<br />
|----<br />
|clMenuText|| Couleur de police pour les menus à employer avec clMenu || - || Aucun<br />
|----<br />
|clWindowText|| Couleur de police d'un texte non sélectionné à employer avec clWindow || - || Aucun<br />
|----<br />
|clCaptionText|| Couleur de texte de la barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clActiveBorder||?|| - || Aucun<br />
|----<br />
|clInactiveBorder||?|| - || Aucun<br />
|----<br />
|clAppWorkspace|| Fond de la fenêtre principale en MDI || - || Aucun<br />
|----<br />
|clHighlight|| La couleur de brosse d'un élement sélectionné || - || Aucun<br />
|----<br />
|clHighlightText|| Couleur de police de texte sélectionné (à employer avec clHighligh). || - || Aucun<br />
|----<br />
|clBtnFace|| Fond de bouton || - || Aucun<br />
|----<br />
|clBtnShadow|| Couleur de l'ombre d'un bouton (en bas à droite) utilisé pour réaliser un effet 3D || - || Aucun<br />
|----<br />
|clGrayText|| Couleur de police d'un élément désactivé || - || Aucun<br />
|----<br />
|clBtnText|| Couleur de police de bouton à utiliser avec clBtnFace || - || Aucun<br />
|----<br />
|clInactiveCaptionText|| Couleur de texte du titre d'une fenêtre inactive || - || Aucun<br />
|----<br />
|clBtnHighlight|| Couleur de surlignement de bouton (en haut à gauche) utilisé pour réaliser un effet 3D || - || Aucun<br />
|----<br />
|cl3DDkShadow||?|| - || Aucun<br />
|----<br />
|cl3DLight||?|| - || Aucun<br />
|----<br />
|clInfoText|| Couleur de police pour les bulles d'aide. A employer avec clInfoBk || - || Tous<br />
|----<br />
|clInfoBk|| Couleur de police pour les bulles d'aide. A employer avec clInfoText || - || Tous<br />
|----<br />
|clHotLight||?|| - || Aucun<br />
|----<br />
|clGradientActiveCaption|| La seconde couleur utilisée pour faire le dégradé de la barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clGradientInactiveCaption|| La seconde couleur utilisée pour faire le dégradé de la barre de titre de fenêtre inactive || - || Aucun<br />
|----<br />
|clMenuHighlight|| La couleur de fond d'un article de menu sélectionné || - || Aucun<br />
|----<br />
|clMenuBar|| Couleur de fond d'une barre de menu || - || Aucun<br />
|----<br />
|clForm||?|| - || Aucun<br />
|----<br />
|clColorDesktop||?|| - || Aucun<br />
|----<br />
|cl3DFace||?|| - || Aucun<br />
|----<br />
|cl3DShadow||?|| - || Aucun<br />
|----<br />
|cl3DHiLight||?|| - || Aucun<br />
|----<br />
|clBtnHiLight|| Comme clBtnHighlight || - || Aucun<br />
|}<br />
<br />
=Dessin d'élément de thème sur vos contrôles personnalisés=<br />
<br />
L'unité '''Themes''' fournit des fonctions pour dessiner des éléments particuliers de contrôles standard. Par exemple, pour dessiner un signe d'expansion comme un '''TTreeView''' on utilise :<br />
<br />
<syntaxhighlight>uses Themes;<br />
<br />
...<br />
<br />
procedure TYourCustomControl.Paint;<br />
const<br />
PlusMinusDetail: array[Boolean {Hot}, Boolean {Expanded}] of TThemedTreeview =<br />
(<br />
(ttGlyphClosed, ttGlyphOpened),<br />
(ttHotGlyphClosed, ttHotGlyphOpened)<br />
);<br />
var<br />
Details: TThemedElementDetails;<br />
R: TRect;<br />
Collapse: boolean;<br />
begin<br />
...<br />
//dessine un signe d'expansion selon le thème.<br />
Details := ThemeServices.GetElementDetails(PlusMinusDetail[False, Collapse]);<br />
R := Rect(ALeft, ATop, ARight + 1, ABottom + 1);<br />
ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);<br />
...<br />
end;</syntaxhighlight></div>Gillou58https://wiki.freepascal.org/index.php?title=Colors/fr&diff=97841Colors/fr2015-11-21T16:43:56Z<p>Gillou58: /* Table des couleurs standard */</p>
<hr />
<div>{{Colors}}<br />
<br><br />
<br><br />
=Vue d'ensemble=<br />
<br />
Dans la LCL, '''TColor''' est le type couleur standard. Il est compatible avec le '''TColor''' de Delphi. '''TColor''' peut représenter ''soit'' une valeur RGB (3x8bits), ''soit'' une couleur ''système'' comme ''crDefault''. La LCL peut aussi travailler avec le système fpImage qui emploie le type '''TFPColor''' qui est du RGBA (4x16bits), et non du RGB (3x8bits comme '''TColor''').<br />
<br />
==Conversions entre '''TColor''' et une valeur RGB==<br />
<br />
L'unité '''Graphics''' fournit les fonctions suivantes :<br />
<br />
<syntaxhighlight>function Blue(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function Green(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function Red(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function RGBToColor(R, G, B: Byte): TColor;<br />
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte); // ne fonctionne pas avec les couleurs système<br />
function FPColorToTColor(const FPColor: TFPColor): TColor;<br />
function TColorToFPColor(const c: TColor): TFPColor; // ne fonctionne pas avec les couleurs système<br />
function IsSysColor(AColor: TColorRef): Boolean;</syntaxhighlight><br />
<br />
==Conversion entre '''TColor''' et une chaîne de caractères==<br />
Fonctions pour convertir des chaînes comme "25500" ou "$AA0088" ou "clNavy" vers le type '''TColor''':<br />
<br />
* StringToColor<br />
* StringToColorDef<br />
<br />
Pour convertir '''TColor''' vers une chaîne qui peut être adaptée à la langue de travail:<br />
<br />
* ColorToString<br />
<br />
=Table des couleurs standard=<br />
<br />
Environ une vingtaine de constantes de couleur prédéfinies sont fournies. Elles sont compatibles avec Delphi:<br />
<br />
<!--<syntaxhighlight> // couleurs standard<br />
clBlack = TColor($000000);<br />
clMaroon = TColor($000080);<br />
clGreen = TColor($008000);<br />
clOlive = TColor($008080);<br />
clNavy = TColor($800000);<br />
clPurple = TColor($800080);<br />
clTeal = TColor($808000);<br />
clGray = TColor($808080);<br />
clSilver = TColor($C0C0C0);<br />
clRed = TColor($0000FF);<br />
clLime = TColor($00FF00);<br />
clYellow = TColor($00FFFF);<br />
clBlue = TColor($FF0000);<br />
clFuchsia = TColor($FF00FF);<br />
clAqua = TColor($FFFF00);<br />
clLtGray = TColor($C0C0C0); // alias de clSilver<br />
clDkGray = TColor($808080); // alais de clGray<br />
clWhite = TColor($FFFFFF);</syntaxhighlight>--><br />
<br />
{| class="wikitable"<br />
|-<br />
! Constante Colour<br />
! Signification<br />
! Valeur hexadécimale pour emploi avec '''TColor'''<br />
! Exemple<br />
|-<br />
| clBlack<br />
| Noir<br />
| TColor($000000);<br />
| style="background: #000000" |<br />
|-<br />
| clMaroon<br />
| Marron<br />
| TColor($000080);<br />
| style="background: #800000" |<br />
|-<br />
| clGreen <br />
| Vert<br />
| TColor($008000);<br />
| style="background: #008000" |<br />
|-<br />
| clOlive <br />
| Vert Olive<br />
| TColor($008080);<br />
| style="background: #808000" |<br />
|-<br />
| clNavy <br />
| Bleu marine<br />
| TColor($800000);<br />
| style="background: #000080" |<br />
|-<br />
| clPurple <br />
| Violet<br />
| TColor($800080);<br />
| style="background: #800080" |<br />
|-<br />
| clTeal <br />
| Bleu canard<br />
| TColor($808000);<br />
| style="background: #008080" |<br />
|-<br />
| clGray <br />
| Gris<br />
| TColor($808080);<br />
| style="background: #808080" |<br />
|-<br />
| clSilver <br />
| Argent<br />
| TColor($C0C0C0);<br />
| style="background: #C0C0C0" |<br />
|-<br />
| clRed <br />
| Rouge<br />
| TColor($0000FF);<br />
| style="background: #FF0000" |<br />
|-<br />
| clLime <br />
| Vert Citron<br />
| TColor($00FF00);<br />
| style="background: #00FF00" |<br />
|-<br />
| clYellow <br />
| Jaune<br />
| TColor($00FFFF);<br />
| style="background: #FFFF00" |<br />
|-<br />
| clBlue <br />
| Bleu<br />
| TColor($FF0000);<br />
| style="background: #0000FF" |<br />
|-<br />
| clFuchsia<br />
| Fuchsia<br />
| TColor($FF00FF);<br />
| style="background: #FF00FF" |<br />
|-<br />
| clAqua <br />
| Bleu vert<br />
| TColor($FFFF00);<br />
| style="background: #00FFFF" |<br />
|-<br />
| clLtGray <br />
| Gris clair<br />
| TColor($C0C0C0);<br />
| style="background: #D3D3D3" | alias de clSilver<br />
|-<br />
| clDkGray <br />
| Gris foncé<br />
| TColor($808080);<br />
| style="background: #808080; color: white;" | alias de clGray<br />
|-<br />
| clWhite <br />
| Blanc<br />
| TColor($FFFFFF);<br />
| style="background: #FFFFFF" |<br />
|-<br />
| clCream <br />
| Crème<br />
| TColor($F0FBFF);<br />
| style="background: #FFFBF0;" | <br />
|-<br />
| clMedGray <br />
| Gris Moyen<br />
| TColor($A4A0A0);<br />
| style="background: #A0A0A4;" | <br />
|-<br />
| clMoneyGreen <br />
| Vert menthe<br />
| TColor($C0DCC0);<br />
| style="background: #C0DCC0;" | <br />
|-<br />
| clSkyBlue <br />
| Bleu ciel<br />
| TColor($F0CAA6);<br />
| style="background: #A6CAF0;" | <br />
|}<br />
<br />
=Couleurs système=<br />
<br />
==Exemples : clInfoBk, clInfoText==<br />
<br />
Les couleurs système sont des constantes avec une signification particulière. Leur valeur réelle dépend du contexte et du thème. Ce ne sont pas de simples couleurs. Par exemple '''clInfoBk''':<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // use the default background brush of a hint window<br />
Form1.Canvas.FillRect(10,10,50,50);</syntaxhighlight><br />
<br />
Une bulle d'aide dans MS Windows ayant un fond blanc, le code ci-dessus va dessiner en blanc. Dans Linux/gtk2, ce code pouvant correspondre à une texture métallique, le code va dessiner la texture. Si vous voulez placer du texte dessus, vous avez besoin d'une couleur correspondante comme '''clInfoText''', sinon votre texte sera illisible pour l'utilisateur. Par exemple:<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // utilise le fond par défaut d'une bulle d'aide<br />
Form1.Canvas.FillRect(10,10,50,50);<br />
Form1.Canvas.Font.Color:=clInfoText; // utilise la couleur du ttexte par défaut d'une bulle d'aide<br />
Form1.Canvas.TextOut(10,10,'Hint');</syntaxhighlight><br />
<br />
La couleur système '''clInfoBk''' ne peut pas être utilisée avec Pen.Color ni pour Font.Color. Si vous faites ainsi, le résultat est indéfini et dépend du widgetset et du thème de l'utilisateur.<br />
<br />
Idem pour '''clInfoText''': il ne peut être utilisé que comme une Font.Color. L'utiliser comme Brush.Color peut ne pas convenir. Actuellement, tous les widgetsets permettent de l'utiliser comme Pen.Color aussi.<br />
<br />
==Changements de thème==<br />
<br />
Quand l'utilisateur bascule le thème, les couleurs système changent. Une '''clInfoBk''' peut passer du blanc au vert ou d'une couleur à une texture. Ce changement surgira quand vous allouerez une nouveau handle de brosse. Gardez à l'esprit que la simple affectation Brush.Color:=clInfoBk n'alloue pas un handle de brosse. Le handle est alloué à l'utilisation. Par exemple:<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // Cela ne créera pas une nouveau handle de brosse<br />
Form1.Canvas.FillRect(10,10,50,50); // Cela va le créer avec la brosse du thème actif pour les bulles d'aide<br />
...<br />
// Si le thème change maintenant, le Brush.Handle est toujours alloué avec les anciennes valeurs<br />
...<br />
Form1.Canvas.FillRect(10,10,50,50); // cela va peindre avec la brosse de l'ancien thème<br />
Form1.Canvas.Brush.Color:=clInfoBk; // affecter l'ancienne valeur ne créera pas un nouveau handle de brosse<br />
Form1.Canvas.FillRect(10,10,50,50); // cela va peindre avec la brosse de l'ancien thème<br />
Form1.Canvas.Brush.Color:=clRed; // affectant une nouvelle couleur, l'ancien handle est invalide<br />
Form1.Canvas.Brush.Color:=clInfoBk; // affectant une nouvelle couleur, l'ancien handle est invalide<br />
Form1.Canvas.FillRect(10,10,50,50); // cela créera un nouveau handle et peindra avec le nouveau thème<br />
</syntaxhighlight><br />
<br />
==Table des couleurs système==<br />
<br />
La table suivante liste les couleurs système et leur sens. Les employer en dehors du champ de leur définition est indéfini et le résultat dépend du widgetset et du thème. Par exemple, '''clDefault''' est la brosse du fond normale du contexte de périphérique utilisé. Si vous voulez peindre des éléments de boutons sur vos contrôles personnalisés, employez les fonctions de dessin de l'unité '''Themes'''.<br />
<br />
{| class="wikitable"<br />
! Constante !! Définition LCL !! Notes Delphi !! Widgetset supporté<br />
|----<br />
|clNone||Indique "ne pas peindre". L'employer comme couleur de contrôle est indéfini. Le contrôle ne deviendra pas transparent.|| - || Tous<br />
|----<br />
|clDefault||L'employer pour une brosse revient à employer la couleur de fond normal pour le contexte de périphérique cible.<br />
* Sur le canevas d'une fiche, un ''FillRect'' peindra une surface rectangulaire remplie avec le fond normal d'une fenêtre standard. Cela quelque puissent définir le widgetset et le thème. Cela peut être la couleur grise, un dégradé ou une image.<br />
* Sur le canevas d'une TListBox, cela peindra avec le fond normal, qui est souvent blanc dans Windows. Ainsi, pour une TListBox, clDefault est identique à clWindow. <br />
* L'utiliser comme couleur de crayon utilisera la couleur de ligne par défaut pour le contexte de périphérique. <br />
* L'utiliser comme couleur de fonte utilisera la couleur de texte par défaut pour le contexte de périphérique. <br />
|| - || Tous<br />
|----<br />
|clScrollBar|| Couleur du corps de barre de défilement || - || Tous<br />
|----<br />
|clBackground|| ? || - || Tous<br />
|----<br />
|clActiveCaption|| Barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clInactiveCaption|| Barre de titre de fenêtre inactive || - || Aucun<br />
|----<br />
|clMenu|| Couleur de fond d'article de menu ordinaire || - || Aucun<br />
|----<br />
|clWindow|| La brosse de fond normal d'un texte non sélectionné. Défini pour des contrôles comme TEdit, TComboBox, TMemo, TListBox, TTreeView.|| - || Aucun<br />
|----<br />
|clWindowFrame|| Couleur du cadre autour de la fenêtre || - || Aucun<br />
|----<br />
|clMenuText|| Couleur de police pour les menus à employer avec clMenu || - || Aucun<br />
|----<br />
|clWindowText|| Couleur de police d'un texte non sélectionné à employer avec clWindow || - || Aucun<br />
|----<br />
|clCaptionText|| Couleur de texte de la barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clActiveBorder||?|| - || Aucun<br />
|----<br />
|clInactiveBorder||?|| - || Aucun<br />
|----<br />
|clAppWorkspace|| Fond de la fenêtre principale en MDI || - || Aucun<br />
|----<br />
|clHighlight|| La couleur de brosse d'un élement sélectionné || - || Aucun<br />
|----<br />
|clHighlightText|| Couleur de police de texte sélectionné (à employer avec clHighligh). || - || Aucun<br />
|----<br />
|clBtnFace|| Fond de bouton || - || Aucun<br />
|----<br />
|clBtnShadow|| Couleur de l'ombre d'un bouton (en bas à droite) utilisé pour réaliser un effet 3D || - || Aucun<br />
|----<br />
|clGrayText|| Couleur de police d'un élément désactivé || - || Aucun<br />
|----<br />
|clBtnText|| Couleur de police de bouton à utiliser avec clBtnFace || - || Aucun<br />
|----<br />
|clInactiveCaptionText|| Couleur de texte du titre d'une fenêtre inactive || - || Aucun<br />
|----<br />
|clBtnHighlight|| Couleur de surlignement de bouton (en haut à gauche) utilisé pour réaliser un effet 3D || - || Aucun<br />
|----<br />
|cl3DDkShadow||?|| - || Aucun<br />
|----<br />
|cl3DLight||?|| - || Aucun<br />
|----<br />
|clInfoText|| Couleur de police pour les bulles d'aide. A employer avec clInfoBk || - || Tous<br />
|----<br />
|clInfoBk|| Couleur de police pour les bulles d'aide. A employer avec clInfoText || - || Tous<br />
|----<br />
|clHotLight||?|| - || Aucun<br />
|----<br />
|clGradientActiveCaption|| La seconde couleur utilisée pour faire le dégradé de la barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clGradientInactiveCaption|| La seconde couleur utilisée pour faire le dégradé de la barre de titre de fenêtre inactive || - || Aucun<br />
|----<br />
|clMenuHighlight|| La couleur de fond d'un article de menu sélectionné || - || Aucun<br />
|----<br />
|clMenuBar|| Couleur de fond d'une barre de menu || - || Aucun<br />
|----<br />
|clForm||?|| - || Aucun<br />
|----<br />
|clColorDesktop||?|| - || Aucun<br />
|----<br />
|cl3DFace||?|| - || Aucun<br />
|----<br />
|cl3DShadow||?|| - || Aucun<br />
|----<br />
|cl3DHiLight||?|| - || Aucun<br />
|----<br />
|clBtnHiLight|| Comme clBtnHighlight || - || Aucun<br />
|}<br />
<br />
=Dessin d'élément de thème sur vos contrôles personnalisés=<br />
<br />
L'unité '''Themes''' fournit des fonctions pour dessiner des éléments particuliers de contrôles standard. Par exemple, pour dessiner un signe d'expansion comme un '''TTreeView''' on utilise :<br />
<br />
<syntaxhighlight>uses Themes;<br />
<br />
...<br />
<br />
procedure TYourCustomControl.Paint;<br />
const<br />
PlusMinusDetail: array[Boolean {Hot}, Boolean {Expanded}] of TThemedTreeview =<br />
(<br />
(ttGlyphClosed, ttGlyphOpened),<br />
(ttHotGlyphClosed, ttHotGlyphOpened)<br />
);<br />
var<br />
Details: TThemedElementDetails;<br />
R: TRect;<br />
Collapse: boolean;<br />
begin<br />
...<br />
//dessine un signe d'expansion selon le thème.<br />
Details := ThemeServices.GetElementDetails(PlusMinusDetail[False, Collapse]);<br />
R := Rect(ALeft, ATop, ARight + 1, ABottom + 1);<br />
ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);<br />
...<br />
end;</syntaxhighlight></div>Gillou58https://wiki.freepascal.org/index.php?title=Colors/fr&diff=97840Colors/fr2015-11-21T16:37:52Z<p>Gillou58: /* Vue d'ensemble */</p>
<hr />
<div>{{Colors}}<br />
<br><br />
<br><br />
=Vue d'ensemble=<br />
<br />
Dans la LCL, '''TColor''' est le type couleur standard. Il est compatible avec le '''TColor''' de Delphi. '''TColor''' peut représenter ''soit'' une valeur RGB (3x8bits), ''soit'' une couleur ''système'' comme ''crDefault''. La LCL peut aussi travailler avec le système fpImage qui emploie le type '''TFPColor''' qui est du RGBA (4x16bits), et non du RGB (3x8bits comme '''TColor''').<br />
<br />
==Conversions entre '''TColor''' et une valeur RGB==<br />
<br />
L'unité '''Graphics''' fournit les fonctions suivantes :<br />
<br />
<syntaxhighlight>function Blue(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function Green(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function Red(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function RGBToColor(R, G, B: Byte): TColor;<br />
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte); // ne fonctionne pas avec les couleurs système<br />
function FPColorToTColor(const FPColor: TFPColor): TColor;<br />
function TColorToFPColor(const c: TColor): TFPColor; // ne fonctionne pas avec les couleurs système<br />
function IsSysColor(AColor: TColorRef): Boolean;</syntaxhighlight><br />
<br />
==Conversion entre '''TColor''' et une chaîne de caractères==<br />
Fonctions pour convertir des chaînes comme "25500" ou "$AA0088" ou "clNavy" vers le type '''TColor''':<br />
<br />
* StringToColor<br />
* StringToColorDef<br />
<br />
Pour convertir '''TColor''' vers une chaîne qui peut être adaptée à la langue de travail:<br />
<br />
* ColorToString<br />
<br />
=Table des couleurs standard=<br />
<br />
Environ une vingtaine de constantes de couleur prédéfinies sont fournies. Elles sont compatibles avec Delphi:<br />
<br />
<!--<syntaxhighlight> // couleurs standard<br />
clBlack = TColor($000000);<br />
clMaroon = TColor($000080);<br />
clGreen = TColor($008000);<br />
clOlive = TColor($008080);<br />
clNavy = TColor($800000);<br />
clPurple = TColor($800080);<br />
clTeal = TColor($808000);<br />
clGray = TColor($808080);<br />
clSilver = TColor($C0C0C0);<br />
clRed = TColor($0000FF);<br />
clLime = TColor($00FF00);<br />
clYellow = TColor($00FFFF);<br />
clBlue = TColor($FF0000);<br />
clFuchsia = TColor($FF00FF);<br />
clAqua = TColor($FFFF00);<br />
clLtGray = TColor($C0C0C0); // clSilver alias<br />
clDkGray = TColor($808080); // clGray alias<br />
clWhite = TColor($FFFFFF);</syntaxhighlight>--><br />
<br />
{| class="wikitable"<br />
|-<br />
! Constante Colour<br />
! Signification<br />
! Valeur hexadécimale pour emploi avec '''TColor'''<br />
! Exemple<br />
|-<br />
| clBlack<br />
| Noir<br />
| TColor($000000);<br />
| style="background: #000000" |<br />
|-<br />
| clMaroon<br />
| Marron<br />
| TColor($000080);<br />
| style="background: #800000" |<br />
|-<br />
| clGreen <br />
| Vert<br />
| TColor($008000);<br />
| style="background: #008000" |<br />
|-<br />
| clOlive <br />
| Vert Olive<br />
| TColor($008080);<br />
| style="background: #808000" |<br />
|-<br />
| clNavy <br />
| Bleu marine<br />
| TColor($800000);<br />
| style="background: #000080" |<br />
|-<br />
| clPurple <br />
| Violet<br />
| TColor($800080);<br />
| style="background: #800080" |<br />
|-<br />
| clTeal <br />
| Bleu canard<br />
| TColor($808000);<br />
| style="background: #008080" |<br />
|-<br />
| clGray <br />
| Gris<br />
| TColor($808080);<br />
| style="background: #808080" |<br />
|-<br />
| clSilver <br />
| Argent<br />
| TColor($C0C0C0);<br />
| style="background: #C0C0C0" |<br />
|-<br />
| clRed <br />
| Rouge<br />
| TColor($0000FF);<br />
| style="background: #FF0000" |<br />
|-<br />
| clLime <br />
| Vert Citron<br />
| TColor($00FF00);<br />
| style="background: #00FF00" |<br />
|-<br />
| clYellow <br />
| Jaune<br />
| TColor($00FFFF);<br />
| style="background: #FFFF00" |<br />
|-<br />
| clBlue <br />
| Bleu<br />
| TColor($FF0000);<br />
| style="background: #0000FF" |<br />
|-<br />
| clFuchsia<br />
| Fuchsia<br />
| TColor($FF00FF);<br />
| style="background: #FF00FF" |<br />
|-<br />
| clAqua <br />
| Bleu vert<br />
| TColor($FFFF00);<br />
| style="background: #00FFFF" |<br />
|-<br />
| clLtGray <br />
| Gris clair<br />
| TColor($C0C0C0);<br />
| style="background: #D3D3D3" | clSilver alias<br />
|-<br />
| clDkGray <br />
| Gris foncé<br />
| TColor($808080);<br />
| style="background: #808080; color: white;" | clGray alias<br />
|-<br />
| clWhite <br />
| Blanc<br />
| TColor($FFFFFF);<br />
| style="background: #FFFFFF" |<br />
|-<br />
| clCream <br />
| Crème<br />
| TColor($F0FBFF);<br />
| style="background: #FFFBF0;" | Lazarus 1.2 et plus récent<br />
|-<br />
| clMedGray <br />
| Gris Moyen<br />
| TColor($A4A0A0);<br />
| style="background: #A0A0A4;" | Lazarus 1.2 et plus récent<br />
|-<br />
| clMoneyGreen <br />
| Vert menthe<br />
| TColor($C0DCC0);<br />
| style="background: #C0DCC0;" | Lazarus 1.2 et plus récent<br />
|-<br />
| clSkyBlue <br />
| Bleu ciel<br />
| TColor($F0CAA6);<br />
| style="background: #A6CAF0;" | Lazarus 1.2 et plus récent<br />
|}<br />
<br />
=Couleurs système=<br />
<br />
==Exemples : clInfoBk, clInfoText==<br />
<br />
Les couleurs système sont des constantes avec une signification particulière. Leur valeur réelle dépend du contexte et du thème. Ce ne sont pas de simples couleurs. Par exemple '''clInfoBk''':<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // use the default background brush of a hint window<br />
Form1.Canvas.FillRect(10,10,50,50);</syntaxhighlight><br />
<br />
Une bulle d'aide dans MS Windows ayant un fond blanc, le code ci-dessus va dessiner en blanc. Dans Linux/gtk2, ce code pouvant correspondre à une texture métallique, le code va dessiner la texture. Si vous voulez placer du texte dessus, vous avez besoin d'une couleur correspondante comme '''clInfoText''', sinon votre texte sera illisible pour l'utilisateur. Par exemple:<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // utilise le fond par défaut d'une bulle d'aide<br />
Form1.Canvas.FillRect(10,10,50,50);<br />
Form1.Canvas.Font.Color:=clInfoText; // utilise la couleur du ttexte par défaut d'une bulle d'aide<br />
Form1.Canvas.TextOut(10,10,'Hint');</syntaxhighlight><br />
<br />
La couleur système '''clInfoBk''' ne peut pas être utilisée avec Pen.Color ni pour Font.Color. Si vous faites ainsi, le résultat est indéfini et dépend du widgetset et du thème de l'utilisateur.<br />
<br />
Idem pour '''clInfoText''': il ne peut être utilisé que comme une Font.Color. L'utiliser comme Brush.Color peut ne pas convenir. Actuellement, tous les widgetsets permettent de l'utiliser comme Pen.Color aussi.<br />
<br />
==Changements de thème==<br />
<br />
Quand l'utilisateur bascule le thème, les couleurs système changent. Une '''clInfoBk''' peut passer du blanc au vert ou d'une couleur à une texture. Ce changement surgira quand vous allouerez une nouveau handle de brosse. Gardez à l'esprit que la simple affectation Brush.Color:=clInfoBk n'alloue pas un handle de brosse. Le handle est alloué à l'utilisation. Par exemple:<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // Cela ne créera pas une nouveau handle de brosse<br />
Form1.Canvas.FillRect(10,10,50,50); // Cela va le créer avec la brosse du thème actif pour les bulles d'aide<br />
...<br />
// Si le thème change maintenant, le Brush.Handle est toujours alloué avec les anciennes valeurs<br />
...<br />
Form1.Canvas.FillRect(10,10,50,50); // cela va peindre avec la brosse de l'ancien thème<br />
Form1.Canvas.Brush.Color:=clInfoBk; // affecter l'ancienne valeur ne créera pas un nouveau handle de brosse<br />
Form1.Canvas.FillRect(10,10,50,50); // cela va peindre avec la brosse de l'ancien thème<br />
Form1.Canvas.Brush.Color:=clRed; // affectant une nouvelle couleur, l'ancien handle est invalide<br />
Form1.Canvas.Brush.Color:=clInfoBk; // affectant une nouvelle couleur, l'ancien handle est invalide<br />
Form1.Canvas.FillRect(10,10,50,50); // cela créera un nouveau handle et peindra avec le nouveau thème<br />
</syntaxhighlight><br />
<br />
==Table des couleurs système==<br />
<br />
La table suivante liste les couleurs système et leur sens. Les employer en dehors du champ de leur définition est indéfini et le résultat dépend du widgetset et du thème. Par exemple, '''clDefault''' est la brosse du fond normale du contexte de périphérique utilisé. Si vous voulez peindre des éléments de boutons sur vos contrôles personnalisés, employez les fonctions de dessin de l'unité '''Themes'''.<br />
<br />
{| class="wikitable"<br />
! Constante !! Définition LCL !! Notes Delphi !! Widgetset supporté<br />
|----<br />
|clNone||Indique "ne pas peindre". L'employer comme couleur de contrôle est indéfini. Le contrôle ne deviendra pas transparent.|| - || Tous<br />
|----<br />
|clDefault||L'employer pour une brosse revient à employer la couleur de fond normal pour le contexte de périphérique cible.<br />
* Sur le canevas d'une fiche, un ''FillRect'' peindra une surface rectangulaire remplie avec le fond normal d'une fenêtre standard. Cela quelque puissent définir le widgetset et le thème. Cela peut être la couleur grise, un dégradé ou une image.<br />
* Sur le canevas d'une TListBox, cela peindra avec le fond normal, qui est souvent blanc dans Windows. Ainsi, pour une TListBox, clDefault est identique à clWindow. <br />
* L'utiliser comme couleur de crayon utilisera la couleur de ligne par défaut pour le contexte de périphérique. <br />
* L'utiliser comme couleur de fonte utilisera la couleur de texte par défaut pour le contexte de périphérique. <br />
|| - || Tous<br />
|----<br />
|clScrollBar|| Couleur du corps de barre de défilement || - || Tous<br />
|----<br />
|clBackground|| ? || - || Tous<br />
|----<br />
|clActiveCaption|| Barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clInactiveCaption|| Barre de titre de fenêtre inactive || - || Aucun<br />
|----<br />
|clMenu|| Couleur de fond d'article de menu ordinaire || - || Aucun<br />
|----<br />
|clWindow|| La brosse de fond normal d'un texte non sélectionné. Défini pour des contrôles comme TEdit, TComboBox, TMemo, TListBox, TTreeView.|| - || Aucun<br />
|----<br />
|clWindowFrame|| Couleur du cadre autour de la fenêtre || - || Aucun<br />
|----<br />
|clMenuText|| Couleur de police pour les menus à employer avec clMenu || - || Aucun<br />
|----<br />
|clWindowText|| Couleur de police d'un texte non sélectionné à employer avec clWindow || - || Aucun<br />
|----<br />
|clCaptionText|| Couleur de texte de la barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clActiveBorder||?|| - || Aucun<br />
|----<br />
|clInactiveBorder||?|| - || Aucun<br />
|----<br />
|clAppWorkspace|| Fond de la fenêtre principale en MDI || - || Aucun<br />
|----<br />
|clHighlight|| La couleur de brosse d'un élement sélectionné || - || Aucun<br />
|----<br />
|clHighlightText|| Couleur de police de texte sélectionné (à employer avec clHighligh). || - || Aucun<br />
|----<br />
|clBtnFace|| Fond de bouton || - || Aucun<br />
|----<br />
|clBtnShadow|| Couleur de l'ombre d'un bouton (en bas à droite) utilisé pour réaliser un effet 3D || - || Aucun<br />
|----<br />
|clGrayText|| Couleur de police d'un élément désactivé || - || Aucun<br />
|----<br />
|clBtnText|| Couleur de police de bouton à utiliser avec clBtnFace || - || Aucun<br />
|----<br />
|clInactiveCaptionText|| Couleur de texte du titre d'une fenêtre inactive || - || Aucun<br />
|----<br />
|clBtnHighlight|| Couleur de surlignement de bouton (en haut à gauche) utilisé pour réaliser un effet 3D || - || Aucun<br />
|----<br />
|cl3DDkShadow||?|| - || Aucun<br />
|----<br />
|cl3DLight||?|| - || Aucun<br />
|----<br />
|clInfoText|| Couleur de police pour les bulles d'aide. A employer avec clInfoBk || - || Tous<br />
|----<br />
|clInfoBk|| Couleur de police pour les bulles d'aide. A employer avec clInfoText || - || Tous<br />
|----<br />
|clHotLight||?|| - || Aucun<br />
|----<br />
|clGradientActiveCaption|| La seconde couleur utilisée pour faire le dégradé de la barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clGradientInactiveCaption|| La seconde couleur utilisée pour faire le dégradé de la barre de titre de fenêtre inactive || - || Aucun<br />
|----<br />
|clMenuHighlight|| La couleur de fond d'un article de menu sélectionné || - || Aucun<br />
|----<br />
|clMenuBar|| Couleur de fond d'une barre de menu || - || Aucun<br />
|----<br />
|clForm||?|| - || Aucun<br />
|----<br />
|clColorDesktop||?|| - || Aucun<br />
|----<br />
|cl3DFace||?|| - || Aucun<br />
|----<br />
|cl3DShadow||?|| - || Aucun<br />
|----<br />
|cl3DHiLight||?|| - || Aucun<br />
|----<br />
|clBtnHiLight|| Comme clBtnHighlight || - || Aucun<br />
|}<br />
<br />
=Dessin d'élément de thème sur vos contrôles personnalisés=<br />
<br />
L'unité '''Themes''' fournit des fonctions pour dessiner des éléments particuliers de contrôles standard. Par exemple, pour dessiner un signe d'expansion comme un '''TTreeView''' on utilise :<br />
<br />
<syntaxhighlight>uses Themes;<br />
<br />
...<br />
<br />
procedure TYourCustomControl.Paint;<br />
const<br />
PlusMinusDetail: array[Boolean {Hot}, Boolean {Expanded}] of TThemedTreeview =<br />
(<br />
(ttGlyphClosed, ttGlyphOpened),<br />
(ttHotGlyphClosed, ttHotGlyphOpened)<br />
);<br />
var<br />
Details: TThemedElementDetails;<br />
R: TRect;<br />
Collapse: boolean;<br />
begin<br />
...<br />
//dessine un signe d'expansion selon le thème.<br />
Details := ThemeServices.GetElementDetails(PlusMinusDetail[False, Collapse]);<br />
R := Rect(ALeft, ATop, ARight + 1, ABottom + 1);<br />
ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);<br />
...<br />
end;</syntaxhighlight></div>Gillou58https://wiki.freepascal.org/index.php?title=Colors/fr&diff=97839Colors/fr2015-11-21T16:33:43Z<p>Gillou58: </p>
<hr />
<div>{{Colors}}<br />
<br><br />
<br><br />
=Vue d'ensemble=<br />
<br />
Dans la LCL, '''TColor''' est le type couleur standard. Il est compatible avec le '''TColor''' de Delphi. '''TColor''' peut représenter ''soit'' une valeur RGB (3x8bit), ''soit'' une couleur ''système'' comme ''crDefault''. La LCL peut aussi travailler avec le système fpImage qui emploie le type '''TFPColor''' qui est du RGBA (4x16bit), et non du RGB (3x8bit comme '''TColor''').<br />
<br />
==Conversions entre '''TColor''' et une valeur RGB==<br />
<br />
L'unité '''Graphics''' fournit les fonctions suivantes :<br />
<br />
<syntaxhighlight>function Blue(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function Green(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function Red(rgb: TColor): BYTE; // ne fonctionne pas avec les couleurs système<br />
function RGBToColor(R, G, B: Byte): TColor;<br />
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte); // ne fonctionne pas avec les couleurs système<br />
function FPColorToTColor(const FPColor: TFPColor): TColor;<br />
function TColorToFPColor(const c: TColor): TFPColor; // ne fonctionne pas avec les couleurs système<br />
function IsSysColor(AColor: TColorRef): Boolean;</syntaxhighlight><br />
<br />
==Conversion entre '''TColor''' et une chaîne de caractères==<br />
Fonctions pour convertir des chaînes comme "25500" ou "$AA0088" ou "clNavy" vers le type '''TColor''':<br />
<br />
* StringToColor<br />
* StringToColorDef<br />
<br />
Pour convertir '''TColor''' vers une jolie chaîne:<br />
<br />
* ColorToString<br />
<br />
=Table des couleurs standard=<br />
<br />
Environ une vingtaine de constantes de couleur prédéfinies sont fournies. Elles sont compatibles avec Delphi:<br />
<br />
<!--<syntaxhighlight> // couleurs standard<br />
clBlack = TColor($000000);<br />
clMaroon = TColor($000080);<br />
clGreen = TColor($008000);<br />
clOlive = TColor($008080);<br />
clNavy = TColor($800000);<br />
clPurple = TColor($800080);<br />
clTeal = TColor($808000);<br />
clGray = TColor($808080);<br />
clSilver = TColor($C0C0C0);<br />
clRed = TColor($0000FF);<br />
clLime = TColor($00FF00);<br />
clYellow = TColor($00FFFF);<br />
clBlue = TColor($FF0000);<br />
clFuchsia = TColor($FF00FF);<br />
clAqua = TColor($FFFF00);<br />
clLtGray = TColor($C0C0C0); // clSilver alias<br />
clDkGray = TColor($808080); // clGray alias<br />
clWhite = TColor($FFFFFF);</syntaxhighlight>--><br />
<br />
{| class="wikitable"<br />
|-<br />
! Constante Colour<br />
! Signification<br />
! Valeur hexadécimale pour emploi avec '''TColor'''<br />
! Exemple<br />
|-<br />
| clBlack<br />
| Noir<br />
| TColor($000000);<br />
| style="background: #000000" |<br />
|-<br />
| clMaroon<br />
| Marron<br />
| TColor($000080);<br />
| style="background: #800000" |<br />
|-<br />
| clGreen <br />
| Vert<br />
| TColor($008000);<br />
| style="background: #008000" |<br />
|-<br />
| clOlive <br />
| Vert Olive<br />
| TColor($008080);<br />
| style="background: #808000" |<br />
|-<br />
| clNavy <br />
| Bleu marine<br />
| TColor($800000);<br />
| style="background: #000080" |<br />
|-<br />
| clPurple <br />
| Violet<br />
| TColor($800080);<br />
| style="background: #800080" |<br />
|-<br />
| clTeal <br />
| Bleu canard<br />
| TColor($808000);<br />
| style="background: #008080" |<br />
|-<br />
| clGray <br />
| Gris<br />
| TColor($808080);<br />
| style="background: #808080" |<br />
|-<br />
| clSilver <br />
| Argent<br />
| TColor($C0C0C0);<br />
| style="background: #C0C0C0" |<br />
|-<br />
| clRed <br />
| Rouge<br />
| TColor($0000FF);<br />
| style="background: #FF0000" |<br />
|-<br />
| clLime <br />
| Vert Citron<br />
| TColor($00FF00);<br />
| style="background: #00FF00" |<br />
|-<br />
| clYellow <br />
| Jaune<br />
| TColor($00FFFF);<br />
| style="background: #FFFF00" |<br />
|-<br />
| clBlue <br />
| Bleu<br />
| TColor($FF0000);<br />
| style="background: #0000FF" |<br />
|-<br />
| clFuchsia<br />
| Fuchsia<br />
| TColor($FF00FF);<br />
| style="background: #FF00FF" |<br />
|-<br />
| clAqua <br />
| Bleu vert<br />
| TColor($FFFF00);<br />
| style="background: #00FFFF" |<br />
|-<br />
| clLtGray <br />
| Gris clair<br />
| TColor($C0C0C0);<br />
| style="background: #D3D3D3" | clSilver alias<br />
|-<br />
| clDkGray <br />
| Gris foncé<br />
| TColor($808080);<br />
| style="background: #808080; color: white;" | clGray alias<br />
|-<br />
| clWhite <br />
| Blanc<br />
| TColor($FFFFFF);<br />
| style="background: #FFFFFF" |<br />
|-<br />
| clCream <br />
| Crème<br />
| TColor($F0FBFF);<br />
| style="background: #FFFBF0;" | Lazarus 1.2 et plus récent<br />
|-<br />
| clMedGray <br />
| Gris Moyen<br />
| TColor($A4A0A0);<br />
| style="background: #A0A0A4;" | Lazarus 1.2 et plus récent<br />
|-<br />
| clMoneyGreen <br />
| Vert menthe<br />
| TColor($C0DCC0);<br />
| style="background: #C0DCC0;" | Lazarus 1.2 et plus récent<br />
|-<br />
| clSkyBlue <br />
| Bleu ciel<br />
| TColor($F0CAA6);<br />
| style="background: #A6CAF0;" | Lazarus 1.2 et plus récent<br />
|}<br />
<br />
=Couleurs système=<br />
<br />
==Exemples : clInfoBk, clInfoText==<br />
<br />
Les couleurs système sont des constantes avec une signification particulière. Leur valeur réelle dépend du contexte et du thème. Ce ne sont pas de simples couleurs. Par exemple '''clInfoBk''':<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // use the default background brush of a hint window<br />
Form1.Canvas.FillRect(10,10,50,50);</syntaxhighlight><br />
<br />
Une bulle d'aide dans MS Windows ayant un fond blanc, le code ci-dessus va dessiner en blanc. Dans Linux/gtk2, ce code pouvant correspondre à une texture métallique, le code va dessiner la texture. Si vous voulez placer du texte dessus, vous avez besoin d'une couleur correspondante comme '''clInfoText''', sinon votre texte sera illisible pour l'utilisateur. Par exemple:<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // utilise le fond par défaut d'une bulle d'aide<br />
Form1.Canvas.FillRect(10,10,50,50);<br />
Form1.Canvas.Font.Color:=clInfoText; // utilise la couleur du ttexte par défaut d'une bulle d'aide<br />
Form1.Canvas.TextOut(10,10,'Hint');</syntaxhighlight><br />
<br />
La couleur système '''clInfoBk''' ne peut pas être utilisée avec Pen.Color ni pour Font.Color. Si vous faites ainsi, le résultat est indéfini et dépend du widgetset et du thème de l'utilisateur.<br />
<br />
Idem pour '''clInfoText''': il ne peut être utilisé que comme une Font.Color. L'utiliser comme Brush.Color peut ne pas convenir. Actuellement, tous les widgetsets permettent de l'utiliser comme Pen.Color aussi.<br />
<br />
==Changements de thème==<br />
<br />
Quand l'utilisateur bascule le thème, les couleurs système changent. Une '''clInfoBk''' peut passer du blanc au vert ou d'une couleur à une texture. Ce changement surgira quand vous allouerez une nouveau handle de brosse. Gardez à l'esprit que la simple affectation Brush.Color:=clInfoBk n'alloue pas un handle de brosse. Le handle est alloué à l'utilisation. Par exemple:<br />
<br />
<syntaxhighlight>Form1.Canvas.Brush.Color:=clInfoBk; // Cela ne créera pas une nouveau handle de brosse<br />
Form1.Canvas.FillRect(10,10,50,50); // Cela va le créer avec la brosse du thème actif pour les bulles d'aide<br />
...<br />
// Si le thème change maintenant, le Brush.Handle est toujours alloué avec les anciennes valeurs<br />
...<br />
Form1.Canvas.FillRect(10,10,50,50); // cela va peindre avec la brosse de l'ancien thème<br />
Form1.Canvas.Brush.Color:=clInfoBk; // affecter l'ancienne valeur ne créera pas un nouveau handle de brosse<br />
Form1.Canvas.FillRect(10,10,50,50); // cela va peindre avec la brosse de l'ancien thème<br />
Form1.Canvas.Brush.Color:=clRed; // affectant une nouvelle couleur, l'ancien handle est invalide<br />
Form1.Canvas.Brush.Color:=clInfoBk; // affectant une nouvelle couleur, l'ancien handle est invalide<br />
Form1.Canvas.FillRect(10,10,50,50); // cela créera un nouveau handle et peindra avec le nouveau thème<br />
</syntaxhighlight><br />
<br />
==Table des couleurs système==<br />
<br />
La table suivante liste les couleurs système et leur sens. Les employer en dehors du champ de leur définition est indéfini et le résultat dépend du widgetset et du thème. Par exemple, '''clDefault''' est la brosse du fond normale du contexte de périphérique utilisé. Si vous voulez peindre des éléments de boutons sur vos contrôles personnalisés, employez les fonctions de dessin de l'unité '''Themes'''.<br />
<br />
{| class="wikitable"<br />
! Constante !! Définition LCL !! Notes Delphi !! Widgetset supporté<br />
|----<br />
|clNone||Indique "ne pas peindre". L'employer comme couleur de contrôle est indéfini. Le contrôle ne deviendra pas transparent.|| - || Tous<br />
|----<br />
|clDefault||L'employer pour une brosse revient à employer la couleur de fond normal pour le contexte de périphérique cible.<br />
* Sur le canevas d'une fiche, un ''FillRect'' peindra une surface rectangulaire remplie avec le fond normal d'une fenêtre standard. Cela quelque puissent définir le widgetset et le thème. Cela peut être la couleur grise, un dégradé ou une image.<br />
* Sur le canevas d'une TListBox, cela peindra avec le fond normal, qui est souvent blanc dans Windows. Ainsi, pour une TListBox, clDefault est identique à clWindow. <br />
* L'utiliser comme couleur de crayon utilisera la couleur de ligne par défaut pour le contexte de périphérique. <br />
* L'utiliser comme couleur de fonte utilisera la couleur de texte par défaut pour le contexte de périphérique. <br />
|| - || Tous<br />
|----<br />
|clScrollBar|| Couleur du corps de barre de défilement || - || Tous<br />
|----<br />
|clBackground|| ? || - || Tous<br />
|----<br />
|clActiveCaption|| Barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clInactiveCaption|| Barre de titre de fenêtre inactive || - || Aucun<br />
|----<br />
|clMenu|| Couleur de fond d'article de menu ordinaire || - || Aucun<br />
|----<br />
|clWindow|| La brosse de fond normal d'un texte non sélectionné. Défini pour des contrôles comme TEdit, TComboBox, TMemo, TListBox, TTreeView.|| - || Aucun<br />
|----<br />
|clWindowFrame|| Couleur du cadre autour de la fenêtre || - || Aucun<br />
|----<br />
|clMenuText|| Couleur de police pour les menus à employer avec clMenu || - || Aucun<br />
|----<br />
|clWindowText|| Couleur de police d'un texte non sélectionné à employer avec clWindow || - || Aucun<br />
|----<br />
|clCaptionText|| Couleur de texte de la barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clActiveBorder||?|| - || Aucun<br />
|----<br />
|clInactiveBorder||?|| - || Aucun<br />
|----<br />
|clAppWorkspace|| Fond de la fenêtre principale en MDI || - || Aucun<br />
|----<br />
|clHighlight|| La couleur de brosse d'un élement sélectionné || - || Aucun<br />
|----<br />
|clHighlightText|| Couleur de police de texte sélectionné (à employer avec clHighligh). || - || Aucun<br />
|----<br />
|clBtnFace|| Fond de bouton || - || Aucun<br />
|----<br />
|clBtnShadow|| Couleur de l'ombre d'un bouton (en bas à droite) utilisé pour réaliser un effet 3D || - || Aucun<br />
|----<br />
|clGrayText|| Couleur de police d'un élément désactivé || - || Aucun<br />
|----<br />
|clBtnText|| Couleur de police de bouton à utiliser avec clBtnFace || - || Aucun<br />
|----<br />
|clInactiveCaptionText|| Couleur de texte du titre d'une fenêtre inactive || - || Aucun<br />
|----<br />
|clBtnHighlight|| Couleur de surlignement de bouton (en haut à gauche) utilisé pour réaliser un effet 3D || - || Aucun<br />
|----<br />
|cl3DDkShadow||?|| - || Aucun<br />
|----<br />
|cl3DLight||?|| - || Aucun<br />
|----<br />
|clInfoText|| Couleur de police pour les bulles d'aide. A employer avec clInfoBk || - || Tous<br />
|----<br />
|clInfoBk|| Couleur de police pour les bulles d'aide. A employer avec clInfoText || - || Tous<br />
|----<br />
|clHotLight||?|| - || Aucun<br />
|----<br />
|clGradientActiveCaption|| La seconde couleur utilisée pour faire le dégradé de la barre de titre de la fenêtre active || - || Aucun<br />
|----<br />
|clGradientInactiveCaption|| La seconde couleur utilisée pour faire le dégradé de la barre de titre de fenêtre inactive || - || Aucun<br />
|----<br />
|clMenuHighlight|| La couleur de fond d'un article de menu sélectionné || - || Aucun<br />
|----<br />
|clMenuBar|| Couleur de fond d'une barre de menu || - || Aucun<br />
|----<br />
|clForm||?|| - || Aucun<br />
|----<br />
|clColorDesktop||?|| - || Aucun<br />
|----<br />
|cl3DFace||?|| - || Aucun<br />
|----<br />
|cl3DShadow||?|| - || Aucun<br />
|----<br />
|cl3DHiLight||?|| - || Aucun<br />
|----<br />
|clBtnHiLight|| Comme clBtnHighlight || - || Aucun<br />
|}<br />
<br />
=Dessin d'élément de thème sur vos contrôles personnalisés=<br />
<br />
L'unité '''Themes''' fournit des fonctions pour dessiner des éléments particuliers de contrôles standard. Par exemple, pour dessiner un signe d'expansion comme un '''TTreeView''' on utilise :<br />
<br />
<syntaxhighlight>uses Themes;<br />
<br />
...<br />
<br />
procedure TYourCustomControl.Paint;<br />
const<br />
PlusMinusDetail: array[Boolean {Hot}, Boolean {Expanded}] of TThemedTreeview =<br />
(<br />
(ttGlyphClosed, ttGlyphOpened),<br />
(ttHotGlyphClosed, ttHotGlyphOpened)<br />
);<br />
var<br />
Details: TThemedElementDetails;<br />
R: TRect;<br />
Collapse: boolean;<br />
begin<br />
...<br />
//dessine un signe d'expansion selon le thème.<br />
Details := ThemeServices.GetElementDetails(PlusMinusDetail[False, Collapse]);<br />
R := Rect(ALeft, ATop, ARight + 1, ABottom + 1);<br />
ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);<br />
...<br />
end;</syntaxhighlight></div>Gillou58https://wiki.freepascal.org/index.php?title=BGRABitmap/fr&diff=89788BGRABitmap/fr2015-05-26T19:15:37Z<p>Gillou58: /* Fonctions de dessin intégrées */</p>
<hr />
<div>{{BGRABitmap}}<br />
<br />
Voir aussi : [[Developing with Graphics/fr|Développer en mode graphique]]<br />
<br />
===Description===<br />
'''BGRABitmap''' est un ensemble d'unités permettant de modifier et de créer des images avec transparence (canal alpha). L'accès direct aux pixels permet le traitement rapide des images. La bibliothèque a été testée avec Windows, Ubuntu et Mac OS, c'est-à-dire avec les ensembles graphiques win32, gtk1, gtk2 et carbon.<br />
<br />
La classe principale est ''TBGRABitmap'', dérivée de ''TFPCustomImage'', qui permet de créer et de dessiner une image. Il y aussi ''TBGRAPtrBitmap'' qui permet de modifier les données déjà allouées d'une image au format BGRA. Ce format consiste en quatre octets pour chaque pixel (bleu, vert, rouge et alpha, dans cet ordre).<br />
<br />
===Utiliser BGRABitmap===<br />
====Tutoriels====<br />
*[http://www.youtube.com/watch?v=HGYSLgtYx-U Comment convertir une application de TCanvas vers BGRABitmap]<br />
*[[BGRABitmap tutorial TAChart/fr|Utiliser BGRABitmap pour afficher un TAChart]]<br />
*[[BGRABitmap tutorial/fr|Une série de tutoriels pour apprendre pas à pas]]<br />
*Exemples dans le [http://lazpaint.svn.sourceforge.net/viewvc/lazpaint/ dépôt de LazPaint].<br />
<br />
==== Aperçu ====<br />
Les fonctions ont des noms longs afin que leur usage soit intuitif. Presque tout est accessible en tant que fonction ou en utilisant une propriété de l'objet ''TBGRABitmap''. Par exemple, vous pouvez utiliser ''CanvasBGRA'' pour avoir un canevas similaire à ''TCanvas'' (avec la transparence et l'anticrénelage en plus) et ''Canvas2D'' pour avoir les mêmes fonctionalités que le [https://developer.mozilla.org/en/HTML:Canvas canvas HTML].<br />
<br />
Certaines fonctionalités spéciales nécessitent des unités, mais vous n'en aurez peut-être pas besoin :<br />
* la classe ''TBGRAMultishapeFiller'' permet d'avoir une jonction avec anticrénelage entre les polygones et se trouve dans ''BGRAPolygon'' ;<br />
* la classe ''TBGRATextEffect'' permet d'appliquer des effets comme de l'ombrage au texte et se trouve dans ''BGRATextFX'' ;<br />
* les transformations 2D se trouvent dans ''BGRATransform'' ;<br />
* ''TBGRAScene3D'' est dans ''BGRAScene3D'' ;<br />
* ''TBGRALayeredBitmap'' dans ''BGRALayers'' permet d'avoir des images multicouches.<br />
<br />
Le double-buffering ne fait pas vraiment partie de '''BGRABitmap''' parce que c'est plutôt une façon de gérer les fenêtres. Cependant, pour faire du double-buffering, vous pouvez utiliser ''TBGRAVirtualScreen'' qui est dans le package [[BGRAControls]].<br />
<br />
À part cela, le double-buffering dans '''BGRABitmap''' fonctionne comme tout double-buffering : vous devez avoir une image où vous stockez votre tracé et que vous affichez en une seule instruction ''Draw''.<br />
<br />
====Exemple simple====<br />
<br />
Il faut copier les unités de '''BGRABitmap''' (voir le [[BGRABitmap tutorial 1/fr|tutorial]] pour plus d'explication) et les lier au projet :<br />
<syntaxhighlight><br />
Uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes;<br />
</syntaxhighlight><br />
<br />
L'unité ''BGRABitmapTypes'' contient des définitions nécessaires la plupart du temps, mais on peut déclarer seulement ''BGRABitmap'' pour simplement charger et afficher une image. Ensuite, il faut créer un objet ''TBGRABitmap'' :<br />
<syntaxhighlight><br />
var bmp: TBGRABitmap;<br />
begin<br />
bmp := TBGRABitmap.Create(100,100,BGRABlack); //création d'une image de 100x100 pixels avec un fond noir<br />
<br />
bmp.FillRect(20,20,60,60,BGRAWhite, dmSet); //dessine un carré blanc sans transparence<br />
bmp.FillRect(40,40,80,80,BGRA(0,0,255,128), dmDrawWithTransparency); //dessine un carré bleu transparent<br />
end;<br />
</syntaxhighlight><br />
<br />
Enfin, pour afficher l'image :<br />
<syntaxhighlight><br />
procedure TFMain.FormPaint(Sender: TObject);<br />
begin<br />
bmp.Draw(Canvas, 0, 0, True); // dessine l'image sur la fenêtre en mode opaque (plus rapide)<br />
end;<br />
</syntaxhighlight><br />
<br />
===Notions===<br />
<br />
Les pixels d'une image avec transparence sont stockés avec quatre valeurs (ici, des octets), dans cet ordre : Bleu, Vert, Rouge, Alpha. Le dernier canal définit le niveau d'opacité (0 signifie transparent, 255 signifie opaque), et les autres canaux définissent la couleur.<br />
<br />
On peut distinguer deux modes de dessin. Le premier consiste à remplacer les valeurs du pixel. Le second consiste à effectuer un mélange entre le pixel déjà présent et celui qu'on dessine, ce qui est appelé l'''alpha blending''.<br />
<br />
Les fonctions de '''BGRABitmap''' proposent essentiellement 4 modes :<br />
* ''dmSet'' : consiste à remplacer les 4 octets par le pixel qu'on dessine, c'est-à-dire qu'on ne gère pas la transparence ;<br />
* ''dmDrawWithTransparency'' : effectue un mélange en prenant en compte la correction gamma (voir plus bas) ;<br />
* ''dmFastBlend'' ou ''dmLinearBlend'' : effectue un mélange sans correction gamma (plus rapide, mais entraîne des distorsions notamment avec les couleurs sombres) ;<br />
* ''dmXor'' : effectue un "ou exclusif" avec chaque composante, y compris alpha (si vous voulez inverser la couleur sans changer la transparence, utilisez BGRA(255,255,255,0)).<br />
<br />
===Fonctions de dessin intégrées===<br />
<br />
* dessiner/effacer des pixels ;<br />
* dessin de lignes avec ou sans anticrénelage ;<br />
* coordonnées avec virgule flottante ;<br />
* choix de l'épaisseur du pinceau avec virgule flottante ;<br />
* dessin de rectangles (contour ou remplissage) ;<br />
* dessin d'ellipses et de polygones avec anticrénelage ;<br />
* calcul de splines (courbe arrondie passant par des points) ;<br />
* remplissage simple (''Floodfill'') ou progressif ;<br />
* rendu de gradient de couleur (linéaire, radial...) ;<br />
* rectangles avec coins arrondis ;<br />
* textes avec transparence.<br />
<br />
===Dessiner avec le Canvas===<br />
<br />
Il est possible de dessiner à l'aide d'un ''Canvas'' avec les fonctions habituelles mais sans anticrénelage. L'opacité du tracé fait avec le ''Canvas'' est définie par la propriété ''CanvasOpacity''. Cette façon est un peu lente parce qu'elle nécessite des transformations de l'image.<br />
<br />
===Dessin en accès direct aux pixels===<br />
<br />
Pour accéder aux pixels, il y a deux propriétés : ''Data'' et ''Scanline''. La première renvoie un pointeur sur le premier pixel de l'image et la seconde un pointeur sur le premier pixel d'une ligne donnée.<br />
<br />
<syntaxhighlight><br />
var <br />
bmp: TBGRABitmap;<br />
p: PBGRAPixel;<br />
n: integer;<br />
<br />
begin<br />
bmp := TBGRABitmap.Create('image.png');<br />
p := bmp.Data;<br />
for n := bmp.NbPixels-1 downto 0 do<br />
begin<br />
p^.red := not p^.red; //inverse le canal rouge<br />
inc(p);<br />
end;<br />
bmp.InvalidateBitmap; //note qu'on a accédé directement aux pixels<br />
bmp.Draw(Canvas,0,0,True);<br />
bmp.Free;<br />
end;<br />
</syntaxhighlight><br />
<br />
Il est nécessaire d'appeler ensuite la fonction ''InvalidateBitmap'' pour reconstruire l'image lors d'un appel à ''Draw'' par exemple. Notez que l'ordre les lignes peut être inversé, selon la propriété ''LineOrder''.<br />
<br />
Voir aussi la comparaison des [[Fast direct pixel access|méthodes d'accès direct aux pixels]].<br />
<br />
=== Manipulation d'images ===<br />
<br />
Outre les fonctions de base, voici les filtres disponibles :<br />
* ''Median'' : calcule la médiane des couleurs autour de chaque pixel, ce qui arrondit les coins ;<br />
* ''Smooth'' : adoucit légèrement l'image (fonction complémentaire de ''Sharpen'') ;<br />
* ''Sharpen'' : faire ressortir les contours (fonction complémentaire de ''Smooth'') ;<br />
* ''Contour'' : dessine les contours sur fond blanc (comme un dessin au crayon) ;<br />
* ''BlurRadial'' : flou non directionnel ;<br />
* ''BlurMotion'' : flou directionnel ;<br />
* ''CustomBlur'' : flou selon un masque en ton de gris ;<br />
* ''Emboss'' : dessine les contours selon un ombrage ;<br />
* ''EmbossHighlight'' : dessine les contours d'une sélection (définie en ton de gris) ;<br />
* ''Grayscale'' : convertit en noir et blanc en tenant compte de la correction gamma ;<br />
* ''Normalize'' : utilise toute la plage d'intensité lumineuse disponible ;<br />
* ''Rotate'' : rotation de l'image autour d'un point ;<br />
* ''SmartZoom3'' : effectue un zoom x3 et détecte les contours, ce qui permet d'avoir un zoom utile pour les sprites des jeux anciens.<br />
<br />
=== Combinaison d'images ===<br />
<br />
Mis à part ''PutImage'', la fonction ''BlendImage'' permet de combiner des images, comme les couches (''layers'') des logiciels d'édition d'image. Les modes de combinaisons sont les suivants :<br />
*''LinearBlend'' : superposition simple sans correction gamma (équivalent de ''dmFastBlend'') ;<br />
*''Transparent'' : superposition en tenant compte de la correction gamma ;<br />
*''Multiply'' : multiplication des composantes RGB (avec correction gamma) ;<br />
*''LinearMultiply'' : multiplication des composantes RGB (sans correction gamma) ;<br />
*''Additive'' : addition des composantes RGB (avec correction gamma) ;<br />
*''LinearAdd'' : addition des composantes RGB (sans correction gamma) ;<br />
*''Difference'' : différence des composantes RGB (avec correction gamma) ;<br />
*''LinearDifference'' : différence des composantes RGB (sans correction gamma) ;<br />
*''Negation'' : fait disparaître les couleurs communes (avec correction gamma) ;<br />
*''LinearNegation'' : fait disparaître les couleurs communes (sans correction gamma) ;<br />
*''Reflect'', ''Glow'' : pour les effets de lumière ;<br />
*''ColorBurn'', ''ColorDodge'', ''Overlay'', ''Screen'' : divers filtres ;<br />
*''Lighten'' : conserve les couleurs les plus claires ;<br />
*''Darken'' : conserve les couleurs les plus foncées ;<br />
*''Xor'' : ou exclusif des composantes RGB.<br />
<br />
=== Captures d'écran ===<br />
[[Image:Lazpaint_contour.png]]<br />
[[Image:Lazpaint curve redim.png]]<br />
[[Image:Bgra_wirecube.png]]<br />
[[Image:Bgra_chessboard.jpg]]<br />
<br />
===Licence===<br />
LGPL modifiée<br />
<br />
Auteur : [http://johann-elsass.net Johann ELSASS] ([http://www.facebook.com/johann.elsass.1 Facebook])<br />
<br />
===Téléchargement===<br />
Sourceforge avec [[LazPaint/fr|LazPaint]] et BGRABitmap : http://sourceforge.net/projects/lazpaint/files/src/<br />
<br />
Ancien lien : http://lazarus.johann-elsass.net/<br />
<br />
Si vous n'avez pas trouvé l'information que vous cherchez ou si vous avez une suggestion, vous pouvez [http://consume.o2switch.net/lazarus/contact.php contacter l'auteur].<br />
<br />
[[Category:Components/fr]]<br />
[[Category:Graphics/fr]]</div>Gillou58https://wiki.freepascal.org/index.php?title=BGRABitmap/fr&diff=89787BGRABitmap/fr2015-05-26T19:11:58Z<p>Gillou58: /* Aperçu */</p>
<hr />
<div>{{BGRABitmap}}<br />
<br />
Voir aussi : [[Developing with Graphics/fr|Développer en mode graphique]]<br />
<br />
===Description===<br />
'''BGRABitmap''' est un ensemble d'unités permettant de modifier et de créer des images avec transparence (canal alpha). L'accès direct aux pixels permet le traitement rapide des images. La bibliothèque a été testée avec Windows, Ubuntu et Mac OS, c'est-à-dire avec les ensembles graphiques win32, gtk1, gtk2 et carbon.<br />
<br />
La classe principale est ''TBGRABitmap'', dérivée de ''TFPCustomImage'', qui permet de créer et de dessiner une image. Il y aussi ''TBGRAPtrBitmap'' qui permet de modifier les données déjà allouées d'une image au format BGRA. Ce format consiste en quatre octets pour chaque pixel (bleu, vert, rouge et alpha, dans cet ordre).<br />
<br />
===Utiliser BGRABitmap===<br />
====Tutoriels====<br />
*[http://www.youtube.com/watch?v=HGYSLgtYx-U Comment convertir une application de TCanvas vers BGRABitmap]<br />
*[[BGRABitmap tutorial TAChart/fr|Utiliser BGRABitmap pour afficher un TAChart]]<br />
*[[BGRABitmap tutorial/fr|Une série de tutoriels pour apprendre pas à pas]]<br />
*Exemples dans le [http://lazpaint.svn.sourceforge.net/viewvc/lazpaint/ dépôt de LazPaint].<br />
<br />
==== Aperçu ====<br />
Les fonctions ont des noms longs afin que leur usage soit intuitif. Presque tout est accessible en tant que fonction ou en utilisant une propriété de l'objet ''TBGRABitmap''. Par exemple, vous pouvez utiliser ''CanvasBGRA'' pour avoir un canevas similaire à ''TCanvas'' (avec la transparence et l'anticrénelage en plus) et ''Canvas2D'' pour avoir les mêmes fonctionalités que le [https://developer.mozilla.org/en/HTML:Canvas canvas HTML].<br />
<br />
Certaines fonctionalités spéciales nécessitent des unités, mais vous n'en aurez peut-être pas besoin :<br />
* la classe ''TBGRAMultishapeFiller'' permet d'avoir une jonction avec anticrénelage entre les polygones et se trouve dans ''BGRAPolygon'' ;<br />
* la classe ''TBGRATextEffect'' permet d'appliquer des effets comme de l'ombrage au texte et se trouve dans ''BGRATextFX'' ;<br />
* les transformations 2D se trouvent dans ''BGRATransform'' ;<br />
* ''TBGRAScene3D'' est dans ''BGRAScene3D'' ;<br />
* ''TBGRALayeredBitmap'' dans ''BGRALayers'' permet d'avoir des images multicouches.<br />
<br />
Le double-buffering ne fait pas vraiment partie de '''BGRABitmap''' parce que c'est plutôt une façon de gérer les fenêtres. Cependant, pour faire du double-buffering, vous pouvez utiliser ''TBGRAVirtualScreen'' qui est dans le package [[BGRAControls]].<br />
<br />
À part cela, le double-buffering dans '''BGRABitmap''' fonctionne comme tout double-buffering : vous devez avoir une image où vous stockez votre tracé et que vous affichez en une seule instruction ''Draw''.<br />
<br />
====Exemple simple====<br />
<br />
Il faut copier les unités de '''BGRABitmap''' (voir le [[BGRABitmap tutorial 1/fr|tutorial]] pour plus d'explication) et les lier au projet :<br />
<syntaxhighlight><br />
Uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes;<br />
</syntaxhighlight><br />
<br />
L'unité ''BGRABitmapTypes'' contient des définitions nécessaires la plupart du temps, mais on peut déclarer seulement ''BGRABitmap'' pour simplement charger et afficher une image. Ensuite, il faut créer un objet ''TBGRABitmap'' :<br />
<syntaxhighlight><br />
var bmp: TBGRABitmap;<br />
begin<br />
bmp := TBGRABitmap.Create(100,100,BGRABlack); //création d'une image de 100x100 pixels avec un fond noir<br />
<br />
bmp.FillRect(20,20,60,60,BGRAWhite, dmSet); //dessine un carré blanc sans transparence<br />
bmp.FillRect(40,40,80,80,BGRA(0,0,255,128), dmDrawWithTransparency); //dessine un carré bleu transparent<br />
end;<br />
</syntaxhighlight><br />
<br />
Enfin, pour afficher l'image :<br />
<syntaxhighlight><br />
procedure TFMain.FormPaint(Sender: TObject);<br />
begin<br />
bmp.Draw(Canvas, 0, 0, True); // dessine l'image sur la fenêtre en mode opaque (plus rapide)<br />
end;<br />
</syntaxhighlight><br />
<br />
===Notions===<br />
<br />
Les pixels d'une image avec transparence sont stockés avec quatre valeurs (ici, des octets), dans cet ordre : Bleu, Vert, Rouge, Alpha. Le dernier canal définit le niveau d'opacité (0 signifie transparent, 255 signifie opaque), et les autres canaux définissent la couleur.<br />
<br />
On peut distinguer deux modes de dessin. Le premier consiste à remplacer les valeurs du pixel. Le second consiste à effectuer un mélange entre le pixel déjà présent et celui qu'on dessine, ce qui est appelé l'''alpha blending''.<br />
<br />
Les fonctions de '''BGRABitmap''' proposent essentiellement 4 modes :<br />
* ''dmSet'' : consiste à remplacer les 4 octets par le pixel qu'on dessine, c'est-à-dire qu'on ne gère pas la transparence ;<br />
* ''dmDrawWithTransparency'' : effectue un mélange en prenant en compte la correction gamma (voir plus bas) ;<br />
* ''dmFastBlend'' ou ''dmLinearBlend'' : effectue un mélange sans correction gamma (plus rapide, mais entraîne des distorsions notamment avec les couleurs sombres) ;<br />
* ''dmXor'' : effectue un "ou exclusif" avec chaque composante, y compris alpha (si vous voulez inverser la couleur sans changer la transparence, utilisez BGRA(255,255,255,0)).<br />
<br />
===Fonctions de dessin intégrées===<br />
<br />
* dessiner/effacer des pixels ;<br />
* dessin de lignes avec ou sans anticrénelage ;<br />
* coordonnées avec virgule flottante ;<br />
* choix de l'épaisseur du pinceau avec virgule flottante ;<br />
* dessin de rectangle (contour ou remplissage) ;<br />
* dessin d'ellipses et de polygones avec anticrénelage ;<br />
* calcul de splines (courbe arrondie passant par des points) ;<br />
* remplissage simple (''Floodfill'') ou progressif ;<br />
* rendu de gradient de couleur (linéaire, radial...) ;<br />
* rectangles avec coins arrondis ;<br />
* textes avec transparence.<br />
<br />
===Dessiner avec le Canvas===<br />
<br />
Il est possible de dessiner à l'aide d'un ''Canvas'' avec les fonctions habituelles mais sans anticrénelage. L'opacité du tracé fait avec le ''Canvas'' est définie par la propriété ''CanvasOpacity''. Cette façon est un peu lente parce qu'elle nécessite des transformations de l'image.<br />
<br />
===Dessin en accès direct aux pixels===<br />
<br />
Pour accéder aux pixels, il y a deux propriétés : ''Data'' et ''Scanline''. La première renvoie un pointeur sur le premier pixel de l'image et la seconde un pointeur sur le premier pixel d'une ligne donnée.<br />
<br />
<syntaxhighlight><br />
var <br />
bmp: TBGRABitmap;<br />
p: PBGRAPixel;<br />
n: integer;<br />
<br />
begin<br />
bmp := TBGRABitmap.Create('image.png');<br />
p := bmp.Data;<br />
for n := bmp.NbPixels-1 downto 0 do<br />
begin<br />
p^.red := not p^.red; //inverse le canal rouge<br />
inc(p);<br />
end;<br />
bmp.InvalidateBitmap; //note qu'on a accédé directement aux pixels<br />
bmp.Draw(Canvas,0,0,True);<br />
bmp.Free;<br />
end;<br />
</syntaxhighlight><br />
<br />
Il est nécessaire d'appeler ensuite la fonction ''InvalidateBitmap'' pour reconstruire l'image lors d'un appel à ''Draw'' par exemple. Notez que l'ordre les lignes peut être inversé, selon la propriété ''LineOrder''.<br />
<br />
Voir aussi la comparaison des [[Fast direct pixel access|méthodes d'accès direct aux pixels]].<br />
<br />
=== Manipulation d'images ===<br />
<br />
Outre les fonctions de base, voici les filtres disponibles :<br />
* ''Median'' : calcule la médiane des couleurs autour de chaque pixel, ce qui arrondit les coins ;<br />
* ''Smooth'' : adoucit légèrement l'image (fonction complémentaire de ''Sharpen'') ;<br />
* ''Sharpen'' : faire ressortir les contours (fonction complémentaire de ''Smooth'') ;<br />
* ''Contour'' : dessine les contours sur fond blanc (comme un dessin au crayon) ;<br />
* ''BlurRadial'' : flou non directionnel ;<br />
* ''BlurMotion'' : flou directionnel ;<br />
* ''CustomBlur'' : flou selon un masque en ton de gris ;<br />
* ''Emboss'' : dessine les contours selon un ombrage ;<br />
* ''EmbossHighlight'' : dessine les contours d'une sélection (définie en ton de gris) ;<br />
* ''Grayscale'' : convertit en noir et blanc en tenant compte de la correction gamma ;<br />
* ''Normalize'' : utilise toute la plage d'intensité lumineuse disponible ;<br />
* ''Rotate'' : rotation de l'image autour d'un point ;<br />
* ''SmartZoom3'' : effectue un zoom x3 et détecte les contours, ce qui permet d'avoir un zoom utile pour les sprites des jeux anciens.<br />
<br />
=== Combinaison d'images ===<br />
<br />
Mis à part ''PutImage'', la fonction ''BlendImage'' permet de combiner des images, comme les couches (''layers'') des logiciels d'édition d'image. Les modes de combinaisons sont les suivants :<br />
*''LinearBlend'' : superposition simple sans correction gamma (équivalent de ''dmFastBlend'') ;<br />
*''Transparent'' : superposition en tenant compte de la correction gamma ;<br />
*''Multiply'' : multiplication des composantes RGB (avec correction gamma) ;<br />
*''LinearMultiply'' : multiplication des composantes RGB (sans correction gamma) ;<br />
*''Additive'' : addition des composantes RGB (avec correction gamma) ;<br />
*''LinearAdd'' : addition des composantes RGB (sans correction gamma) ;<br />
*''Difference'' : différence des composantes RGB (avec correction gamma) ;<br />
*''LinearDifference'' : différence des composantes RGB (sans correction gamma) ;<br />
*''Negation'' : fait disparaître les couleurs communes (avec correction gamma) ;<br />
*''LinearNegation'' : fait disparaître les couleurs communes (sans correction gamma) ;<br />
*''Reflect'', ''Glow'' : pour les effets de lumière ;<br />
*''ColorBurn'', ''ColorDodge'', ''Overlay'', ''Screen'' : divers filtres ;<br />
*''Lighten'' : conserve les couleurs les plus claires ;<br />
*''Darken'' : conserve les couleurs les plus foncées ;<br />
*''Xor'' : ou exclusif des composantes RGB.<br />
<br />
=== Captures d'écran ===<br />
[[Image:Lazpaint_contour.png]]<br />
[[Image:Lazpaint curve redim.png]]<br />
[[Image:Bgra_wirecube.png]]<br />
[[Image:Bgra_chessboard.jpg]]<br />
<br />
===Licence===<br />
LGPL modifiée<br />
<br />
Auteur : [http://johann-elsass.net Johann ELSASS] ([http://www.facebook.com/johann.elsass.1 Facebook])<br />
<br />
===Téléchargement===<br />
Sourceforge avec [[LazPaint/fr|LazPaint]] et BGRABitmap : http://sourceforge.net/projects/lazpaint/files/src/<br />
<br />
Ancien lien : http://lazarus.johann-elsass.net/<br />
<br />
Si vous n'avez pas trouvé l'information que vous cherchez ou si vous avez une suggestion, vous pouvez [http://consume.o2switch.net/lazarus/contact.php contacter l'auteur].<br />
<br />
[[Category:Components/fr]]<br />
[[Category:Graphics/fr]]</div>Gillou58https://wiki.freepascal.org/index.php?title=BGRABitmap/fr&diff=89786BGRABitmap/fr2015-05-26T19:10:42Z<p>Gillou58: /* Aperçu */</p>
<hr />
<div>{{BGRABitmap}}<br />
<br />
Voir aussi : [[Developing with Graphics/fr|Développer en mode graphique]]<br />
<br />
===Description===<br />
'''BGRABitmap''' est un ensemble d'unités permettant de modifier et de créer des images avec transparence (canal alpha). L'accès direct aux pixels permet le traitement rapide des images. La bibliothèque a été testée avec Windows, Ubuntu et Mac OS, c'est-à-dire avec les ensembles graphiques win32, gtk1, gtk2 et carbon.<br />
<br />
La classe principale est ''TBGRABitmap'', dérivée de ''TFPCustomImage'', qui permet de créer et de dessiner une image. Il y aussi ''TBGRAPtrBitmap'' qui permet de modifier les données déjà allouées d'une image au format BGRA. Ce format consiste en quatre octets pour chaque pixel (bleu, vert, rouge et alpha, dans cet ordre).<br />
<br />
===Utiliser BGRABitmap===<br />
====Tutoriels====<br />
*[http://www.youtube.com/watch?v=HGYSLgtYx-U Comment convertir une application de TCanvas vers BGRABitmap]<br />
*[[BGRABitmap tutorial TAChart/fr|Utiliser BGRABitmap pour afficher un TAChart]]<br />
*[[BGRABitmap tutorial/fr|Une série de tutoriels pour apprendre pas à pas]]<br />
*Exemples dans le [http://lazpaint.svn.sourceforge.net/viewvc/lazpaint/ dépôt de LazPaint].<br />
<br />
==== Aperçu ====<br />
Les fonctions ont des noms longs afin que leur usage soit intuitif. Presque tout est accessible en tant que fonction ou en utilisant une propriété de l'objet ''TBGRABitmap''. Par exemple, vous pouvez utiliser ''CanvasBGRA'' pour avoir un canevas similaire à ''TCanvas'' (avec la transparence et l'anticrénelage en plus) et ''Canvas2D'' pour avoir les mêmes fonctionalités que le [https://developer.mozilla.org/en/HTML:Canvas canvas HTML].<br />
<br />
Certaines fonctionalités spéciales nécessitent des unités, mais vous n'en aurez peut-être pas besoin :<br />
* la classe ''TBGRAMultishapeFiller'' permet d'avoir une jonction avec anticrénelage entre les polygones et se trouve dans ''BGRAPolygon'' ;<br />
* la classe ''TBGRATextEffect'' permet d'appliquer des effets comme de l'ombrage au texte et se trouve dans ''BGRATextFX'' ;<br />
* les transformations 2D se trouvent dans ''BGRATransform'' ;<br />
* ''TBGRAScene3D'' est dans ''BGRAScene3D'' ;<br />
* ''TBGRALayeredBitmap'' dans ''BGRALayers'' permet d'avoir des images multicouches.<br />
<br />
Le double-buffering ne fait pas vraiment partie de '''BGRABitmap''' parce que c'est plutôt une façon de gérer les fenêtres. Cependant, pour faire du double-buffering, vous pouvez utiliser ''TBGRAVirtualScreen'' qui est dans le package [[BGRAControls]].<br />
<br />
À part cela, le double-buffering dans '''BGRABitmap''' fonctionne comme tout double-buffering : vous devez avoir une image où vous stockez votre tracé et que vous affichez en un seule instruction ''Draw''.<br />
<br />
====Exemple simple====<br />
<br />
Il faut copier les unités de '''BGRABitmap''' (voir le [[BGRABitmap tutorial 1/fr|tutorial]] pour plus d'explication) et les lier au projet :<br />
<syntaxhighlight><br />
Uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes;<br />
</syntaxhighlight><br />
<br />
L'unité ''BGRABitmapTypes'' contient des définitions nécessaires la plupart du temps, mais on peut déclarer seulement ''BGRABitmap'' pour simplement charger et afficher une image. Ensuite, il faut créer un objet ''TBGRABitmap'' :<br />
<syntaxhighlight><br />
var bmp: TBGRABitmap;<br />
begin<br />
bmp := TBGRABitmap.Create(100,100,BGRABlack); //création d'une image de 100x100 pixels avec un fond noir<br />
<br />
bmp.FillRect(20,20,60,60,BGRAWhite, dmSet); //dessine un carré blanc sans transparence<br />
bmp.FillRect(40,40,80,80,BGRA(0,0,255,128), dmDrawWithTransparency); //dessine un carré bleu transparent<br />
end;<br />
</syntaxhighlight><br />
<br />
Enfin, pour afficher l'image :<br />
<syntaxhighlight><br />
procedure TFMain.FormPaint(Sender: TObject);<br />
begin<br />
bmp.Draw(Canvas, 0, 0, True); // dessine l'image sur la fenêtre en mode opaque (plus rapide)<br />
end;<br />
</syntaxhighlight><br />
<br />
===Notions===<br />
<br />
Les pixels d'une image avec transparence sont stockés avec quatre valeurs (ici, des octets), dans cet ordre : Bleu, Vert, Rouge, Alpha. Le dernier canal définit le niveau d'opacité (0 signifie transparent, 255 signifie opaque), et les autres canaux définissent la couleur.<br />
<br />
On peut distinguer deux modes de dessin. Le premier consiste à remplacer les valeurs du pixel. Le second consiste à effectuer un mélange entre le pixel déjà présent et celui qu'on dessine, ce qui est appelé l'''alpha blending''.<br />
<br />
Les fonctions de '''BGRABitmap''' proposent essentiellement 4 modes :<br />
* ''dmSet'' : consiste à remplacer les 4 octets par le pixel qu'on dessine, c'est-à-dire qu'on ne gère pas la transparence ;<br />
* ''dmDrawWithTransparency'' : effectue un mélange en prenant en compte la correction gamma (voir plus bas) ;<br />
* ''dmFastBlend'' ou ''dmLinearBlend'' : effectue un mélange sans correction gamma (plus rapide, mais entraîne des distorsions notamment avec les couleurs sombres) ;<br />
* ''dmXor'' : effectue un "ou exclusif" avec chaque composante, y compris alpha (si vous voulez inverser la couleur sans changer la transparence, utilisez BGRA(255,255,255,0)).<br />
<br />
===Fonctions de dessin intégrées===<br />
<br />
* dessiner/effacer des pixels ;<br />
* dessin de lignes avec ou sans anticrénelage ;<br />
* coordonnées avec virgule flottante ;<br />
* choix de l'épaisseur du pinceau avec virgule flottante ;<br />
* dessin de rectangle (contour ou remplissage) ;<br />
* dessin d'ellipses et de polygones avec anticrénelage ;<br />
* calcul de splines (courbe arrondie passant par des points) ;<br />
* remplissage simple (''Floodfill'') ou progressif ;<br />
* rendu de gradient de couleur (linéaire, radial...) ;<br />
* rectangles avec coins arrondis ;<br />
* textes avec transparence.<br />
<br />
===Dessiner avec le Canvas===<br />
<br />
Il est possible de dessiner à l'aide d'un ''Canvas'' avec les fonctions habituelles mais sans anticrénelage. L'opacité du tracé fait avec le ''Canvas'' est définie par la propriété ''CanvasOpacity''. Cette façon est un peu lente parce qu'elle nécessite des transformations de l'image.<br />
<br />
===Dessin en accès direct aux pixels===<br />
<br />
Pour accéder aux pixels, il y a deux propriétés : ''Data'' et ''Scanline''. La première renvoie un pointeur sur le premier pixel de l'image et la seconde un pointeur sur le premier pixel d'une ligne donnée.<br />
<br />
<syntaxhighlight><br />
var <br />
bmp: TBGRABitmap;<br />
p: PBGRAPixel;<br />
n: integer;<br />
<br />
begin<br />
bmp := TBGRABitmap.Create('image.png');<br />
p := bmp.Data;<br />
for n := bmp.NbPixels-1 downto 0 do<br />
begin<br />
p^.red := not p^.red; //inverse le canal rouge<br />
inc(p);<br />
end;<br />
bmp.InvalidateBitmap; //note qu'on a accédé directement aux pixels<br />
bmp.Draw(Canvas,0,0,True);<br />
bmp.Free;<br />
end;<br />
</syntaxhighlight><br />
<br />
Il est nécessaire d'appeler ensuite la fonction ''InvalidateBitmap'' pour reconstruire l'image lors d'un appel à ''Draw'' par exemple. Notez que l'ordre les lignes peut être inversé, selon la propriété ''LineOrder''.<br />
<br />
Voir aussi la comparaison des [[Fast direct pixel access|méthodes d'accès direct aux pixels]].<br />
<br />
=== Manipulation d'images ===<br />
<br />
Outre les fonctions de base, voici les filtres disponibles :<br />
* ''Median'' : calcule la médiane des couleurs autour de chaque pixel, ce qui arrondit les coins ;<br />
* ''Smooth'' : adoucit légèrement l'image (fonction complémentaire de ''Sharpen'') ;<br />
* ''Sharpen'' : faire ressortir les contours (fonction complémentaire de ''Smooth'') ;<br />
* ''Contour'' : dessine les contours sur fond blanc (comme un dessin au crayon) ;<br />
* ''BlurRadial'' : flou non directionnel ;<br />
* ''BlurMotion'' : flou directionnel ;<br />
* ''CustomBlur'' : flou selon un masque en ton de gris ;<br />
* ''Emboss'' : dessine les contours selon un ombrage ;<br />
* ''EmbossHighlight'' : dessine les contours d'une sélection (définie en ton de gris) ;<br />
* ''Grayscale'' : convertit en noir et blanc en tenant compte de la correction gamma ;<br />
* ''Normalize'' : utilise toute la plage d'intensité lumineuse disponible ;<br />
* ''Rotate'' : rotation de l'image autour d'un point ;<br />
* ''SmartZoom3'' : effectue un zoom x3 et détecte les contours, ce qui permet d'avoir un zoom utile pour les sprites des jeux anciens.<br />
<br />
=== Combinaison d'images ===<br />
<br />
Mis à part ''PutImage'', la fonction ''BlendImage'' permet de combiner des images, comme les couches (''layers'') des logiciels d'édition d'image. Les modes de combinaisons sont les suivants :<br />
*''LinearBlend'' : superposition simple sans correction gamma (équivalent de ''dmFastBlend'') ;<br />
*''Transparent'' : superposition en tenant compte de la correction gamma ;<br />
*''Multiply'' : multiplication des composantes RGB (avec correction gamma) ;<br />
*''LinearMultiply'' : multiplication des composantes RGB (sans correction gamma) ;<br />
*''Additive'' : addition des composantes RGB (avec correction gamma) ;<br />
*''LinearAdd'' : addition des composantes RGB (sans correction gamma) ;<br />
*''Difference'' : différence des composantes RGB (avec correction gamma) ;<br />
*''LinearDifference'' : différence des composantes RGB (sans correction gamma) ;<br />
*''Negation'' : fait disparaître les couleurs communes (avec correction gamma) ;<br />
*''LinearNegation'' : fait disparaître les couleurs communes (sans correction gamma) ;<br />
*''Reflect'', ''Glow'' : pour les effets de lumière ;<br />
*''ColorBurn'', ''ColorDodge'', ''Overlay'', ''Screen'' : divers filtres ;<br />
*''Lighten'' : conserve les couleurs les plus claires ;<br />
*''Darken'' : conserve les couleurs les plus foncées ;<br />
*''Xor'' : ou exclusif des composantes RGB.<br />
<br />
=== Captures d'écran ===<br />
[[Image:Lazpaint_contour.png]]<br />
[[Image:Lazpaint curve redim.png]]<br />
[[Image:Bgra_wirecube.png]]<br />
[[Image:Bgra_chessboard.jpg]]<br />
<br />
===Licence===<br />
LGPL modifiée<br />
<br />
Auteur : [http://johann-elsass.net Johann ELSASS] ([http://www.facebook.com/johann.elsass.1 Facebook])<br />
<br />
===Téléchargement===<br />
Sourceforge avec [[LazPaint/fr|LazPaint]] et BGRABitmap : http://sourceforge.net/projects/lazpaint/files/src/<br />
<br />
Ancien lien : http://lazarus.johann-elsass.net/<br />
<br />
Si vous n'avez pas trouvé l'information que vous cherchez ou si vous avez une suggestion, vous pouvez [http://consume.o2switch.net/lazarus/contact.php contacter l'auteur].<br />
<br />
[[Category:Components/fr]]<br />
[[Category:Graphics/fr]]</div>Gillou58https://wiki.freepascal.org/index.php?title=BGRABitmap_tutorial_Font_rendering/fr&diff=89403BGRABitmap tutorial Font rendering/fr2015-05-16T17:14:09Z<p>Gillou58: </p>
<hr />
<div>{{BGRABitmap_tutorial_Font_rendering}}<br />
<br />
Des fonctions de texte de base sont disponibles avec les objets ''TBGRABitmap''. Vous trouverez des explications à ce sujet dans le [[BGRABitmap tutorial 12/fr|tutoriel 12]].<br />
<br />
Voyons les façons avancées de dessiner du texte.<br />
<br />
=== La propriété FontRenderer ===<br />
<br />
Les images ''TBGRABitmap'' ont une propriété ''FontRenderer''. Par défaut, le moteur de rendu utilisant le dessin de la LCL est utilisé, éventuellement en dessinant le texte plus gros et en appliquant un anticrénelage. Cela est réalisé par la classe ''TLCLFontRenderer'' de l'unité ''BGRAText''. Cependant, ce mode de dessin ne permet pas de faire des ombrage ou de dessiner un contour au texte. De plus, il est un peu lent pour dessiner du texte dans un rectangle (fonction ''TextRect'').<br />
<br />
Vous pouvez remplacer le moteur de rendu en créant un objet dérivé de la classe ''TBGRACustomFontRenderer'' et en l'affectant à la propriété ''FontRenderer''. Notez qu'une instance ne peut être utilisée que pour un seul objet, qui en devient le propriétaire. Vous n'avez alors pas à libérer vous-même le moteur de rendu.<br />
<br />
==== Ajouter des effets ====<br />
<br />
Pour améliorer la vitesse du rendu et ajouter des effets, vous aurez besoin de la classe ''TBGRATextEffectFontRenderer'' qui se trouve dans l'unité ''BGRATextFX''. Pour cela, écrivez simplement ceci :<br />
<br />
<syntaxhighlight><br />
Uses BGRABitmap, BGRATextFX;<br />
<br />
var Bitmap: TBGRABitmap;<br />
Renderer: TBGRATextEffectFontRenderer;<br />
<br />
begin<br />
...<br />
Renderer := TBGRATextEffectFontRenderer.Create;<br />
Bitmap.FontRenderer := Renderer;<br />
</syntaxhighlight><br />
<br />
Notez que vous pourriez affecter directement l'objet créé sans passer par la variable ''Renderer'', mais cette dernière va vous permettre de choisir les effets appliqués.<br />
<br />
* Pour l'ombrage, utilisez les propriétés ''ShadowVisible'', ''ShadowColor'', ''ShadowOffset'' et ''ShadowRadius''. Pour qu'une ombre soit visible, il faut que ''ShadowVisible'' soit à ''True'' et que ''ShadowColor'' ne soit pas transparent.<br />
* Pour ajouter un contour, utilisez ''OutlineVisible'', ''OuterOutlineOnly'', ''OutlineColor'' ou ''OutlineTexture'' et ''OutlineWidth''. Pour qu'un contour soit visible, il faut que ''OutlineVisible'' soit à ''True'', et qu'une texture soit définie ou sinon une couleur non transparente. De plus, ''OutlineWidth'' ne doit pas être égal à zéro.<br />
<br />
Par exemple, définissez l'événement ''OnPaint'' en double-cliquant dans l'inspecteur d'objet d'une fenêtre et écrivez :<br />
<syntaxhighlight><br />
Uses BGRABitmap, BGRABitmapTypes, BGRATextFX;<br />
<br />
procedure TForm1.FormPaint(Sender: TObject);<br />
var <br />
bmp: TBGRABitmap;<br />
renderer: TBGRATextEffectFontRenderer;<br />
begin<br />
bmp := TBGRABitmap.Create(ClientWidth,ClientHeight,ColorToRGB(clBtnFace));<br />
renderer := TBGRATextEffectFontRenderer.Create;<br />
bmp.FontRenderer := renderer;<br />
renderer.ShadowVisible := True;<br />
renderer.OutlineVisible := True;<br />
renderer.OutlineColor := BGRABlack;<br />
renderer.OuterOutlineOnly := True;<br />
bmp.FontFullHeight := 50;<br />
bmp.TextOut(5,5,'Hello world',CSSRed);<br />
bmp.Draw(Canvas,0,0);<br />
bmp.Free;<br />
end; </syntaxhighlight><br />
<br />
[[Image:bgratexteffectfontrendering.png]]<br />
<br />
Notez que l'anticrénelage n'est pas activé. Vous pouvez le faire avec :<br />
<br />
<syntaxhighlight><br />
bmp.FontQuality:= fqFineAntialiasing;<br />
</syntaxhighlight><br />
<br />
[[Image:bgratexteffectfontrendering_aa.png]]<br />
<br />
===== Utiliser un éclairage de Phong =====<br />
<br />
Pour avoir un éclairage de Phong, vous aurez besoin d'un ''shader''. Pour le créer :<br />
<syntaxhighlight><br />
uses BGRAGradients;<br />
var<br />
shader: TPhongShading;<br />
renderer: TBGRATextEffectFontRenderer;<br />
begin<br />
shader := TPhongShading.Create;<br />
renderer := TBGRATextEffectFontRenderer.Create(shader, True); //le deuxième paramètre indique que le shader appartient au moteur de rendu<br />
</syntaxhighlight><br />
<br />
L'exemple au complet, en utilisant un ombrage, devient :<br />
<syntaxhighlight><br />
uses BGRABitmap, BGRABitmapTypes, BGRATextFX, BGRAGradients; <br />
<br />
procedure TForm1.FormPaint(Sender: TObject);<br />
var bmp: TBGRABitmap;<br />
shader: TPhongShading;<br />
renderer: TBGRATextEffectFontRenderer;<br />
begin<br />
bmp := TBGRABitmap.Create(ClientWidth,ClientHeight,ColorToRGB(clBtnFace));<br />
shader := TPhongShading.Create;<br />
renderer := TBGRATextEffectFontRenderer.Create(shader,True);<br />
bmp.FontRenderer := renderer;<br />
renderer.ShadowVisible := True;<br />
bmp.FontFullHeight := 50;<br />
bmp.FontQuality:= fqFineAntialiasing;<br />
bmp.TextOut(5,5,'Hello world',CSSRed);<br />
</syntaxhighlight><br />
<br />
[[Image:bgratexteffectfontrendering_shader.png]]<br />
<br />
==== Utiliser les polices avec LazFreeType intégré à Lazarus ====<br />
<br />
Depuis la version 1.0 de Lazarus, un moteur de police FreeType est intégré à Lazarus. Notez que vous devez fournir vous-même les fichiers ou les flux contenant les polices que vous voulez afficher. Les répertoires du système et les polices installées sont ignorés, à moins bien entendu que vous ajoutiez explicitement ces fichiers. Notez que dans l'implémentation actuelle, il est nécessaire de fournir la police Arial même si vous ne l'utilisez pas.<br />
<br />
Afin de définir les polices, écrivez ceci lors de la création de votre application :<br />
<syntaxhighlight><br />
uses LazFreeTypeFontCollection;<br />
<br />
var FFontCollection: TFreeTypeFontCollection;<br />
<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
FFontCollection := TFreeTypeFontCollection.Create;<br />
FFontCollection.AddFile('Arial.ttf'); //en supposant que le fichier se trouve à coté de l'application<br />
SetDefaultFreeTypeFontCollection(FFontCollection);<br />
end;<br />
<br />
procedure TForm1.FormDestroy(Sender: TObject);<br />
begin<br />
SetDefaultFreeTypeFontCollection(nil);<br />
FreeAndNil(FFontCollection);<br />
end;<br />
</syntaxhighlight><br />
<br />
À présent, pour utiliser ces polices, définissez la propriété ''FontRenderer'' :<br />
<syntaxhighlight><br />
uses BGRABitmap, BGRABitmapTypes, BGRAFreeType;<br />
<br />
procedure TForm1.FormPaint(Sender: TObject);<br />
var<br />
bmp: TBGRABitmap;<br />
renderer: TBGRAFreeTypeFontRenderer;<br />
begin<br />
bmp := TBGRABitmap.Create(ClientWidth,ClientHeight,ColorToRGB(clBtnFace));<br />
renderer := TBGRAFreeTypeFontRenderer.Create;<br />
bmp.FontRenderer := renderer;<br />
bmp.FontName := 'Arial';<br />
bmp.FontFullHeight:= 50;<br />
bmp.FontQuality := fqFineClearTypeRGB;<br />
bmp.TextOut(10,10,'Hello world',BGRABlack);<br />
bmp.Draw(Canvas,0,0);<br />
bmp.Free;<br />
end;<br />
</syntaxhighlight><br />
<br />
[[Image:bgrafreetyperenderer.png]]<br />
<br />
Vous pouvez ajouter une ombre avec la propriété ''Shadow'' :<br />
<syntaxhighlight><br />
renderer.ShadowVisible := True;<br />
</syntaxhighlight><br />
<br />
[[Image:bgrafreetyperenderer_shadow.png]]<br />
<br />
Pour ajouter un contour :<br />
<syntaxhighlight><br />
renderer.OutlineVisible := True;<br />
renderer.OutlineColor := CSSBlack;<br />
renderer.OuterOutlineOnly := True;<br />
</syntaxhighlight><br />
<br />
[[Image:bgrafreetyperenderer_outline.png]]<br />
<br />
===== Éclairage de Phong =====<br />
<br />
Pour avoir un éclairage de Phong, vous aurez besoin d'un ''shader''. Pour le créer :<br />
<syntaxhighlight><br />
uses BGRAGradients;<br />
var<br />
shader: TPhongShading;<br />
renderer: TBGRAFreeTypeFontRenderer;<br />
begin<br />
shader := TPhongShading.Create;<br />
renderer := TBGRAFreeTypeFontRenderer.Create(shader, True); //le deuxième paramètre indique que le shader appartient au moteur de rendu<br />
</syntaxhighlight><br />
<br />
[[Image:bgrafreetyperenderer_shader.png]]<br />
<br />
<br />
<br />
{{AutoCategory}}</div>Gillou58https://wiki.freepascal.org/index.php?title=BGRABitmap_tutorial_10/fr&diff=89402BGRABitmap tutorial 10/fr2015-05-16T16:51:05Z<p>Gillou58: /* Exécution du programme */</p>
<hr />
<div>{{BGRABitmap_tutorial_10}}<br />
<br />
{{BGRABitmap_tutorial_index/fr}}<br />
<br />
Ce tutoriel montre comment utiliser le plaquage de texture.<br />
<br />
=== Création d'un nouveau projet ===<br />
<br />
Créez un nouveau projet et ajoutez la référence à [[BGRABitmap]], de la même façon que dans [[BGRABitmap tutorial/fr|le premier tutoriel]].<br />
<br />
=== Sans placage particulier ===<br />
<br />
Regardez ce qu'il arrive si on dessine un polygone avec une texture en utilisant le placage par défaut :<br />
<syntaxhighlight>procedure TForm1.FormPaint(Sender: TObject);<br />
var image: TBGRABitmap;<br />
tex: TBGRABitmap;<br />
begin<br />
//fond noir<br />
image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );<br />
<br />
tex:= TBGRABitmap.Create('image.png'); //charge un image<br />
image.FillPolyAntialias( [PointF(110,10), PointF(250,10), PointF(350,160), PointF(10,160)], tex);<br />
tex.Free;<br />
<br />
image.Draw(Canvas,0,0,True); //dessine à l'écran<br />
image.free;<br />
end; </syntaxhighlight><br />
<br />
=== Exécution du programme ===<br />
<br />
Vous devriez obtenir quelque chose comme cela :<br />
<br />
[[Image:BGRATutorial10a.png]]<br />
<br />
Comme vous pouvez le voir, l'image n'est pas déformée.<br />
<br />
=== Transformation affine ===<br />
<br />
Vous pouvez appliquer une transformation affine comme cela :<br />
<syntaxhighlight>procedure TForm1.PaintImage;<br />
var image: TBGRABitmap;<br />
tex: TBGRABitmap;<br />
affine: TBGRAAffineBitmapTransform;<br />
<br />
begin<br />
//fond noir<br />
image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );<br />
<br />
tex:= TBGRABitmap.Create('image.png'); //charge une image<br />
<br />
//création d'une rotation de 45°<br />
affine := TBGRAAffineBitmapTransform.Create(tex,True);<br />
affine.RotateDeg(45);<br />
<br />
//utiliser cette transformation comme paramètre à la place de tex<br />
image.FillPolyAntialias( [PointF(110,10), PointF(250,10), PointF(350,160), PointF(10,160)], affine); <br />
<br />
affine.Free;<br />
tex.Free;<br />
<br />
image.Draw(Canvas,0,0,True); //dessin à l'écran<br />
image.free;<br />
end;</syntaxhighlight><br />
<br />
=== Exécution du programme ===<br />
<br />
Vous devriez obtenir une image tournée à l'intérieur du polygone :<br />
<br />
[[Image:BGRATutorial10b.png]]<br />
<br />
=== Placage de texture ===<br />
<br />
Maintenant, si vous voulez que la texture soit alignée avec les bords du polygone, vous pouvez utiliser le placage de texture.<br />
<br />
==== Placage linéaire ====<br />
<br />
Le placage linéaire étire l'image le long des bords. Pour faire cela :<br />
<syntaxhighlight>procedure TForm1.PaintImage;<br />
var image: TBGRABitmap;<br />
tex: TBGRABitmap;<br />
begin<br />
image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );<br />
<br />
tex:= TBGRABitmap.Create('image.png');<br />
image.FillPolyLinearMapping( [PointF(110,10), PointF(250,10), PointF(350,160), PointF(10,160)], tex,<br />
[PointF(0,0), PointF(tex.width-1,0), PointF(tex.Width-1,tex.Height-1), PointF(0,tex.Height-1)], true);<br />
tex.Free;<br />
<br />
image.Draw(Canvas,0,0,True);<br />
image.free;<br />
end; </syntaxhighlight><br />
<br />
Pour faire le placage, vous utilisez ''FillPolyLinearMapping''. De nouveaux paramètres sont apparus. Les coordonnées de la texture définissent, pour chaque sommet du polygone, la position dans la texture. L'option d'interpolation est utilisée pour une meilleure qualité.<br />
<br />
==== Exécution du programme ====<br />
<br />
À présent, la texture est déformée selon la forme polygonale :<br />
<br />
[[Image:BGRATutorial10c.png]]<br />
<br />
==== Placage avec perspective ====<br />
<br />
Le placage avec perspective permet de définir pour chaque point sa profondeur.<br />
<syntaxhighlight>procedure TForm1.PaintImage;<br />
var image: TBGRABitmap;<br />
tex: TBGRABitmap;<br />
begin<br />
image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );<br />
<br />
tex:= TBGRABitmap.Create('image.png');<br />
image.FillPolyPerspectiveMapping( [PointF(110,10), PointF(250,10), PointF(350,160), PointF(10,160)],<br />
[75, 75, 50, 50],<br />
tex, [PointF(0,0), PointF(tex.width-1,0), PointF(tex.Width-1,tex.Height-1), PointF(0,tex.Height-1)], true);<br />
tex.Free;<br />
<br />
image.Draw(Canvas,0,0,True);<br />
image.free;<br />
end; </syntaxhighlight><br />
<br />
Ici, la profondeur est de 75 pour le haut du polygone et de 50 pour le bas. Cela signifie que le bas est plus proche de l'observateur, comme s'il était horizontal, à la manière d'un plancher.<br />
<br />
==== Exécution du programme ====<br />
<br />
Maintenant, on a l'impression que c'est un polygone en 3D :<br />
<br />
[[Image:BGRATutorial10d.png]]<br />
<br />
=== Conclusion ===<br />
<br />
Avec ces techniques, il est possible de déformer une image, comme dans l'outil "grille de déformation" de LazPaint, ou pour dessiner des objets en 3D avec textures, comme dans les tests 19-21 de ''testbgrafunc'' (aussi dans l'archive de LazPaint).<br />
<br />
[[BGRABitmap tutorial 9/fr|Tutoriel précédent (éclairage de phong)]] | [[BGRABitmap tutorial 11/fr|Tutoriel suivant (combiner les transformations)]]<br />
<br />
[[Category:Graphics/fr]]</div>Gillou58