<?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 - Blogs</title>
		<link>https://www.developpez.net/forums/blogs/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Sun, 02 Aug 2026 07:40:39 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs</title>
			<link>https://www.developpez.net/forums/blogs/</link>
		</image>
		<item>
			<title>EmmaDE6 1.02 améliore encore l’accessibilité aux déficients visuels</title>
			<link>https://www.developpez.net/forums/blogs/837113-patrick_emmabuntus/b10789/emmade6-1-02-ameliore-l-accessibilite-aux-deficients-visuels/</link>
			<pubDate>Sat, 01 Aug 2026 09:04:07 GMT</pubDate>
			<description>Ce 27 juillet 2026, le...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font size="3">Ce 27 juillet 2026, le collectif Emmabuntüs vient d’annoncer la sortie de sa nouvelle version Emmabuntüs Debian Édition 6 1.02, basée sur la Debian 13.6 Trixie et supportant les deux environnements de bureau XFCE et LXQt.</font><br />
<br />
<font size="3">Rappelons que cette distribution est née au sein du Mouvement Emmaüs, pour faciliter le reconditionnement des ordinateurs donnés aux associations, notamment humanitaires, mais aussi pour favoriser la découverte de GNU/Linux par les débutants, tout en prolongeant la durée de vie du matériel informatique, ce qui réduit le gaspillage lié à la surconsommation de matière première.</font><br />
<br />
<font size="3">La nouvelle évolution de cette distribution concerne essentiellement des améliorations en matière d’accessibilité avec notamment un retour à la version stable d'Orca 48.1.1  ainsi qu’une meilleure prise en charge de la synthèse vocale Piper, ce qui améliore notablement le confort d’écoute du système.<br />
Cette distribution a été utilisée lors de la première séance de formation dispensée au Centre Polyvalent Saint-Augustin de Lomé, à l'intention des futurs référents représentant les 10 structures spécialisées pour les personnes déficientes visuelles du Togo.</font><br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachment.php?attachmentid=677955&amp;d=1785574790" border="0" alt="Nom : 1er_formation_accessibilite_Lome_800.jpeg
Affichages : 10
Taille : 90,8 Ko"  style="float: CONFIG" /><br />
Première séance de formation au Centre  Polyvalent Saint-Augustin de Lomé, du 9 au 10 juillet 2026</div><br />
<font size="3">Pour mémoire ces actions se font en collaboration étroite avec  l’<a href="https://yovotogo.fr/" target="_blank">A.S.I. YOVOTOGO</a> qui prévoit aussi l’installation d’une première salle informatique au Cameroun, marquant une nouvelle étape dans l’expansion géographique de ses actions dans cette région d’Afrique. </font><br />
<br />
<font size="3"><b>Aller plus loin :</b><br />
<ul><li style=""><a href="https://yovotogo.fr/formation-emmadapte-a-lome/" target="_blank">11 représentants des structures spécialisées prennent en main l’informatique inclusive </a></li><li style=""><a href="https://emmabuntus.org/interviews-realisees-suite-a-la-premiere-formation-sur-laccessibilite/" target="_blank">Interviews réalisées suite à la première formation sur l’accessibilité </a></li><li style=""><a href="https://emmabuntus.org/manuel-des-fonctions-daccessibilite-dans-emmabuntus/" target="_blank">Manuel des fonctions d’accessibilité dans Emmabuntüs </a></li><li style=""><a href="https://emmabuntus.org/accessibilite/" target="_blank">Page sur l’accessibilité d’Emmabuntüs </a></li><li style=""><a href="https://emmabuntus.org/le-27-juillet-2026-emmade6-1-02-amelioration-de-laccessibilite/" target="_blank">Le 27 juillet 2026, EmmaDE6 1.02 amélioration de l’accessibilité</a></li><li style=""><a href="http://htt&#91;/SIZE]ps://emmabuntus.org/contact/" target="_blank">Contacter Emmabuntüs </a></li></ul></font></blockquote>

]]></content:encoded>
			<dc:creator>Patrick_Emmabuntus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/837113-patrick_emmabuntus/b10789/emmade6-1-02-ameliore-l-accessibilite-aux-deficients-visuels/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Août)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10788/nouveau-pack-ressources-offertes-fab-aout/</link>
			<pubDate>Wed, 29 Jul 2026 10:25:50 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">une <a href="https://www.fab.com/listings/a7000a7c-c5fe-45f3-b8df-3e85c576b6c1" target="_blank">gigantesque cave</a> où vivrait un dragon ;</li><li style="">un <a href="https://www.fab.com/listings/9d27e228-5ee3-4bb5-a4a2-87ba386cb53a" target="_blank">outil pour manipuler les surfaces</a> ;</li><li style="">des <a href="https://www.fab.com/listings/7daaf336-d19a-4510-8151-92818bb48cf6" target="_blank">ruines de l'Atlantide</a>.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10788/nouveau-pack-ressources-offertes-fab-aout/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Juillet)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10787/nouveau-pack-ressources-offertes-fab-juillet/</link>
			<pubDate>Wed, 15 Jul 2026 15:23:57 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/dcbb4d37-622a-44d1-beba-5a8d37d4c9eb" target="_blank">système</a> pour gérer les différents niveaux de difficultés dans votre jeu ;</li><li style="">un <a href="https://www.fab.com/listings/587858fc-892c-4594-a5e0-3d243b00531d" target="_blank">village modulaire dans un style low-poly</a> ;</li><li style="">ensemble <a href="https://www.fab.com/listings/51547bf5-5b85-4c71-8b1c-0dd20a19c3f8" target="_blank">d'arbres vivants</a>.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10787/nouveau-pack-ressources-offertes-fab-juillet/</guid>
		</item>
		<item>
			<title>Nous avons indexé 86 000 extensions Claude Code, Codex et Cursor : ce que disent les données</title>
			<link>https://www.developpez.net/forums/blogs/1864575-skillselion/b10782/avons-indexe-86-000-extensions-claude-code-codex-cursor-disent-donnees/</link>
			<pubDate>Thu, 02 Jul 2026 20:13:14 GMT</pubDate>
			<description>Image :...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><img src="https://raw.githubusercontent.com/skillselion/blog-assets/master/homepage.png" border="0" alt="" /><br />
