<?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>Thu, 05 Nov 2026 18:46: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[Animation d'attente VCL/FMX..]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185677&amp;goto=newpost</link>
			<pubDate>Tue, 15 Sep 2026 16:10:03 GMT</pubDate>
			<description>Le code suivant montre la...</description>
			<content:encoded><![CDATA[<div>Le code suivant montre la création d'une animation affichée pendent le téléchargement ou un traitement long:<br />
VCL:<br />
Une forme  Timer, TImage:<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 />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 /></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>
 Bmp := Image1.Picture.Bitmap;
 <span style="color: #0000ff;">with</span> Bmp <span style="color: #0000ff;">do</span>
 <span style="color: #0000ff;">begin</span>
    width := <span style="color: #cc66cc;">300</span>;
    height := <span style="color: #cc66cc;">300</span>;
 <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.DArc<span class="br0">&#40;</span>CenterX, CenterY, Radius: <span style="color: #0080ff;">Integer</span>; AngleStart, AngleEnd: <span style="color: #0080ff;">Double</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  X1, Y1, X2, Y2: <span style="color: #0080ff;">Integer</span>;
  X3, Y3, X4, Y4: <span style="color: #0080ff;">Integer</span>;
  RadStart, RadEnd: <span style="color: #0080ff;">Double</span>;
<span style="color: #0000ff;">begin</span>
  X1 := CenterX - Radius;
  Y1 := CenterY - Radius;
  X2 := CenterX + Radius;
  Y2 := CenterY + Radius;
&nbsp;
  RadStart := AngleStart * Pi / <span style="color: #cc66cc;">180</span>;
  RadEnd   := AngleEnd * Pi / <span style="color: #cc66cc;">180</span>;
&nbsp;
  X3 := CenterX + Round<span class="br0">&#40;</span>Radius * Cos<span class="br0">&#40;</span>RadStart<span class="br0">&#41;</span><span class="br0">&#41;</span>;
  Y3 := CenterY + Round<span class="br0">&#40;</span>Radius * Sin<span class="br0">&#40;</span>RadStart<span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
  X4 := CenterX + Round<span class="br0">&#40;</span>Radius * Cos<span class="br0">&#40;</span>RadEnd<span class="br0">&#41;</span><span class="br0">&#41;</span>;
  Y4 := CenterY + Round<span class="br0">&#40;</span>Radius * Sin<span class="br0">&#40;</span>RadEnd<span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
  Bmp.Canvas.Brush.Color := clWhite;
  Bmp.Canvas.FillRect<span class="br0">&#40;</span>ClientRect<span class="br0">&#41;</span>;
  Bmp.Canvas.Pen.Color := clSkyBlue;
  Bmp.Canvas.Pen.Width := <span style="color: #cc66cc;">10</span>;
  Bmp.Canvas.Arc<span class="br0">&#40;</span>X1, Y1, X2, Y2, X4, Y4, X3, Y3<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
&nbsp;
<span style="color: #0000ff;">var</span>
 CPos, P2, total: <span style="color: #0080ff;">integer</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.Timer1Timer<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">const</span>
  N  = <span style="color: #cc66cc;">30</span>;
  N2 = N * <span style="color: #cc66cc;">10</span> <span style="color: #0000ff;">div</span> <span style="color: #cc66cc;">15</span>;
  K1 = <span style="color: #cc66cc;">180</span> <span style="color: #0000ff;">div</span> N2;
  K2 = <span style="color: #cc66cc;">360</span> <span style="color: #0000ff;">div</span> N2;
  K3 = <span style="color: #cc66cc;">90</span>  <span style="color: #0000ff;">div</span> N2;
&nbsp;
<span style="color: #0000ff;">var</span>
  Curr: <span style="color: #0080ff;">Integer</span>;
<span style="color: #0000ff;">begin</span>
&nbsp;
  Curr := total <span style="color: #0000ff;">mod</span> N;
  Inc<span class="br0">&#40;</span>total<span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #0000ff;">if</span> Curr = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    CPos := P2 - <span style="color: #cc66cc;">2</span>;
    Inc<span class="br0">&#40;</span>P2, K1<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span> <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> Curr &lt; N2 <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    Inc<span class="br0">&#40;</span>CPos, K1<span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>P2, K2<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span> <span style="color: #0000ff;">else</span>
  <span style="color: #0000ff;">begin</span>
    Inc<span class="br0">&#40;</span>CPos, K1 * <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span>;
    Inc<span class="br0">&#40;</span>P2, K3<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">end</span>;
&nbsp;
  DArc<span class="br0">&#40;</span><span style="color: #cc66cc;">150</span>, <span style="color: #cc66cc;">150</span>, <span style="color: #cc66cc;">40</span>, CPos <span style="color: #0000ff;">mod</span> <span style="color: #cc66cc;">360</span>, P2 <span style="color: #0000ff;">mod</span> <span style="color: #cc66cc;">360</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></code><hr />
</div>Pour FMX remplacer l'image par un TArc et replacer DArc par le code suivant:<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 /></div></td><td valign="top"><pre style="margin: 0">  Arc1.StartAngle := CPos;
  Arc1.EndAngle := P2 - CPos;</pre></td></tr></table></code><hr />
</div><img src="https://i.ibb.co/FbrF99s4/spinning.gif" border="0" alt="" /></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>Invité</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185677/environnements-developpement/delphi/codes-sources-telecharger/animation-d-attente-vcl-fmx/</guid>
		</item>
		<item>
			<title><![CDATA[Calcul de la taille (Height & With) d'un TPopupMenu de FireMonkey]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184732&amp;goto=newpost</link>
			<pubDate>Sat, 18 Jul 2026 14:13:00 GMT</pubDate>
			<description>Bonjour, 
 
Comme plusieurs...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Comme plusieurs développeurs, je me suis heurté à l'absence de propriété et/ou de fonction donnant les dimensions (hauteur et largeur) d'un popup menu dans l’environnement FMX.<br />
Aussi, j'ai crée un &quot;class helper&quot; pour les composants FMX.Menus.TPopupMenu qui présente la propriété &quot;Size&quot; recherchée<br />
<br />
Je vous livre ici l'unité &quot;uMenusHelper.pas&quot; définissant cette classe. Le code reprend une partie du code en implémentation de l'unité FMX.Menus de Delphi car les classes nécessaires ne sont pas accessibles autrement</div>


	<div style="padding:10px">

	

	

	

	
		<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/p677622d1784408485/environnements-developpement/delphi/codes-sources-telecharger/calcul-taille-height-with-d-tpopupmenu-firemonkey/umenushelper./">uMenusHelper.pas</a> 
(24,9 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><![CDATA[Didier LOZAC'H]]></dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184732/environnements-developpement/delphi/codes-sources-telecharger/calcul-taille-height-with-d-tpopupmenu-firemonkey/</guid>
		</item>
		<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 : 576
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 : 151
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 : 309
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 : 103
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 : 291
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 : 285
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 : 273
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 : 273
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 : 274
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 : 274
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 : 216
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 : 201
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>
	</channel>
</rss>
