<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Codes sources à télécharger</title>
		<link>https://www.developpez.net/forums/</link>
		<description><![CDATA[Codes sources Delphi à télécharger -> Proposez vos propres codes sources]]></description>
		<language>fr</language>
		<lastBuildDate>Wed, 03 Jun 2026 16:40:55 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.png</url>
			<title>Forum du club des développeurs et IT Pro - Codes sources à télécharger</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title><![CDATA[[FMX] Jeu de course de voitures]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2182430&amp;goto=newpost</link>
			<pubDate>Tue, 03 Mar 2026 16:03:25 GMT</pubDate>
			<description>Bonjour tout le monde, 
...</description>
			<content:encoded><![CDATA[<div>Bonjour tout le monde,<br />
<br />
J'ai commencé la rédaction d'un nouvel article sur le gamedev (et toujours avec Delphi :D) pour un magazine français.<br />
Cette fois ci, il s'agit d'un jeu de course en 2D de type Outrun.<br />

<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/sQxK5Ese7rM?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
<br />
<br />
Vous trouverez les sources sur mon GitHub : <a rel="nofollow" href="https://github.com/gbegreg/FMXOutrun" target="_blank">https://github.com/gbegreg/FMXOutrun</a><br />
<br />
Il y a encore un peu de travail(gérer un scrolling en bacground, affichage des voitures adverses par &quot;dessus&quot; des sprites du décor...) mais c'est déjà opérationnel en l'état.<br />
C'est écrit avec Delphi 13 (utilisation de l'opérateur ternaire) mais avec de petites modifications, le code peut être facilement porté sous Delphi 12. J'ai pris pour habitude maintenant d'utiliser l'inférence de type et les variables in-line donc si vous avez une version un peu ancienne de Delphi, il faudra adapter un peu plus le code.<br />
<br />
Le code est commenté et je donnerai des explications dans l'article mais si vous avez des questions sur le code, je pourrai déjà répondre ici ;)</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>gbegreg</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2182430/environnements-developpement/delphi/codes-sources-telecharger/fmx-jeu-course-voitures/</guid>
		</item>
		<item>
			<title><![CDATA[[VCL] Petit outil de dessin technique]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181545&amp;goto=newpost</link>
			<pubDate>Sun, 18 Jan 2026 06:39:27 GMT</pubDate>
			<description>Petite application de dessin...</description>
			<content:encoded><![CDATA[<div>Petite application de dessin qui facilite la création et la mesure de segments sur une grille.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p673369d1768718228/environnements-developpement/delphi/codes-sources-telecharger/vcl-petit-outil-dessin-technique/capture-d-ecran-2026-01-18-073645.png/" border="0" alt="Nom : Capture d'écran 2026-01-18 073645.png
Affichages : 550
Taille : 24,5 Ko"  style="float: CONFIG" /><br />
<br />
Code Source : <a href="https://www.developpez.net/forums/attachments/p673370d1768718290/environnements-developpement/delphi/codes-sources-telecharger/vcl-petit-outil-dessin-technique/drawing.zip/"  title="Nom : Drawing.zip
Affichages : 132
Taille : 97,6 Ko">Drawing.zip</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p673369d1768718228/environnements-developpement/delphi/codes-sources-telecharger/vcl-petit-outil-dessin-technique/capture-d-ecran-2026-01-18-073645.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	
		<fieldset class="fieldset">
			<legend>Fichiers attachés</legend>
			<ul>
			<li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/zip.gif" alt="Type de fichier : zip" />
	<a href="https://www.developpez.net/forums/attachments/p673370d1768718290/environnements-developpement/delphi/codes-sources-telecharger/vcl-petit-outil-dessin-technique/drawing.zip/">Drawing.zip</a> 
(97,6 Ko)
</li>
			</ul>
		</fieldset>
	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>XeGregory</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181545/environnements-developpement/delphi/codes-sources-telecharger/vcl-petit-outil-dessin-technique/</guid>
		</item>
		<item>
			<title><![CDATA[[VCL] Jeu du Pendu]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181297&amp;goto=newpost</link>
			<pubDate>Sun, 04 Jan 2026 08:03:50 GMT</pubDate>
			<description>Je partage aujourd’hui un...</description>
			<content:encoded><![CDATA[<div>Je partage aujourd’hui un mini&#8209;projet : un jeu du Pendu interactif.<br />
Le jeu affiche un clavier graphique, dessine la potence et le pendu au fur et à mesure des erreurs, et marque d’une petite croix rouge les touches déjà tentées et incorrectes.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p673025d1767513652/environnements-developpement/delphi/codes-sources-telecharger/vcl-jeu-pendu/capture-d-ecran-2026-01-04-085924.png/" border="0" alt="Nom : Capture d'écran 2026-01-04 085924.png
Affichages : 294
Taille : 20,3 Ko"  style="float: CONFIG" /><br />
<br />
Code Source : <a href="https://www.developpez.net/forums/attachments/p673026d1767513707/environnements-developpement/delphi/codes-sources-telecharger/vcl-jeu-pendu/hangman.zip/"  title="Nom : Hangman.zip
Affichages : 69
Taille : 106,0 Ko">Hangman.zip</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p673025d1767513652/environnements-developpement/delphi/codes-sources-telecharger/vcl-jeu-pendu/capture-d-ecran-2026-01-04-085924.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	
		<fieldset class="fieldset">
			<legend>Fichiers attachés</legend>
			<ul>
			<li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/zip.gif" alt="Type de fichier : zip" />
	<a href="https://www.developpez.net/forums/attachments/p673026d1767513707/environnements-developpement/delphi/codes-sources-telecharger/vcl-jeu-pendu/hangman.zip/">Hangman.zip</a> 
(106,0 Ko)
</li>
			</ul>
		</fieldset>
	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>XeGregory</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181297/environnements-developpement/delphi/codes-sources-telecharger/vcl-jeu-pendu/</guid>
		</item>
		<item>
			<title>Fenêtres layered faciles</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180729&amp;goto=newpost</link>
			<pubDate>Mon, 01 Dec 2025 16:34:07 GMT</pubDate>
			<description>Bonjour à tous ! 
 
Je vous...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous !<br />
<br />
Je vous propose aujourd'hui une petite unité facilitant la gestion des fenêtres &quot;layered&quot; (transparence et forme quelconque).<br />
Cette unité met à disposition une classe abstraite <b>TLayeredWindow </b>fournissant des méthodes pour dessiner des images et permettant quelques facéties comme vous le verrez ci-dessous.<br />
<br />
La structure de <i>TLayeredWindow </i>est la suivante :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">type</span>
  TLayeredWindow = <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">abstract</span>
  <span style="color: #0000ff;">private</span>
    <span style="color: #0000ff;">type</span>
      TLayeredWindowProc = reference <span style="color: #0000ff;">to</span> <span style="color: #0000ff;">procedure</span><span class="br0">&#40;</span>aControl: TWinControl; aCanvas: TD2DCanvas; aRect: TRect<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> DoDraw<span class="br0">&#40;</span>aControl: TWinControl; aBmp: TBitmap; aRect: TRect; aProc: TLayeredWindowProc; aOptions: TLayeredOptions; aOpacity :<span style="color: #0080ff;">byte</span><span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>; <span style="color: #0000ff;">inline</span>;
    <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> Resize<span class="br0">&#40;</span>aBoundsRect: TRect; aImageRect: TRect; aOptions: TLayeredOptions<span class="br0">&#41;</span>: TRect; <span style="color: #0000ff;">inline</span>;
  <span style="color: #0000ff;">public</span>
    <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> Draw<span class="br0">&#40;</span>aControl: TWinControl; aProc: TLayeredWindowProc; aOptions: TLayeredOptions = <span class="br0">&#91;</span><span class="br0">&#93;</span>; aOpacity :<span style="color: #0080ff;">byte</span> = <span style="color: #cc66cc;">255</span><span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>; <span style="color: #0000ff;">overload</span>;
    <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> Draw<span class="br0">&#40;</span>aControl: TWinControl; aImage :TWICImage; aProc: TLayeredWindowProc = <span style="color: #0000ff;">nil</span>; aOptions: TLayeredOptions = <span class="br0">&#91;</span><span class="br0">&#93;</span>; aOpacity :<span style="color: #0080ff;">byte</span> = <span style="color: #cc66cc;">255</span><span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>; <span style="color: #0000ff;">overload</span>;
    <span style="color: #808080;">{$IF CompilerVersion &gt;= 34.0}</span>
    <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> Draw<span class="br0">&#40;</span>aControl: TWinControl; aImageCollection :TImageCollection; aImageName: <span style="color: #0080ff;">string</span>; aProc: TLayeredWindowProc = <span style="color: #0000ff;">nil</span>; aOptions: TLayeredOptions = <span class="br0">&#91;</span><span class="br0">&#93;</span>; aOpacity :<span style="color: #0080ff;">byte</span> = <span style="color: #cc66cc;">255</span><span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>; <span style="color: #0000ff;">overload</span>;
    <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> Draw<span class="br0">&#40;</span>aControl: TWinControl; aImageCollection :TImageCollection; aImageIndex: <span style="color: #0080ff;">integer</span>; aProc: TLayeredWindowProc = <span style="color: #0000ff;">nil</span>; aOptions: TLayeredOptions = <span class="br0">&#91;</span><span class="br0">&#93;</span>; aOpacity :<span style="color: #0080ff;">byte</span> = <span style="color: #cc66cc;">255</span><span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>; <span style="color: #0000ff;">overload</span>;
    <span style="color: #808080;">{$ENDIF}</span>
    <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> DrawFromFileName<span class="br0">&#40;</span>aControl: TWinControl; <span style="color: #0000ff;">const</span> aFileName :<span style="color: #0080ff;">string</span>; aProc: TLayeredWindowProc = <span style="color: #0000ff;">nil</span>; aOptions: TLayeredOptions = <span class="br0">&#91;</span><span class="br0">&#93;</span>; aOpacity :<span style="color: #0080ff;">byte</span> = <span style="color: #cc66cc;">255</span><span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>;
    <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> DrawFromResource<span class="br0">&#40;</span>aControl: TWinControl; aInstance :<span style="color: #0080ff;">THandle</span>; <span style="color: #0000ff;">const</span> aResName :<span style="color: #0080ff;">string</span>; aProc: TLayeredWindowProc = <span style="color: #0000ff;">nil</span>; aOptions: TLayeredOptions = <span class="br0">&#91;</span><span class="br0">&#93;</span>; aOpacity :<span style="color: #0080ff;">byte</span> = <span style="color: #cc66cc;">255</span><span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>;
    <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> DrawFromStream<span class="br0">&#40;</span>aControl: TWinControl; aStream :TStream; aProc: TLayeredWindowProc = <span style="color: #0000ff;">nil</span>; aOptions: TLayeredOptions = <span class="br0">&#91;</span><span class="br0">&#93;</span>; aOpacity :<span style="color: #0080ff;">byte</span> = <span style="color: #cc66cc;">255</span><span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>;
  <span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div>Et voici quelques exemples d'utilisation.<br />
<br />
A noter que les fonctions avancées requièrent les unités <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">WinApi.D2D1</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Vcl.Direct2D</span>.<br />
<br />
<hr /><br />
Quand on parle fenêtres &quot;layered&quot;, on pense en premier lieu à un <i>splash screen</i>, ou éventuellement une fenêtre de notification dans un coin de l'écran.<br />
<br />
Ici l'image de fond est stockée en ressource mais elle pourrait être sur disque, pré-chargée par vos soins dans un <i>TWICImage </i>ou extraite d'un <i>TImageCollection</i>.<br />
<br />
Par défaut l'image est ajustée pour remplir son conteneur. Le paramètre <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Options</span> permet la proportionnalité (<i>loProportional</i>) et le centrage (<i>loCenter</i>). Les fenêtres sont transparentes (<i>click through</i>) si <i>loOpaque</i> n'est pas spécifié.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p672261d1764606521/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/splash1.png/" border="0" alt="Nom : Splash1.png
Affichages : 252
Taille : 40,4 Ko"  style="float: CONFIG" /><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.FormCreate<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  TLayeredWindow.DrawFromResource<span class="br0">&#40;</span><span style="color: #0000ff;">Self</span>, hInstance, <span style="color: #FF0000;">'SplashScreen'</span>, <span class="br0">&#91;</span>loOpaque<span class="br0">&#93;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div><hr /><br />
Les méthodes <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Draw</span> accepte une procédure en paramètre (ou procédure anonyme ou méthode) permettant des ajouts à cette image de fond ; textes, dessin, autres images en fonction de vos besoins. <br />
<br />
Le canvas est au format Direct2D, <i>aRect </i>représente la zone image après retaillage (si <i>loProportional/loCenter</i>).<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p672250d1764602789/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/splash2.png/" border="0" alt="Nom : Splash2.png
Affichages : 246
Taille : 44,2 Ko"  style="float: CONFIG" /><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">procedure</span> TForm1.DrawNextStep<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aText: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  TLayeredWindow.DrawFromResource<span class="br0">&#40;</span><span style="color: #0000ff;">Self</span>, hInstance, <span style="color: #FF0000;">'SplashScreen'</span>,
    <span style="color: #0000ff;">procedure</span><span class="br0">&#40;</span>aControl: TWinControl; aCanvas: TD2DCanvas; aRect: TRect<span class="br0">&#41;</span>
    <span style="color: #0000ff;">begin</span>
      aCanvas.Font.Assign<span class="br0">&#40;</span>Font<span class="br0">&#41;</span>;
      aCanvas.Brush.Style := bsClear;
      aCanvas.TextOut<span class="br0">&#40;</span>ScaleValue<span class="br0">&#40;</span><span style="color: #cc66cc;">200</span><span class="br0">&#41;</span>, aRect.Bottom -ScaleValue<span class="br0">&#40;</span><span style="color: #cc66cc;">100</span><span class="br0">&#41;</span>, aText<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>, <span class="br0">&#91;</span>loOpaque<span class="br0">&#93;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.FormCreate<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  DrawNextStep<span class="br0">&#40;</span><span style="color: #FF0000;">'Chargement des biblioth&egrave;ques...'</span><span class="br0">&#41;</span>;
  <span style="color: #808080;">// Action</span>
  DrawNextStep<span class="br0">&#40;</span><span style="color: #FF0000;">'Initialisation...'</span><span class="br0">&#41;</span>;
  <span style="color: #808080;">// Action</span>
  DrawNextStep<span class="br0">&#40;</span><span style="color: #FF0000;">'D&eacute;marrage...'</span><span class="br0">&#41;</span>;
  <span style="color: #808080;">// Action</span>
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div><hr /><br />
Mais depuis Windows 8 le mode &quot;layered&quot; s'applique également au contrôles enfants (dérivant de <i>TWinControl</i>) apportant une grande souplesse à notre rendu.<br />
<br />
Alors qu'un <i>TImage </i>est dessiné sur le canevas de son parent, notre contrôle respecte le <i>Z-Order</i>, et puisqu'il est transparent par défaut il n'affecte pas l'utilisation des autres contrôles.<br />
<br />
Ici les conteneurs sont des <i>TStaticText </i>et les images sont rendues en transparence.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p672252d1764603356/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/backfront.png/" border="0" alt="Nom : BackFront.png
Affichages : 240
Taille : 15,4 Ko"  style="float: CONFIG" /><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.DrawOverlays<span class="br0">&#40;</span>aControl: TWinControl<span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  TLayeredWindow.Draw<span class="br0">&#40;</span>aControl, ImageCollection1, <span style="color: #FF0000;">'Delphi'</span>, <span style="color: #0000ff;">nil</span>, <span class="br0">&#91;</span><span class="br0">&#93;</span>, <span style="color: #cc66cc;">30</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.FormCreate<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  DrawOverlays<span class="br0">&#40;</span>StaticText1<span class="br0">&#41;</span>;
  DrawOverlays<span class="br0">&#40;</span>StaticText2<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div><hr /><br />
Avez-vous besoin d'un texte en <i>overlay</i> ? pas de problème !<br />
Ici à l'aide d'un <i>TPanel</i>.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p672254d1764603539/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/overlay.png/" border="0" alt="Nom : Overlay.png
Affichages : 237
Taille : 24,2 Ko"  style="float: CONFIG" /><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">procedure</span> TForm1.FormCreate<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  TLayeredWindow.DrawFromFileName<span class="br0">&#40;</span>
    Panel1, <span style="color: #FF0000;">'D:\Delphi\Test\LayeredWindows\Car.webp'</span>,
    <span style="color: #0000ff;">procedure</span><span class="br0">&#40;</span>aControl: TWinControl; aCanvas: TD2DCanvas; aRect: TRect<span class="br0">&#41;</span>
    <span style="color: #0000ff;">var</span>
      TextFormat: IDWriteTextFormat;
      TextLayout: IDWriteTextLayout;
      Brush: ID2D1SolidColorBrush;
    <span style="color: #0000ff;">begin</span>
      <span style="color: #0000ff;">if</span> Sold <span style="color: #0000ff;">then</span>
      <span style="color: #0000ff;">begin</span>
        <span style="color: #0000ff;">const</span> Matrix = TD2DMatrix3X2F.Rotation<span class="br0">&#40;</span>-<span style="color: #cc66cc;">30</span>, aRect.CenterPoint.X, aRect.CenterPoint.Y<span class="br0">&#41;</span>;
        aCanvas.RenderTarget.SetTransform<span class="br0">&#40;</span>Matrix<span class="br0">&#41;</span>;
&nbsp;
        DWriteFactory.CreateTextFormat<span class="br0">&#40;</span><span style="color: #FF0000;">'Tahoma'</span>, <span style="color: #0000ff;">nil</span>, DWRITE_FONT_WEIGHT_BOLD, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, <span style="color: #cc66cc;">60</span>, <span style="color: #FF0000;">'fr'</span>, TextFormat<span class="br0">&#41;</span>;
        DWriteFactory.CreateTextLayout<span class="br0">&#40;</span><span style="color: #FF0000;">'Vendu'</span>, <span style="color: #cc66cc;">5</span>, TextFormat, aRect.Width, aRect.Height, TextLayout<span class="br0">&#41;</span>;
&nbsp;
        TextLayout.SetTextAlignment<span class="br0">&#40;</span>DWRITE_TEXT_ALIGNMENT_CENTER<span class="br0">&#41;</span>;
        TextLayout.SetParagraphAlignment<span class="br0">&#40;</span>DWRITE_PARAGRAPH_ALIGNMENT_CENTER<span class="br0">&#41;</span>;
&nbsp;
        aCanvas.RenderTarget.CreateSolidColorBrush<span class="br0">&#40;</span>D2D1ColorF<span class="br0">&#40;</span>clRed, <span style="color: #cc66cc;">0.5</span><span class="br0">&#41;</span>, <span style="color: #0000ff;">nil</span>, Brush<span class="br0">&#41;</span>;
        aCanvas.RenderTarget.DrawTextLayout<span class="br0">&#40;</span>D2D1PointF<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>, TextLayout, Brush<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">end</span>, <span class="br0">&#91;</span>loProportional, loCenter<span class="br0">&#93;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div><hr /><br />
Ou peut-être d'une image dans un badge ?<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p672256d1764603864/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/badge.png/" border="0" alt="Nom : Badge.png
Affichages : 236
Taille : 41,4 Ko"  style="float: CONFIG" /><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">procedure</span> TForm1.FormCreate<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  TLayeredWindow.Draw<span class="br0">&#40;</span>Panel1,
    <span style="color: #0000ff;">procedure</span><span class="br0">&#40;</span>aControl: TWinControl; aCanvas: TD2DCanvas; aRect: TRect<span class="br0">&#41;</span>
    <span style="color: #0000ff;">var</span>
      Badge: ID2D1RoundedRectangleGeometry;
      Params: TD2D1LayerParameters;
      Layer: ID2D1Layer;
    <span style="color: #0000ff;">begin</span>
      <span style="color: #0000ff;">const</span> Image = ImageCollection1.GetSourceImage<span class="br0">&#40;</span><span style="color: #cc66cc;">2</span>, aRect.Width, aRect.Height<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">const</span> RoundedRect = D2D1RoundedRect<span class="br0">&#40;</span>D2D1RectF<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, aRect.Right, aRect.Bottom<span class="br0">&#41;</span>, aRect.Width/<span style="color: #cc66cc;">2</span>, aRect.Height/<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span>;
&nbsp;
      D2DFactory.CreateRoundedRectangleGeometry<span class="br0">&#40;</span>RoundedRect, Badge<span class="br0">&#41;</span>;
&nbsp;
      Params.ContentBounds     := D2D1RectF<span class="br0">&#40;</span>-INFINITE, -INFINITE, INFINITE, INFINITE<span class="br0">&#41;</span>;
      Params.geometricMask     := Badge;
      Params.MaskAntiAliasMode := D2D1_ANTIALIAS_MODE_PER_PRIMITIVE;
      Params.maskTransform     := TD2D1Matrix3X2F.Identity;
      Params.Opacity           := <span style="color: #cc66cc;">1</span>;
      Params.OpacityBrush      := <span style="color: #0000ff;">nil</span>;
      Params.LayerOptions      := D2D1_LAYER_OPTIONS_NONE;
&nbsp;
      aCanvas.RenderTarget.CreateLayer<span class="br0">&#40;</span><span style="color: #0000ff;">nil</span>, Layer<span class="br0">&#41;</span>;
      aCanvas.RenderTarget.PushLayer<span class="br0">&#40;</span>Params, Layer<span class="br0">&#41;</span>;
&nbsp;
      aCanvas.StretchDraw<span class="br0">&#40;</span>aRect, Image<span class="br0">&#41;</span>;
      aCanvas.Brush.Style := bsClear;
      aCanvas.Ellipse<span class="br0">&#40;</span>aRect<span class="br0">&#41;</span>;
&nbsp;
      aCanvas.RenderTarget.PopLayer;
    <span style="color: #0000ff;">end</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div><hr /><br />
Et puisque tous les <i>TWinControl </i>sont supportés, pourquoi ne pas tout simplement donner un nouveau look au <i>TCheckBox </i>?<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p672257d1764603976/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/checkbox.png/" border="0" alt="Nom : Checkbox.png
Affichages : 239
Taille : 14,0 Ko"  style="float: CONFIG" /><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">type</span>
  TCheckBox = <span style="color: #0000ff;">class</span><span class="br0">&#40;</span>Vcl.StdCtrls.TCheckBox<span class="br0">&#41;</span>
  <span style="color: #0000ff;">protected</span>
    <span style="color: #0000ff;">procedure</span> CreateWnd; <span style="color: #0000ff;">override</span>;
    <span style="color: #0000ff;">procedure</span> Paint;
    <span style="color: #0000ff;">procedure</span> WndProc<span class="br0">&#40;</span><span style="color: #0000ff;">var</span> Message: TMessage<span class="br0">&#41;</span>; <span style="color: #0000ff;">override</span>;
  <span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">{ TCheckBox }</span>
&nbsp;
<span style="color: #0000ff;">procedure</span> TCheckBox.CreateWnd;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">inherited</span>;
  Paint;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TCheckBox.Paint;
<span style="color: #0000ff;">begin</span>
  TLayeredWindow.Draw<span class="br0">&#40;</span><span style="color: #0000ff;">Self</span>,
    <span style="color: #0000ff;">procedure</span><span class="br0">&#40;</span>aControl: TWinControl; aCanvas: TD2DCanvas; aRect: TRect<span class="br0">&#41;</span>
    <span style="color: #0000ff;">var</span>
      Brush: ID2D1SolidColorBrush;
    <span style="color: #0000ff;">begin</span>
      <span style="color: #0000ff;">var</span> Text := IfThen<span class="br0">&#40;</span>Checked, <span style="color: #FF0000;">'&#128077;'</span>, <span style="color: #FF0000;">'&#128078;'</span><span class="br0">&#41;</span> +Caption;
&nbsp;
      <span style="color: #808080;">// Fond &quot;presque&quot; transparent pour que le texte soit cliquable (entre les lettres)</span>
      aCanvas.RenderTarget.CreateSolidColorBrush<span class="br0">&#40;</span>D2D1ColorF<span class="br0">&#40;</span>clNone, <span style="color: #cc66cc;">0.01</span><span class="br0">&#41;</span>, <span style="color: #0000ff;">nil</span>, Brush<span class="br0">&#41;</span>;
      aCanvas.RenderTarget.FillRectangle<span class="br0">&#40;</span>D2D1RectF<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, aRect.Right, aRect.Bottom<span class="br0">&#41;</span>, Brush<span class="br0">&#41;</span>;
&nbsp;
      aCanvas.Font.Assign<span class="br0">&#40;</span>Font<span class="br0">&#41;</span>;
      aCanvas.Font.Color := IfThen<span class="br0">&#40;</span>Checked, clHighlight, clBlack<span class="br0">&#41;</span>;
      aCanvas.Brush.Style := bsClear;
      aCanvas.TextRect<span class="br0">&#40;</span>aRect, Text, <span class="br0">&#91;</span>tfVerticalCenter, tfSingleLine<span class="br0">&#93;</span><span class="br0">&#41;</span>;
&nbsp;
      <span style="color: #0000ff;">if</span> Focused <span style="color: #0000ff;">then</span>
      <span style="color: #0000ff;">begin</span>
        aCanvas.Pen.Color := clBlack;
        aCanvas.Pen.Style := psDot;
        SystemParametersInfo<span class="br0">&#40;</span>SPI_GETFOCUSBORDERWIDTH, <span style="color: #cc66cc;">0</span>, @aCanvas.Pen.Width, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
        aCanvas.Rectangle<span class="br0">&#40;</span>aRect<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">end</span>, <span class="br0">&#91;</span>loProportional, loOpaque<span class="br0">&#93;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TCheckBox.WndProc<span class="br0">&#40;</span><span style="color: #0000ff;">var</span> Message: TMessage<span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">inherited</span>;
&nbsp;
  <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>Message.Msg = CM_CHANGED<span class="br0">&#41;</span> <span style="color: #0000ff;">or</span>
     <span class="br0">&#40;</span>Message.Msg = WM_SetFocus<span class="br0">&#41;</span> <span style="color: #0000ff;">or</span>
     <span class="br0">&#40;</span>Message.Msg = WM_KillFocus<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span> Paint;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div><hr /><br />
Et n'oubliez pas que le mode &quot;layered&quot; est sans scintillement, les rafraichissements rapides se font sans accros.<br />
<br />
Amusez-vous, laissez libre cours à votre imagination et à bientôt sur DVP :P</div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p672250d1764602789/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/splash2.png/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p672252d1764603356/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/backfront.png/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p672254d1764603539/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/overlay.png/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p672256d1764603864/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/badge.png/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p672257d1764603976/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/checkbox.png/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p672261d1764606521/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/splash1.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	
		<fieldset class="fieldset">
			<legend>Fichiers attachés</legend>
			<ul>
			<li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/pas.gif" alt="Type de fichier : pas" />
	<a href="https://www.developpez.net/forums/attachments/p672260d1764605550/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/layeredwindows./">LayeredWindows.pas</a> 
(7,5 Ko)
</li>
			</ul>
		</fieldset>
	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>Andnotor</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180729/environnements-developpement/delphi/codes-sources-telecharger/fenetres-layered-faciles/</guid>
		</item>
		<item>
			<title><![CDATA[[FMX] Jeu de labyrinthe]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180586&amp;goto=newpost</link>
			<pubDate>Sat, 22 Nov 2025 18:20:25 GMT</pubDate>
			<description>Bonjour, 
 
Je vous propose...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Je vous propose un nouvel exemple de petit jeu vidéo avec Delphi à l'occasion de mon article publié dans le n° 272 du magazine Programmez! qui vient de paraitre.<br />
Il s'agit d'un jeu de labyrinthe en 3D dans lequel le joueur devra déplacer son pion à travers un labyrinthe généré aléatoirement jusqu'à la sortie (matérialisée par une case texturé d'un damier noir et blanc). Pour ce faire, le joueur utilisera les flèches du clavier.<br />
<br />
Mais attention, le joueur sera confronté au pion géré par l'ordinateur ! J'ai repris ce que j'avais présenté <a href="https://www.developpez.net/forums/d2100598/environnements-developpement/delphi/codes-sources-telecharger/fmx-path-finder-rechercher-chemin-plus-court-aller-d-point/" target="_blank">ici</a> pour expliquer l’algorithme de pathfinding A*.<br />
<br />
A chaque début de partie, le pion du joueur humain (le violet) est placé en bas à droite du plateau et le pion géré par l'ordinateur (le vert) est placé en bas à gauche. La case d'arrivée est placée aléatoirement elle aussi mais toujours vers le haut du plateau.<br />
<br />
Les premières parties sont faciles car l'ordinateur joue lentement, mais plus le joueur humain remporte de partie, plus l'ordinateur déplacera son pion rapidement ;)<br />
<br />

<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/1MBjJuxV3wM?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
<br />
<br />
Le code source du jeu est disponible sur mon GitHub <a rel="nofollow" href="https://github.com/gbegreg/FunMaze/tree/main" target="_blank">https://github.com/gbegreg/FunMaze/tree/main</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>gbegreg</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180586/environnements-developpement/delphi/codes-sources-telecharger/fmx-jeu-labyrinthe/</guid>
		</item>
		<item>
			<title><![CDATA[Synchronisation conditionnelle en fonction d'une valeur]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180478&amp;goto=newpost</link>
			<pubDate>Fri, 14 Nov 2025 17:58:11 GMT</pubDate>
			<description><![CDATA[Salut à tous ! 
 
J'avais...]]></description>
			<content:encoded><![CDATA[<div>Salut à tous !<br />
<br />
J'avais besoin d'une synchronisation un peu particulière basée sur une valeur étant ou non dans une certaine plage.<br />
Je vous propose ci-dessous un <i>record </i>générique permettant cela ainsi que d'autres modes d'attente.<br />
<br />
J'ai utilisé les fonctions WakeByAddress\WaitOnAddress dont <a href="https://www.developpez.net/forums/d2155919/environnements-developpement/delphi/codes-sources-telecharger/synchronisation-multithreads-event/" target="_blank">j'avais déjà parlé</a> voici quelques temps.<br />
<br />
Les différents modes sont :<br />
<ul><li style=""><b>Wait</b> (AutoReset = FALSE) : valeur différente d'une valeur de référence.</li><li style=""><b>Wait </b>(AutoReset = TRUE) : à chaque modification de la variable.</li><li style=""><b>Wait </b>(avec callback) : contrôle personnalisé par fonction callback.</li><li style=""><b>WaitEquals </b>: égalité.</li><li style=""><b>WaitBelow </b>: inférieure à.</li><li style=""><b>WaitAbove </b>: supérieure à.</li><li style=""><b>WaitIn </b>: dans une plage.</li><li style=""><b>WaitOut</b> : hors plage.</li></ul><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">uses</span> System.TypInfo, Generics.Defaults;
&nbsp;
<span style="color: #0000ff;">type</span>
  TWakeType = <span class="br0">&#40;</span>wtSingle, wtAll<span class="br0">&#41;</span>;
  TWakeCompare = <span class="br0">&#40;</span>wcEqual, wcNotEqual, wcBelow, wcAbove, wcIn, wcOut, wcCustom<span class="br0">&#41;</span>;
&nbsp;
  TWakeValue&lt;T&gt; = <span style="color: #0000ff;">record</span>
  <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">type</span>
    TWakeCompareProc = reference <span style="color: #0000ff;">to</span> <span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aValue: T<span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>;
  <span style="color: #0000ff;">private</span>
    FCompareValue: T;
    FAutoReset: <span style="color: #0080ff;">boolean</span>;
    FValue: T;
    FWakeType: TWakeType;
    Lock: <span style="color: #0080ff;">TObject</span>;
    <span style="color: #0000ff;">procedure</span> SetValue<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aValue: T<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">function</span> GetValue: T;
    <span style="color: #0000ff;">procedure</span> CheckIsOrdinal; <span style="color: #0000ff;">inline</span>;
    <span style="color: #0000ff;">procedure</span> Normalize<span class="br0">&#40;</span><span style="color: #0000ff;">var</span> aLowerValue, aUpperValue: T<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">function</span> DoWait<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aValue1, aValue2: T; aCompare: TWakeCompare; aCompareProc: TWakeCompareProc; aTimeOut: <span style="color: #0080ff;">cardinal</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">boolean</span>;
  <span style="color: #0000ff;">public</span>
    <span style="color: #0000ff;">property</span> Value :T read GetValue write SetValue;
    <span style="color: #0000ff;">class</span> operator Initialize<span class="br0">&#40;</span>out Dest: TWakeValue&lt;T&gt;<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">class</span> operator finalize<span class="br0">&#40;</span><span style="color: #0000ff;">var</span> Dest: TWakeValue&lt;T&gt;<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">class</span> operator Assign<span class="br0">&#40;</span><span style="color: #0000ff;">var</span> Dest: TWakeValue&lt;T&gt;; <span style="color: #0000ff;">const</span> <span class="br0">&#91;</span>ref<span class="br0">&#93;</span> Source: TWakeValue&lt;T&gt;<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">function</span> Wait<span class="br0">&#40;</span>aTimeout :<span style="color: #0080ff;">cardinal</span> = INFINITE<span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>; <span style="color: #0000ff;">overload</span>;
    <span style="color: #0000ff;">function</span> Wait<span class="br0">&#40;</span>aCompareProc: TWakeCompareProc; aTimeout :<span style="color: #0080ff;">cardinal</span> = INFINITE<span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>; <span style="color: #0000ff;">overload</span>;
    <span style="color: #0000ff;">function</span> WaitEquals<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aWaitValue: T; aTimeout :<span style="color: #0080ff;">cardinal</span> = INFINITE<span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>;
    <span style="color: #0000ff;">function</span> WaitBelow<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aBelowValue: T; aTimeout :<span style="color: #0080ff;">cardinal</span> = INFINITE<span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>;
    <span style="color: #0000ff;">function</span> WaitAbove<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aAboveValue: T; aTimeout :<span style="color: #0080ff;">cardinal</span> = INFINITE<span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>;
    <span style="color: #0000ff;">function</span> WaitIn<span class="br0">&#40;</span>aLowerValue, aUpperValue: T; aTimeout :<span style="color: #0080ff;">cardinal</span> = INFINITE<span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>;
    <span style="color: #0000ff;">function</span> WaitOut<span class="br0">&#40;</span>aLowerValue, aUpperValue: T; aTimeout :<span style="color: #0080ff;">cardinal</span> = INFINITE<span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>;
    <span style="color: #0000ff;">constructor</span> Create<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aValue, aCompareValue :T; aAutoReset: <span style="color: #0080ff;">boolean</span> = <span style="color: #0000ff;">TRUE</span>; aWakeType :TWakeType = wtAll<span class="br0">&#41;</span>; <span style="color: #0000ff;">overload</span>;
    <span style="color: #0000ff;">constructor</span> Create<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aValue :T; aAutoReset: <span style="color: #0080ff;">boolean</span> = <span style="color: #0000ff;">TRUE</span>; aWakeType :TWakeType = wtAll<span class="br0">&#41;</span>; <span style="color: #0000ff;">overload</span>;
  <span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">{ TWakeValue&lt;T&gt; }</span>
&nbsp;
<span style="color: #0000ff;">class</span> operator TWakeValue&lt;T&gt;.Initialize<span class="br0">&#40;</span>out Dest: TWakeValue&lt;T&gt;<span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  Assert<span class="br0">&#40;</span>SizeOf<span class="br0">&#40;</span>T<span class="br0">&#41;</span> &lt;= <span style="color: #cc66cc;">8</span>, <span style="color: #FF0000;">'SizeOf(T) exceeds 8'</span><span class="br0">&#41;</span>;
&nbsp;
  Dest.FValue := Default<span class="br0">&#40;</span>T<span class="br0">&#41;</span>;
  Dest.FCompareValue := Default<span class="br0">&#40;</span>T<span class="br0">&#41;</span>;
  Dest.FAutoReset := <span style="color: #0000ff;">TRUE</span>;
  Dest.FWakeType := wtAll;
  Dest.Lock := <span style="color: #0080ff;">TObject</span>.Create;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">class</span> operator TWakeValue&lt;T&gt;.finalize<span class="br0">&#40;</span><span style="color: #0000ff;">var</span> Dest: TWakeValue&lt;T&gt;<span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  Dest.Lock.Free;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">class</span> operator TWakeValue&lt;T&gt;.Assign<span class="br0">&#40;</span><span style="color: #0000ff;">var</span> Dest: TWakeValue&lt;T&gt;; <span style="color: #0000ff;">const</span> <span class="br0">&#91;</span>ref<span class="br0">&#93;</span> Source: TWakeValue&lt;T&gt;<span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  TMonitor.Enter<span class="br0">&#40;</span>Source.Lock<span class="br0">&#41;</span>;
  TMonitor.Enter<span class="br0">&#40;</span>Dest.Lock<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">try</span>
    Dest.FCompareValue := Source.FCompareValue;
    Dest.FValue := Source.FValue;
    Dest.FWakeType := Source.FWakeType;
    Dest.FAutoReset := Source.FAutoReset;
  <span style="color: #0000ff;">finally</span>
    TMonitor.Exit<span class="br0">&#40;</span>Source.Lock<span class="br0">&#41;</span>;
    TMonitor.Exit<span class="br0">&#40;</span>Dest.Lock<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">constructor</span> TWakeValue&lt;T&gt;.Create<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aValue, aCompareValue: T; aAutoReset: <span style="color: #0080ff;">boolean</span>; aWakeType: TWakeType<span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  FCompareValue := aCompareValue;
  FAutoReset := aAutoReset;
  FWakeType := aWakeType;
&nbsp;
  SetValue<span class="br0">&#40;</span>aValue<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">constructor</span> TWakeValue&lt;T&gt;.Create<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aValue: T; aAutoReset: <span style="color: #0080ff;">boolean</span>; aWakeType: TWakeType<span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  Create<span class="br0">&#40;</span>aValue, aValue, aAutoReset, aWakeType<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TWakeValue&lt;T&gt;.Normalize<span class="br0">&#40;</span><span style="color: #0000ff;">var</span> aLowerValue, aUpperValue: T<span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">if</span> TComparer&lt;T&gt;.Default.Compare<span class="br0">&#40;</span>aLowerValue, aUpperValue<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    <span style="color: #0000ff;">const</span> Tmp = aUpperValue;
    aUpperValue := aLowerValue;
    aLowerValue := Tmp;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TWakeValue&lt;T&gt;.CheckIsOrdinal;
<span style="color: #0000ff;">begin</span>
  Assert<span class="br0">&#40;</span>PTypeInfo<span class="br0">&#40;</span>TypeInfo<span class="br0">&#40;</span>T<span class="br0">&#41;</span><span class="br0">&#41;</span>^.Kind <span style="color: #0000ff;">in</span> <span class="br0">&#91;</span>tkInteger, tkInt64, tkFloat, tkChar, tkWChar, tkEnumeration<span class="br0">&#93;</span>, <span style="color: #FF0000;">'&lt;T&gt; is not a valid type (numeric, char or enumeration)'</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">function</span> TWakeValue&lt;T&gt;.GetValue: T;
<span style="color: #0000ff;">begin</span>
  TMonitor.Enter<span class="br0">&#40;</span>Lock<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">try</span>
    Result := FValue;
  <span style="color: #0000ff;">finally</span>
    TMonitor.Exit<span class="br0">&#40;</span>Lock<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TWakeValue&lt;T&gt;.SetValue<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aValue: T<span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  TMonitor.Enter<span class="br0">&#40;</span>Lock<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">try</span>
    <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> TEqualityComparer&lt;T&gt;.Default.Equals<span class="br0">&#40;</span>FValue, aValue<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      FValue := aValue;
&nbsp;
      <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> TEqualityComparer&lt;T&gt;.Default.Equals<span class="br0">&#40;</span>FValue, FCompareValue<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
      <span style="color: #0000ff;">begin</span>
        <span style="color: #0000ff;">case</span> FWakeType <span style="color: #0000ff;">of</span>
          wtSingle : WakeByAddressSingle<span class="br0">&#40;</span>@FValue<span class="br0">&#41;</span>;
          wtAll    : WakeByAddressAll<span class="br0">&#40;</span>@FValue<span class="br0">&#41;</span>;
        <span style="color: #0000ff;">end</span>;
&nbsp;
        <span style="color: #0000ff;">if</span> FAutoReset <span style="color: #0000ff;">then</span>
          FCompareValue := FValue;
      <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">end</span>;
&nbsp;
  <span style="color: #0000ff;">finally</span>
    TMonitor.Exit<span class="br0">&#40;</span>Lock<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">function</span> TWakeValue&lt;T&gt;.DoWait<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aValue1, aValue2: T; aCompare: TWakeCompare; aCompareProc: TWakeCompareProc; aTimeOut: <span style="color: #0080ff;">cardinal</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">boolean</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">while</span> <span style="color: #0000ff;">TRUE</span> <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    <span style="color: #0000ff;">const</span> Value = GetValue;
    <span style="color: #0000ff;">const</span> Res = TComparer&lt;T&gt;.Default.Compare<span class="br0">&#40;</span>Value, aValue1<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #0000ff;">case</span> aCompare <span style="color: #0000ff;">of</span>
      wcEqual    : <span style="color: #0000ff;">if</span> Res = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span> Exit<span class="br0">&#40;</span><span style="color: #0000ff;">TRUE</span><span class="br0">&#41;</span>;
      wcNotEqual : <span style="color: #0000ff;">if</span> Res &lt;&gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span> Exit<span class="br0">&#40;</span><span style="color: #0000ff;">TRUE</span><span class="br0">&#41;</span>;
      wcBelow    : <span style="color: #0000ff;">if</span> Res &lt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span> Exit<span class="br0">&#40;</span><span style="color: #0000ff;">TRUE</span><span class="br0">&#41;</span>;
      wcAbove    : <span style="color: #0000ff;">if</span> Res &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span> Exit<span class="br0">&#40;</span><span style="color: #0000ff;">TRUE</span><span class="br0">&#41;</span>;
      wcIn       : <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>Res &gt;= <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">and</span> <span class="br0">&#40;</span>TComparer&lt;T&gt;.Default.Compare<span class="br0">&#40;</span>Value, aValue2<span class="br0">&#41;</span> &lt;= <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span> Exit<span class="br0">&#40;</span><span style="color: #0000ff;">TRUE</span><span class="br0">&#41;</span>;
      wcOut      : <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>Res &lt; <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">or</span> <span class="br0">&#40;</span>TComparer&lt;T&gt;.Default.Compare<span class="br0">&#40;</span>Value, aValue2<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span> Exit<span class="br0">&#40;</span><span style="color: #0000ff;">TRUE</span><span class="br0">&#41;</span>;
      wcCustom   : <span style="color: #0000ff;">if</span> aCompareProc<span class="br0">&#40;</span>Value<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span> Exit<span class="br0">&#40;</span><span style="color: #0000ff;">TRUE</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
&nbsp;
    <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> WaitOnAddress<span class="br0">&#40;</span>@FValue, @FValue, SizeOf<span class="br0">&#40;</span>T<span class="br0">&#41;</span>, aTimeout<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span> Exit<span class="br0">&#40;</span><span style="color: #0000ff;">FALSE</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">function</span> TWakeValue&lt;T&gt;.WaitEquals<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aWaitValue: T; aTimeout: <span style="color: #0080ff;">cardinal</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">boolean</span>;
<span style="color: #0000ff;">begin</span>
  Result := DoWait<span class="br0">&#40;</span>aWaitValue, Default<span class="br0">&#40;</span>T<span class="br0">&#41;</span>, wcEqual, <span style="color: #0000ff;">nil</span>, aTimeOut<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">function</span> TWakeValue&lt;T&gt;.WaitAbove<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aAboveValue: T; aTimeout: <span style="color: #0080ff;">cardinal</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">boolean</span>;
<span style="color: #0000ff;">begin</span>
  CheckIsOrdinal;
  Result := DoWait<span class="br0">&#40;</span>aAboveValue, Default<span class="br0">&#40;</span>T<span class="br0">&#41;</span>, wcAbove, <span style="color: #0000ff;">nil</span>, aTimeOut<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">function</span> TWakeValue&lt;T&gt;.WaitBelow<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aBelowValue: T; aTimeout: <span style="color: #0080ff;">cardinal</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">boolean</span>;
<span style="color: #0000ff;">begin</span>
  CheckIsOrdinal;
  Result := DoWait<span class="br0">&#40;</span>aBelowValue, Default<span class="br0">&#40;</span>T<span class="br0">&#41;</span>, wcBelow, <span style="color: #0000ff;">nil</span>, aTimeOut<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">function</span> TWakeValue&lt;T&gt;.WaitIn<span class="br0">&#40;</span>aLowerValue, aUpperValue: T; aTimeout: <span style="color: #0080ff;">cardinal</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">boolean</span>;
<span style="color: #0000ff;">begin</span>
  CheckIsOrdinal;
  Normalize<span class="br0">&#40;</span>aLowerValue, aUpperValue<span class="br0">&#41;</span>;
  Result := DoWait<span class="br0">&#40;</span>aLowerValue, aUpperValue, wcIn, <span style="color: #0000ff;">nil</span>, aTimeOut<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">function</span> TWakeValue&lt;T&gt;.WaitOut<span class="br0">&#40;</span>aLowerValue, aUpperValue: T; aTimeout: <span style="color: #0080ff;">cardinal</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">boolean</span>;
<span style="color: #0000ff;">begin</span>
  CheckIsOrdinal;
  Normalize<span class="br0">&#40;</span>aLowerValue, aUpperValue<span class="br0">&#41;</span>;
  Result := DoWait<span class="br0">&#40;</span>aLowerValue, aUpperValue, wcOut, <span style="color: #0000ff;">nil</span>, aTimeOut<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">function</span> TWakeValue&lt;T&gt;.Wait<span class="br0">&#40;</span>aTimeout: <span style="color: #0080ff;">cardinal</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">boolean</span>;
<span style="color: #0000ff;">var</span>
  CompareValue: T;
<span style="color: #0000ff;">begin</span>
  TMonitor.Enter<span class="br0">&#40;</span>Lock<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">try</span>
    CompareValue := FCompareValue;
  <span style="color: #0000ff;">finally</span>
    TMonitor.Exit<span class="br0">&#40;</span>Lock<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  Result := DoWait<span class="br0">&#40;</span>CompareValue, Default<span class="br0">&#40;</span>T<span class="br0">&#41;</span>, wcNotEqual, <span style="color: #0000ff;">nil</span>, aTimeOut<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">function</span> TWakeValue&lt;T&gt;.Wait<span class="br0">&#40;</span>aCompareProc: TWakeCompareProc; aTimeout :<span style="color: #0080ff;">cardinal</span><span class="br0">&#41;</span> :<span style="color: #0080ff;">boolean</span>;
<span style="color: #0000ff;">begin</span>
  Assert<span class="br0">&#40;</span>Assigned<span class="br0">&#40;</span>aCompareProc<span class="br0">&#41;</span>, <span style="color: #FF0000;">'aCompareProc cannot be nil.'</span><span class="br0">&#41;</span>;
  Result := DoWait<span class="br0">&#40;</span>Default<span class="br0">&#40;</span>T<span class="br0">&#41;</span>, Default<span class="br0">&#40;</span>T<span class="br0">&#41;</span>, wcCustom, aCompareProc, aTimeOut<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div>A l'usage :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">var</span>
  StatusMsg :TWakeValue&lt;string&gt;;
  SafeOperation :TWakeValue&lt;integer&gt;;
  ErrorMsg :TWakeValue&lt;string&gt;;
&nbsp;
TMyThread1.Execute;
<span style="color: #0000ff;">begin</span>
  StatusMsg.WaitEquals<span class="br0">&#40;</span><span style="color: #FF0000;">'Success'</span><span class="br0">&#41;</span>;
  ...
<span style="color: #0000ff;">end</span>;
&nbsp;
TMyThread2.Execute;
<span style="color: #0000ff;">begin</span>
  SafeOperation.WaitIn<span class="br0">&#40;</span><span style="color: #cc66cc;">50</span>, <span style="color: #cc66cc;">60</span><span class="br0">&#41;</span>;
  ...
<span style="color: #0000ff;">end</span>;
&nbsp;
TMyThread3.Execute;
<span style="color: #0000ff;">begin</span>
  ErrorMsg.Wait<span class="br0">&#40;</span><span style="color: #0000ff;">function</span><span class="br0">&#40;</span><span style="color: #0000ff;">const</span> aValue: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">boolean</span>
                <span style="color: #0000ff;">begin</span>
                  Result := aValue.StartsWith<span class="br0">&#40;</span><span style="color: #FF0000;">'Error'</span><span class="br0">&#41;</span>;
                <span style="color: #0000ff;">end</span><span class="br0">&#41;</span>;
  ...
<span style="color: #0000ff;">end</span>;
&nbsp;
StatusMsg.Value := <span style="color: #FF0000;">'Success'</span>;
SafeOperation.Value := <span style="color: #cc66cc;">55</span>;
ErrorMsg.Value := <span style="color: #FF0000;">'Error 200'</span>;</pre></td></tr></table></code><hr />
</div></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>Andnotor</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180478/environnements-developpement/delphi/codes-sources-telecharger/synchronisation-conditionnelle-fonction-d/</guid>
		</item>
		<item>
			<title><![CDATA[MiniFAQ TF&#8209;IDF Assistant FAQ console]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180349&amp;goto=newpost</link>
			<pubDate>Sat, 08 Nov 2025 06:39:52 GMT</pubDate>
			<description>Bonjour,  
 
Je vous propose...</description>
			<content:encoded><![CDATA[<div>Bonjour, <br />
<br />
Je vous propose un nouvel élément à utiliser : <a href="http://delphi.developpez.com/telecharger/detail/id/7534/MiniFAQ-TF-8209-IDF-Assistant-FAQ-console" target="_blank">MiniFAQ TF&#8209;IDF Assistant FAQ console</a><br />
<br />
Un utilitaire console qui fournit une aide interactive en indexant automatiquement une FAQ et en répondant par similarité sémantique. <br />
Le programme normalise les questions, génère des tokens et des bigrams, construit des vecteurs TF&#8209;IDF (IDF légèrement renforcé) et recherche la meilleure réponse via similarité cosinus. <br />
<br />
Il inclut une génération automatique d’une table de synonymes à partir des questions, un fallback basé sur tokens uniques et bigrams pour les requêtes courtes ou mal formulées, un menu de suggestion quand aucune réponse n’est trouvée.<br />
<br />
L’affichage utilise des couleurs console pour distinguer prompt, question, réponse et erreurs.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p671600d1762584333/environnements-developpement/delphi/codes-sources-telecharger/minifaq-tf-idf-assistant-faq-console/capture-d-ecran-2025-11-08-074455.png/" border="0" alt="Nom : Capture d'écran 2025-11-08 074455.png
Affichages : 200
Taille : 132,0 Ko"  style="float: CONFIG" /><br />
<br />
<img src="https://www.developpez.net/forums/attachments/p671601d1762584343/environnements-developpement/delphi/codes-sources-telecharger/minifaq-tf-idf-assistant-faq-console/capture-d-ecran-2025-11-08-074512.png/" border="0" alt="Nom : Capture d'écran 2025-11-08 074512.png
Affichages : 183
Taille : 140,0 Ko"  style="float: CONFIG" /><br />
<br />
Qu'en pensez-vous ?</div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p671600d1762584333/environnements-developpement/delphi/codes-sources-telecharger/minifaq-tf-idf-assistant-faq-console/capture-d-ecran-2025-11-08-074455.png/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p671601d1762584343/environnements-developpement/delphi/codes-sources-telecharger/minifaq-tf-idf-assistant-faq-console/capture-d-ecran-2025-11-08-074512.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>XeGregory</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180349/environnements-developpement/delphi/codes-sources-telecharger/minifaq-tf-idf-assistant-faq-console/</guid>
		</item>
		<item>
			<title><![CDATA[Déboguer un service depuis l'EDI]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180295&amp;goto=newpost</link>
			<pubDate>Wed, 05 Nov 2025 10:16:06 GMT</pubDate>
			<description><![CDATA[Salut à tous ! 
 
On a (j'ai)...]]></description>
			<content:encoded><![CDATA[<div>Salut à tous !<br />
<br />
On a (j'ai) beaucoup parlé service ces derniers temps. Sur ce sujet je vous propose aujourd'hui une petite unité permettant de les déboguer plus facilement directement dans votre EDI favori.<br />
<br />
Alors évidemment elle ne va pas être utilisable si votre service a besoin de privilèges élevés (compte Système). Elle ne va pas non plus aider à mettre en évidence des erreurs dues par exemple à des objets de synchronization non suffisamment renseignés (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Global\</span> ou descripteur de sécurité manquants) mais pour le reste ça devrait faire le job. <br />
<br />
L'utilisation de cette unité est totalement transparente, elle n'a d'influence qu'en mode DEBUG et pour autant que l'exe soit lancé dans une session utilisateur. Elle est totalement ignorée en RELEASE ou si réellement exécuté comme service (session 0).<br />
<br />
Son utilisation est très simple sans aucun réglage. Il suffit d'un test <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">RunAsService</span> dans le <i>dpr</i>.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> RunAsService<span class="br0">&#40;</span>TService1, Service1<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span> Exit;
&nbsp;
  <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> Application.DelayInitialize <span style="color: #0000ff;">or</span> Application.Installing <span style="color: #0000ff;">then</span>
    Application.Initialize;
  Application.CreateForm<span class="br0">&#40;</span>TService1, Service1<span class="br0">&#41;</span>;
  Application.Run;
<span style="color: #0000ff;">end</span>.</pre></td></tr></table></code><hr />
</div><b><font color="#0000CD">Fonctionnement</font></b><br />
<br />
Une console est créée vous permettant d'interagir comme le ferait le SCM (<i>service control manager</i>) : démarrage, arrêt, pause, etc.<br />
De plus le journal des événements est &quot;tracé&quot;, les <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">LogMessage</span> générés sont directement affichés dans la console avec mise en évidence des erreurs et avertissements.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p671539d1762337619/environnements-developpement/delphi/codes-sources-telecharger/deboguer-service-l-edi/debug.svcmgr.jpg/" border="0" alt="Nom : Debug.SvcMgr.jpg
Affichages : 165
Taille : 51,9 Ko"  style="float: CONFIG" /><br />
<br />
<b>Note</b><br />
SCM génère une erreur &quot;normale&quot; dans ce cas d'utilisation (il ne peut pas démarrer un service). Cette erreur est ignorée et correspond à &quot;Descripteur non valide&quot;. Vous devrez adapter ce texte sur des OS autres que le français.<br />
<br />
<font color="#0000CD"><b>Prérequis</b></font><br />
<br />
La console est gérée par l'unité <a href="https://www.developpez.net/forums/d2162398/environnements-developpement/delphi/codes-sources-telecharger/application-console-couleur-plus/#post12102116" target="_blank">AppConsole</a> que vous pouvez télécharger <a href="https://www.developpez.net/forums/d2162398/environnements-developpement/delphi/codes-sources-telecharger/application-console-couleur-plus/#post12102116" target="_blank">ici</a>.<br />
La trace est faite par WMI, vous devez importer la bibliothèque &quot;Microsoft WMI Scripting&quot;. Dans l'EDI : menus <i>Composant</i> &#8594; <i>Importer un composant</i> &#8594; <i>Importer une bibliothèque de types</i> (cochez <i>avec wrappers</i>). L'unité résultante est <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">WbemScripting_TLB.pas</span>.<br />
<br />
<br />
N'hésitez pas à faire part de vos remarques et à bientôt sur DVP :D</div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p671539d1762337619/environnements-developpement/delphi/codes-sources-telecharger/deboguer-service-l-edi/debug.svcmgr.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	
		<fieldset class="fieldset">
			<legend>Fichiers attachés</legend>
			<ul>
			<li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/pas.gif" alt="Type de fichier : pas" />
	<a href="https://www.developpez.net/forums/attachments/p671537d1762337556/environnements-developpement/delphi/codes-sources-telecharger/deboguer-service-l-edi/debug.svcmgr./">Debug.SvcMgr.pas</a> 
(7,5 Ko)
</li>
			</ul>
		</fieldset>
	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>Andnotor</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180295/environnements-developpement/delphi/codes-sources-telecharger/deboguer-service-l-edi/</guid>
		</item>
		<item>
			<title>TSystemInfo - Une Classe pour la collecte d’informations système Windows</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180223&amp;goto=newpost</link>
			<pubDate>Fri, 31 Oct 2025 16:55:29 GMT</pubDate>
			<description>Je vous propose un nouvel...</description>
			<content:encoded><![CDATA[<div>Je vous propose un nouvel élément à utiliser : <a href="http://delphi.developpez.com/telecharger/detail/id/7533/TSystemInfo-moins-Une-Class-pour-la-collecte-d-informations-systeme-Windows" target="_blank">TSystemInfo - Une Classe pour la collecte d’informations système Windows</a><br />
<br />
TSystemInfo est une classe qui centralise la collecte d’informations système Windows (Windows 10/11) en combinant WMI et API Windows.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p671444d1761929869/environnements-developpement/delphi/codes-sources-telecharger/tsysteminfo-classe-collecte-d-informations-systeme-windows/capture-d-ecran-2025-10-31-175407.png/" border="0" alt="Nom : Capture d'écran 2025-10-31 175407.png
Affichages : 524
Taille : 120,1 Ko"  style="float: CONFIG" /><br />
<br />
Principales méthodes exposées :<br />
<br />
<ul><li style=""> GetOSInfo : nom, version, build, architecture, date d’installation.</li><li style=""> GetCPUInfo : nom, fabricant, identifiant, nombre de cœurs/threads, fréquence max.</li><li style=""> GetMemoryInfo : mémoire totale/disponible, pourcentage d’utilisation, mémoire virtuelle.</li><li style=""> GetDiskInfo : lecteurs logiques (taille et espace libre formatés).</li><li style=""> GetNetworkAdapters : adaptateurs IP activés, adresses MAC/IP, passerelle, DNS.</li><li style=""> GetGPUInfo : contrôleurs vidéo, RAM adaptateur formatée.</li><li style=""> GetBIOSInfo / GetBaseBoardInfo / GetBatteryInfo — informations matérielles.</li><li style=""> GetUsers : comptes locaux.</li><li style=""> GetHotFixes : correctifs installés.</li><li style=""> GetPrinters / GetServices / GetProcesses : imprimantes, services (état, mode démarrage), processus en cours.</li><li style=""> GetTimeZoneAndLocale : fuseau horaire et locale utilisateur.</li><li style=""> GetPowerPlan : GUID du plan d’alimentation actif.</li><li style=""> GetHostAndUptime : nom d’hôte et durée de fonctionnement (WMI ou fallback).</li></ul><br />
<br />
<b>TSystemInfo : </b><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br />336<br />337<br />338<br />339<br />340<br />341<br />342<br />343<br />344<br />345<br />346<br />347<br />348<br />349<br />350<br />351<br />352<br />353<br />354<br />355<br />356<br />357<br />358<br />359<br />360<br />361<br />362<br />363<br />364<br />365<br />366<br />367<br />368<br />369<br />370<br />371<br />372<br />373<br />374<br />375<br />376<br />377<br />378<br />379<br />380<br />381<br />382<br />383<br />384<br />385<br />386<br />387<br />388<br />389<br />390<br />391<br />392<br />393<br />394<br />395<br />396<br />397<br />398<br />399<br />400<br />401<br />402<br />403<br />404<br />405<br />406<br />407<br />408<br />409<br />410<br />411<br />412<br />413<br />414<br />415<br />416<br />417<br />418<br />419<br />420<br />421<br />422<br />423<br />424<br />425<br />426<br />427<br />428<br />429<br />430<br />431<br />432<br />433<br />434<br />435<br />436<br />437<br />438<br />439<br />440<br />441<br />442<br />443<br />444<br />445<br />446<br />447<br />448<br />449<br />450<br />451<br />452<br />453<br />454<br />455<br />456<br />457<br />458<br />459<br />460<br />461<br />462<br />463<br />464<br />465<br />466<br />467<br />468<br />469<br />470<br />471<br />472<br />473<br />474<br />475<br />476<br />477<br />478<br />479<br />480<br />481<br />482<br />483<br />484<br />485<br />486<br />487<br />488<br />489<br />490<br />491<br />492<br />493<br />494<br />495<br />496<br />497<br />498<br />499<br />500<br />501<br />502<br />503<br />504<br />505<br />506<br />507<br />508<br />509<br />510<br />511<br />512<br />513<br />514<br />515<br />516<br />517<br />518<br />519<br />520<br />521<br />522<br />523<br />524<br />525<br />526<br />527<br />528<br />529<br />530<br />531<br />532<br />533<br />534<br />535<br />536<br />537<br />538<br />539<br />540<br />541<br />542<br />543<br />544<br />545<br />546<br />547<br />548<br />549<br />550<br />551<br />552<br />553<br />554<br />555<br />556<br />557<br />558<br />559<br />560<br />561<br />562<br />563<br />564<br />565<br />566<br />567<br />568<br />569<br />570<br />571<br />572<br />573<br />574<br />575<br />576<br />577<br />578<br />579<br />580<br />581<br />582<br />583<br />584<br />585<br />586<br />587<br />588<br />589<br />590<br />591<br />592<br />593<br />594<br />595<br />596<br />597<br />598<br />599<br />600<br />601<br />602<br />603<br />604<br />605<br />606<br />607<br />608<br />609<br />610<br />611<br />612<br />613<br />614<br />615<br />616<br />617<br />618<br />619<br />620<br />621<br />622<br />623<br />624<br />625<br />626<br />627<br />628<br />629<br />630<br />631<br />632<br />633<br />634<br />635<br />636<br />637<br />638<br />639<br />640<br />641<br />642<br />643<br />644<br />645<br />646<br />647<br />648<br />649<br />650<br />651<br />652<br />653<br />654<br />655<br />656<br />657<br />658<br />659<br />660<br />661<br />662<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">unit</span> SystemInfo;
&nbsp;
<span style="color: #0000ff;">interface</span>
&nbsp;
<span style="color: #0000ff;">uses</span>
  System.Classes,
  System.SysUtils,
  Winapi.Windows,
  System.Variants,
  ComObj,
  ActiveX,
  Registry,
  TlHelp32,
  Winapi.ShellAPI;
&nbsp;
<span style="color: #0000ff;">type</span>
  <span style="color: #808080;">/// Classe pour r&eacute;cup&eacute;rer des informations syst&egrave;me via WMI et API Windows.</span>
  TSystemInfo = <span style="color: #0000ff;">class</span>
  <span style="color: #0000ff;">private</span>
    <span style="color: #0000ff;">function</span> WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> WMIClass, PropName: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span>;
    <span style="color: #0000ff;">function</span> WMIQueryList<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> WMIClass: <span style="color: #0080ff;">string</span>; <span style="color: #0000ff;">const</span> Props: <span style="color: #0000ff;">array</span> <span style="color: #0000ff;">of</span> <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>
      : TStringList;
    <span style="color: #0000ff;">function</span> GetUptimeFromWMI: <span style="color: #0080ff;">string</span>;
    <span style="color: #0000ff;">function</span> GetActivePowerSchemeGUID: <span style="color: #0080ff;">string</span>;
  <span style="color: #0000ff;">public</span>
    <span style="color: #0000ff;">constructor</span> Create;
    <span style="color: #0000ff;">destructor</span> Destroy; <span style="color: #0000ff;">override</span>;
&nbsp;
    <span style="color: #0000ff;">function</span> GetOSInfo: TStringList;
    <span style="color: #0000ff;">function</span> GetCPUInfo: TStringList;
    <span style="color: #0000ff;">function</span> GetMemoryInfo: TStringList;
    <span style="color: #0000ff;">function</span> GetDiskInfo: TStringList;
    <span style="color: #0000ff;">function</span> GetNetworkAdapters: TStringList;
    <span style="color: #0000ff;">function</span> GetGPUInfo: TStringList;
&nbsp;
    <span style="color: #0000ff;">function</span> GetBIOSInfo: TStringList;
    <span style="color: #0000ff;">function</span> GetBaseBoardInfo: TStringList;
    <span style="color: #0000ff;">function</span> GetBatteryInfo: TStringList;
    <span style="color: #0000ff;">function</span> GetUsers: TStringList;
    <span style="color: #0000ff;">function</span> GetHotFixes: TStringList;
    <span style="color: #0000ff;">function</span> GetHostAndUptime: TStringList;
&nbsp;
    <span style="color: #0000ff;">function</span> GetPrinters: TStringList;
    <span style="color: #0000ff;">function</span> GetServices: TStringList;
    <span style="color: #0000ff;">function</span> GetProcesses: TStringList;
    <span style="color: #0000ff;">function</span> GetTimeZoneAndLocale: TStringList;
    <span style="color: #0000ff;">function</span> GetPowerPlan: TStringList;
&nbsp;
    <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> FormatSize<span class="br0">&#40;</span>Bytes: UInt64<span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span>; static;
  <span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">implementation</span>
&nbsp;
<span style="color: #808080;">{ TSystemInfo }</span>
&nbsp;
<span style="color: #0000ff;">constructor</span> TSystemInfo.Create;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">inherited</span>;
  <span style="color: #808080;">// Initialisation COM pour WMI</span>
  CoInitializeEx<span class="br0">&#40;</span><span style="color: #0000ff;">nil</span>, COINIT_APARTMENTTHREADED<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">destructor</span> TSystemInfo.Destroy;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// Lib&eacute;ration COM</span>
  CoUninitialize;
  <span style="color: #0000ff;">inherited</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Ex&eacute;cute une requ&ecirc;te WMI et retourne la premi&egrave;re valeur trouv&eacute;e.</span>
<span style="color: #0000ff;">function</span> TSystemInfo.WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> WMIClass,
  PropName: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">var</span>
  WbemLocator, WMIService, Items, Item: OLEVariant;
  Enum: IEnumVARIANT;
  Value: <span style="color: #0080ff;">Cardinal</span>;
<span style="color: #0000ff;">begin</span>
  Result := <span style="color: #FF0000;">''</span>;
  <span style="color: #0000ff;">try</span>
    WbemLocator := CreateOleObject<span class="br0">&#40;</span><span style="color: #FF0000;">'WbemScripting.SWbemLocator'</span><span class="br0">&#41;</span>;
    WMIService := WbemLocator.ConnectServer<span class="br0">&#40;</span><span style="color: #FF0000;">'.'</span>, <span style="color: #FF0000;">'root\cimv2'</span>, <span style="color: #FF0000;">''</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>;
    Items := WMIService.ExecQuery<span class="br0">&#40;</span>Format<span class="br0">&#40;</span><span style="color: #FF0000;">'SELECT %s FROM %s'</span>,
      <span class="br0">&#91;</span>PropName, WMIClass<span class="br0">&#93;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'WQL'</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
    Enum := <span style="color: #0080ff;">IUnknown</span><span class="br0">&#40;</span>Items._NewEnum<span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> IEnumVARIANT;
    <span style="color: #0000ff;">if</span> Enum.Next<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, Item, Value<span class="br0">&#41;</span> = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      <span style="color: #0000ff;">try</span>
        Result := VarToStr<span class="br0">&#40;</span>Item.Properties_.Item<span class="br0">&#40;</span>PropName<span class="br0">&#41;</span>.Value<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">finally</span>
        Item := Unassigned;
      <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">except</span>
    Result := <span style="color: #FF0000;">''</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Ex&eacute;cute une requ&ecirc;te WMI et construit une TStringList (chaque ligne = propri&eacute;t&eacute;s concat&eacute;n&eacute;es).</span>
<span style="color: #0000ff;">function</span> TSystemInfo.WMIQueryList<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> WMIClass: <span style="color: #0080ff;">string</span>;
  <span style="color: #0000ff;">const</span> Props: <span style="color: #0000ff;">array</span> <span style="color: #0000ff;">of</span> <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>: TStringList;
<span style="color: #0000ff;">var</span>
  WbemLocator, WMIService, Items, Item: OLEVariant;
  Enum: IEnumVARIANT;
  Value: <span style="color: #0080ff;">Cardinal</span>;
  i: <span style="color: #0080ff;">Integer</span>;
  s: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">begin</span>
  Result := TStringList.Create;
  <span style="color: #0000ff;">try</span>
    WbemLocator := CreateOleObject<span class="br0">&#40;</span><span style="color: #FF0000;">'WbemScripting.SWbemLocator'</span><span class="br0">&#41;</span>;
    WMIService := WbemLocator.ConnectServer<span class="br0">&#40;</span><span style="color: #FF0000;">'.'</span>, <span style="color: #FF0000;">'root\cimv2'</span>, <span style="color: #FF0000;">''</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>;
    Items := WMIService.ExecQuery<span class="br0">&#40;</span>Format<span class="br0">&#40;</span><span style="color: #FF0000;">'SELECT * FROM %s'</span>, <span class="br0">&#91;</span>WMIClass<span class="br0">&#93;</span><span class="br0">&#41;</span>,
      <span style="color: #FF0000;">'WQL'</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
    Enum := <span style="color: #0080ff;">IUnknown</span><span class="br0">&#40;</span>Items._NewEnum<span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> IEnumVARIANT;
    <span style="color: #0000ff;">while</span> Enum.Next<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, Item, Value<span class="br0">&#41;</span> = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">do</span>
    <span style="color: #0000ff;">begin</span>
      s := <span style="color: #FF0000;">''</span>;
      <span style="color: #0000ff;">for</span> i := Low<span class="br0">&#40;</span>Props<span class="br0">&#41;</span> <span style="color: #0000ff;">to</span> High<span class="br0">&#40;</span>Props<span class="br0">&#41;</span> <span style="color: #0000ff;">do</span>
      <span style="color: #0000ff;">begin</span>
        <span style="color: #0000ff;">try</span>
          s := s + Props<span class="br0">&#91;</span>i<span class="br0">&#93;</span> + <span style="color: #FF0000;">': '</span> +
            VarToStr<span class="br0">&#40;</span>Item.Properties_.Item<span class="br0">&#40;</span>Props<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>.Value<span class="br0">&#41;</span>;
        <span style="color: #0000ff;">except</span>
          s := s + Props<span class="br0">&#91;</span>i<span class="br0">&#93;</span> + <span style="color: #FF0000;">': '</span>;
        <span style="color: #0000ff;">end</span>;
        <span style="color: #0000ff;">if</span> i &lt; High<span class="br0">&#40;</span>Props<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
          s := s + <span style="color: #FF0000;">' ; '</span>;
      <span style="color: #0000ff;">end</span>;
      Result.Add<span class="br0">&#40;</span>s<span class="br0">&#41;</span>;
      Item := Unassigned;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">except</span>
    <span style="color: #0000ff;">on</span> E: Exception <span style="color: #0000ff;">do</span>
    <span style="color: #0000ff;">begin</span>
      Result.Clear;
      Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Erreur: '</span> + E.Message<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Informations processeur (WMI)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetCPUInfo: TStringList;
<span style="color: #0000ff;">var</span>
  sl: TStringList;
<span style="color: #0000ff;">begin</span>
  sl := TStringList.Create;
  <span style="color: #0000ff;">try</span>
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Nom: '</span> + WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_Processor'</span>, <span style="color: #FF0000;">'Name'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Fabricant: '</span> + WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_Processor'</span>,
      <span style="color: #FF0000;">'Manufacturer'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Identifiant Processeur: '</span> + WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_Processor'</span>,
      <span style="color: #FF0000;">'ProcessorId'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Nombre Coeurs: '</span> + WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_Processor'</span>,
      <span style="color: #FF0000;">'NumberOfCores'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Nombre Threads Logiques: '</span> + WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_Processor'</span>,
      <span style="color: #FF0000;">'NumberOfLogicalProcessors'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Frequence Max MHz: '</span> + WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_Processor'</span>,
      <span style="color: #FF0000;">'MaxClockSpeed'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    Result := sl;
  <span style="color: #0000ff;">except</span>
    sl.Free;
    <span style="color: #0000ff;">raise</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Informations disques logiques (WMI) + conversion taille.</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetDiskInfo: TStringList;
<span style="color: #0000ff;">var</span>
  i: <span style="color: #0080ff;">Integer</span>;
  line: <span style="color: #0080ff;">string</span>;
  parts: TArray&lt;string&gt;;
  dev, fs, sizeStr, freeStr, vol: <span style="color: #0080ff;">string</span>;
  sizeNum, freeNum: <span style="color: #0080ff;">Int64</span>;
<span style="color: #0000ff;">begin</span>
  Result := WMIQueryList<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_LogicalDisk WHERE DriveType=3'</span>,
    <span class="br0">&#91;</span><span style="color: #FF0000;">'DeviceID'</span>, <span style="color: #FF0000;">'FileSystem'</span>, <span style="color: #FF0000;">'Size'</span>, <span style="color: #FF0000;">'FreeSpace'</span>, <span style="color: #FF0000;">'VolumeName'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">try</span>
    i := <span style="color: #cc66cc;">0</span>;
    <span style="color: #0000ff;">while</span> i &lt; Result.Count <span style="color: #0000ff;">do</span>
    <span style="color: #0000ff;">begin</span>
      line := Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span>;
      parts := line.Split<span class="br0">&#40;</span><span class="br0">&#91;</span><span style="color: #FF0000;">' ; '</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
&nbsp;
      dev := <span style="color: #FF0000;">''</span>;
      fs := <span style="color: #FF0000;">''</span>;
      sizeStr := <span style="color: #FF0000;">''</span>;
      freeStr := <span style="color: #FF0000;">''</span>;
      vol := <span style="color: #FF0000;">''</span>;
      <span style="color: #0000ff;">if</span> Length<span class="br0">&#40;</span>parts<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
        dev := parts<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>;
      <span style="color: #0000ff;">if</span> Length<span class="br0">&#40;</span>parts<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">1</span> <span style="color: #0000ff;">then</span>
        fs := parts<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>;
      <span style="color: #0000ff;">if</span> Length<span class="br0">&#40;</span>parts<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">2</span> <span style="color: #0000ff;">then</span>
        <span style="color: #0000ff;">if</span> parts<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span>.StartsWith<span class="br0">&#40;</span><span style="color: #FF0000;">'Size:'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
          sizeStr := Trim<span class="br0">&#40;</span>parts<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span>.Substring<span class="br0">&#40;</span>Length<span class="br0">&#40;</span><span style="color: #FF0000;">'Size:'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
      <span style="color: #0000ff;">if</span> Length<span class="br0">&#40;</span>parts<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">3</span> <span style="color: #0000ff;">then</span>
        <span style="color: #0000ff;">if</span> parts<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span>.StartsWith<span class="br0">&#40;</span><span style="color: #FF0000;">'FreeSpace:'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
          freeStr := Trim<span class="br0">&#40;</span>parts<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span>.Substring<span class="br0">&#40;</span>Length<span class="br0">&#40;</span><span style="color: #FF0000;">'FreeSpace:'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
      <span style="color: #0000ff;">if</span> Length<span class="br0">&#40;</span>parts<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">4</span> <span style="color: #0000ff;">then</span>
        vol := parts<span class="br0">&#91;</span><span style="color: #cc66cc;">4</span><span class="br0">&#93;</span>;
&nbsp;
      sizeNum := <span style="color: #cc66cc;">0</span>;
      freeNum := <span style="color: #cc66cc;">0</span>;
      <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>sizeStr &lt;&gt; <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span style="color: #0000ff;">and</span> TryStrToInt64<span class="br0">&#40;</span>sizeStr, sizeNum<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
        sizeStr := TSystemInfo.FormatSize<span class="br0">&#40;</span>UInt64<span class="br0">&#40;</span>sizeNum<span class="br0">&#41;</span><span class="br0">&#41;</span>;
      <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>freeStr &lt;&gt; <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span style="color: #0000ff;">and</span> TryStrToInt64<span class="br0">&#40;</span>freeStr, freeNum<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
        freeStr := TSystemInfo.FormatSize<span class="br0">&#40;</span>UInt64<span class="br0">&#40;</span>freeNum<span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
      Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span> :=
        Format<span class="br0">&#40;</span><span style="color: #FF0000;">'Lecteur: %s ; Syst&egrave;me Fichiers: %s ; Taille: %s ; Espace Libre: %s ; Etiquette: %s'</span>,
        <span class="br0">&#91;</span>dev, fs, sizeStr, freeStr, vol<span class="br0">&#93;</span><span class="br0">&#41;</span>;
      Inc<span class="br0">&#40;</span>i<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">except</span>
    <span style="color: #808080;">// Ne pas lever d'exception ici : retourner ce qui est disponible.</span>
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Informations GPU (WMI) ; conversion RAM adaptateur si possible.</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetGPUInfo: TStringList;
<span style="color: #0000ff;">var</span>
  i, j: <span style="color: #0080ff;">Integer</span>;
  line: <span style="color: #0080ff;">string</span>;
  parts: TArray&lt;string&gt;;
  ramStr: <span style="color: #0080ff;">string</span>;
  ramNum: <span style="color: #0080ff;">Int64</span>;
<span style="color: #0000ff;">begin</span>
  Result := WMIQueryList<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_VideoController'</span>, <span class="br0">&#91;</span><span style="color: #FF0000;">'Name'</span>, <span style="color: #FF0000;">'DriverVersion'</span>,
    <span style="color: #FF0000;">'AdapterRAM'</span>, <span style="color: #FF0000;">'VideoProcessor'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">try</span>
    i := <span style="color: #cc66cc;">0</span>;
    <span style="color: #0000ff;">while</span> i &lt; Result.Count <span style="color: #0000ff;">do</span>
    <span style="color: #0000ff;">begin</span>
      line := Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span>;
      parts := line.Split<span class="br0">&#40;</span><span class="br0">&#91;</span><span style="color: #FF0000;">' ; '</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
      <span style="color: #0000ff;">for</span> j := <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">to</span> High<span class="br0">&#40;</span>parts<span class="br0">&#41;</span> <span style="color: #0000ff;">do</span>
      <span style="color: #0000ff;">begin</span>
        <span style="color: #0000ff;">if</span> parts<span class="br0">&#91;</span>j<span class="br0">&#93;</span>.StartsWith<span class="br0">&#40;</span><span style="color: #FF0000;">'AdapterRAM:'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
        <span style="color: #0000ff;">begin</span>
          ramStr := Trim<span class="br0">&#40;</span>parts<span class="br0">&#91;</span>j<span class="br0">&#93;</span>.Substring<span class="br0">&#40;</span>Length<span class="br0">&#40;</span><span style="color: #FF0000;">'AdapterRAM:'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
          ramNum := <span style="color: #cc66cc;">0</span>;
          <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>ramStr &lt;&gt; <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> <span style="color: #0000ff;">and</span> TryStrToInt64<span class="br0">&#40;</span>ramStr, ramNum<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
            parts<span class="br0">&#91;</span>j<span class="br0">&#93;</span> := <span style="color: #FF0000;">'RAM Adaptateur: '</span> + TSystemInfo.FormatSize
              <span class="br0">&#40;</span>UInt64<span class="br0">&#40;</span>ramNum<span class="br0">&#41;</span><span class="br0">&#41;</span>;
        <span style="color: #0000ff;">end</span>;
        <span style="color: #808080;">// Remplacer libell&eacute;s anglais</span>
        parts<span class="br0">&#91;</span>j<span class="br0">&#93;</span> := parts<span class="br0">&#91;</span>j<span class="br0">&#93;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'Name:'</span>, <span style="color: #FF0000;">'Nom:'</span><span class="br0">&#41;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'DriverVersion:'</span>,
          <span style="color: #FF0000;">'Version Driver:'</span><span class="br0">&#41;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'VideoProcessor:'</span>, <span style="color: #FF0000;">'Processeur Video:'</span><span class="br0">&#41;</span>;
      <span style="color: #0000ff;">end</span>;
      Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span> := <span style="color: #0080ff;">String</span>.Join<span class="br0">&#40;</span><span style="color: #FF0000;">' ; '</span>, parts<span class="br0">&#41;</span>;
      Inc<span class="br0">&#40;</span>i<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">except</span>
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Informations m&eacute;moire via GlobalMemoryStatusEx</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetMemoryInfo: TStringList;
<span style="color: #0000ff;">var</span>
  TotalPhys, AvailPhys: UInt64;
  memStatus: TMemoryStatusEx;
  sl: TStringList;
<span style="color: #0000ff;">begin</span>
  sl := TStringList.Create;
  memStatus.dwLength := SizeOf<span class="br0">&#40;</span>memStatus<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> GlobalMemoryStatusEx<span class="br0">&#40;</span>memStatus<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    TotalPhys := memStatus.ullTotalPhys;
    AvailPhys := memStatus.ullAvailPhys;
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Memoire Physique Totale: '</span> + FormatSize<span class="br0">&#40;</span>TotalPhys<span class="br0">&#41;</span><span class="br0">&#41;</span>;
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Memoire Physique Disponible: '</span> + FormatSize<span class="br0">&#40;</span>AvailPhys<span class="br0">&#41;</span><span class="br0">&#41;</span>;
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Chargement Memoire Pourcent: '</span> +
      IntToStr<span class="br0">&#40;</span>memStatus.dwMemoryLoad<span class="br0">&#41;</span> + <span style="color: #FF0000;">'%'</span><span class="br0">&#41;</span>;
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Memoire Virtuelle Totale: '</span> +
      FormatSize<span class="br0">&#40;</span>memStatus.ullTotalVirtual<span class="br0">&#41;</span><span class="br0">&#41;</span>;
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Memoire Virtuelle Disponible: '</span> +
      FormatSize<span class="br0">&#40;</span>memStatus.ullAvailVirtual<span class="br0">&#41;</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>
  <span style="color: #0000ff;">else</span>
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Global Memory StatusEx a &eacute;chou&eacute;'</span><span class="br0">&#41;</span>;
  Result := sl;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Adaptateurs r&eacute;seau (WMI)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetNetworkAdapters: TStringList;
<span style="color: #0000ff;">var</span>
  i: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
  Result := WMIQueryList
    <span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_NetworkAdapterConfiguration WHERE IPEnabled=True'</span>,
    <span class="br0">&#91;</span><span style="color: #FF0000;">'Description'</span>, <span style="color: #FF0000;">'MACAddress'</span>, <span style="color: #FF0000;">'IPAddress'</span>, <span style="color: #FF0000;">'IPSubnet'</span>, <span style="color: #FF0000;">'DefaultIPGateway'</span>,
    <span style="color: #FF0000;">'DNSHostName'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
  i := <span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">while</span> i &lt; Result.Count <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span> := Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'Description:'</span>, <span style="color: #FF0000;">'Description:'</span><span class="br0">&#41;</span>
      .Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'MACAddress:'</span>, <span style="color: #FF0000;">'Adresse MAC:'</span><span class="br0">&#41;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'IPAddress:'</span>,
      <span style="color: #FF0000;">'Adresse IP:'</span><span class="br0">&#41;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'IPSubnet:'</span>, <span style="color: #FF0000;">'Masque:'</span><span class="br0">&#41;</span>
      .Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'DefaultIPGateway:'</span>, <span style="color: #FF0000;">'PasserelleParDefaut:'</span><span class="br0">&#41;</span>
      .Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'DNSHostName:'</span>, <span style="color: #FF0000;">'NomDNS:'</span><span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>i<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Informations OS (WMI)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetOSInfo: TStringList;
<span style="color: #0000ff;">var</span>
  sl: TStringList;
  csd, buildNumber, caption, version, arch: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">begin</span>
  sl := TStringList.Create;
  caption := WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_OperatingSystem'</span>, <span style="color: #FF0000;">'Caption'</span><span class="br0">&#41;</span>;
  version := WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_OperatingSystem'</span>, <span style="color: #FF0000;">'Version'</span><span class="br0">&#41;</span>;
  csd := WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_OperatingSystem'</span>, <span style="color: #FF0000;">'CSDVersion'</span><span class="br0">&#41;</span>;
  buildNumber := WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_OperatingSystem'</span>, <span style="color: #FF0000;">'BuildNumber'</span><span class="br0">&#41;</span>;
  arch := WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_OperatingSystem'</span>, <span style="color: #FF0000;">'OSArchitecture'</span><span class="br0">&#41;</span>;
  sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Nom OS: '</span> + caption<span class="br0">&#41;</span>;
  sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Version OS: '</span> + version<span class="br0">&#41;</span>;
  sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Num Build: '</span> + buildNumber<span class="br0">&#41;</span>;
  sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Architecture: '</span> + arch<span class="br0">&#41;</span>;
  sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'CSD Version: '</span> + csd<span class="br0">&#41;</span>;
  sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Numero Serie OS: '</span> + WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_OperatingSystem'</span>,
    <span style="color: #FF0000;">'SerialNumber'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
  sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Date Installation: '</span> + WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_OperatingSystem'</span>,
    <span style="color: #FF0000;">'InstallDate'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
  Result := sl;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// BIOS (WMI)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetBIOSInfo: TStringList;
<span style="color: #0000ff;">var</span>
  i: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
  Result := WMIQueryList<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_BIOS'</span>, <span class="br0">&#91;</span><span style="color: #FF0000;">'Manufacturer'</span>, <span style="color: #FF0000;">'Name'</span>, <span style="color: #FF0000;">'Version'</span>,
    <span style="color: #FF0000;">'SerialNumber'</span>, <span style="color: #FF0000;">'ReleaseDate'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
  i := <span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">while</span> i &lt; Result.Count <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span> := Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'Manufacturer:'</span>, <span style="color: #FF0000;">'Fabricant:'</span><span class="br0">&#41;</span>
      .Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'Name:'</span>, <span style="color: #FF0000;">'Nom:'</span><span class="br0">&#41;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'SerialNumber:'</span>, <span style="color: #FF0000;">'Numero Serie:'</span><span class="br0">&#41;</span>
      .Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'ReleaseDate:'</span>, <span style="color: #FF0000;">'DateSortie:'</span><span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>i<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Carte m&egrave;re (Win32_BaseBoard)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetBaseBoardInfo: TStringList;
<span style="color: #0000ff;">var</span>
  i: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
  Result := WMIQueryList<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_BaseBoard'</span>, <span class="br0">&#91;</span><span style="color: #FF0000;">'Manufacturer'</span>, <span style="color: #FF0000;">'Product'</span>,
    <span style="color: #FF0000;">'SerialNumber'</span>, <span style="color: #FF0000;">'Version'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
  i := <span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">while</span> i &lt; Result.Count <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span> := Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'Manufacturer:'</span>, <span style="color: #FF0000;">'Fabricant:'</span><span class="br0">&#41;</span>
      .Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'Product:'</span>, <span style="color: #FF0000;">'Produit:'</span><span class="br0">&#41;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'SerialNumber:'</span>,
      <span style="color: #FF0000;">'Numero Serie:'</span><span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>i<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Batterie (Win32_Battery)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetBatteryInfo: TStringList;
<span style="color: #0000ff;">var</span>
  i: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
  Result := WMIQueryList<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_Battery'</span>,
    <span class="br0">&#91;</span><span style="color: #FF0000;">'Name'</span>, <span style="color: #FF0000;">'Status'</span>, <span style="color: #FF0000;">'EstimatedChargeRemaining'</span>, <span style="color: #FF0000;">'BatteryStatus'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
  i := <span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">while</span> i &lt; Result.Count <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span> := Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'Name:'</span>, <span style="color: #FF0000;">'Nom:'</span><span class="br0">&#41;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'Status:'</span>, <span style="color: #FF0000;">'Etat:'</span><span class="br0">&#41;</span>
      .Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'EstimatedChargeRemaining:'</span>, <span style="color: #FF0000;">'Charge Restante Pourcent:'</span><span class="br0">&#41;</span>
      .Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'BatteryStatus:'</span>, <span style="color: #FF0000;">'Statut Batterie:'</span><span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>i<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Utilisateurs locaux (WMI)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetUsers: TStringList;
<span style="color: #0000ff;">var</span>
  i: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
  Result := WMIQueryList<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_UserAccount WHERE LocalAccount=True'</span>,
    <span class="br0">&#91;</span><span style="color: #FF0000;">'Name'</span>, <span style="color: #FF0000;">'FullName'</span>, <span style="color: #FF0000;">'SID'</span>, <span style="color: #FF0000;">'Status'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
  i := <span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">while</span> i &lt; Result.Count <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span> := Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'Name:'</span>, <span style="color: #FF0000;">'Nom:'</span><span class="br0">&#41;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'FullName:'</span>,
      <span style="color: #FF0000;">'Nom Complet:'</span><span class="br0">&#41;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'Status:'</span>, <span style="color: #FF0000;">'Etat:'</span><span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>i<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Correctifs (WMI)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetHotFixes: TStringList;
<span style="color: #0000ff;">var</span>
  i: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
  Result := WMIQueryList<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_QuickFixEngineering'</span>,
    <span class="br0">&#91;</span><span style="color: #FF0000;">'HotFixID'</span>, <span style="color: #FF0000;">'Description'</span>, <span style="color: #FF0000;">'InstalledOn'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
  i := <span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">while</span> i &lt; Result.Count <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span> := Result<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'HotFixID:'</span>, <span style="color: #FF0000;">'Correctif ID:'</span><span class="br0">&#41;</span>
      .Replace<span class="br0">&#40;</span><span style="color: #FF0000;">'InstalledOn:'</span>, <span style="color: #FF0000;">'Installe Le:'</span><span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>i<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Parse LastBootUpTime et calcule l'uptime en secondes</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetUptimeFromWMI: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">var</span>
  sBoot: <span style="color: #0080ff;">string</span>;
  bootDate: <span style="color: #0080ff;">TDateTime</span>;
  bootDateStr: <span style="color: #0080ff;">string</span>;
  osUpSeconds: <span style="color: #0080ff;">Int64</span>;
  nowDT: <span style="color: #0080ff;">TDateTime</span>;
<span style="color: #0000ff;">begin</span>
  Result := <span style="color: #FF0000;">''</span>;
  sBoot := WMIQuerySingleValue<span class="br0">&#40;</span><span style="color: #FF0000;">'Win32_OperatingSystem'</span>, <span style="color: #FF0000;">'LastBootUpTime'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> sBoot = <span style="color: #FF0000;">''</span> <span style="color: #0000ff;">then</span>
    Exit;
  <span style="color: #0000ff;">try</span>
    <span style="color: #0000ff;">if</span> Length<span class="br0">&#40;</span>sBoot<span class="br0">&#41;</span> &gt;= <span style="color: #cc66cc;">14</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      bootDateStr := Copy<span class="br0">&#40;</span>sBoot, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">14</span><span class="br0">&#41;</span>;
      bootDate := EncodeDate<span class="br0">&#40;</span>StrToInt<span class="br0">&#40;</span>Copy<span class="br0">&#40;</span>bootDateStr, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">4</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,
        StrToInt<span class="br0">&#40;</span>Copy<span class="br0">&#40;</span>bootDateStr, <span style="color: #cc66cc;">5</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, StrToInt<span class="br0">&#40;</span>Copy<span class="br0">&#40;</span>bootDateStr, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> +
        EncodeTime<span class="br0">&#40;</span>StrToInt<span class="br0">&#40;</span>Copy<span class="br0">&#40;</span>bootDateStr, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,
        StrToInt<span class="br0">&#40;</span>Copy<span class="br0">&#40;</span>bootDateStr, <span style="color: #cc66cc;">11</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,
        StrToInt<span class="br0">&#40;</span>Copy<span class="br0">&#40;</span>bootDateStr, <span style="color: #cc66cc;">13</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
      nowDT := Now;
      osUpSeconds := Trunc<span class="br0">&#40;</span><span class="br0">&#40;</span>nowDT - bootDate<span class="br0">&#41;</span> * <span style="color: #cc66cc;">24</span> * <span style="color: #cc66cc;">3600</span><span class="br0">&#41;</span>;
      Result := Format
        <span class="br0">&#40;</span><span style="color: #FF0000;">'Dernier Demarrage: %s ; Duree Fonctionnement Secondes: %d'</span>,
        <span class="br0">&#91;</span>DateTimeToStr<span class="br0">&#40;</span>bootDate<span class="br0">&#41;</span>, osUpSeconds<span class="br0">&#93;</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">except</span>
    Result := <span style="color: #FF0000;">''</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Nom h&ocirc;te et uptime (WMI puis fallback)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetHostAndUptime: TStringList;
<span style="color: #0000ff;">var</span>
  sl: TStringList;
  host: <span style="color: #0000ff;">array</span> <span class="br0">&#91;</span><span style="color: #cc66cc;">0</span> .. MAX_COMPUTERNAME_LENGTH + <span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> <span style="color: #0000ff;">of</span> <span style="color: #0080ff;">Char</span>;
  sizeName: <span style="color: #0080ff;">DWORD</span>;
  uptimeStr: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">begin</span>
  sl := TStringList.Create;
  sizeName := Length<span class="br0">&#40;</span>host<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> GetComputerName<span class="br0">&#40;</span>host, sizeName<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Nom Hote: '</span> + <span style="color: #0080ff;">string</span><span class="br0">&#40;</span>host<span class="br0">&#41;</span><span class="br0">&#41;</span>
  <span style="color: #0000ff;">else</span>
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Nom Hote: (echec)'</span><span class="br0">&#41;</span>;
&nbsp;
  uptimeStr := GetUptimeFromWMI;
  <span style="color: #0000ff;">if</span> uptimeStr &lt;&gt; <span style="color: #FF0000;">''</span> <span style="color: #0000ff;">then</span>
    sl.Add<span class="br0">&#40;</span>uptimeStr<span class="br0">&#41;</span>
  <span style="color: #0000ff;">else</span>
    sl.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Duree Fonctionnement Secondes: '</span> +
      UIntToStr<span class="br0">&#40;</span>GetTickCount64 <span style="color: #0000ff;">div</span> <span style="color: #cc66cc;">1000</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
  Result := sl;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Imprimantes (WMI)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetPrinters: TStringList;
<span style="color: #0000ff;">var</span>
  WbemLocator, WMIService, Items, Item: OLEVariant;
  Enum: IEnumVARIANT;
  Value: <span style="color: #0080ff;">Cardinal</span>;
  s: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">begin</span>
  Result := TStringList.Create;
  <span style="color: #0000ff;">try</span>
    <span style="color: #0000ff;">try</span>
      WbemLocator := CreateOleObject<span class="br0">&#40;</span><span style="color: #FF0000;">'WbemScripting.SWbemLocator'</span><span class="br0">&#41;</span>;
      WMIService := WbemLocator.ConnectServer<span class="br0">&#40;</span><span style="color: #FF0000;">'.'</span>, <span style="color: #FF0000;">'root\cimv2'</span>, <span style="color: #FF0000;">''</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>;
      Items := WMIService.ExecQuery
        <span class="br0">&#40;</span><span style="color: #FF0000;">'SELECT Name, SystemName, DriverName, PortName, Default FROM Win32_Printer'</span>,
        <span style="color: #FF0000;">'WQL'</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
      Enum := <span style="color: #0080ff;">IUnknown</span><span class="br0">&#40;</span>Items._NewEnum<span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> IEnumVARIANT;
      <span style="color: #0000ff;">while</span> Enum.Next<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, Item, Value<span class="br0">&#41;</span> = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">do</span>
      <span style="color: #0000ff;">begin</span>
        <span style="color: #0000ff;">try</span>
          s := Format
            <span class="br0">&#40;</span><span style="color: #FF0000;">'Nom: %s ; Systeme: %s ; Pilote: %s ; Port: %s ; Defaut: %s'</span>,
            <span class="br0">&#91;</span>VarToStr<span class="br0">&#40;</span>Item.Name<span class="br0">&#41;</span>, VarToStr<span class="br0">&#40;</span>Item.SystemName<span class="br0">&#41;</span>,
            VarToStr<span class="br0">&#40;</span>Item.DriverName<span class="br0">&#41;</span>, VarToStr<span class="br0">&#40;</span>Item.PortName<span class="br0">&#41;</span>,
            VarToStr<span class="br0">&#40;</span>Item.Default<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
        <span style="color: #0000ff;">except</span>
          s := <span style="color: #FF0000;">'Imprimante: (erreur lecture propri&eacute;t&eacute;s)'</span>;
        <span style="color: #0000ff;">end</span>;
        Result.Add<span class="br0">&#40;</span>s<span class="br0">&#41;</span>;
        Item := Unassigned;
      <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">except</span>
      <span style="color: #0000ff;">on</span> E: Exception <span style="color: #0000ff;">do</span>
        Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Erreur r&eacute;cup&eacute;ration imprimantes: '</span> + E.Message<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">except</span>
    Result.Free;
    <span style="color: #0000ff;">raise</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Services (WMI)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetServices: TStringList;
<span style="color: #0000ff;">var</span>
  WbemLocator, WMIService, Items, Item: OLEVariant;
  Enum: IEnumVARIANT;
  Value: <span style="color: #0080ff;">Cardinal</span>;
  Name, displayName, state, startMode: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">begin</span>
  Result := TStringList.Create;
  <span style="color: #0000ff;">try</span>
    <span style="color: #0000ff;">try</span>
      WbemLocator := CreateOleObject<span class="br0">&#40;</span><span style="color: #FF0000;">'WbemScripting.SWbemLocator'</span><span class="br0">&#41;</span>;
      WMIService := WbemLocator.ConnectServer<span class="br0">&#40;</span><span style="color: #FF0000;">'.'</span>, <span style="color: #FF0000;">'root\cimv2'</span>, <span style="color: #FF0000;">''</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>;
      Items := WMIService.ExecQuery
        <span class="br0">&#40;</span><span style="color: #FF0000;">'SELECT Name, DisplayName, State, StartMode FROM Win32_Service'</span>,
        <span style="color: #FF0000;">'WQL'</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
      Enum := <span style="color: #0080ff;">IUnknown</span><span class="br0">&#40;</span>Items._NewEnum<span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> IEnumVARIANT;
      <span style="color: #0000ff;">while</span> Enum.Next<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, Item, Value<span class="br0">&#41;</span> = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">do</span>
      <span style="color: #0000ff;">begin</span>
        <span style="color: #0000ff;">try</span>
          name := VarToStr<span class="br0">&#40;</span>Item.Name<span class="br0">&#41;</span>;
          displayName := VarToStr<span class="br0">&#40;</span>Item.displayName<span class="br0">&#41;</span>;
          state := VarToStr<span class="br0">&#40;</span>Item.state<span class="br0">&#41;</span>;
          startMode := VarToStr<span class="br0">&#40;</span>Item.startMode<span class="br0">&#41;</span>;
          Result.Add
            <span class="br0">&#40;</span>Format<span class="br0">&#40;</span><span style="color: #FF0000;">'Nom Service: %s ; Nom Affiche: %s ; Etat: %s ; Mode Demarrage: %s'</span>,
            <span class="br0">&#91;</span>name, displayName, state, startMode<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
        <span style="color: #0000ff;">except</span>
          Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Service: (erreur lecture propri&eacute;t&eacute;s)'</span><span class="br0">&#41;</span>;
        <span style="color: #0000ff;">end</span>;
        Item := Unassigned;
      <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">except</span>
      <span style="color: #0000ff;">on</span> E: Exception <span style="color: #0000ff;">do</span>
        Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Erreur r&eacute;cup&eacute;ration services: '</span> + E.Message<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">except</span>
    Result.Free;
    <span style="color: #0000ff;">raise</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Processus en cours (snapshot ToolHelp)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetProcesses: TStringList;
<span style="color: #0000ff;">var</span>
  hSnap: <span style="color: #0080ff;">THandle</span>;
  pe: TProcessEntry32;
<span style="color: #0000ff;">begin</span>
  Result := TStringList.Create;
  hSnap := CreateToolhelp32Snapshot<span class="br0">&#40;</span>TH32CS_SNAPPROCESS, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> hSnap = INVALID_HANDLE_VALUE <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Erreur creation snapshot processus'</span><span class="br0">&#41;</span>;
    Exit;
  <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">try</span>
    pe.dwSize := SizeOf<span class="br0">&#40;</span>pe<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> Process32First<span class="br0">&#40;</span>hSnap, pe<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      <span style="color: #0000ff;">repeat</span>
        Result.Add<span class="br0">&#40;</span>Format<span class="br0">&#40;</span><span style="color: #FF0000;">'PID: %d ; Nom: %s ; Threads: %d'</span>,
          <span class="br0">&#91;</span>pe.th32ProcessID, <span style="color: #0080ff;">string</span><span class="br0">&#40;</span>pe.szExeFile<span class="br0">&#41;</span>, pe.cntThreads<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
      <span style="color: #0000ff;">until</span> <span style="color: #0000ff;">not</span> Process32Next<span class="br0">&#40;</span>hSnap, pe<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>
    <span style="color: #0000ff;">else</span>
      Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Aucun processus trouv&eacute; ou droits insuffisants'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">finally</span>
    CloseHandle<span class="br0">&#40;</span>hSnap<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Fuseau horaire et locale (API Windows)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetTimeZoneAndLocale: TStringList;
<span style="color: #0000ff;">var</span>
  tzInfo: TTimeZoneInformation;
  langID: LCID;
  localeName: <span style="color: #0000ff;">array</span> <span class="br0">&#91;</span><span style="color: #cc66cc;">0</span> .. LOCALE_NAME_MAX_LENGTH<span class="br0">&#93;</span> <span style="color: #0000ff;">of</span> <span style="color: #0080ff;">Char</span>;
  res: <span style="color: #0080ff;">Cardinal</span>;
<span style="color: #0000ff;">begin</span>
  Result := TStringList.Create;
  <span style="color: #0000ff;">if</span> GetTimeZoneInformation<span class="br0">&#40;</span>tzInfo<span class="br0">&#41;</span> &lt;&gt; <span style="color: #0080ff;">DWORD</span><span class="br0">&#40;</span>TIME_ZONE_ID_INVALID<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Fuseau Horaire: '</span> + <span style="color: #0080ff;">String</span><span class="br0">&#40;</span>tzInfo.StandardName<span class="br0">&#41;</span><span class="br0">&#41;</span>
  <span style="color: #0000ff;">else</span>
    Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Fuseau Horaire: (echec)'</span><span class="br0">&#41;</span>;
&nbsp;
  langID := GetUserDefaultLCID;
  res := LCIDToLocaleName<span class="br0">&#40;</span>langID, localeName, LOCALE_NAME_MAX_LENGTH + <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> res &lt;&gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
    Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Locale: '</span> + <span style="color: #0080ff;">string</span><span class="br0">&#40;</span><span style="color: #0080ff;">PChar</span><span class="br0">&#40;</span>@localeName<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
  <span style="color: #0000ff;">else</span>
    Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Locale: (echec)'</span><span class="br0">&#41;</span>;
&nbsp;
  Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Langue Utilisateur ID: '</span> + IntToStr<span class="br0">&#40;</span>GetUserDefaultLangID<span class="br0">&#41;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// R&eacute;cup&egrave;re le GUID du plan d'alimentation actif (powrprof.dll)</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetActivePowerSchemeGUID: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">type</span>
  TPowerGetActiveScheme = <span style="color: #0000ff;">function</span><span class="br0">&#40;</span>UserRootPowerKey: <span style="color: #0080ff;">Pointer</span>;
    <span style="color: #0000ff;">var</span> SchemeGuid: TGUID<span class="br0">&#41;</span>: <span style="color: #0080ff;">DWORD</span>; <span style="color: #0000ff;">stdcall</span>;
<span style="color: #0000ff;">var</span>
  PowerGetActiveScheme: TPowerGetActiveScheme;
  hPowrProf: <span style="color: #0080ff;">THandle</span>;
  guid: TGUID;
<span style="color: #0000ff;">begin</span>
  Result := <span style="color: #FF0000;">''</span>;
  hPowrProf := GetModuleHandle<span class="br0">&#40;</span><span style="color: #FF0000;">'powrprof.dll'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> hPowrProf = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
    Exit;
  @PowerGetActiveScheme := GetProcAddress<span class="br0">&#40;</span>hPowrProf, <span style="color: #FF0000;">'PowerGetActiveScheme'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> Assigned<span class="br0">&#40;</span>PowerGetActiveScheme<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    Exit;
  <span style="color: #0000ff;">if</span> PowerGetActiveScheme<span class="br0">&#40;</span><span style="color: #0000ff;">nil</span>, guid<span class="br0">&#41;</span> = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    Result := GUIDToString<span class="br0">&#40;</span>guid<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>Length<span class="br0">&#40;</span>Result<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">and</span> <span class="br0">&#40;</span>Result<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">'{'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">and</span>
      <span class="br0">&#40;</span>Result<span class="br0">&#91;</span>Length<span class="br0">&#40;</span>Result<span class="br0">&#41;</span><span class="br0">&#93;</span> = <span style="color: #FF0000;">'}'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
      Result := Copy<span class="br0">&#40;</span>Result, <span style="color: #cc66cc;">2</span>, Length<span class="br0">&#40;</span>Result<span class="br0">&#41;</span> - <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Wrapper pour renvoyer le GUID du plan d'alimentation actif</span>
<span style="color: #0000ff;">function</span> TSystemInfo.GetPowerPlan: TStringList;
<span style="color: #0000ff;">var</span>
  guid: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">begin</span>
  Result := TStringList.Create;
  guid := GetActivePowerSchemeGUID;
  <span style="color: #0000ff;">if</span> guid &lt;&gt; <span style="color: #FF0000;">''</span> <span style="color: #0000ff;">then</span>
    Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'GUID Plan Alimentatio nActif: '</span> + guid<span class="br0">&#41;</span>
  <span style="color: #0000ff;">else</span>
    Result.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'GUID Plan Alimentation Actif: (non disponible)'</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">/// Convertit octets en cha&icirc;ne lisible</span>
<span style="color: #0000ff;">class</span> <span style="color: #0000ff;">function</span> TSystemInfo.FormatSize<span class="br0">&#40;</span>Bytes: UInt64<span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">const</span>
  KB = <span style="color: #cc66cc;">1024</span>;
  MB = KB * <span style="color: #cc66cc;">1024</span>;
  GB = MB * <span style="color: #cc66cc;">1024</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">if</span> Bytes &gt;= GB <span style="color: #0000ff;">then</span>
    Result := FormatFloat<span class="br0">&#40;</span><span style="color: #FF0000;">'0.## GB'</span>, Bytes / GB<span class="br0">&#41;</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> Bytes &gt;= MB <span style="color: #0000ff;">then</span>
    Result := FormatFloat<span class="br0">&#40;</span><span style="color: #FF0000;">'0.## MB'</span>, Bytes / MB<span class="br0">&#41;</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> Bytes &gt;= KB <span style="color: #0000ff;">then</span>
    Result := FormatFloat<span class="br0">&#40;</span><span style="color: #FF0000;">'0.## KB'</span>, Bytes / KB<span class="br0">&#41;</span>
  <span style="color: #0000ff;">else</span>
    Result := Format<span class="br0">&#40;</span><span style="color: #FF0000;">'%d octets'</span>, <span class="br0">&#91;</span>Bytes<span class="br0">&#93;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">end</span>.</pre></td></tr></table></code><hr />
</div><b>Exemple d’utilisation de TSystemInfo (console) :</b><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">uses</span>
  System.SysUtils,
  System.Classes,
  System.Math,
  SystemInfo <span style="color: #0000ff;">in</span> <span style="color: #FF0000;">'SystemInfo.pas'</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> GetInfoSystem<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> Titre: <span style="color: #0080ff;">string</span>; SL: TStringList<span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  i: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
  Writeln<span class="br0">&#40;</span><span style="color: #FF0000;">'--- '</span> + Titre + <span style="color: #FF0000;">' ---'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>SL = <span style="color: #0000ff;">nil</span><span class="br0">&#41;</span> <span style="color: #0000ff;">or</span> <span class="br0">&#40;</span>SL.Count = <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    Writeln<span class="br0">&#40;</span><span style="color: #FF0000;">'(aucune donn&eacute;e)'</span><span class="br0">&#41;</span>;
    Exit;
  <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">for</span> i := <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">to</span> SL.Count - <span style="color: #cc66cc;">1</span> <span style="color: #0000ff;">do</span>
    Writeln<span class="br0">&#40;</span>SL<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>;
  Writeln;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">var</span>
  SI: TSystemInfo;
  SL: TStringList;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">try</span>
    SI := TSystemInfo.Create;
    <span style="color: #0000ff;">try</span>
      <span style="color: #808080;">// Informations OS</span>
      SL := SI.GetOSInfo;
      <span style="color: #0000ff;">try</span>
        GetInfoSystem<span class="br0">&#40;</span><span style="color: #FF0000;">'Informations OS'</span>, SL<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">finally</span>
        SL.Free;
      <span style="color: #0000ff;">end</span>;
&nbsp;
      <span style="color: #808080;">// Processeur</span>
      SL := SI.GetCPUInfo;
      <span style="color: #0000ff;">try</span>
        GetInfoSystem<span class="br0">&#40;</span><span style="color: #FF0000;">'Processeur'</span>, SL<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">finally</span>
        SL.Free;
      <span style="color: #0000ff;">end</span>;
&nbsp;
      <span style="color: #808080;">// M&eacute;moire</span>
      SL := SI.GetMemoryInfo;
      <span style="color: #0000ff;">try</span>
        GetInfoSystem<span class="br0">&#40;</span><span style="color: #FF0000;">'M&eacute;moire'</span>, SL<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">finally</span>
        SL.Free;
      <span style="color: #0000ff;">end</span>;
&nbsp;
      <span style="color: #808080;">// Disques</span>
      SL := SI.GetDiskInfo;
      <span style="color: #0000ff;">try</span>
        GetInfoSystem<span class="br0">&#40;</span><span style="color: #FF0000;">'Disques'</span>, SL<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">finally</span>
        SL.Free;
      <span style="color: #0000ff;">end</span>;
&nbsp;
      <span style="color: #808080;">// R&eacute;seau</span>
      SL := SI.GetNetworkAdapters;
      <span style="color: #0000ff;">try</span>
        GetInfoSystem<span class="br0">&#40;</span><span style="color: #FF0000;">'Adaptateurs r&eacute;seau'</span>, SL<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">finally</span>
        SL.Free;
      <span style="color: #0000ff;">end</span>;
&nbsp;
      <span style="color: #808080;">// GPU</span>
      SL := SI.GetGPUInfo;
      <span style="color: #0000ff;">try</span>
        GetInfoSystem<span class="br0">&#40;</span><span style="color: #FF0000;">'Carte graphique'</span>, SL<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">finally</span>
        SL.Free;
      <span style="color: #0000ff;">end</span>;
&nbsp;
      <span style="color: #808080;">// Services (extrait pour lisibilit&eacute;)</span>
      SL := SI.GetServices;
      <span style="color: #0000ff;">try</span>
        Writeln<span class="br0">&#40;</span><span style="color: #FF0000;">'--- Services ---'</span><span class="br0">&#41;</span>;
        <span style="color: #0000ff;">if</span> SL.Count = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
          Writeln<span class="br0">&#40;</span><span style="color: #FF0000;">'(aucun service)'</span><span class="br0">&#41;</span>
        <span style="color: #0000ff;">else</span>
          <span style="color: #0000ff;">for</span> <span style="color: #0000ff;">var</span> i := <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">to</span> Min<span class="br0">&#40;</span><span style="color: #cc66cc;">29</span>, SL.Count - <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span style="color: #0000ff;">do</span>
            Writeln<span class="br0">&#40;</span>SL<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>;
        Writeln;
      <span style="color: #0000ff;">finally</span>
        SL.Free;
      <span style="color: #0000ff;">end</span>;
&nbsp;
      <span style="color: #808080;">// Processus</span>
      SL := SI.GetProcesses;
      <span style="color: #0000ff;">try</span>
        GetInfoSystem<span class="br0">&#40;</span><span style="color: #FF0000;">'Processus en cours'</span>, SL<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">finally</span>
        SL.Free;
      <span style="color: #0000ff;">end</span>;
&nbsp;
      <span style="color: #808080;">// H&ocirc;te et uptime</span>
      SL := SI.GetHostAndUptime;
      <span style="color: #0000ff;">try</span>
        GetInfoSystem<span class="br0">&#40;</span><span style="color: #FF0000;">'H&ocirc;te et dur&eacute;e de fonctionnement'</span>, SL<span class="br0">&#41;</span>;
      <span style="color: #0000ff;">finally</span>
        SL.Free;
      <span style="color: #0000ff;">end</span>;
&nbsp;
    <span style="color: #0000ff;">finally</span>
      SI.Free;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">except</span>
    <span style="color: #0000ff;">on</span> E: Exception <span style="color: #0000ff;">do</span>
      Writeln<span class="br0">&#40;</span><span style="color: #FF0000;">'Exception: '</span>, E.ClassName, <span style="color: #FF0000;">' - '</span>, E.Message<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  Writeln<span class="br0">&#40;</span><span style="color: #FF0000;">'Appuyez sur Entr&eacute;e pour quitter...'</span><span class="br0">&#41;</span>;
  Readln;
<span style="color: #0000ff;">end</span>.</pre></td></tr></table></code><hr />
</div>Compatible avec Delphi 2009 et versions ultérieures (Delphi XE2 … Delphi 10.x / 11.x / ...)</div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p671444d1761929869/environnements-developpement/delphi/codes-sources-telecharger/tsysteminfo-classe-collecte-d-informations-systeme-windows/capture-d-ecran-2025-10-31-175407.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>XeGregory</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180223/environnements-developpement/delphi/codes-sources-telecharger/tsysteminfo-classe-collecte-d-informations-systeme-windows/</guid>
		</item>
		<item>
			<title>Exécuter des scripts batch ou des commandes système depuis une application</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180160&amp;goto=newpost</link>
			<pubDate>Wed, 29 Oct 2025 05:38:25 GMT</pubDate>
			<description>Je vous propose un nouvel...</description>
			<content:encoded><![CDATA[<div>Je vous propose un nouvel élément à utiliser : <a href="http://delphi.developpez.com/telecharger/detail/id/7532/Executer-des-scripts-batch-ou-des-commandes-systeme-depuis-une-application-Delphi" target="_blank">Exécuter des scripts batch ou des commandes système depuis une application</a><br />
<br />
Cette unité fournit la classe utilitaire TCmdPipeExecutor qui permet de lancer cmd.exe en arrière-plan depuis une application VCL, d’envoyer des commandes via stdin, de capturer stdout/stderr à travers des pipes anonymes, et de récupérer le code de sortie du processus.<br />
<br />
<b>TCmdPipeExecutor</b><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">unit</span> UnitCmdPipeExecutor;
&nbsp;
<span style="color: #0000ff;">interface</span>
&nbsp;
<span style="color: #0000ff;">uses</span>
  System.SysUtils, System.Classes, Winapi.Windows, Vcl.StdCtrls;
&nbsp;
<span style="color: #0000ff;">type</span>
  <span style="color: #808080;">// Classe utilitaire pour ex&eacute;cuter des commandes via cmd.exe et capturer la sortie</span>
  TCmdPipeExecutor = <span style="color: #0000ff;">class</span>
  <span style="color: #0000ff;">private</span>
    <span style="color: #808080;">// Cr&eacute;e les handles de pipe n&eacute;cessaires pour rediriger stdin/stdout du processus enfant</span>
    <span style="color: #0000ff;">function</span> CreatePipeHandles<span class="br0">&#40;</span>out ReadStdOut, WriteStdOut, ReadStdIn,
      WriteStdIn: <span style="color: #0080ff;">THandle</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">Boolean</span>;
&nbsp;
  <span style="color: #0000ff;">public</span>
    <span style="color: #0000ff;">constructor</span> Create;
    <span style="color: #0000ff;">destructor</span> Destroy; <span style="color: #0000ff;">override</span>;
&nbsp;
    <span style="color: #808080;">// Ex&eacute;cute les commandes pass&eacute;es dans Commands, capture la sortie dans Output et le code de sortie dans ExitCode.</span>
    <span style="color: #808080;">// HiddenWindow: si True, demande &agrave; cacher la fen&ecirc;tre du processus (STARTF_USESHOWWINDOW + SW_HIDE)</span>
    <span style="color: #808080;">// UseUtf8: si True, &eacute;crit les commandes en UTF-8 et d&eacute;code la sortie en UTF-8; sinon utilise le jeu de caract&egrave;res OEM</span>
    <span style="color: #808080;">// TimeoutMs: d&eacute;lai en ms pour d&eacute;tecter une absence d'activit&eacute; de sortie; INFINITE signifie aucun timeout</span>
    <span style="color: #0000ff;">function</span> ExecuteCmdAndCapture<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> Commands: TStrings; out Output: <span style="color: #0080ff;">string</span>;
      out ExitCode: <span style="color: #0080ff;">DWORD</span>; HiddenWindow: <span style="color: #0080ff;">Boolean</span> = <span style="color: #0000ff;">True</span>;
      UseUtf8: <span style="color: #0080ff;">Boolean</span> = <span style="color: #0000ff;">False</span>; TimeoutMs: <span style="color: #0080ff;">Cardinal</span> = INFINITE<span class="br0">&#41;</span>: <span style="color: #0080ff;">Boolean</span>;
&nbsp;
    <span style="color: #808080;">// M&eacute;thode pratique : lit les commandes depuis SourceMemo, ex&eacute;cute, et &eacute;crit le r&eacute;sultat dans DestMemo</span>
    <span style="color: #0000ff;">procedure</span> ExecuteFromMemo<span class="br0">&#40;</span>SourceMemo, DestMemo: TMemo;
      HiddenWindow: <span style="color: #0080ff;">Boolean</span> = <span style="color: #0000ff;">True</span>; UseUtf8: <span style="color: #0080ff;">Boolean</span> = <span style="color: #0000ff;">False</span>;
      TimeoutMs: <span style="color: #0080ff;">Cardinal</span> = INFINITE<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">implementation</span>
&nbsp;
<span style="color: #808080;">// Convertit un buffer d'octets interpr&eacute;t&eacute;s en OEM vers une cha&icirc;ne WideString Delphi</span>
<span style="color: #0000ff;">function</span> OEMBytesToString<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> Buffer: <span style="color: #0080ff;">Pointer</span>; Count: <span style="color: #0080ff;">Integer</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">var</span>
  WideLen: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
  Result := <span style="color: #FF0000;">''</span>;
  <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>Buffer = <span style="color: #0000ff;">nil</span><span class="br0">&#41;</span> <span style="color: #0000ff;">or</span> <span class="br0">&#40;</span>Count &lt;= <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    Exit;
&nbsp;
  <span style="color: #808080;">// Calcule la longueur n&eacute;cessaire en WideChar</span>
  WideLen := MultiByteToWideChar<span class="br0">&#40;</span>CP_OEMCP, <span style="color: #cc66cc;">0</span>, <span style="color: #0080ff;">PAnsiChar</span><span class="br0">&#40;</span>Buffer<span class="br0">&#41;</span>, Count, <span style="color: #0000ff;">nil</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> WideLen &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    SetLength<span class="br0">&#40;</span>Result, WideLen<span class="br0">&#41;</span>;
    <span style="color: #808080;">// Convertit du OEM vers WideChar (Unicode interne Delphi)</span>
    MultiByteToWideChar<span class="br0">&#40;</span>CP_OEMCP, <span style="color: #cc66cc;">0</span>, <span style="color: #0080ff;">PAnsiChar</span><span class="br0">&#40;</span>Buffer<span class="br0">&#41;</span>, Count,
      <span style="color: #0080ff;">PWideChar</span><span class="br0">&#40;</span>Result<span class="br0">&#41;</span>, WideLen<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">// Convertit une cha&icirc;ne WideString en tableau d'octets selon le code page OEM</span>
<span style="color: #808080;">// Retourne le nombre d'octets et remplit Bytes</span>
<span style="color: #0000ff;">function</span> WideStringToOEMBytes<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> S: <span style="color: #0080ff;">string</span>; out Bytes: TBytes<span class="br0">&#41;</span>: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
  Result := <span style="color: #cc66cc;">0</span>;
  Bytes := <span style="color: #0000ff;">nil</span>;
  <span style="color: #0000ff;">if</span> S = <span style="color: #FF0000;">''</span> <span style="color: #0000ff;">then</span>
    Exit;
&nbsp;
  <span style="color: #808080;">// Obtient la longueur n&eacute;cessaire en octets</span>
  Result := WideCharToMultiByte<span class="br0">&#40;</span>CP_OEMCP, <span style="color: #cc66cc;">0</span>, <span style="color: #0080ff;">PWideChar</span><span class="br0">&#40;</span>S<span class="br0">&#41;</span>, Length<span class="br0">&#40;</span>S<span class="br0">&#41;</span>, <span style="color: #0000ff;">nil</span>, <span style="color: #cc66cc;">0</span>,
    <span style="color: #0000ff;">nil</span>, <span style="color: #0000ff;">nil</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> Result &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    SetLength<span class="br0">&#40;</span>Bytes, Result<span class="br0">&#41;</span>;
    <span style="color: #808080;">// Remplit le tableau d'octets avec la conversion OEM</span>
    WideCharToMultiByte<span class="br0">&#40;</span>CP_OEMCP, <span style="color: #cc66cc;">0</span>, <span style="color: #0080ff;">PWideChar</span><span class="br0">&#40;</span>S<span class="br0">&#41;</span>, Length<span class="br0">&#40;</span>S<span class="br0">&#41;</span>, <span style="color: #0080ff;">PAnsiChar</span><span class="br0">&#40;</span>Bytes<span class="br0">&#41;</span>,
      Result, <span style="color: #0000ff;">nil</span>, <span style="color: #0000ff;">nil</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">{ TCmdPipeExecutor }</span>
&nbsp;
<span style="color: #0000ff;">constructor</span> TCmdPipeExecutor.Create;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">inherited</span> Create;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">destructor</span> TCmdPipeExecutor.Destroy;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">inherited</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">// Cr&eacute;e deux pipes anonymes : un pour capturer stdout/err du processus enfant (ReadStdOut/WriteStdOut)</span>
<span style="color: #808080;">// et un pour fournir stdin au processus enfant (ReadStdIn/WriteStdIn).</span>
<span style="color: #808080;">// Les handles destin&eacute;s au processus enfant restent h&eacute;ritables; les handles parentaux sont marqu&eacute;s non-h&eacute;ritables.</span>
<span style="color: #0000ff;">function</span> TCmdPipeExecutor.CreatePipeHandles<span class="br0">&#40;</span>out ReadStdOut, WriteStdOut,
  ReadStdIn, WriteStdIn: <span style="color: #0080ff;">THandle</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">Boolean</span>;
<span style="color: #0000ff;">var</span>
  SecAttr: SECURITY_ATTRIBUTES;
<span style="color: #0000ff;">begin</span>
  Result := <span style="color: #0000ff;">False</span>;
  ReadStdOut := <span style="color: #cc66cc;">0</span>;
  WriteStdOut := <span style="color: #cc66cc;">0</span>;
  ReadStdIn := <span style="color: #cc66cc;">0</span>;
  WriteStdIn := <span style="color: #cc66cc;">0</span>;
&nbsp;
  ZeroMemory<span class="br0">&#40;</span>@SecAttr, SizeOf<span class="br0">&#40;</span>SecAttr<span class="br0">&#41;</span><span class="br0">&#41;</span>;
  SecAttr.nLength := SizeOf<span class="br0">&#40;</span>SecAttr<span class="br0">&#41;</span>;
  SecAttr.bInheritHandle := <span style="color: #0000ff;">True</span>;
  <span style="color: #808080;">// Permet l'h&eacute;ritage des handles au processus enfant</span>
  SecAttr.lpSecurityDescriptor := <span style="color: #0000ff;">nil</span>;
&nbsp;
  <span style="color: #808080;">// Pipe pour stdout/err du processus enfant</span>
  <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> CreatePipe<span class="br0">&#40;</span>ReadStdOut, WriteStdOut, @SecAttr, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    Exit;
&nbsp;
  <span style="color: #808080;">// Pipe pour stdin du processus enfant</span>
  <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> CreatePipe<span class="br0">&#40;</span>ReadStdIn, WriteStdIn, @SecAttr, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    <span style="color: #808080;">// en cas d'&eacute;chec, fermer le premier pipe et sortir</span>
    CloseHandle<span class="br0">&#40;</span>ReadStdOut<span class="br0">&#41;</span>;
    CloseHandle<span class="br0">&#40;</span>WriteStdOut<span class="br0">&#41;</span>;
    Exit;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  <span style="color: #808080;">// Emp&ecirc;cher le parent d'h&eacute;riter des handles c&ocirc;t&eacute; lecture/&eacute;criture qui sont uniquement destin&eacute;s &agrave; l'enfant</span>
  SetHandleInformation<span class="br0">&#40;</span>ReadStdOut, HANDLE_FLAG_INHERIT, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
  SetHandleInformation<span class="br0">&#40;</span>WriteStdIn, HANDLE_FLAG_INHERIT, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
&nbsp;
  Result := <span style="color: #0000ff;">True</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">// Ex&eacute;cute les commandes et capture la sortie</span>
<span style="color: #0000ff;">function</span> TCmdPipeExecutor.ExecuteCmdAndCapture<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> Commands: TStrings;
  out Output: <span style="color: #0080ff;">string</span>; out ExitCode: <span style="color: #0080ff;">DWORD</span>; HiddenWindow: <span style="color: #0080ff;">Boolean</span>;
  UseUtf8: <span style="color: #0080ff;">Boolean</span>; TimeoutMs: <span style="color: #0080ff;">Cardinal</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">Boolean</span>;
<span style="color: #0000ff;">var</span>
  ReadStdOut, WriteStdOut, ReadStdIn, WriteStdIn: <span style="color: #0080ff;">THandle</span>;
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: <span style="color: #0000ff;">array</span> <span class="br0">&#91;</span><span style="color: #cc66cc;">0</span> .. <span style="color: #cc66cc;">255</span><span class="br0">&#93;</span> <span style="color: #0000ff;">of</span> <span style="color: #0080ff;">Char</span>;
  Buffer: <span style="color: #0000ff;">array</span> <span class="br0">&#91;</span><span style="color: #cc66cc;">0</span> .. <span style="color: #cc66cc;">4095</span><span class="br0">&#93;</span> <span style="color: #0000ff;">of</span> <span style="color: #0080ff;">Byte</span>;
  BytesRead, BytesWritten: <span style="color: #0080ff;">DWORD</span>;
  CmdText: <span style="color: #0080ff;">string</span>;
  OutStream: TMemoryStream;
  WaitRes, LastTick: <span style="color: #0080ff;">DWORD</span>;
  Utf8Bytes: TBytes;
  OemBytes: TBytes;
  OemLen: <span style="color: #0080ff;">Integer</span>;
  TmpBytes: TBytes;
<span style="color: #0000ff;">begin</span>
  Result := <span style="color: #0000ff;">False</span>;
  Output := <span style="color: #FF0000;">''</span>;
  ExitCode := <span style="color: #0080ff;">DWORD</span><span class="br0">&#40;</span><span style="color: #cc66cc;">$FFFFFFFF</span><span class="br0">&#41;</span>;
  ReadStdOut := <span style="color: #cc66cc;">0</span>;
  WriteStdOut := <span style="color: #cc66cc;">0</span>;
  ReadStdIn := <span style="color: #cc66cc;">0</span>;
  WriteStdIn := <span style="color: #cc66cc;">0</span>;
&nbsp;
  <span style="color: #808080;">// Cr&eacute;e les handles de pipe n&eacute;cessaires</span>
  <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> CreatePipeHandles<span class="br0">&#40;</span>ReadStdOut, WriteStdOut, ReadStdIn, WriteStdIn<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    Exit;
&nbsp;
  <span style="color: #0000ff;">try</span>
    <span style="color: #808080;">// Initialise STARTUPINFO en pr&eacute;cisant les handles pour stdin/stdout/stderr</span>
    ZeroMemory<span class="br0">&#40;</span>@StartInfo, SizeOf<span class="br0">&#40;</span>StartInfo<span class="br0">&#41;</span><span class="br0">&#41;</span>;
    StartInfo.cb := SizeOf<span class="br0">&#40;</span>StartInfo<span class="br0">&#41;</span>;
    StartInfo.hStdInput := ReadStdIn;
    StartInfo.hStdOutput := WriteStdOut;
    StartInfo.hStdError := WriteStdOut;
    StartInfo.dwFlags := STARTF_USESTDHANDLES;
    <span style="color: #0000ff;">if</span> HiddenWindow <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      <span style="color: #808080;">// Si demand&eacute;, indique au syst&egrave;me de cacher la fen&ecirc;tre du processus</span>
      StartInfo.dwFlags := StartInfo.dwFlags <span style="color: #0000ff;">or</span> STARTF_USESHOWWINDOW;
      StartInfo.wShowWindow := SW_HIDE;
    <span style="color: #0000ff;">end</span>;
&nbsp;
    ZeroMemory<span class="br0">&#40;</span>@ProcInfo, SizeOf<span class="br0">&#40;</span>ProcInfo<span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Pr&eacute;pare la ligne de commande pour lancer cmd.exe en mode silencieux (/Q)</span>
    StrPCopy<span class="br0">&#40;</span>CmdLine, <span style="color: #FF0000;">'cmd.exe /Q'</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Cr&eacute;e le processus enfant en h&eacute;ritant des handles n&eacute;cessaires</span>
    <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> CreateProcess<span class="br0">&#40;</span><span style="color: #0000ff;">nil</span>, CmdLine, <span style="color: #0000ff;">nil</span>, <span style="color: #0000ff;">nil</span>, <span style="color: #0000ff;">True</span>, CREATE_NO_WINDOW, <span style="color: #0000ff;">nil</span>,
      <span style="color: #0000ff;">nil</span>, StartInfo, ProcInfo<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
      Exit;
&nbsp;
    <span style="color: #808080;">// Le parent ferme ses copies des handles que seul l'enfant doit utiliser</span>
    <span style="color: #0000ff;">if</span> ReadStdIn &lt;&gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      CloseHandle<span class="br0">&#40;</span>ReadStdIn<span class="br0">&#41;</span>;
      ReadStdIn := <span style="color: #cc66cc;">0</span>;
    <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">if</span> WriteStdOut &lt;&gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      CloseHandle<span class="br0">&#40;</span>WriteStdOut<span class="br0">&#41;</span>;
      WriteStdOut := <span style="color: #cc66cc;">0</span>;
    <span style="color: #0000ff;">end</span>;
&nbsp;
    <span style="color: #0000ff;">try</span>
      <span style="color: #808080;">// Pr&eacute;pare le texte des commandes : si vide, &eacute;crit un message; s'assure qu'il y a un 'exit'</span>
      CmdText := Commands.Text;
      <span style="color: #0000ff;">if</span> CmdText = <span style="color: #FF0000;">''</span> <span style="color: #0000ff;">then</span>
        CmdText := <span style="color: #FF0000;">'echo Aucun commande'</span> + sLineBreak;
      <span style="color: #0000ff;">if</span> Pos<span class="br0">&#40;</span><span style="color: #FF0000;">'exit'</span> + sLineBreak, LowerCase<span class="br0">&#40;</span>CmdText<span class="br0">&#41;</span><span class="br0">&#41;</span> = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
        CmdText := CmdText + <span style="color: #FF0000;">'exit'</span> + sLineBreak;
&nbsp;
      <span style="color: #808080;">// &Eacute;crit les commandes dans stdin de l'enfant en UTF-8 ou en OEM selon UseUtf8</span>
      BytesWritten := <span style="color: #cc66cc;">0</span>;
      <span style="color: #0000ff;">if</span> UseUtf8 <span style="color: #0000ff;">then</span>
      <span style="color: #0000ff;">begin</span>
        Utf8Bytes := TEncoding.UTF8.GetBytes<span class="br0">&#40;</span>CmdText<span class="br0">&#41;</span>;
        <span style="color: #0000ff;">if</span> Length<span class="br0">&#40;</span>Utf8Bytes<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
          WriteFile<span class="br0">&#40;</span>WriteStdIn, Utf8Bytes<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, Length<span class="br0">&#40;</span>Utf8Bytes<span class="br0">&#41;</span>,
            BytesWritten, <span style="color: #0000ff;">nil</span><span class="br0">&#41;</span>;
      <span style="color: #0000ff;">end</span>
      <span style="color: #0000ff;">else</span>
      <span style="color: #0000ff;">begin</span>
        OemLen := WideStringToOEMBytes<span class="br0">&#40;</span>CmdText, OemBytes<span class="br0">&#41;</span>;
        <span style="color: #0000ff;">if</span> OemLen &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
          WriteFile<span class="br0">&#40;</span>WriteStdIn, OemBytes<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, OemLen, BytesWritten, <span style="color: #0000ff;">nil</span><span class="br0">&#41;</span>;
      <span style="color: #0000ff;">end</span>;
&nbsp;
      <span style="color: #808080;">// Ferme le c&ocirc;t&eacute; &eacute;criture du pipe stdin pour signaler EOF au processus enfant</span>
      <span style="color: #0000ff;">if</span> WriteStdIn &lt;&gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
      <span style="color: #0000ff;">begin</span>
        CloseHandle<span class="br0">&#40;</span>WriteStdIn<span class="br0">&#41;</span>;
        WriteStdIn := <span style="color: #cc66cc;">0</span>;
      <span style="color: #0000ff;">end</span>;
&nbsp;
      <span style="color: #808080;">// Lit la sortie produite par le processus enfant dans un TMemoryStream</span>
      OutStream := TMemoryStream.Create;
      <span style="color: #0000ff;">try</span>
        LastTick := GetTickCount;
        <span style="color: #0000ff;">repeat</span>
          BytesRead := <span style="color: #cc66cc;">0</span>;
          <span style="color: #808080;">// Tente de lire des donn&eacute;es disponibles</span>
          <span style="color: #0000ff;">if</span> ReadFile<span class="br0">&#40;</span>ReadStdOut, Buffer, SizeOf<span class="br0">&#40;</span>Buffer<span class="br0">&#41;</span>, BytesRead, <span style="color: #0000ff;">nil</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
          <span style="color: #0000ff;">begin</span>
            <span style="color: #0000ff;">if</span> BytesRead &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
            <span style="color: #0000ff;">begin</span>
              <span style="color: #808080;">// Stocke les donn&eacute;es lues et r&eacute;initialise le timer d'activit&eacute;</span>
              OutStream.Write<span class="br0">&#40;</span>Buffer, BytesRead<span class="br0">&#41;</span>;
              LastTick := GetTickCount;
            <span style="color: #0000ff;">end</span>;
          <span style="color: #0000ff;">end</span>
          <span style="color: #0000ff;">else</span>
            BytesRead := <span style="color: #cc66cc;">0</span>;
&nbsp;
          <span style="color: #808080;">// Attend un court laps de temps pour savoir si le processus est termin&eacute;</span>
          WaitRes := WaitForSingleObject<span class="br0">&#40;</span>ProcInfo.hProcess, <span style="color: #cc66cc;">50</span><span class="br0">&#41;</span>;
&nbsp;
          <span style="color: #808080;">// Si timeout configur&eacute; et pas d'activit&eacute; depuis TimeoutMs, termine le processus</span>
          <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>TimeoutMs &lt;&gt; INFINITE<span class="br0">&#41;</span> <span style="color: #0000ff;">and</span> <span class="br0">&#40;</span>GetTickCount - LastTick &gt; TimeoutMs<span class="br0">&#41;</span>
          <span style="color: #0000ff;">then</span>
          <span style="color: #0000ff;">begin</span>
            TerminateProcess<span class="br0">&#40;</span>ProcInfo.hProcess, <span style="color: #0080ff;">DWORD</span><span class="br0">&#40;</span><span style="color: #cc66cc;">$FFFFFFFD</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
            <span style="color: #0000ff;">raise</span> Exception.Create<span class="br0">&#40;</span><span style="color: #FF0000;">'Timeout: no activity from process'</span><span class="br0">&#41;</span>;
          <span style="color: #0000ff;">end</span>;
        <span style="color: #0000ff;">until</span> <span class="br0">&#40;</span>BytesRead = <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">and</span> <span class="br0">&#40;</span>WaitRes &lt;&gt; WAIT_TIMEOUT<span class="br0">&#41;</span>;
&nbsp;
        <span style="color: #808080;">// Assure que le processus est termin&eacute; et r&eacute;cup&egrave;re son code de sortie</span>
        WaitForSingleObject<span class="br0">&#40;</span>ProcInfo.hProcess, INFINITE<span class="br0">&#41;</span>;
        GetExitCodeProcess<span class="br0">&#40;</span>ProcInfo.hProcess, ExitCode<span class="br0">&#41;</span>;
&nbsp;
        <span style="color: #808080;">// Conversion du contenu du stream en cha&icirc;ne selon l'encodage demand&eacute;</span>
        <span style="color: #0000ff;">if</span> OutStream.Size &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
        <span style="color: #0000ff;">begin</span>
          SetLength<span class="br0">&#40;</span>TmpBytes, OutStream.Size<span class="br0">&#41;</span>;
          Move<span class="br0">&#40;</span>OutStream.Memory^, TmpBytes<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, OutStream.Size<span class="br0">&#41;</span>;
&nbsp;
          <span style="color: #0000ff;">if</span> UseUtf8 <span style="color: #0000ff;">then</span>
          <span style="color: #0000ff;">begin</span>
            Output := TEncoding.UTF8.GetString<span class="br0">&#40;</span>TmpBytes<span class="br0">&#41;</span>;
          <span style="color: #0000ff;">end</span>
          <span style="color: #0000ff;">else</span>
          <span style="color: #0000ff;">begin</span>
            Output := OEMBytesToString<span class="br0">&#40;</span>@TmpBytes<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, Length<span class="br0">&#40;</span>TmpBytes<span class="br0">&#41;</span><span class="br0">&#41;</span>;
          <span style="color: #0000ff;">end</span>;
        <span style="color: #0000ff;">end</span>
        <span style="color: #0000ff;">else</span>
          Output := <span style="color: #FF0000;">''</span>;
&nbsp;
        Result := <span style="color: #0000ff;">True</span>;
      <span style="color: #0000ff;">finally</span>
        OutStream.Free;
      <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">finally</span>
      <span style="color: #808080;">// Ferme les handles du processus</span>
      CloseHandle<span class="br0">&#40;</span>ProcInfo.hProcess<span class="br0">&#41;</span>;
      CloseHandle<span class="br0">&#40;</span>ProcInfo.hThread<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">finally</span>
    <span style="color: #808080;">// S'assure de fermer tous les handles ouverts (s&eacute;curise contre les fuites)</span>
    <span style="color: #0000ff;">if</span> ReadStdOut &lt;&gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
      CloseHandle<span class="br0">&#40;</span>ReadStdOut<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> WriteStdOut &lt;&gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
      CloseHandle<span class="br0">&#40;</span>WriteStdOut<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> ReadStdIn &lt;&gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
      CloseHandle<span class="br0">&#40;</span>ReadStdIn<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> WriteStdIn &lt;&gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
      CloseHandle<span class="br0">&#40;</span>WriteStdIn<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">// M&eacute;thode utilitaire pour ex&eacute;cuter des commandes depuis un TMemo source et afficher la sortie dans un TMemo destination</span>
<span style="color: #0000ff;">procedure</span> TCmdPipeExecutor.ExecuteFromMemo<span class="br0">&#40;</span>SourceMemo, DestMemo: TMemo;
  HiddenWindow: <span style="color: #0080ff;">Boolean</span>; UseUtf8: <span style="color: #0080ff;">Boolean</span>; TimeoutMs: <span style="color: #0080ff;">Cardinal</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  OutStr: <span style="color: #0080ff;">string</span>;
  ExitCode: <span style="color: #0080ff;">DWORD</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>SourceMemo = <span style="color: #0000ff;">nil</span><span class="br0">&#41;</span> <span style="color: #0000ff;">or</span> <span class="br0">&#40;</span>DestMemo = <span style="color: #0000ff;">nil</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    Exit;
&nbsp;
  DestMemo.Lines.BeginUpdate;
  <span style="color: #0000ff;">try</span>
    DestMemo.Lines.Clear;
    DestMemo.Lines.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'--- Execution started ---'</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Appel principal qui ex&eacute;cute les commandes et capture la sortie</span>
    <span style="color: #0000ff;">if</span> ExecuteCmdAndCapture<span class="br0">&#40;</span>SourceMemo.Lines, OutStr, ExitCode, HiddenWindow,
      UseUtf8, TimeoutMs<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      <span style="color: #808080;">// Uniformise les sauts de ligne pour l'affichage dans TMemo</span>
      OutStr := StringReplace<span class="br0">&#40;</span>OutStr, <span style="color: #cc66cc;">#10</span>, sLineBreak, <span class="br0">&#91;</span>rfReplaceAll<span class="br0">&#93;</span><span class="br0">&#41;</span>;
      DestMemo.Lines.Add<span class="br0">&#40;</span>OutStr<span class="br0">&#41;</span>;
      DestMemo.Lines.Add<span class="br0">&#40;</span>Format<span class="br0">&#40;</span><span style="color: #FF0000;">'--- Execution finished (Exit code: %d) ---'</span>,
        <span class="br0">&#91;</span>ExitCode<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>
    <span style="color: #0000ff;">else</span>
      DestMemo.Lines.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'Erreur: impossible de lancer cmd.exe.'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">finally</span>
    DestMemo.Lines.EndUpdate;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">end</span>.</pre></td></tr></table></code><hr />
</div><b>Exemple d’utilisation simple (dans une Form VCL)</b><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">uses</span>
  UnitCmdPipeExecutor, System.Classes, Vcl.StdCtrls;
&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.ButtonRunClick<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  Executor: TCmdPipeExecutor;
  Commands: TStringList;
  Output: <span style="color: #0080ff;">string</span>;
  ExitCode: <span style="color: #0080ff;">DWORD</span>;
<span style="color: #0000ff;">begin</span>
  Executor := TCmdPipeExecutor.Create;
  Commands := TStringList.Create;
  <span style="color: #0000ff;">try</span>
    <span style="color: #808080;">// Exemple : liste de commandes batch</span>
    Commands.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'echo D&eacute;but du script'</span><span class="br0">&#41;</span>;
    Commands.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'dir C:\Windows'</span><span class="br0">&#41;</span>;        <span style="color: #808080;">// commande montrant la sortie</span>
    Commands.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'echo Fin du script'</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Ex&eacute;cute via cmd.exe, fen&ecirc;tre cach&eacute;e, encodage OEM (UseUtf8 = False), timeout 10s</span>
    <span style="color: #0000ff;">if</span> Executor.ExecuteCmdAndCapture<span class="br0">&#40;</span>Commands, Output, ExitCode, <span style="color: #0000ff;">True</span>, <span style="color: #0000ff;">False</span>, <span style="color: #cc66cc;">10000</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      ShowMessage<span class="br0">&#40;</span>Format<span class="br0">&#40;</span><span style="color: #FF0000;">'Sortie (%d octets) - ExitCode=%d'</span><span style="color: #cc66cc;">#13</span><span style="color: #cc66cc;">#10</span><span style="color: #FF0000;">'%s'</span>, <span class="br0">&#91;</span>Length<span class="br0">&#40;</span>Output<span class="br0">&#41;</span>, ExitCode, Output<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>
    <span style="color: #0000ff;">else</span>
      ShowMessage<span class="br0">&#40;</span><span style="color: #FF0000;">'Erreur: impossible de lancer cmd.exe.'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">finally</span>
    Commands.Free;
    Executor.Free;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div><b>Exemple avec TMemo (utilisation directe de ExecuteFromMemo)</b><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">procedure</span> TForm1.ButtonRunFromMemoClick<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  Executor: TCmdPipeExecutor;
<span style="color: #0000ff;">begin</span>
  Executor := TCmdPipeExecutor.Create;
  <span style="color: #0000ff;">try</span>
    <span style="color: #808080;">// SourceMemo contient les commandes (une par ligne)</span>
    <span style="color: #808080;">// DestMemo affichera la sortie et le code de retour</span>
    Executor.ExecuteFromMemo<span class="br0">&#40;</span>SourceMemo, DestMemo, <span style="color: #0000ff;">True</span>, <span style="color: #0000ff;">False</span>, <span style="color: #cc66cc;">15000</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">finally</span>
    Executor.Free;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div><b>Exemple utilisant UTF-8 (pour commandes/texte accentué)</b><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">var</span>
  Executor: TCmdPipeExecutor;
  Cmds: TStringList;
  OutStr: <span style="color: #0080ff;">string</span>;
  Code: <span style="color: #0080ff;">DWORD</span>;
<span style="color: #0000ff;">begin</span>
  Executor := TCmdPipeExecutor.Create;
  Cmds := TStringList.Create;
  <span style="color: #0000ff;">try</span>
    Cmds.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'chcp 65001'</span><span class="br0">&#41;</span>;                <span style="color: #808080;">// optionnel : passe la console en UTF-8</span>
    Cmds.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'echo Caf&eacute; et accents: &eacute;&agrave;&ecirc;'</span><span class="br0">&#41;</span>;
    Cmds.Add<span class="br0">&#40;</span><span style="color: #FF0000;">'exit'</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> Executor.ExecuteCmdAndCapture<span class="br0">&#40;</span>Cmds, OutStr, Code, <span style="color: #0000ff;">True</span>, <span style="color: #0000ff;">True</span>, <span style="color: #cc66cc;">5000</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
      Memo1.Lines.Text := OutStr
    <span style="color: #0000ff;">else</span>
      Memo1.Lines.Text := <span style="color: #FF0000;">'Erreur d'</span><span style="color: #FF0000;">'ex&eacute;cution'</span>;
  <span style="color: #0000ff;">finally</span>
    Cmds.Free;
    Executor.Free;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>XeGregory</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180160/environnements-developpement/delphi/codes-sources-telecharger/executer-scripts-batch-commandes-systeme-application/</guid>
		</item>
		<item>
			<title>TLinkExplorer — Explorateur de liens et médias web</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2179794&amp;goto=newpost</link>
			<pubDate>Sat, 11 Oct 2025 15:32:49 GMT</pubDate>
			<description>Classe pour explorer...</description>
			<content:encoded><![CDATA[<div>Classe pour explorer récursivement un site, extraire liens, images et documents, et afficher les résultats dans TListBox/TTreeView avec compteurs et arrêt contrôlé.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br />336<br />337<br />338<br />339<br />340<br />341<br />342<br />343<br />344<br />345<br />346<br />347<br />348<br />349<br />350<br />351<br />352<br />353<br />354<br />355<br />356<br />357<br />358<br />359<br />360<br />361<br />362<br />363<br />364<br />365<br />366<br />367<br />368<br />369<br />370<br />371<br />372<br />373<br />374<br />375<br />376<br />377<br />378<br />379<br />380<br />381<br />382<br />383<br />384<br />385<br />386<br />387<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">unit</span> LinkExplorerCore;
&nbsp;
<span style="color: #0000ff;">interface</span>
&nbsp;
<span style="color: #0000ff;">uses</span>
  System.Net.HttpClient, System.Net.HttpClientComponent, System.SysUtils,
  System.Classes,
  RegularExpressions, Generics.Collections, Vcl.Forms, Vcl.StdCtrls,
  Vcl.ComCtrls;
&nbsp;
<span style="color: #0000ff;">type</span>
  <span style="color: #808080;">// TLinkExplorer: classe principale pour explorer un site web,</span>
  <span style="color: #808080;">// d&eacute;tecter les liens, images et documents, et les afficher dans des</span>
  <span style="color: #808080;">// composants VCL (TListBox, TTreeView, TLabel).</span>
  TLinkExplorer = <span style="color: #0000ff;">class</span>
  <span style="color: #0000ff;">private</span>
    <span style="color: #808080;">// Dictionnaire de liens visit&eacute;s pour &eacute;viter les boucles et les doublons.</span>
    VisitedLinks: TDictionary&lt;<span style="color: #0080ff;">string</span>, Boolean&gt;;
    <span style="color: #808080;">// Compteur total de liens parcourus.</span>
    TotalLinks: <span style="color: #0080ff;">Integer</span>;
    <span style="color: #808080;">// Compteur total de fichiers (images + documents) ajout&eacute;s &agrave; l'arbre.</span>
    FileCount: <span style="color: #0080ff;">Integer</span>;
    <span style="color: #808080;">// Indicateur pour arr&ecirc;ter proprement l'exploration depuis l'UI.</span>
    StopProcess: <span style="color: #0080ff;">Boolean</span>;
&nbsp;
    <span style="color: #808080;">// R&eacute;cup&egrave;re le contenu HTML d'une URL et le retourne comme string.</span>
    <span style="color: #0000ff;">function</span> GetWebContent<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> URL: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span>;
&nbsp;
    <span style="color: #808080;">// Extrait les URLs des balises &lt;a href=&quot;...&quot;&gt; du HTML.</span>
    <span style="color: #808080;">// BaseURL est utilis&eacute; pour construire des URLs relatives.</span>
    <span style="color: #0000ff;">procedure</span> ExtractLinks<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> HTML: <span style="color: #0080ff;">string</span>; BaseURL: <span style="color: #0080ff;">string</span>;
      <span style="color: #0000ff;">var</span> LinkList: TStringList<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Extrait les sources m&eacute;dias (&lt;img src=...&gt; et liens de type pdf/html/css).</span>
    <span style="color: #808080;">// Remplit deux listes distinctes: ImageList et DocList.</span>
    <span style="color: #0000ff;">procedure</span> ExtractMediaSources<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> HTML: <span style="color: #0080ff;">string</span>; BaseURL: <span style="color: #0080ff;">string</span>;
      <span style="color: #0000ff;">var</span> ImageList, DocList: TStringList<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Ajoute les fichiers trouv&eacute;s (images/documents) au TTreeView fourni.</span>
    <span style="color: #808080;">// Met aussi &agrave; jour le label indiquant le nombre total de fichiers.</span>
    <span style="color: #0000ff;">procedure</span> AddFilesToTreeView<span class="br0">&#40;</span>ImageList, DocList: TStringList;
      TreeView: TTreeView; FileLabel: TLabel<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Fonction r&eacute;cursive qui explore les liens jusqu'&agrave; une profondeur donn&eacute;e.</span>
    <span style="color: #808080;">// Met &agrave; jour la ListBox (liste de pages parcourues), le TreeView (fichiers),</span>
    <span style="color: #808080;">// et les labels de compteurs.</span>
    <span style="color: #0000ff;">procedure</span> ExploreLinksRecursive<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> URL: <span style="color: #0080ff;">string</span>; ListBox: TListBox;
      TreeView: TTreeView; LabelCounter, FileLabel: TLabel; Depth: <span style="color: #0080ff;">Integer</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">public</span>
    <span style="color: #808080;">// D&eacute;marre l'exploration depuis une URL, initialise les variables internes.</span>
    <span style="color: #808080;">// MaxDepth = profondeur maximale d'exploration (1 = seul la page initiale).</span>
    <span style="color: #0000ff;">procedure</span> ExploreLinks<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> URL: <span style="color: #0080ff;">string</span>; ListBox: TListBox;
      TreeView: TTreeView; LabelCounter, FileLabel: TLabel; MaxDepth: <span style="color: #0080ff;">Integer</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Demande l'arr&ecirc;t de l'exploration en cours (l'exploration v&eacute;rifie StopProcess).</span>
    <span style="color: #0000ff;">procedure</span> StopExploration;
  <span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">implementation</span>
&nbsp;
<span style="color: #0000ff;">uses</span>
  System.IOUtils;
&nbsp;
<span style="color: #0000ff;">procedure</span> TLinkExplorer.StopExploration;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// Indique au processus r&eacute;cursif qu'il doit s'arr&ecirc;ter d&egrave;s que possible.</span>
  StopProcess := <span style="color: #0000ff;">True</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">function</span> TLinkExplorer.GetWebContent<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> URL: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">var</span>
  Client: TNetHTTPClient;
  Response: TStringStream;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// Initialise la valeur de retour vide par d&eacute;faut.</span>
  Result := <span style="color: #FF0000;">''</span>;
&nbsp;
  <span style="color: #808080;">// Cr&eacute;ation d'un client HTTP et d'un flux pour r&eacute;cup&eacute;rer la r&eacute;ponse.</span>
  Client := TNetHTTPClient.Create<span class="br0">&#40;</span><span style="color: #0000ff;">nil</span><span class="br0">&#41;</span>;
  Response := TStringStream.Create;
  <span style="color: #0000ff;">try</span>
    <span style="color: #0000ff;">try</span>
      <span style="color: #808080;">// Requ&ecirc;te GET simple; le contenu renvoy&eacute; est plac&eacute; dans Response.</span>
      Client.Get<span class="br0">&#40;</span>URL, Response<span class="br0">&#41;</span>;
      Result := Response.DataString;
    <span style="color: #0000ff;">except</span>
      <span style="color: #808080;">// En cas d'erreur r&eacute;seau ou autre, affiche un message dans la console.</span>
      <span style="color: #0000ff;">on</span> E: Exception <span style="color: #0000ff;">do</span>
        Writeln<span class="br0">&#40;</span><span style="color: #FF0000;">'Erreur : '</span> + E.Message<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">finally</span>
    <span style="color: #808080;">// Lib&eacute;ration des objets pour &eacute;viter les fuites m&eacute;moire.</span>
    Client.Free;
    Response.Free;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TLinkExplorer.ExtractLinks<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> HTML: <span style="color: #0080ff;">string</span>; BaseURL: <span style="color: #0080ff;">string</span>;
  <span style="color: #0000ff;">var</span> LinkList: TStringList<span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  Regex: TRegEx;
  Match: TMatch;
  Link: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// Regex simple pour capturer href=&quot;...&quot; dans les balises &lt;a&gt;.</span>
  Regex := TRegEx.Create<span class="br0">&#40;</span><span style="color: #FF0000;">'&lt;a\s+(?:[^&gt;]*?\s+)?href=&quot;([^&quot;]*)&quot;'</span>, <span class="br0">&#91;</span>roIgnoreCase<span class="br0">&#93;</span><span class="br0">&#41;</span>;
  Match := Regex.Match<span class="br0">&#40;</span>HTML<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">while</span> Match.Success <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Link := Match.Groups<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>.Value;
&nbsp;
    <span style="color: #808080;">// Normalise les URLs relatives en les transformant en URLs absolues bas&eacute;es sur BaseURL.</span>
    <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> Link.StartsWith<span class="br0">&#40;</span><span style="color: #FF0000;">'http'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      <span style="color: #0000ff;">if</span> Link.StartsWith<span class="br0">&#40;</span><span style="color: #FF0000;">'/'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
        Link := BaseURL + Link
      <span style="color: #0000ff;">else</span>
        Link := BaseURL + <span style="color: #FF0000;">'/'</span> + Link;
    <span style="color: #0000ff;">end</span>;
&nbsp;
    <span style="color: #808080;">// Ajoute le lien s'il n'a pas encore &eacute;t&eacute; visit&eacute; (&eacute;vite doublons dans la file).</span>
    <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> VisitedLinks.ContainsKey<span class="br0">&#40;</span>Link<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
      LinkList.Add<span class="br0">&#40;</span>Link<span class="br0">&#41;</span>;
&nbsp;
    Match := Match.NextMatch;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">// Enl&egrave;ve certains param&egrave;tres d'URL (ex : ?w=) pour normaliser les sources m&eacute;dias.</span>
<span style="color: #0000ff;">function</span> RemoveURLParams<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> URL: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">begin</span>
  Result := URL;
  <span style="color: #0000ff;">if</span> Pos<span class="br0">&#40;</span><span style="color: #FF0000;">'?w='</span>, Result<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
    Result := Copy<span class="br0">&#40;</span>Result, <span style="color: #cc66cc;">1</span>, Pos<span class="br0">&#40;</span><span style="color: #FF0000;">'?w='</span>, Result<span class="br0">&#41;</span> - <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TLinkExplorer.ExtractMediaSources<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> HTML: <span style="color: #0080ff;">string</span>; BaseURL: <span style="color: #0080ff;">string</span>;
  <span style="color: #0000ff;">var</span> ImageList, DocList: TStringList<span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  RegexImg, RegexDoc: TRegEx;
  Match: TMatch;
  Source: <span style="color: #0080ff;">string</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// Regex pour trouver les balises &lt;img src=&quot;...&quot;&gt; pointant vers des extensions d'image courantes.</span>
  RegexImg := TRegEx.Create
    <span class="br0">&#40;</span><span style="color: #FF0000;">'&lt;img\s+[^&gt;]*src=&quot;([^&quot;]+\.(jpg|jpeg|png|gif|bmp|webp|svg))&quot;'</span>,
    <span class="br0">&#91;</span>roIgnoreCase<span class="br0">&#93;</span><span class="br0">&#41;</span>;
  Match := RegexImg.Match<span class="br0">&#40;</span>HTML<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">while</span> Match.Success <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Source := RemoveURLParams<span class="br0">&#40;</span>Match.Groups<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>.Value<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// G&egrave;re les sources relatives.</span>
    <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> Source.StartsWith<span class="br0">&#40;</span><span style="color: #FF0000;">'http'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
      Source := BaseURL + Source;
&nbsp;
    <span style="color: #808080;">// V&eacute;rifie la pr&eacute;sence d'une extension avant d'ajouter.</span>
    <span style="color: #0000ff;">if</span> TPath.GetExtension<span class="br0">&#40;</span>Source<span class="br0">&#41;</span> &lt;&gt; <span style="color: #FF0000;">''</span> <span style="color: #0000ff;">then</span>
      ImageList.Add<span class="br0">&#40;</span>Source<span class="br0">&#41;</span>;
&nbsp;
    Match := Match.NextMatch;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  <span style="color: #808080;">// Regex pour trouver les liens vers PDF, HTML, CSS (documents int&eacute;ressants).</span>
  RegexDoc := TRegEx.Create<span class="br0">&#40;</span><span style="color: #FF0000;">'&lt;a\s+[^&gt;]*href=&quot;([^&quot;]+\.(pdf|html|css))&quot;'</span>,
    <span class="br0">&#91;</span>roIgnoreCase<span class="br0">&#93;</span><span class="br0">&#41;</span>;
  Match := RegexDoc.Match<span class="br0">&#40;</span>HTML<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">while</span> Match.Success <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Source := RemoveURLParams<span class="br0">&#40;</span>Match.Groups<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>.Value<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> Source.StartsWith<span class="br0">&#40;</span><span style="color: #FF0000;">'http'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
      Source := BaseURL + Source;
&nbsp;
    <span style="color: #0000ff;">if</span> TPath.GetExtension<span class="br0">&#40;</span>Source<span class="br0">&#41;</span> &lt;&gt; <span style="color: #FF0000;">''</span> <span style="color: #0000ff;">then</span>
      DocList.Add<span class="br0">&#40;</span>Source<span class="br0">&#41;</span>;
&nbsp;
    Match := Match.NextMatch;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">// Recherche un n&#156;ud enfant direct d'un parent dont le texte correspond exactement.</span>
<span style="color: #808080;">// Retourne nil si non trouv&eacute;.</span>
<span style="color: #0000ff;">function</span> FindTreeNode<span class="br0">&#40;</span>ParentNode: TTreeNode; <span style="color: #0000ff;">const</span> Text: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>: TTreeNode;
<span style="color: #0000ff;">var</span>
  Node: TTreeNode;
<span style="color: #0000ff;">begin</span>
  Result := <span style="color: #0000ff;">nil</span>;
  Node := ParentNode.getFirstChild;
  <span style="color: #0000ff;">while</span> Node &lt;&gt; <span style="color: #0000ff;">nil</span> <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    <span style="color: #0000ff;">if</span> Node.Text = Text <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      Result := Node;
      Exit;
    <span style="color: #0000ff;">end</span>;
    Node := Node.getNextSibling;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TLinkExplorer.AddFilesToTreeView<span class="br0">&#40;</span>ImageList, DocList: TStringList;
  TreeView: TTreeView; FileLabel: TLabel<span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  i: <span style="color: #0080ff;">Integer</span>;
  RootNode, ImagesNode, DocsNode: TTreeNode;
  AddedCount: <span style="color: #0080ff;">Integer</span>;
  <span style="color: #808080;">// Compteurs locaux pour afficher le nombre par section dans le TreeView.</span>
  ImageCount, DocCount: <span style="color: #0080ff;">Integer</span>;
  Node: TTreeNode;
<span style="color: #0000ff;">begin</span>
  AddedCount := <span style="color: #cc66cc;">0</span>;
&nbsp;
  <span style="color: #808080;">// R&eacute;cup&egrave;re le n&#156;ud racine ou le cr&eacute;e si absent.</span>
  RootNode := TreeView.Items.GetFirstNode;
  <span style="color: #0000ff;">if</span> RootNode = <span style="color: #0000ff;">nil</span> <span style="color: #0000ff;">then</span>
    RootNode := TreeView.Items.Add<span class="br0">&#40;</span><span style="color: #0000ff;">nil</span>, <span style="color: #FF0000;">'Fichiers trouv&eacute;s'</span><span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Cherche ou cr&eacute;e le sous-n&#156;ud &quot;Images&quot; (on compare seulement le pr&eacute;fixe pour conserver le compteur).</span>
  ImagesNode := <span style="color: #0000ff;">nil</span>;
  Node := RootNode.getFirstChild;
  <span style="color: #0000ff;">while</span> Node &lt;&gt; <span style="color: #0000ff;">nil</span> <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    <span style="color: #0000ff;">if</span> SameText<span class="br0">&#40;</span>Copy<span class="br0">&#40;</span>Node.Text, <span style="color: #cc66cc;">1</span>, Length<span class="br0">&#40;</span><span style="color: #FF0000;">'Images'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'Images'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      ImagesNode := Node;
      Break;
    <span style="color: #0000ff;">end</span>;
    Node := Node.getNextSibling;
  <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">if</span> ImagesNode = <span style="color: #0000ff;">nil</span> <span style="color: #0000ff;">then</span>
    ImagesNode := TreeView.Items.AddChild<span class="br0">&#40;</span>RootNode, <span style="color: #FF0000;">'Images'</span><span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Cherche ou cr&eacute;e le sous-n&#156;ud &quot;Documents&quot;.</span>
  DocsNode := <span style="color: #0000ff;">nil</span>;
  Node := RootNode.getFirstChild;
  <span style="color: #0000ff;">while</span> Node &lt;&gt; <span style="color: #0000ff;">nil</span> <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    <span style="color: #0000ff;">if</span> SameText<span class="br0">&#40;</span>Copy<span class="br0">&#40;</span>Node.Text, <span style="color: #cc66cc;">1</span>, Length<span class="br0">&#40;</span><span style="color: #FF0000;">'Documents'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'Documents'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      DocsNode := Node;
      Break;
    <span style="color: #0000ff;">end</span>;
    Node := Node.getNextSibling;
  <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">if</span> DocsNode = <span style="color: #0000ff;">nil</span> <span style="color: #0000ff;">then</span>
    DocsNode := TreeView.Items.AddChild<span class="br0">&#40;</span>RootNode, <span style="color: #FF0000;">'Documents'</span><span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Ajoute les images sous le n&#156;ud &quot;Images&quot; en &eacute;vitant les doublons.</span>
  <span style="color: #0000ff;">for</span> i := <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">to</span> ImageList.Count - <span style="color: #cc66cc;">1</span> <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    <span style="color: #0000ff;">if</span> FindTreeNode<span class="br0">&#40;</span>ImagesNode, ImageList<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> = <span style="color: #0000ff;">nil</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      TreeView.Items.AddChild<span class="br0">&#40;</span>ImagesNode, ImageList<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>;
      Inc<span class="br0">&#40;</span>AddedCount<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  <span style="color: #808080;">// Ajoute les documents sous le n&#156;ud &quot;Documents&quot; en &eacute;vitant les doublons.</span>
  <span style="color: #0000ff;">for</span> i := <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">to</span> DocList.Count - <span style="color: #cc66cc;">1</span> <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    <span style="color: #0000ff;">if</span> FindTreeNode<span class="br0">&#40;</span>DocsNode, DocList<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> = <span style="color: #0000ff;">nil</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      TreeView.Items.AddChild<span class="br0">&#40;</span>DocsNode, DocList<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>;
      Inc<span class="br0">&#40;</span>AddedCount<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  <span style="color: #808080;">// Mise &agrave; jour du compteur global de fichiers et du label associ&eacute;.</span>
  <span style="color: #0000ff;">if</span> AddedCount &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    Inc<span class="br0">&#40;</span>FileCount, AddedCount<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> Assigned<span class="br0">&#40;</span>FileLabel<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
      FileLabel.Caption := <span style="color: #FF0000;">'Fichiers trouv&eacute;s : '</span> + IntToStr<span class="br0">&#40;</span>FileCount<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  <span style="color: #808080;">// Calcul du nombre d'enfants directs pour ImagesNode (pour afficher un compteur local).</span>
  ImageCount := <span style="color: #cc66cc;">0</span>;
  Node := ImagesNode.getFirstChild;
  <span style="color: #0000ff;">while</span> Node &lt;&gt; <span style="color: #0000ff;">nil</span> <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Inc<span class="br0">&#40;</span>ImageCount<span class="br0">&#41;</span>;
    Node := Node.getNextSibling;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  <span style="color: #808080;">// Calcul du nombre d'enfants directs pour DocsNode.</span>
  DocCount := <span style="color: #cc66cc;">0</span>;
  Node := DocsNode.getFirstChild;
  <span style="color: #0000ff;">while</span> Node &lt;&gt; <span style="color: #0000ff;">nil</span> <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    Inc<span class="br0">&#40;</span>DocCount<span class="br0">&#41;</span>;
    Node := Node.getNextSibling;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  <span style="color: #808080;">// Met &agrave; jour le texte des n&#156;uds pour inclure le compteur local.</span>
  ImagesNode.Text := <span style="color: #FF0000;">'Images : '</span> + IntToStr<span class="br0">&#40;</span>ImageCount<span class="br0">&#41;</span>;
  DocsNode.Text := <span style="color: #FF0000;">'Documents : '</span> + IntToStr<span class="br0">&#40;</span>DocCount<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TLinkExplorer.ExploreLinksRecursive<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> URL: <span style="color: #0080ff;">string</span>;
  ListBox: TListBox; TreeView: TTreeView; LabelCounter, FileLabel: TLabel;
  Depth: <span style="color: #0080ff;">Integer</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  HTMLContent: <span style="color: #0080ff;">string</span>;
  Links, Images, Docs: TStringList;
  i: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// V&eacute;rifie le drapeau d'arr&ecirc;t demand&eacute; par l'UI.</span>
  <span style="color: #0000ff;">if</span> StopProcess <span style="color: #0000ff;">then</span>
    Exit;
&nbsp;
  <span style="color: #808080;">// Si la profondeur est atteinte, arr&ecirc;te la r&eacute;cursion.</span>
  <span style="color: #0000ff;">if</span> Depth &lt;= <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
    Exit;
&nbsp;
  <span style="color: #808080;">// Si l'URL a d&eacute;j&agrave; &eacute;t&eacute; visit&eacute;e, &eacute;viter de la revisiter.</span>
  <span style="color: #0000ff;">if</span> VisitedLinks.ContainsKey<span class="br0">&#40;</span>URL<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    Exit;
&nbsp;
  <span style="color: #808080;">// Marque l'URL comme visit&eacute;e et incr&eacute;mente le compteur global.</span>
  VisitedLinks.Add<span class="br0">&#40;</span>URL, <span style="color: #0000ff;">True</span><span class="br0">&#41;</span>;
  Inc<span class="br0">&#40;</span>TotalLinks<span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Permet au thread de l'interface utilisateur de traiter les messages</span>
  <span style="color: #808080;">// (utile si la m&eacute;thode est appel&eacute;e depuis le thread principal).</span>
  Application.ProcessMessages;
  <span style="color: #0000ff;">if</span> Assigned<span class="br0">&#40;</span>LabelCounter<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    LabelCounter.Caption := <span style="color: #FF0000;">'Liens parcourus : '</span> + IntToStr<span class="br0">&#40;</span>TotalLinks<span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// R&eacute;cup&egrave;re le contenu HTML de la page.</span>
  HTMLContent := GetWebContent<span class="br0">&#40;</span>URL<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> HTMLContent = <span style="color: #FF0000;">''</span> <span style="color: #0000ff;">then</span>
    Exit;
&nbsp;
  <span style="color: #808080;">// Cr&eacute;ation des listes locales pour stocker les r&eacute;sultats d'analyse.</span>
  Links := TStringList.Create;
  Images := TStringList.Create;
  Docs := TStringList.Create;
  <span style="color: #0000ff;">try</span>
    <span style="color: #808080;">// Extrait les liens et m&eacute;dias depuis le contenu HTML.</span>
    ExtractLinks<span class="br0">&#40;</span>HTMLContent, URL, Links<span class="br0">&#41;</span>;
    ExtractMediaSources<span class="br0">&#40;</span>HTMLContent, URL, Images, Docs<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Ajoute l'URL parcourue &agrave; la ListBox pour visibilit&eacute;.</span>
    ListBox.Items.Add<span class="br0">&#40;</span>URL<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Ajoute les images et documents trouv&eacute;s dans le TreeView.</span>
    AddFilesToTreeView<span class="br0">&#40;</span>Images, Docs, TreeView, FileLabel<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Appel r&eacute;cursif sur chaque lien trouv&eacute; tant que la profondeur le permet.</span>
    <span style="color: #0000ff;">for</span> i := <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">to</span> Links.Count - <span style="color: #cc66cc;">1</span> <span style="color: #0000ff;">do</span>
    <span style="color: #0000ff;">begin</span>
      <span style="color: #0000ff;">if</span> StopProcess <span style="color: #0000ff;">then</span>
        Exit;
      ExploreLinksRecursive<span class="br0">&#40;</span>Links<span class="br0">&#91;</span>i<span class="br0">&#93;</span>, ListBox, TreeView, LabelCounter,
        FileLabel, Depth - <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">finally</span>
    <span style="color: #808080;">// Lib&eacute;ration des listes temporaires.</span>
    Links.Free;
    Images.Free;
    Docs.Free;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TLinkExplorer.ExploreLinks<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> URL: <span style="color: #0080ff;">string</span>; ListBox: TListBox;
  TreeView: TTreeView; LabelCounter, FileLabel: TLabel; MaxDepth: <span style="color: #0080ff;">Integer</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// Initialise l'&eacute;tat interne de l'explorateur pour une nouvelle session.</span>
  VisitedLinks := TDictionary&lt;<span style="color: #0080ff;">string</span>, Boolean&gt;.Create;
  TotalLinks := <span style="color: #cc66cc;">0</span>;
  FileCount := <span style="color: #cc66cc;">0</span>;
  StopProcess := <span style="color: #0000ff;">False</span>;
  <span style="color: #0000ff;">try</span>
    <span style="color: #808080;">// Initialise le libell&eacute; des fichiers si fourni.</span>
    <span style="color: #0000ff;">if</span> Assigned<span class="br0">&#40;</span>FileLabel<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
      FileLabel.Caption := <span style="color: #FF0000;">'Fichiers trouv&eacute;s : 0'</span>;
&nbsp;
    <span style="color: #808080;">// Lance la recherche r&eacute;cursive depuis l'URL racine.</span>
    ExploreLinksRecursive<span class="br0">&#40;</span>URL, ListBox, TreeView, LabelCounter, FileLabel,
      MaxDepth<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">finally</span>
    <span style="color: #808080;">// Lib&egrave;re le dictionnaire des liens visit&eacute;s.</span>
    VisitedLinks.Free;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">end</span>.</pre></td></tr></table></code><hr />
</div><img src="https://www.developpez.net/forums/attachments/p670886d1760196683/environnements-developpement/delphi/codes-sources-telecharger/tlinkexplorer-explorateur-liens-medias-web/capture-d-ecran-2025-10-11-173015.png/" border="0" alt="Nom : Capture d'écran 2025-10-11 173015.png
Affichages : 891
Taille : 82,1 Ko"  style="float: CONFIG" /><br />
<br />
Code Source : <a href="https://www.developpez.net/forums/attachments/p670887d1760196745/environnements-developpement/delphi/codes-sources-telecharger/tlinkexplorer-explorateur-liens-medias-web/linkexplorer.zip/"  title="Nom : LinkExplorer.zip
Affichages : 72
Taille : 124,3 Ko">LinkExplorer.zip</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p670886d1760196683/environnements-developpement/delphi/codes-sources-telecharger/tlinkexplorer-explorateur-liens-medias-web/capture-d-ecran-2025-10-11-173015.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	
		<fieldset class="fieldset">
			<legend>Fichiers attachés</legend>
			<ul>
			<li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/zip.gif" alt="Type de fichier : zip" />
	<a href="https://www.developpez.net/forums/attachments/p670887d1760196745/environnements-developpement/delphi/codes-sources-telecharger/tlinkexplorer-explorateur-liens-medias-web/linkexplorer.zip/">LinkExplorer.zip</a> 
(124,3 Ko)
</li>
			</ul>
		</fieldset>
	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>XeGregory</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2179794/environnements-developpement/delphi/codes-sources-telecharger/tlinkexplorer-explorateur-liens-medias-web/</guid>
		</item>
		<item>
			<title>ChatLan — Messagerie locale INDY</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2179666&amp;goto=newpost</link>
			<pubDate>Sun, 05 Oct 2025 08:35:04 GMT</pubDate>
			<description>ChatLan — Messagerie locale 
...</description>
			<content:encoded><![CDATA[<div>ChatLan — Messagerie locale<br />
<br />
ChatLan — messagerie HTTP locale légère, offrant une interface web réactive pour discuter sur un réseau local avec polling, gestion simple des utilisateurs par token.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p670750d1759653302/environnements-developpement/delphi/codes-sources-telecharger/chatlan-messagerie-locale-indy/capture-d-ecran-2025-10-05-101921.png/" border="0" alt="Nom : Capture d'écran 2025-10-05 101921.png
Affichages : 311
Taille : 51,1 Ko"  style="float: CONFIG" /><br />
<br />
Code Source : <a href="https://www.developpez.net/forums/attachments/p670749d1759653147/environnements-developpement/delphi/codes-sources-telecharger/chatlan-messagerie-locale-indy/chatlan.zip/"  title="Nom : ChatLan.zip
Affichages : 67
Taille : 142,2 Ko">ChatLan.zip</a><br />
<br />
Recommandé : Delphi XE2, 10.4, 11 etc.</div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p670750d1759653302/environnements-developpement/delphi/codes-sources-telecharger/chatlan-messagerie-locale-indy/capture-d-ecran-2025-10-05-101921.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	
		<fieldset class="fieldset">
			<legend>Fichiers attachés</legend>
			<ul>
			<li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/zip.gif" alt="Type de fichier : zip" />
	<a href="https://www.developpez.net/forums/attachments/p670749d1759653147/environnements-developpement/delphi/codes-sources-telecharger/chatlan-messagerie-locale-indy/chatlan.zip/">ChatLan.zip</a> 
(142,2 Ko)
</li>
			</ul>
		</fieldset>
	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>XeGregory</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2179666/environnements-developpement/delphi/codes-sources-telecharger/chatlan-messagerie-locale-indy/</guid>
		</item>
		<item>
			<title>Signature de code</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178801&amp;goto=newpost</link>
			<pubDate>Sun, 24 Aug 2025 17:17:08 GMT</pubDate>
			<description><![CDATA[Salut à tous ! 
 
J'ai dû...]]></description>
			<content:encoded><![CDATA[<div>Salut à tous !<br />
<br />
J'ai dû dernièrement renouveler mon certificat et force est de constater que la procédure de signature s'est complexifiée.<br />
Alors qu'on pouvait se contenter d'un pfx et d'un mot de passe, la clé privée doit maintenant être stockée sur un dispositif externe (ex. clé USB) à la norme FIPS 140-2.<br />
<br />
Là où ça se complique (façon de parler) est qu'à chaque signature il faut entrer manuellement le code PIN défini pour cette clé.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p669752d1756054979/environnements-developpement/delphi/codes-sources-telecharger/signature-code/2025-08-24-13_13_05-securite-windows.jpg/" border="0" alt="Nom : 2025-08-24 13_13_05-Sécurité Windows.jpg
Affichages : 493
Taille : 20,7 Ko"  style="float: CONFIG" /><br />
<br />
C'est encore supportable (quoi que) si on compile un seul exe mais lors de la construction d'un projet complet contenant de multiples modules, c'est carrément énervant ! Je me suis donc créé un petit utilitaire pour la saisie automatique de ce code PIN, utilitaire que je vous mets à disposition.<br />
<br />
Sur le principe il attend simplement que la boite de dialogue apparaisse et que le champ &quot;Code PIN&quot; prenne le focus, le remplit et confirme avant d'attendre la fin du processus de signature (en attendant vous pouvez aller boire un café !).<br />
<br />
Dans le fichier <i>CodeSigning.ini</i>, vous devez :<br />
<ul><li style="">définir l'empreinte numérique propre à votre certificat (récupérée depuis <i>certmgr.msc</i>) ;</li><li style="">renseigner le code PIN que vous avez défini pour votre Yubikey.</li></ul><br />
<br />
Le chemin de <i>SignTool </i>est le plus récent à ce jour dans le <a rel="nofollow" href="https://developer.microsoft.com/fr-fr/windows/downloads/windows-sdk/" target="_blank">Windows SDKs</a> et les informations de la boite de dialogue sont celles de Windows 11.<br />
<br />
Si vous signez vos modules en post-construction depuis l'EDI il vous suffit de lancer la commande <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #FF0000;">&quot;chemin\CodeSigning.exe&quot;</span> <span style="color: #FF0000;">&quot;$(OUTPUTPATH)&quot;</span></span>.<br />
<br />
Mais même si la signature de code ne vous intéresse pas, vous pourrez éventuellement apprendre comment être notifié lors du focus d'un champ d'une application tiers, l'envoi de commandes clavier et comment détecter la fin d'un processus distant.<br />
<br />
Voilà, à bientôt sur DVP ;)<br />
<br />
EDIT:<br />
Modification: <i>timer </i>par <i>ThreadPoolTimer</i>.</div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p669752d1756054979/environnements-developpement/delphi/codes-sources-telecharger/signature-code/2025-08-24-13_13_05-securite-windows.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	
		<fieldset class="fieldset">
			<legend>Fichiers attachés</legend>
			<ul>
			<li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/zip.gif" alt="Type de fichier : zip" />
	<a href="https://www.developpez.net/forums/attachments/p669815d1756216014/environnements-developpement/delphi/codes-sources-telecharger/signature-code/codesigning.zip/">CodeSigning.zip</a> 
(1,03 Mo)
</li>
			</ul>
		</fieldset>
	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>Andnotor</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178801/environnements-developpement/delphi/codes-sources-telecharger/signature-code/</guid>
		</item>
		<item>
			<title>Création de cartes Pokémon</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178712&amp;goto=newpost</link>
			<pubDate>Wed, 20 Aug 2025 09:30:55 GMT</pubDate>
			<description>Pièce jointe 669618...</description>
			<content:encoded><![CDATA[<div><div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p669618d1755682047/environnements-developpement/delphi/codes-sources-telecharger/creation-cartes-pokemon/video_2025_08_20-3_edit_0.gif/" border="0" alt="Nom : Video_2025_08_20-3_edit_0.gif
Affichages : 369
Taille : 922,5 Ko"  style="float: CONFIG" /></div><br />
<b>Version idéale pour une compatibilité complète et stable : Delphi 10.3 Rio ou plus récente</b><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">unit</span> Unit1;
&nbsp;
<span style="color: #0000ff;">interface</span>
&nbsp;
<span style="color: #0000ff;">uses</span>
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes,
  System.JSON, System.IOUtils, System.Math,
  System.Net.URLClient, System.Net.HttpClient,
  System.Generics.Collections,
  Vcl.Graphics, Vcl.Controls,
  Vcl.Forms, Vcl.Dialogs,
  Vcl.ExtCtrls, Vcl.StdCtrls,
  Vcl.Imaging.pngimage;
&nbsp;
<span style="color: #0000ff;">type</span>
  TForm1 = <span style="color: #0000ff;">class</span><span class="br0">&#40;</span>TForm<span class="br0">&#41;</span>
    ListPokemon: TListBox;
    Card: TImage;
    <span style="color: #0000ff;">procedure</span> FormCreate<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">procedure</span> ListPokemonClick<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">procedure</span> FormDestroy<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #0000ff;">private</span>
    <span style="color: #808080;">// Tableau JSON contenant tous les Pok&eacute;mon</span>
    FPokemonArray: TJSONArray;
    <span style="color: #808080;">// Cache en m&eacute;moire des images t&eacute;l&eacute;charg&eacute;es</span>
    FImageCache: TDictionary&lt;<span style="color: #0080ff;">string</span>, TPngImage&gt;;
    FBackground: TPngImage;
&nbsp;
    <span style="color: #0000ff;">procedure</span> LoadJSONFromURL<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> AURL: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">procedure</span> CreateCard<span class="br0">&#40;</span>Index: <span style="color: #0080ff;">Integer</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">function</span> DownloadIm<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> URL: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>: TPngImage;
  <span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">var</span>
  Form1: TForm1;
&nbsp;
<span style="color: #0000ff;">implementation</span>
&nbsp;
<span style="color: #808080;">{$R *.dfm}</span>
&nbsp;
<span style="color: #808080;">{ -------------------------------------------------------------------------------</span>
<span style="color: #808080;">&nbsp; Initialisation de la form : cr&eacute;ation du cache et chargement du JSON</span>
<span style="color: #808080;">&nbsp; ------------------------------------------------------------------------------- }</span>
<span style="color: #0000ff;">procedure</span> TForm1.FormCreate<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// Cr&eacute;ation du dictionnaire pour stocker TPngImage par URL</span>
  FImageCache := TDictionary&lt;<span style="color: #0080ff;">string</span>, TPngImage&gt;.Create;
  <span style="color: #808080;">// Chargement depuis la ressource nomm&eacute;e &quot;FondCarte&quot;</span>
&nbsp;
  FBackground := TPngImage.Create;
&nbsp;
  <span style="color: #0000ff;">try</span>
    FBackground.LoadFromResourceName<span class="br0">&#40;</span>HInstance, <span style="color: #FF0000;">'Background'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">except</span>
    <span style="color: #0000ff;">on</span> E: Exception <span style="color: #0000ff;">do</span>
      ShowMessage<span class="br0">&#40;</span><span style="color: #FF0000;">'Erreur de chargement du fond en ressource : '</span> + E.Message<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  <span style="color: #808080;">// Chargement du fichier JSON avec les donn&eacute;es des Pok&eacute;mon</span>
  <span style="color: #0000ff;">try</span>
    LoadJSONFromURL<span class="br0">&#40;</span><span style="color: #FF0000;">'https://tyradex.vercel.app/api/v1/pokemon'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">except</span>
    <span style="color: #0000ff;">on</span> E: Exception <span style="color: #0000ff;">do</span>
      ShowMessage<span class="br0">&#40;</span><span style="color: #FF0000;">'Erreur de chargement des donn&eacute;es : '</span> + E.Message<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">{ -------------------------------------------------------------------------------</span>
<span style="color: #808080;">&nbsp; Lib&eacute;ration des ressources : images du cache et tableau JSON</span>
<span style="color: #808080;">&nbsp; ------------------------------------------------------------------------------- }</span>
<span style="color: #0000ff;">procedure</span> TForm1.FormDestroy<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  Img: TPngImage;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// Parcours et lib&eacute;ration de chaque image en cache</span>
  <span style="color: #0000ff;">for</span> Img <span style="color: #0000ff;">in</span> FImageCache.Values <span style="color: #0000ff;">do</span>
    Img.Free;
  <span style="color: #808080;">// Lib&eacute;ration du dictionnaire</span>
  FImageCache.Free;
  <span style="color: #808080;">// Lib&eacute;ration du JSON</span>
  FPokemonArray.Free;
&nbsp;
  FBackground.Free;
  <span style="color: #0000ff;">inherited</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">{ -------------------------------------------------------------------------------</span>
<span style="color: #808080;">&nbsp; S&eacute;lection d&#146;un Pok&eacute;mon : cr&eacute;ation et affichage de sa carte</span>
<span style="color: #808080;">&nbsp; ------------------------------------------------------------------------------- }</span>
<span style="color: #0000ff;">procedure</span> TForm1.ListPokemonClick<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">if</span> ListPokemon.ItemIndex &gt;= <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
    CreateCard<span class="br0">&#40;</span>ListPokemon.ItemIndex + <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">{ -------------------------------------------------------------------------------</span>
<span style="color: #808080;">&nbsp; Lecture du JSON, parsing et remplissage de ListPokemon</span>
<span style="color: #808080;">&nbsp; ------------------------------------------------------------------------------- }</span>
<span style="color: #0000ff;">procedure</span> TForm1.LoadJSONFromURL<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> AURL: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  HttpClient: THTTPClient;
  Response: IHTTPResponse;
  JSONString: <span style="color: #0080ff;">string</span>;
  JSONValue: TJSONValue;
  I: <span style="color: #0080ff;">Integer</span>;
  NameObj: TJSONObject;
<span style="color: #0000ff;">begin</span>
  HttpClient := THTTPClient.Create;
  <span style="color: #0000ff;">try</span>
    <span style="color: #808080;">// T&eacute;l&eacute;charger le JSON</span>
    Response := HttpClient.Get<span class="br0">&#40;</span>AURL<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> Response.StatusCode &lt;&gt; <span style="color: #cc66cc;">200</span> <span style="color: #0000ff;">then</span>
      <span style="color: #0000ff;">raise</span> Exception.CreateFmt<span class="br0">&#40;</span><span style="color: #FF0000;">'Impossible de r&eacute;cup&eacute;rer le JSON (HTTP %d)'</span>, <span class="br0">&#91;</span>Response.StatusCode<span class="br0">&#93;</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// R&eacute;cup&eacute;rer la r&eacute;ponse comme texte UTF-8</span>
    JSONString := Response.ContentAsString<span class="br0">&#40;</span>TEncoding.UTF8<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Parser le JSON</span>
    JSONValue := TJSONObject.ParseJSONValue<span class="br0">&#40;</span>JSONString<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> Assigned<span class="br0">&#40;</span>JSONValue<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
      <span style="color: #0000ff;">raise</span> Exception.Create<span class="br0">&#40;</span><span style="color: #FF0000;">'Impossible de parser le JSON'</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// V&eacute;rifier que c&#146;est bien un tableau racine</span>
    <span style="color: #0000ff;">if</span> JSONValue <span style="color: #0000ff;">is</span> TJSONArray <span style="color: #0000ff;">then</span>
      FPokemonArray := TJSONArray<span class="br0">&#40;</span>JSONValue<span class="br0">&#41;</span>
    <span style="color: #0000ff;">else</span>
    <span style="color: #0000ff;">begin</span>
      JSONValue.Free;
      <span style="color: #0000ff;">raise</span> Exception.Create<span class="br0">&#40;</span><span style="color: #FF0000;">'Le JSON doit &ecirc;tre un tableau racine'</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
&nbsp;
    <span style="color: #808080;">// Remplir la liste des noms</span>
    ListPokemon.Items.BeginUpdate;
    <span style="color: #0000ff;">try</span>
      ListPokemon.Clear;
      <span style="color: #0000ff;">for</span> I := <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">to</span> FPokemonArray.Count - <span style="color: #cc66cc;">1</span> <span style="color: #0000ff;">do</span>
      <span style="color: #0000ff;">begin</span>
        NameObj := <span class="br0">&#40;</span>FPokemonArray.Items<span class="br0">&#91;</span>I<span class="br0">&#93;</span> <span style="color: #0000ff;">as</span> TJSONObject<span class="br0">&#41;</span>.GetValue&lt;TJSONObject&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'name'</span><span class="br0">&#41;</span>;
&nbsp;
        <span style="color: #0000ff;">if</span> NameObj.GetValue&lt;string&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'fr'</span><span class="br0">&#41;</span> = <span style="color: #FF0000;">'MissingNo.'</span> <span style="color: #0000ff;">then</span>
          Continue;
&nbsp;
        ListPokemon.Items.Add<span class="br0">&#40;</span>NameObj.GetValue&lt;string&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'fr'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
      <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">finally</span>
      ListPokemon.Items.EndUpdate;
    <span style="color: #0000ff;">end</span>;
&nbsp;
  <span style="color: #0000ff;">finally</span>
    HttpClient.Free;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">{ -------------------------------------------------------------------------------</span>
<span style="color: #808080;">&nbsp; Construction graphique de la carte du Pok&eacute;mon s&eacute;lectionn&eacute;</span>
<span style="color: #808080;">&nbsp; ------------------------------------------------------------------------------- }</span>
<span style="color: #0000ff;">procedure</span> TForm1.CreateCard<span class="br0">&#40;</span>Index: <span style="color: #0080ff;">Integer</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  Pokemon, Sprites, Stats: TJSONObject;
  Nom, Categorie, SpriteURL, TypesStr, StatsText: <span style="color: #0080ff;">string</span>;
  TypesArray: TJSONArray;
  I, yPos, xPos, xOrigin: <span style="color: #0080ff;">Integer</span>;
  SurfaceW, SurfaceH: <span style="color: #0080ff;">Integer</span>;
  TargetW, TargetH: <span style="color: #0080ff;">Integer</span>;
  DestRect: TRect;
  CornerW, CornerH, Margin: <span style="color: #0080ff;">Integer</span>;
  RegionLeft, RegionTop, RegionRight, RegionBottom: <span style="color: #0080ff;">Integer</span>;
  StatsY: <span style="color: #0080ff;">Integer</span>;
  PSprite: TPngImage;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// R&eacute;cup&eacute;ration des donn&eacute;es JSON</span>
  Pokemon := FPokemonArray.Items<span class="br0">&#91;</span>Index<span class="br0">&#93;</span> <span style="color: #0000ff;">as</span> TJSONObject;
  Nom := Pokemon.GetValue&lt;TJSONObject&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'name'</span><span class="br0">&#41;</span>.GetValue&lt;string&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'fr'</span><span class="br0">&#41;</span>;
  Categorie := Pokemon.GetValue&lt;string&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'category'</span><span class="br0">&#41;</span>;
  Sprites := Pokemon.GetValue&lt;TJSONObject&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'sprites'</span><span class="br0">&#41;</span>;
  SpriteURL := Sprites.GetValue&lt;string&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'regular'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> SpriteURL &lt;&gt; <span style="color: #FF0000;">''</span> <span style="color: #0000ff;">then</span>
    PSprite := DownloadIm<span class="br0">&#40;</span>SpriteURL<span class="br0">&#41;</span>
  <span style="color: #0000ff;">else</span>
    PSprite := <span style="color: #0000ff;">nil</span>;
&nbsp;
  <span style="color: #808080;">// Concat&eacute;nation des types</span>
  TypesStr := <span style="color: #FF0000;">''</span>;
  TypesArray := Pokemon.GetValue&lt;TJSONArray&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'types'</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">for</span> I := <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">to</span> TypesArray.Count - <span style="color: #cc66cc;">1</span> <span style="color: #0000ff;">do</span>
    TypesStr := TypesStr + TypesArray.Items<span class="br0">&#91;</span>I<span class="br0">&#93;</span>.GetValue&lt;string&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'name'</span><span class="br0">&#41;</span> + <span style="color: #FF0000;">' '</span>;
  TypesStr := TypesStr.Trim;
&nbsp;
  <span style="color: #808080;">// Pr&eacute;paration du bitmap</span>
  Card.Picture.Bitmap.SetSize<span class="br0">&#40;</span>Card.Width, Card.Height<span class="br0">&#41;</span>;
  SurfaceW := Card.Picture.Bitmap.Width;
  SurfaceH := Card.Picture.Bitmap.Height;
&nbsp;
  <span style="color: #0000ff;">with</span> Card.Picture.Bitmap.Canvas <span style="color: #0000ff;">do</span>
  <span style="color: #0000ff;">begin</span>
    <span style="color: #808080;">// Dessin de l'image de fond DANS la carte (zone arrondie)</span>
    Margin := <span style="color: #cc66cc;">10</span>;
    CornerW := <span style="color: #cc66cc;">20</span>;
    CornerH := <span style="color: #cc66cc;">20</span>;
    RegionLeft := Margin;
    RegionTop := Margin;
    RegionRight := SurfaceW - Margin;
    RegionBottom := SurfaceH - Margin;
&nbsp;
    <span style="color: #808080;">// &Eacute;tire le fond dans le rectangle int&eacute;rieur arrondi</span>
    SetStretchBltMode<span class="br0">&#40;</span>Handle, HALFTONE<span class="br0">&#41;</span>;
    StretchDraw<span class="br0">&#40;</span>Rect<span class="br0">&#40;</span>RegionLeft, RegionTop, RegionRight, RegionBottom<span class="br0">&#41;</span>, FBackground<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Trace uniquement le contour arrondi</span>
    Pen.Color := clBlack;
    Pen.Width := <span style="color: #cc66cc;">3</span>;
    Brush.Style := bsClear;
    RoundRect<span class="br0">&#40;</span>RegionLeft, RegionTop, RegionRight, RegionBottom, CornerW, CornerH<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Passage en mode texte transparent</span>
    SetBkMode<span class="br0">&#40;</span>Handle, TRANSPARENT<span class="br0">&#41;</span>;
    Brush.Style := bsClear; <span style="color: #808080;">// garantit que l'arri&egrave;re-plan du texte n'&eacute;crase rien</span>
&nbsp;
    <span style="color: #808080;">// Position de d&eacute;part pour le texte</span>
    xOrigin := RegionLeft + <span style="color: #cc66cc;">10</span>;
    yPos := RegionTop + <span style="color: #cc66cc;">10</span>;
&nbsp;
    <span style="color: #808080;">// Nom</span>
    Font.Size := <span style="color: #cc66cc;">16</span>;
    Font.Style := <span class="br0">&#91;</span>fsBold<span class="br0">&#93;</span>;
    Font.Color := clBlack;
    TextOut<span class="br0">&#40;</span>xOrigin, yPos, Nom<span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>yPos, TextHeight<span class="br0">&#40;</span>Nom<span class="br0">&#41;</span> + <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Cat&eacute;gorie</span>
    Font.Size := <span style="color: #cc66cc;">10</span>;
    Font.Style := <span class="br0">&#91;</span>fsBold<span class="br0">&#93;</span>;
    TextOut<span class="br0">&#40;</span>xOrigin, yPos, Categorie<span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>yPos, TextHeight<span class="br0">&#40;</span>Categorie<span class="br0">&#41;</span> + <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Types</span>
    TextOut<span class="br0">&#40;</span>xOrigin, yPos, <span style="color: #FF0000;">'Type(s) : '</span> + TypesStr<span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>yPos, TextHeight<span class="br0">&#40;</span><span style="color: #FF0000;">'Type(s) : '</span> + TypesStr<span class="br0">&#41;</span> + <span style="color: #cc66cc;">10</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Sprite centr&eacute;</span>
    <span style="color: #0000ff;">if</span> Assigned<span class="br0">&#40;</span>PSprite<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      TargetW := <span class="br0">&#40;</span>RegionRight - RegionLeft<span class="br0">&#41;</span> <span style="color: #0000ff;">div</span> <span style="color: #cc66cc;">2</span>;
      TargetH := <span class="br0">&#40;</span>RegionBottom - RegionTop<span class="br0">&#41;</span> <span style="color: #0000ff;">div</span> <span style="color: #cc66cc;">2</span>;
      xPos := RegionLeft + <span class="br0">&#40;</span><span class="br0">&#40;</span>RegionRight - RegionLeft<span class="br0">&#41;</span> - TargetW<span class="br0">&#41;</span> <span style="color: #0000ff;">div</span> <span style="color: #cc66cc;">2</span>;
      DestRect := Rect<span class="br0">&#40;</span>xPos, yPos, xPos + TargetW, yPos + TargetH<span class="br0">&#41;</span>;
&nbsp;
      SetBrushOrgEx<span class="br0">&#40;</span>Handle, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #0000ff;">nil</span><span class="br0">&#41;</span>;
      StretchDraw<span class="br0">&#40;</span>DestRect, PSprite<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">end</span>;
&nbsp;
    <span style="color: #808080;">// Statistiques en bas</span>
    Stats := Pokemon.GetValue&lt;TJSONObject&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'stats'</span><span class="br0">&#41;</span>;
    StatsText := Format<span class="br0">&#40;</span><span style="color: #FF0000;">'PV: %d   ATK: %d   DEF: %d   VIT: %d'</span>,
      <span class="br0">&#91;</span>Stats.GetValue&lt;Integer&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'hp'</span><span class="br0">&#41;</span>, Stats.GetValue&lt;Integer&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'atk'</span><span class="br0">&#41;</span>,
      Stats.GetValue&lt;Integer&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'def'</span><span class="br0">&#41;</span>, Stats.GetValue&lt;Integer&gt;<span class="br0">&#40;</span><span style="color: #FF0000;">'vit'</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
    Font.Size := <span style="color: #cc66cc;">10</span>;
    Font.Style := <span class="br0">&#91;</span>fsBold<span class="br0">&#93;</span>;
    StatsY := RegionBottom - Margin - TextHeight<span class="br0">&#40;</span>StatsText<span class="br0">&#41;</span>;
    TextOut<span class="br0">&#40;</span>xOrigin, StatsY, StatsText<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #808080;">{ -------------------------------------------------------------------------------</span>
<span style="color: #808080;">&nbsp; T&eacute;l&eacute;chargement ou r&eacute;cup&eacute;ration en cache d&#146;un sprite PNG par URL</span>
<span style="color: #808080;">&nbsp; ------------------------------------------------------------------------------- }</span>
<span style="color: #0000ff;">function</span> TForm1.DownloadIm<span class="br0">&#40;</span><span style="color: #0000ff;">const</span> URL: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>: TPngImage;
<span style="color: #0000ff;">var</span>
  Http: THTTPClient;
  Response: IHTTPResponse;
  Stream: TMemoryStream;
<span style="color: #0000ff;">begin</span>
  <span style="color: #808080;">// Retourner l&#146;image du cache si elle existe</span>
  <span style="color: #0000ff;">if</span> FImageCache.TryGetValue<span class="br0">&#40;</span>URL, Result<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
    Exit;
&nbsp;
  <span style="color: #808080;">// Sinon t&eacute;l&eacute;charger l&#146;image</span>
  Http := THTTPClient.Create;
  Stream := TMemoryStream.Create;
  <span style="color: #0000ff;">try</span>
    Response := Http.Get<span class="br0">&#40;</span>URL, Stream<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">if</span> Response.StatusCode &lt;&gt; <span style="color: #cc66cc;">200</span> <span style="color: #0000ff;">then</span>
      <span style="color: #0000ff;">raise</span> Exception.CreateFmt<span class="br0">&#40;</span><span style="color: #FF0000;">'Erreur HTTP %d : %s'</span>, <span class="br0">&#91;</span>Response.StatusCode, Response.StatusText<span class="br0">&#93;</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Chargement en m&eacute;moire de l&#146;image PNG</span>
    Stream.Position := <span style="color: #cc66cc;">0</span>;
    Result := TPngImage.Create;
    Result.LoadFromStream<span class="br0">&#40;</span>Stream<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080;">// Stockage dans le cache pour usages futurs</span>
    FImageCache.Add<span class="br0">&#40;</span>URL, Result<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">finally</span>
    Http.Free;
    Stream.Free;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">end</span>.</pre></td></tr></table></code><hr />
</div><img src="https://www.developpez.net/forums/attachments/p669635d1755703438/environnements-developpement/delphi/codes-sources-telecharger/creation-cartes-pokemon/capture-d-ecran-2025-08-20-172331.png/" border="0" alt="Nom : Capture d'écran 2025-08-20 172331.png
Affichages : 295
Taille : 394,5 Ko"  style="float: CONFIG" /></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p669618d1755682047/environnements-developpement/delphi/codes-sources-telecharger/creation-cartes-pokemon/video_2025_08_20-3_edit_0.gif/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p669635d1755703438/environnements-developpement/delphi/codes-sources-telecharger/creation-cartes-pokemon/capture-d-ecran-2025-08-20-172331.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>XeGregory</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178712/environnements-developpement/delphi/codes-sources-telecharger/creation-cartes-pokemon/</guid>
		</item>
		<item>
			<title><![CDATA[[FMX] Effet de distorsion d'une image]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178466&amp;goto=newpost</link>
			<pubDate>Thu, 07 Aug 2025 07:44:49 GMT</pubDate>
			<description>Bonjour, 
 
Je vous propose...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Je vous propose un petit effet de distorsion sinusoïdale comme on pouvait en voir dans les jeux vidéo de mon enfance (exemple l'animation du fond dans le monde 2 de Thunder Force 3 sur Megadrive 
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/eYsjIwSnZ_A?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
)<br />
<br />
J'avais besoin d'un tel effet sur un jeu que je suis en train de développer.<br />
<br />
L'exemple proposé est un exemple pour Delphi FMX pur (pas d'utilisation de shader). Çà tourne pas mal sur de petites images mais pour optimiser cela, il faudrait passer par des shaders ;)<br />
<br />
Le principe est simple : on stocke l'image originale dans un TBitmap et on dessine dans un autre TBitmap. En fonction de différents critères (amplitude en X, fréquence en X, amplitude en Y, fréquence en X, fréquence en Y et de vitesse), on va récupérer la couleur du pixel à des coordonnées calculées pour écrire dans le pixel (x,y) du TBitmap de sortie cette couleur.<br />
<br />
Par exemple, si on souhaite une amplitude de 50 sur X, dans le TBitmap de sortie, on va forcer la couleur du pixel (x,y) à la couleur du pixel (x+50, y) du TBitmap d'origine. On utilise une fonction sinusoïdale pour affiner le rendu et aller progressivement de l'amplitude 0 à 50 puis de 50 à 0 et cela indéfiniment.<br />
<img src="https://www.developpez.net/forums/attachments/p669289d1754552454/environnements-developpement/delphi/codes-sources-telecharger/fmx-effet-distorsion-d-image/distorsion.png/" border="0" alt="Nom : distorsion.png
Affichages : 182
Taille : 457,7 Ko"  style="float: CONFIG" /><br />
<br />
Le ZIP du projet est dispo ici : <a href="https://www.developpez.net/forums/attachments/p669298d1754581789/environnements-developpement/delphi/codes-sources-telecharger/fmx-effet-distorsion-d-image/distortiondemo.7z/"  title="Nom : DistortionDemo.7z
Affichages : 78
Taille : 99,7 Ko">DistortionDemo.7z</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p669289d1754552454/environnements-developpement/delphi/codes-sources-telecharger/fmx-effet-distorsion-d-image/distorsion.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	
		<fieldset class="fieldset">
			<legend>Fichiers attachés</legend>
			<ul>
			<li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/7z.gif" alt="Type de fichier : 7z" />
	<a href="https://www.developpez.net/forums/attachments/p669298d1754581789/environnements-developpement/delphi/codes-sources-telecharger/fmx-effet-distorsion-d-image/distortiondemo.7z/">DistortionDemo.7z</a> 
(99,7 Ko)
</li>
			</ul>
		</fieldset>
	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1769/environnements-developpement/delphi/codes-sources-telecharger/">Codes sources à télécharger</category>
			<dc:creator>gbegreg</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178466/environnements-developpement/delphi/codes-sources-telecharger/fmx-effet-distorsion-d-image/</guid>
		</item>
	</channel>
</rss>