<br />
86 047. C'est le nombre d'extensions pour Claude Code, Codex et Cursor que nous indexons chez <a href="https://skillselion.com" target="_blank">Skillselion</a>, rafraîchi chaque jour. Nous avons trié tout le catalogue selon ce que fait réellement chaque extension. La répartition dit quelque chose de gênant sur l'endroit où la communauté passe son temps.<br />
<br />
<font size="5"><b>Le catalogue en chiffres</b></font><br />
<br />
Cette semaine, à travers Claude Code, Codex, Cursor et les autres agents de code :<br />
<br />
<ul><li style=""><b>86 047</b> extensions au total</li><li style=""><b>65 933</b> agent skills</li><li style=""><b>9 828</b> marketplaces de plugins</li><li style=""><b>7 901</b> serveurs MCP</li><li style=""><b>2 385</b> plugins</li><li style=""><b>120,2 millions</b> d'installations enregistrées</li></ul><br />
<br />
Les skills représentent 77 % du catalogue. Un skill, c'est un seul fichier SKILL.md : n'importe qui avec un éditeur de texte et un git push en publie un.<br />
<br />
<img src="https://raw.githubusercontent.com/skillselion/blog-assets/master/skills-directory.png" border="0" alt="" /><br />
<br />
<font size="5"><b>Ce que tout le monde construit</b></font><br />
<br />
Triez par la tâche que chaque extension accomplit, et le schéma saute aux yeux :<br />
<br />
<ul><li style=""><b>Outillage d'agent : 37 265</b> (contexte, mémoire, orchestration, sous-agents)</li><li style=""><b>Intégrations : 12 165</b> (agents branchés à des API et des services)</li><li style=""><b>Backend : 6 786</b></li><li style=""><b>Frontend : 5 070</b></li><li style=""><b>Sécurité et revue de code : 2 386</b></li><li style=""><b>Documentation : 1 897</b></li></ul><br />
<br />
L'outillage d'agent dépasse à lui seul le backend, le frontend, la doc et la sécurité réunis. Les développeurs affûtent d'abord l'agent, avant de le pointer vers le produit lui-même.<br />
<br />
<img src="https://raw.githubusercontent.com/ItzikDabush/skillselion-blog-assets/main/build-vs-ship-gap.png" border="0" alt="" /><br />
<br />
<font size="5"><b>Le créneau que presque personne ne travaille</b></font><br />
<br />
Comptez maintenant les extensions pour diffuser et faire grandir un produit, plutôt que pour le construire :<br />
<br />
<ul><li style=""><b>Lancement et distribution : 627</b></li><li style=""><b>Optimisation pour les stores (ASO) : 107</b></li><li style=""><b>Optimisation pour les moteurs génératifs (GEO) : 71</b></li><li style=""><b>Audience et positionnement : 84</b></li></ul><br />
<br />
Soixante-et-onze extensions vous aident à mettre votre travail devant des utilisateurs. Trente-sept mille aident l'agent à écrire du code. Si vous construisez pour ces agents et cherchez un créneau que personne n'encombre, cet espace est grand ouvert.<br />
<br />
<font size="5"><b>Le vrai problème, c'est de trouver la bonne</b></font><br />
<br />
66 000 skills, ce n'est pas trop peu. C'est trop pour tenir dans une tête. Vous ne vous souviendrez pas qu'un skill existe au moment où vous en avez besoin, et vous ne ferez pas défiler une liste de 66 000 lignes en plein travail.<br />
<br />
Deux choses sur lesquelles nous nous appuyons :<br />
<br />
<ol class="decimal"><li style=""><b>Classer par installations, pas par étoiles.</b> Une étoile veut dire que quelqu'un a mis en favori. Une installation veut dire que quelqu'un l'a lancée. Le haut de ces deux listes ne se recoupe presque pas.</li><li style=""><b>Récupérer les skills en plein travail.</b> Nous avons construit un MCP qui interroge le catalogue depuis l'intérieur de l'agent. Décrivez le manque en langage courant, récupérez le skill le mieux classé, continuez à travailler. Ça tourne dans Claude Code, Codex et Cursor.</li></ol><br />
<br />
<img src="https://raw.githubusercontent.com/skillselion/blog-assets/master/skill-detail.png" border="0" alt="" /><br />
<br />
<font size="5"><b>Voyez ce qui compte pour votre stack</b></font><br />
<br />
Tapez votre stack dans le catalogue et regardez quels skills les gens installent vraiment, sans inscription : <a href="https://skillselion.com" target="_blank">skillselion.com</a>. Ou glissez le loader, <a href="https://github.com/skillselion/skillselion-mcp" target="_blank">skillselion-mcp</a>, dans votre agent, et laissez-le récupérer le bon skill la prochaine fois que vous bloquez.<br />
<br />
Les chiffres viennent du catalogue en direct au jour de la rédaction, découverts chaque jour depuis skills.sh, GitHub et les registres MCP, et classés par installations réelles. Projet indépendant, non affilié à Anthropic, OpenAI ou Cursor.</blockquote>

]]></content:encoded>
			<dc:creator>Skillselion</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/1864575-skillselion/b10782/avons-indexe-86-000-extensions-claude-code-codex-cursor-disent-donnees/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Juillet)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10781/nouveau-pack-ressources-offertes-fab-juillet/</link>
			<pubDate>Wed, 01 Jul 2026 13:30:01 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/81880856-a0e1-492f-8686-3afbda15ab43" target="_blank">ensemble pour faire un ensemble désertique de science-fiction</a> ;</li><li style="">un <a href="https://www.fab.com/listings/6a31d7ae-c5a3-4d96-bc7a-8406404cf2d3" target="_blank">système pour faire un RPG basé sur un jeu de puzzle</a> (Match-3) ;</li><li style="">des <a href="https://www.fab.com/listings/a4b04697-30c1-4745-ae2f-a706278300bd" target="_blank">effets visuels de traînées</a>.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10781/nouveau-pack-ressources-offertes-fab-juillet/</guid>
		</item>
		<item>
			<title>Knowledge Graph : une architecture de description de la connaissance</title>
			<link>https://www.developpez.net/forums/blogs/893250-rhona-maxwel/b10780/knowledge-graph-architecture-description-connaissance/</link>
			<pubDate>Thu, 18 Jun 2026 04:31:25 GMT</pubDate>
			<description>https://www.urbanisation-si.co...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><a href="https://www.urbanisation-si.com/meilleures-pratiques-pour-les-deux-cycles-de-vie-d-un-knowledge-graph-1" target="_blank">https://www.urbanisation-si.com/meil...wledge-graph-1</a><br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=677018&amp;d=1781757262" border="0" alt="Nom : knowledge-graph-architecture-de-description-de-la-connaissance.png
Affichages : 1031
Taille : 172,6 Ko"  style="float: CONFIG" /><br />
<br />
La spécificité des Knowledge Graphs, c’est d’être à la fois des réponses pour relier des ensembles de données dispersés avec une véritable approche d’interopérabilité sémantique et pouvoir raisonner sur ces données. D’une part, ils permettent de qualifier intelligemment (stricto sensu, de manière intelligible) la nature du rapprochement qu’on peut faire entre les données. D’autre part, ils sont source de raisonnements à base de déduction, totalement explicable sur la base de règles prédéfinies (explainable AI). Ils permettent des inférences logiques et non des analyses statistiques de corrélations possibles.</blockquote>

]]></content:encoded>
			<dc:creator>Rhona Maxwel</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/893250-rhona-maxwel/b10780/knowledge-graph-architecture-description-connaissance/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Juin)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10779/nouveau-pack-ressources-offertes-fab-juin/</link>
			<pubDate>Tue, 16 Jun 2026 17:16:55 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/0ffccb05-d04a-4ad3-90ed-b8354d6ca7ce" target="_blank">château blanc</a> ;</li><li style="">des <a href="https://www.fab.com/listings/8ecc05ee-7447-4a8a-af10-1adccc7e8bd2" target="_blank">personnages stylisés</a> ;</li><li style="">un environnement de <a href="https://www.fab.com/listings/c1d714a2-288f-4bfa-a820-ec0406d51c8a" target="_blank">docks</a>.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10779/nouveau-pack-ressources-offertes-fab-juin/</guid>
		</item>
		<item>
			<title>Application Boussole pour Android</title>
			<link>https://www.developpez.net/forums/blogs/27025-gouyon/b10778/application-boussole-android/</link>
			<pubDate>Fri, 05 Jun 2026 12:14:09 GMT</pubDate>
			<description>Pour valider les résultats...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pour valider les résultats d'une autre application, j'ai eu besoin d'une boussole. Dans un premier temps je me suis dis &quot;bon il doit y en avoir un paquet sur le playstore&quot; et puis je me suis dis finalement c'est une opportunité de développé quelque chose et de voir comment utiliser les capteurs d'un téléphone.<br />
<br />
Alors inutile de dire que le démarrage à été difficile. La documentation est très succincte voir pas à jour et parfois complètement à coté de la plaque. Mr Embarcadero vos produits sont très bon mais pitié faite un gros effort sur la documentation. Finalement j'ai été sauvé par le livre <b>Expert Delphi</b> de <b>Pawel Glowacki</b> qui trainait dans ma bibliothèque. Dans lequel il y a tout un chapitre consacré aux capteur et qui est très explicite.<br />
<br />
Donc sur ma fiche j'ai déposé les composants suivants:<br />
<ul><li style="">un TOrientationSensor pour accès au capteur d'orientation</li><li style="">un TMotionSensor pour avoir l'attitude du téléphone dans l'espace. Ce n'est pas nécessaire au premier ordre mais indispensable si on veut des résultats corrects quelque soit l'orientation du téléphone.</li><li style="">un TTimer pour cadencer le rafraichissement de la boussole</li><li style="">un TBoussole qui est un composant graphique que j'ai développé voir mon billet  <a href="https://www.developpez.net/forums/blogs/27025-gouyon/b9556/composants-daffichage-fmx-delphi/" target="_blank">Composants d'affichage FMX pour Delphi </a> et qui va afficher la direction.</li></ul><br />
<br />
Et voici ce que ça donne<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=676757&amp;d=1780659719" border="0" alt="Nom : boussole1.JPG
Affichages : 917
Taille : 60,1 Ko"  style="float: CONFIG" /><br />
<br />
Et voici le code<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><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 /></div></td><td valign="top"><pre style="margin: 0">unit BoussoleMainFrm;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Sensors, FMX.Objects, Boussole,
  System.Sensors.Components, FMX.Layouts, FMX.Controls.Presentation, FMX.StdCtrls;

type
  TBoussoleForm = class(TForm)
    laBoussole: TOrientationSensor;
    visuBoussole: TBoussole;
    TimerBsl: TTimer;
    Path1: TPath;
    Layout1: TLayout;
    Accelero: TMotionSensor;
    Layout2: TLayout;
    Label4: TLabel;
    Label5: TLabel;
    SwBrtMoy: TSwitch;
    procedure majDirection(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SwBrtMoySwitch(Sender: TObject);
  private
    { Déclarations privées }
    nb: integer;
    mzs, mxs, mys, axs, ays, azs: array [0 .. 4] of double;
  public
    { Déclarations publiques }
  end;

var
  BoussoleForm: TBoussoleForm;

implementation

uses math;
{$R *.fmx}

procedure TBoussoleForm.FormCreate(Sender: TObject);
begin
  nb := 0;
end;

procedure TBoussoleForm.majDirection(Sender: TObject);
var
  lmz, lmx, lmy, lax, lay, laz: double;
  lalpha: double;
  xh, yh, pitch, roll: double;
  I: integer;
begin
  // ATTENTION Si my est négatif quant on pointe vers le nord, il faut inverser mx et my
  lmx := laBoussole.Sensor.HeadingX;
  lmy := laBoussole.Sensor.HeadingY;
  lmz := laBoussole.Sensor.Headingz;
  // Calcul des angles de roulis et tangage
  lax := Accelero.Sensor.AccelerationX;
  lay := Accelero.Sensor.AccelerationY;
  // ATTENTION selon la convention de l'OS,
  // la sortie du capteur doit être inversée sinon le nord est au sud et vice versa
  laz := -Accelero.Sensor.AccelerationZ;

  if SwBrtMoy.IsChecked then
  begin
    if nb = 5 then
    begin
      for I := 0 to 3 do
      begin
        mxs[I] := mxs[I + 1];
        mys[I] := mys[I + 1];
        mzs[I] := mzs[I + 1];
        axs[I] := axs[I + 1];
        ays[I] := ays[I + 1];
        azs[I] := azs[I + 1];
      end;
    end
    else
      inc(nb);
    mxs[nb - 1] := lmx;
    mys[nb - 1] := lmy;
    mzs[nb - 1] := lmz;
    axs[nb - 1] := lax;
    ays[nb - 1] := lay;
    azs[nb - 1] := laz;

    lmx := 0;
    lmy := 0;
    lmz := 0;
    lax := 0;
    lay := 0;
    laz := 0;
    for I := 0 to nb - 1 do
    begin
      lmx := lmx + mxs[I];
      lmy := lmy + mys[I];
      lmz := lmz + mzs[I];
      lax := lax + axs[I];
      lay := lay + ays[I];
      laz := laz + azs[I];
    end;
    lmx := lmx / nb;
    lmy := lmy / nb;
    lmz := lmz / nb;
    lax := lax / nb;
    lay := lay / nb;
    laz := laz / nb;
  end;

  pitch := arctan2(-lax, sqrt(lay * lay + laz * laz));
  roll := arctan2(lay, laz);
  xh := lmx * cos(pitch) + lmz * sin(pitch);
  yh := lmx * sin(roll) * sin(pitch) + lmy * cos(roll) - lmz * sin(roll) * cos(pitch);
  lalpha := arctan2(-xh, yh);
  if lalpha &lt; 0 then
    lalpha := lalpha + 2 * pi;
  visuBoussole.Valeur := lalpha / pi * 180;
end;

procedure TBoussoleForm.SwBrtMoySwitch(Sender: TObject);
begin
  nb := 0;
end;

end.</pre></td></tr></table></pre>
</div><b><u>Quelque précisions</u></b><br />
<br />
Le code aurait pu être beaucoup plus simple si mon téléphone avait eu accès à ces propriétes (MagHeading, TrueHeading, CompMagHeading, CompTrueHeading) du capteur d'orientation.<br />
Malheureusement ce n'est pas le cas donc il a fallu écrire quelque chose de plus complexe.<br />
<br />
Après quelques recherche j'ai trouvé que <br />
<br />
<ul><li style="">HeadingX correspond à l'axe horizontal gauche/droite (pointe vers la droite de l'écran)</li><li style="">HeadingY correspond à l'axe horizontal bas/haut (pointe vers le haut de l'écran)</li><li style="">HeadingZ correspond à l'axe vertical (pointe vers l'extérieur de l'écran)</li></ul><br />
<br />
A partir de là en utilisant <i>HeadingX</i> et<i> HeadingY</i> on peut retrouver la direction grâce à la fonction <i>arctan2</i>. Ceci fonctionne bien si le téléphone est à plat sur une surface horizontale. Si ce n'est pas le cas il faut corriger les angles par rapport à l'orientation du téléphone dans l'espace. <br />
<br />
Pour ceux que ça intéresse il s'agit de rotation de repère dans l'espace. On parle assez souvent d'angles d'Euler vous trouverez pas mal de documentation sur le sujet (<a href="https://mecaspa.cannes-aero-patrimoine.net/SCAO/EULER/euler.htm" target="_blank">Exemple</a>)<br />
<br />
Enfin afin d'augmenter un peu la précision j'ai ajouté la possibilité de moyenner les résultats pour avoir une mesure plus précise. <font color="#FF0000">ATTENTION</font> c'est à n'utiliser que quand le téléphone est statique sinon les résultats ne sont pas terribles.</blockquote>

]]></content:encoded>
			<dc:creator>Gouyon</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/27025-gouyon/b10778/application-boussole-android/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Juin)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10777/nouveau-pack-ressources-offertes-fab-juin/</link>
			<pubDate>Tue, 02 Jun 2026 17:37:17 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">une <a href="https://www.fab.com/listings/0667e321-31a7-40ed-b85c-6db5bbc4366b" target="_blank">station scientifique modulaire</a> ;</li><li style="">un <a href="https://www.fab.com/listings/16b82fb0-7ea5-4627-adcc-95f23a387b61" target="_blank">système d'inventaire en grille</a> ;</li><li style="">un <a href="https://www.fab.com/listings/2931e0fc-b1c0-4d6d-be28-95f6c22974d5" target="_blank">ensemble de modèle d'objets de survie</a>.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10777/nouveau-pack-ressources-offertes-fab-juin/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Mai)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10776/nouveau-pack-ressources-offertes-fab-mai/</link>
			<pubDate>Wed, 20 May 2026 19:06:17 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/88cd6710-40d1-4afc-8f44-c8f42bd9df26" target="_blank">ensemble de modèles</a> de maisons faites avec des conteneurs ;</li><li style="">des <a href="https://www.fab.com/listings/ea85f730-1f39-4b15-8a69-60975d3b39a7" target="_blank">scans</a> d'une crypte en ruine ;</li><li style="">un <a href="https://www.fab.com/listings/bc34bd60-93e6-4039-bddd-d0162d5af74d" target="_blank">système</a> pour simuler des vitres en verre trempé, destructibles ;</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10776/nouveau-pack-ressources-offertes-fab-mai/</guid>
		</item>
		<item>
			<title>Les nouvelles fonctionnalités d’IA opérationnelles ou à venir de la solution d’Architecture d’Entreprise Obeo</title>
			<link>https://www.developpez.net/forums/blogs/893250-rhona-maxwel/b10775/nouvelles-fonctionnalites-d-ia-operationnelles-venir-solution-d-architecture-d-entreprise-obeo/</link>
			<pubDate>Tue, 19 May 2026 04:24:15 GMT</pubDate>
			<description>Recherche assistée par l’IA 
...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Recherche assistée par l’IA<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=676399&amp;d=1779164545" border="0" alt="Nom : architecture-ia-agentique-obeo-smartea-web-04.png
Affichages : 1087
Taille : 270,4 Ko"  style="float: CONFIG" /><br />
<br />
<a href="https://www.urbanisation-si.com/les-nouvelles-fonctionnalites-dia-operationnelles-ou-a-venir-de-la-solution-darchitecture-dentreprise-obeo-smartea" target="_blank">https://www.urbanisation-si.com/les-...e-obeo-smartea</a><br />
<br />
Cette fonctionnalité est encore expérimentale, mais on la trouve déjà dans la version 9 d’Obeo SmartEA. L'éditeur laisse la liberté à l’utilisateur de choisir son LLM entre 2 fournisseurs : le français Mistral ou l’américain OpenAI.<br />
La stratégie d’Obeo n’a pas été d'exposer le référentiel au LLM, mais de lui faire traduire une requête en langage naturel dans un langage technique. La confidentialité est assurée, aucune donnée utilisateur n’étant jamais envoyée. Ce langage technique open source utilisé dans SmartEA s’appelle AQL (Acceleo Query Language). Il se rapproche d’OCL (Object Constraint Language - norme OMG). Obeo a eu de la chance, car la plupart des LLM ont appris ce langage en analysant les documentations et les nombreux exemples, sans oublier son code source. L'Open Source a permis le partage de connaissances entre humains, sans entraves et maintenant avec les IA ! Un avantage inattendu, mais qui a de nombreuses conséquences, notamment dans le vibe coding et la réalisation d'applications par IA. Donc pas d’apprentissage, il vous suffit de configurer l’appel à l’API du LLM choisi (URL, clé…) et le tour est joué. Un prompt posant le contexte (« Tu es un développeur Acceleo Query Language… ») est déjà fourni dans un fichier modifiable.</blockquote>

]]></content:encoded>
			<dc:creator>Rhona Maxwel</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/893250-rhona-maxwel/b10775/nouvelles-fonctionnalites-d-ia-operationnelles-venir-solution-d-architecture-d-entreprise-obeo/</guid>
		</item>
		<item>
			<title>Retro Cloner, un outil pour faire des jeux retro sur Windows/MacOS/Linux</title>
			<link>https://www.developpez.net/forums/blogs/70032-djpoke/b10774/retro-cloner-outil-faire-jeux-retro-windows-macos-linux/</link>
			<pubDate>Mon, 18 May 2026 10:47:48 GMT</pubDate>
			<description>Bonjour, 
 
Je suis en train...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour,<br />
<br />
Je suis en train de développer un logiciel avec Löve2d. Il permet de faire des jeux retro rapidement et sans programmation. Il immite le hardware graphique de l'Amstrad CPC, du Commodore 64, du ZX Spectrum, de l'Atari ST ou de l'Amiga.<br />
<br />
Attention, il est encore en travaux, et j'en ai encore peut-être pour trois semaines un mois avant d'avoir une première version beta. Mais le logiciel est fourni avec des petites demos, qui évoluent au fur et à mesure.<br />
<br />
Téléchargez le (gratuit et en license MIT) sur GitHub : <a href="https://github.com/DjPoke/RetroCloner" target="_blank">https://github.com/DjPoke/RetroCloner</a><br />
<br />
Enjoy :D</blockquote>

]]></content:encoded>
			<dc:creator>DjPoke</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/70032-djpoke/b10774/retro-cloner-outil-faire-jeux-retro-windows-macos-linux/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Mai)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10771/nouveau-pack-ressources-offertes-fab-mai/</link>
			<pubDate>Wed, 06 May 2026 18:32:03 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/b6a85679-47f0-4f59-aa6d-da9d5f59aee5" target="_blank">ensemble modulaire</a>, low poly, pour créer une ville ;</li><li style="">une <a href="https://www.fab.com/listings/3413113f-147a-4fc9-bd9f-7c543934969a" target="_blank">créature mécanique</a> dans un style steampunk ;</li><li style="">des <a href="https://www.fab.com/listings/0e920fbc-fb78-4331-a4e1-878dc3504bad" target="_blank">effets</a> pour reproduire les reflets de lentille.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10771/nouveau-pack-ressources-offertes-fab-mai/</guid>
		</item>
		<item>
			<title><![CDATA[[FMX] Un dialogue d'ouverture de fichier "stylisé" - partie arborescence]]></title>
			<link>https://www.developpez.net/forums/blogs/138527-sergiomaster/b10770/fmx-dialogue-d-ouverture-fichier-stylise-partie-arborescence/</link>
			<pubDate>Sun, 26 Apr 2026 09:40:18 GMT</pubDate>
			<description>Au risque de réinventer une...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Au risque de réinventer une roue existante que je n'aurais pas trouvée, j'ai décidé de créer mon dialogue.<br />
<br />
Il y a tout d'abord une première particularité à l'utilisation du <b>TTreeview</b> Firemonkey la création des éléments est vraiment différente de celle de VCL.<br />
Je vous livre mon secret pour optimiser le chargement : ne pas tout balayer mais seulement les répertoires enfants mais quand même indiquer s'il y a des branches possibles grâce à un élément fantôme.  <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code Delphi :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><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 /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">procedure</span> TForm1.AddDirectories<span class="br0">&#40;</span>ParentNode: TTreeviewItem; <span style="color: #0000ff;">const</span> Path: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  SubDirs: TStringDynArray;
  SubDir: <span style="color: #0080ff;">string</span>;
  NewNode: TTreeviewItem;
  HasChildren: <span style="color: #0080ff;">Boolean</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">if</span> DirectoryExists<span class="br0">&#40;</span>Path<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    NewNode:=<span style="color: #0000ff;">nil</span>;
    SubDirs := TDirectory.GetDirectories<span class="br0">&#40;</span>Path, <span style="color: #FF0000;">'*.*'</span>,
      TSearchOption.soTopDirectoryOnly<span class="br0">&#41;</span>;                <span style="color: #808080;">// un seul r&eacute;pertoire &agrave; la fois</span>
      <span style="color: #0000ff;">if</span> Sizeof<span class="br0">&#40;</span>subdirs<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;">for</span> SubDir <span style="color: #0000ff;">in</span> SubDirs <span style="color: #0000ff;">do</span>
      <span style="color: #0000ff;">begin</span>
        <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> DirectoryExists<span class="br0">&#40;</span>subdir<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span> continue;
        <span style="color: #0000ff;">try</span>
          HasChildren := Length<span class="br0">&#40;</span>TDirectory.GetDirectories<span class="br0">&#40;</span>SubDir<span class="br0">&#41;</span><span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span>;
          NewNode := TTreeViewItem.Create<span class="br0">&#40;</span>ParentNode<span class="br0">&#41;</span>;
          NewNode.Parent := ParentNode;
          NewNode.Text := TPath.GetFileName<span class="br0">&#40;</span>SubDir<span class="br0">&#41;</span>; <span style="color: #808080;">// Nom seul, sans le chemin</span>
          NewNode.ImageIndex := <span style="color: #cc66cc;">0</span>;
          NewNode.TagString := StrNew<span class="br0">&#40;</span><span style="color: #0080ff;">PChar</span><span class="br0">&#40;</span>SubDir<span class="br0">&#41;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// Chemin complet stock&eacute;</span>
          NewNode.OnClick := TreeViewItemClick;
          <span style="color: #808080;">// V&eacute;rifie si ce sous-dossier a lui-m&ecirc;me des enfants</span>
          <span style="color: #808080;">// pour afficher ou non le bouton [+]</span>
        <span style="color: #0000ff;">except</span>
          HasChildren := <span style="color: #0000ff;">False</span>;
        <span style="color: #0000ff;">end</span>;
&nbsp;
        <span style="color: #0000ff;">if</span> HasChildren <span style="color: #0000ff;">then</span>
          <span style="color: #808080;">// N&#156;ud fant&ocirc;me : d&eacute;clenche l'affichage du bouton [+]</span>
         <span style="color: #0000ff;">begin</span>
           NoeudFantome<span class="br0">&#40;</span>NewNode<span class="br0">&#41;</span>;
         <span style="color: #0000ff;">end</span>;
      <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.NoeudFantome<span class="br0">&#40;</span>ParentNode: TTreeViewItem<span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  NewNode: TTreeviewItem;
<span style="color: #0000ff;">begin</span>
  NewNode := TTreeViewItem.Create<span class="br0">&#40;</span>ParentNode<span class="br0">&#41;</span>;
  NewNode.ImageIndex := -<span style="color: #cc66cc;">1</span>;
  NewNode.Parent := ParentNode;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.TreeViewItemClick<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;">var</span> path := TTreeViewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>.TagString;
&nbsp;
  <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>TTreeViewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>.Count&gt;<span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AND</span> <span class="br0">&#40;</span>TTreeViewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>.ItemByIndex<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>.ImageIndex=-<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    TreeView1.BeginUpdate;
    FreeAndnil<span class="br0">&#40;</span>TTreeViewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>.ItemByIndex<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    AddDirectories<span class="br0">&#40;</span>TTreeviewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>, TTreeViewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>.TagString<span class="br0">&#41;</span>;
    TTreeviewItem<span class="br0">&#40;</span>Sender<span class="br0">&#41;</span>.Expand;
    TreeView1.EndUpdate;
  <span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></pre>
</div><br />
Si on en reste là quand nous voulons obtenir les sous-répertoires en utilisant l'extenseur, nous verrons l'élément fantôme pas la suite de l'arborescence.<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=675938&amp;d=1777190265" border="0" alt="Nom : Capture.png
Affichages : 80
Taille : 13,0 Ko"  style="float: CONFIG" /><br />
  <br />
Le problème avec le <b>TTreeView</b> en Firemonkey est qu'il manque certains évènements défini en VCL comme le<b> OnExpanding</b> et si l'on utilise l'extenseur, l'évènement  <b>TreeViewItem.OnClick</b> n'est pas déclenché.  <br />
<br />
Donc comment procéder ? J'ai testé plusieurs solutions en commençant par le surclassement de <b>TTreeViewItem</b>.<br />
Puis j'ai fait des tentatives de désactivation du bouton extenseur en accédant au style de l'élément. <br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=675939&amp;d=1777191155" border="0" alt="Nom : Capture.png
Affichages : 81
Taille : 6,8 Ko"  style="float: CONFIG" /><br />
<br />
Celles-ci paraissaient prometteuses mais, hélas, pas toujours efficace. Dans l'image suivante l'extenseur de <b><i>TreeviewItem6</i></b> devrait être grisé. <br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=675940&amp;d=1777192874" border="0" alt="Nom : Capture.png
Affichages : 81
Taille : 30,2 Ko"  style="float: CONFIG" /> <br />
<br />
Cependant la piste du style se révèle être la bonne si l'on utilise les spécificités des styles Firemonkey, à savoir la méthode de recherche d'un style d'élément (stylelookup). <br />
J'ai commencé par déposer un nouveau <b>TStyleBook</b> sur le formulaire.   <br />
Puis j'ai ouvert le style en cours pour copier le l'élément nommé <b><i>treeviewitemstyle</i></b> afin de le coller dans ce nouveau <b>Stylebook</b>.<br />
J'ai ensuite renommé ce dernier en <b><i>treeviewitemghosted</i></b>.<br />
J'ai ensuite changé le comportement du bouton en mettant simplement la propriété <b>HitTest</b> à false.<br />
Enfin, pour que l'affichage du texte soit correct quelque soit le style en cours, j'ai supprimé <b>TText</b> pour le remplacer par un <b>TLabel</b>.<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=675942&amp;d=1777193762" border="0" alt="Nom : Capture.png
Affichages : 43
Taille : 56,2 Ko"  style="float: CONFIG" /><br />
<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code Delphi :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><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 /></div></td><td valign="top"><pre style="margin: 0">procedure TForm1.AddDirectories(ParentNode: TTreeviewItem; const Path: string);
var
  SubDirs: TStringDynArray;
  SubDir: string;
  NewNode: TTreeviewItem;
  HasChildren: Boolean;
begin
  if DirectoryExists(Path) then
  begin
    NewNode:=nil;
    SubDirs := TDirectory.GetDirectories(Path, '*.*',
      TSearchOption.soTopDirectoryOnly);
      if Sizeof(subdirs) &gt; 0 then
    begin
      for SubDir in SubDirs do
      begin
        if not DirectoryExists(subdir) then continue;
        try
          HasChildren := Length(TDirectory.GetDirectories(SubDir)) &gt; 0;
          NewNode := TTreeViewItem.Create(ParentNode);
          NewNode.Parent := ParentNode;
          NewNode.Text := TPath.GetFileName(SubDir); // Nom seul, sans le chemin
          NewNode.ImageIndex := 0;
          NewNode.TagString := StrNew(PChar(SubDir)); // Chemin complet stocké
          NewNode.OnClick := TreeViewItemClick;
          // Vérifie si ce sous-dossier a lui-même des enfants
          // pour afficher ou non le bouton [+]
        except
          HasChildren := False;
        end;

        if HasChildren then
          // Nœud fantôme : déclenche l'affichage du bouton [+]
         begin
         <font color="#0000FF"> newNode.StyleLookup:='treeviewitemghosted';</font>
          NoeudFantome(NewNode);
         end;
      end;
    end;
  end;
end;
end;

procedure TForm1.TreeViewItemClick(Sender: TObject);
begin
  var path := TTreeViewItem(sender).TagString;
<font color="#0000FF">  if TTreeViewItem(sender).StyleLookup.EndsWith('ghosted') then</font>
  begin
    TreeView1.BeginUpdate;
 <font color="#0000FF">   TTreeViewItem(sender).StyleLookup:=''; // style en cours
    TTreeViewItem(sender).NeedStyleLookup;</font> // ne pas oublier
    FreeAndnil(TTreeViewItem(sender).ItemByIndex(0));
    AddDirectories(TTreeviewItem(sender), TTreeViewItem(sender).TagString);
    TTreeviewItem(Sender).Expand;
    TreeView1.EndUpdate;
  end;
  
end;
end;</pre></td></tr></table></pre>
</div><br />
Le résultat final <br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=675944&amp;d=1777197217" border="0" alt="Nom : Dialogue.gif
Affichages : 65
Taille : 1,83 Mo"  style="float: CONFIG" /><br />
<br />
Le prochain billet parlera de comment j'ai traité la liste (<b>TListBox</b>) droite</blockquote>

]]></content:encoded>
			<dc:creator>SergioMaster</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/138527-sergiomaster/b10770/fmx-dialogue-d-ouverture-fichier-stylise-partie-arborescence/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Avril)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10769/nouveau-pack-ressources-offertes-fab-avril/</link>
			<pubDate>Tue, 21 Apr 2026 15:36:12 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<br />
<ul><li style="">un <a href="https://www.fab.com/listings/14e5f29e-26eb-4b7c-82c6-e48e43fd1276" target="_blank">effet de rendu</a> pour simuler la cassette vidéo (VHS) d'une caméra au torse (bodycam) ;</li><li style="">une <a href="https://www.fab.com/listings/ec2385d7-3e02-494b-a243-e18cac7f4a69" target="_blank">station sous-marine</a> ;</li><li style="">un ensemble de <a href="https://www.fab.com/listings/ea4d6c6f-83d9-4250-a12b-7393753db0f2" target="_blank">ponts modernes</a>.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10769/nouveau-pack-ressources-offertes-fab-avril/</guid>
		</item>
	</channel>
</rss>
