<?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 - Contribuez</title>
		<link>https://www.developpez.net/forums/</link>
		<description><![CDATA[Proposez vos articles, cours, tutoriels, quizz, etc. Pour la FAQ c'est directement ici, et pour vos codes sources c'est ici.]]></description>
		<language>fr</language>
		<lastBuildDate>Sat, 30 May 2026 09:44:51 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 - Contribuez</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title>TRotatedEdit : un composant VCL d’édition de texte orientable</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2183868&amp;goto=newpost</link>
			<pubDate>Mon, 25 May 2026 11:33:51 GMT</pubDate>
			<description>Bonjour, 
Je viens de publier...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
Je viens de publier un composant VCL open source pour Delphi :<br />
<b>VclRotatedEdit / TRotatedEdit</b><br />
Dépôt GitHub :<br />
<a rel="nofollow" href="https://github.com/mbaumsti/VclRotatedEdit" target="_blank">https://github.com/mbaumsti/VclRotatedEdit</a><br />
<br />
<br />
TRotatedEdit est un contrôle d’édition mono-ligne capable d’afficher et d’éditer du texte horizontalement, verticalement ou avec un angle libre.<br />
<br />
<br />
L’objectif n’était pas seulement de dessiner du texte incliné, mais de conserver le comportement attendu d’un contrôle d’édition :<br />
<br />
<ul><li style="">déplacement du curseur ;<br /></li><li style="">sélection à la souris et au clavier ;<br /></li><li style="">copier / couper / coller ;<br /></li><li style="">validation ;<br /></li><li style="">gestion de la sélection ;<br /></li><li style="">prise en compte des styles VCL ;<br /></li><li style="">redimensionnement en conception.<br />
<br />
</li></ul><br />
Le composant repose sur une surface logique interne, décrite par LogicalLength et LogicalThickness, qui est ensuite projetée selon l’orientation ou l’angle choisi. Cela permet de conserver un modèle d’édition cohérent tout en affichant le contrôle dans une orientation différente.<br />
Le dépôt contient :<br />
<br />
<ul><li style="">les sources du composant ;<br /></li><li style="">les packages runtime et design-time ;<br /></li><li style="">une application de démonstration ;<br /></li><li style="">une documentation générée avec PasDoc ;<br /></li><li style="">un README avec les principales règles d’utilisation.<br />
<br />
</li></ul><br />
Le composant a principalement été stabilisé et testé avec Delphi 12.2, notamment sur les points sensibles suivants :<br />
<br />
<ul><li style="">comportement au design-time ;<br /></li><li style="">styles VCL ;<br /></li><li style="">passage entre vue fiche et vue texte DFM ;<br /></li><li style="">redimensionnement des contrôles inclinés ;<br /></li><li style="">orientations verticales VerticalDown et VerticalUp.<br />
<br />
</li></ul><br />
Les retours sont les bienvenus, en particulier sur la compatibilité avec d’autres versions de Delphi, les styles VCL et les cas d’usage réels.<br />
<br />
<br />
Cordialement,<br />
Marc</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f784/environnements-developpement/delphi/contribuez/">Contribuez</category>
			<dc:creator>mbaum</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2183868/environnements-developpement/delphi/contribuez/trotatededit-composant-vcl-d-edition-texte-orientable/</guid>
		</item>
		<item>
			<title>NoReflowTabBar : composant VCL TabBar / ButtonBar avec layout multi-lignes stable</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2183826&amp;goto=newpost</link>
			<pubDate>Thu, 21 May 2026 14:46:57 GMT</pubDate>
			<description>Bonjour, 
Je viens de publier...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
Je viens de publier un composant VCL Delphi nommé <b>NoReflowTabBar</b>.<br />
<br />
<br />
Dépôt GitHub :<br />
<a rel="nofollow" href="https://github.com/mbaumsti/NoReflowTabBar" target="_blank">https://github.com/mbaumsti/NoReflowTabBar</a><br />
<br />
<br />
À l’origine, ce composant a été développé pour résoudre un problème d’ergonomie rencontré avec certains contrôles d’onglets multi-lignes : lorsqu’on sélectionne un onglet, les lignes peuvent se réorganiser, ce qui fait parfois bouger l’élément que l’utilisateur vient de cliquer.<br />
L’objectif de départ était donc simple : conserver une disposition stable, sans réorganisation visuelle intempestive lors de la sélection.<br />
Le composant a ensuite évolué vers une barre plus générale, utilisable comme :<br />
<br />
<ul><li style="">barre d’onglets ;<br /></li><li style="">barre de boutons ;<br /></li><li style="">barre de navigation ;<br /></li><li style="">barre de commandes ;<br /></li><li style="">sélecteur de modules ou de vues.<br />
<br />
</li></ul><br />
Principales fonctionnalités :<br />
<br />
<ul><li style="">layout multi-lignes stable, sans reflow à la sélection ;<br /></li><li style="">modes onglets, boutons poussoirs, boutons sélectionnables et boutons cochables ;<br /></li><li style="">zones logiques Start / Center / End ;<br /></li><li style="">headers de zones optionnels ;<br /></li><li style="">orientations horizontales et verticales ;<br /></li><li style="">glyphes via ImageList ;<br /></li><li style="">indicateurs d’état appelés “signals” ;<br /></li><li style="">couleurs de signals standards ou personnalisées ;<br /></li><li style="">gestion des textes trop longs avec ellipsis ;<br /></li><li style="">règles de fallback quand l’espace est limité ;<br /></li><li style="">édition inline des libellés ;<br /></li><li style="">drag and drop interne ;<br /></li><li style="">drag and drop possible entre barres compatibles ;<br /></li><li style="">sauvegarde / restauration de la disposition ;<br /></li><li style="">rendus flat, gradient et style-aware ;<br /></li><li style="">packages runtime et design-time ;<br /></li><li style="">documentation Markdown et documentation API générée avec PasDoc.<br />
<br />
</li></ul><br />
Le dépôt contient les sources du composant, les packages, une application de démonstration, des captures d’écran, de la documentation Markdown et une documentation API HTML générée.<br />
Le composant est actuellement développé et testé avec <b>Delphi 12.2</b> en VCL sous Windows.<br />
<br />
<br />
Licence : <b>Mozilla Public License 2.0<br />
<br />
</b><br />
Qu’en pensez-vous ? Vos retours sont les bienvenus.</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f784/environnements-developpement/delphi/contribuez/">Contribuez</category>
			<dc:creator>mbaum</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2183826/environnements-developpement/delphi/contribuez/noreflowtabbar-composant-vcl-tabbar-buttonbar-layout-multi-lignes-stable/</guid>
		</item>
		<item>
			<title>Automatiser la création de plusieurs dépôts sur GitHub</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2183781&amp;goto=newpost</link>
			<pubDate>Mon, 18 May 2026 21:20:41 GMT</pubDate>
			<description>Le code suivant a été généré...</description>
			<content:encoded><![CDATA[<div>Le code suivant a été généré par IA (Gemeni) pour ceux qui n'aiment pas utiliser ce type de code ils peuvent s'arrêter là.<br />
<br />
Bien que ça n'a pas un lien direct avec Delphi mais beaucoup de développeurs mettent leurs codes sur GitHub  et dans certains cas on souhaite placer plusieurs dossiers probablement des archives, faire cela manuellement est un vrai casse tête. <br />
<br />
C'est un scripte qui s'execute sur Git Bach pour créer les dépôts selon la liste (repos_liste.txt), située en même endroit que le fichier du scripte, les répos portent par défaut les noms des dossiers sources vous devrez vérifier s'ils ne contiennent  pas d'espaces ou caractères spéciaux, les données de la liste sont enregistrées sous ce format:<br />
Trois champs séparés par point virgule : Visibilité;Nom alternatif;Chemin<br />
 <br />
<b>Visibilité</b>	true pour répo publique sinon le répo est privé<br />
<b>Nom Alt</b>	Nom alternatif au nom du dossier <br />
<b>Chemin</b>	Chemin absolu du dossier à traiter<br />
<br />
exemple pour repos_liste.txt<br />
<div class="bbcode_container">
	<div class="bbcode_description">Citation:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			false;DelphiTip;/c/Users/Au/Documents/CodeSnippet/Delphi Tip<br />
false;;/c/Users/Au/Documents/CodeSnippet/SortList<br />
true;;/c/Users/Au/Documents/CodeSnippet/PowerShell
			
		<hr />
	</div>
</div><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 /></div></td><td valign="top"><pre style="margin: 0">#!/bin/bash
&nbsp;
# ==============================================================================
# CONFIGURATION GITHUB
# ==============================================================================
# Votre pseudo GitHub
GITHUB_USER=<span style="color: #FF0000;">&quot;...&quot;</span>
&nbsp;
# Collez votre Token <span class="br0">&#40;</span>ghp_...<span class="br0">&#41;</span> entre les guillemets
GITHUB_TOKEN=<span style="color: #FF0000;">&quot;ghp_..&quot;</span>
&nbsp;
# D&eacute;tection automatique du dossier du script
DOSSIER_SCRIPT=$<span class="br0">&#40;</span>cd <span style="color: #FF0000;">&quot;$(dirname &quot;</span><span style="color: #cc66cc;">$0</span><span style="color: #FF0000;">&quot;)&quot;</span> &amp;&amp; pwd<span class="br0">&#41;</span>
&nbsp;
# Fichier contenant la liste et fichier de Log
FICHIER_LISTE=<span style="color: #FF0000;">&quot;$DOSSIER_SCRIPT/repos_liste.txt&quot;</span>
FICHIER_LOG=<span style="color: #FF0000;">&quot;$DOSSIER_SCRIPT/liste_liens_git.txt&quot;</span>
# ==============================================================================
&nbsp;
# V&eacute;rification si le fichier liste existe
<span style="color: #0000ff;">if</span> <span class="br0">&#91;</span> ! -f <span style="color: #FF0000;">&quot;$FICHIER_LISTE&quot;</span> <span class="br0">&#93;</span>; <span style="color: #0000ff;">then</span>
    echo <span style="color: #FF0000;">&quot;Erreur : Le fichier $FICHIER_LISTE est introuvable !&quot;</span>
    exit <span style="color: #cc66cc;">1</span>
fi
&nbsp;
# Initialisation du fichier log &gt;&gt; append, &gt; eraze
echo <span style="color: #FF0000;">&quot;&quot;</span> &gt;&gt; <span style="color: #FF0000;">&quot;$FICHIER_LOG&quot;</span>
echo <span style="color: #FF0000;">&quot;================================================&quot;</span> &gt;&gt; <span style="color: #FF0000;">&quot;$FICHIER_LOG&quot;</span>
echo <span style="color: #FF0000;">&quot;=== Session: $(date +&quot;</span>%d/%m/%Y %H:%M:%S<span style="color: #FF0000;">&quot;) &quot;</span> &gt;&gt; <span style="color: #FF0000;">&quot;$FICHIER_LOG&quot;</span>
echo <span style="color: #FF0000;">&quot;================================================&quot;</span> &gt;&gt; <span style="color: #FF0000;">&quot;$FICHIER_LOG&quot;</span>
&nbsp;
# Lecture du fichier ligne par ligne
# IFS=; permet de d&eacute;couper la ligne selon les points-virgules
<span style="color: #0000ff;">while</span> IFS=<span style="color: #FF0000;">&quot;;&quot;</span> read -r champ_public champ_nom_alt champ_chemin || <span class="br0">&#91;</span> -n <span style="color: #FF0000;">&quot;$champ_public&quot;</span> <span class="br0">&#93;</span>; <span style="color: #0000ff;">do</span>
&nbsp;
    # Nettoyage des espaces superflus en d&eacute;but/fin de cha&icirc;ne <span class="br0">&#40;</span>trim<span class="br0">&#41;</span>
    is_public=$<span class="br0">&#40;</span>echo <span style="color: #FF0000;">&quot;$champ_public&quot;</span> | xargs<span class="br0">&#41;</span>
    nom_alt=$<span class="br0">&#40;</span>echo <span style="color: #FF0000;">&quot;$champ_nom_alt&quot;</span> | xargs<span class="br0">&#41;</span>
    chemin_dossier=$<span class="br0">&#40;</span>echo <span style="color: #FF0000;">&quot;$champ_chemin&quot;</span> | xargs<span class="br0">&#41;</span>
&nbsp;
    # Ignorer les lignes vides ou les commentaires <span class="br0">&#40;</span>commen&ccedil;ant par #<span class="br0">&#41;</span>
    <span style="color: #0000ff;">if</span> <span class="br0">&#91;</span> -z <span style="color: #FF0000;">&quot;$chemin_dossier&quot;</span> <span class="br0">&#93;</span> || <span class="br0">&#91;</span><span class="br0">&#91;</span> <span style="color: #FF0000;">&quot;$is_public&quot;</span> == \#* <span class="br0">&#93;</span><span class="br0">&#93;</span>; <span style="color: #0000ff;">then</span>
        continue
    fi
&nbsp;
    echo <span style="color: #FF0000;">&quot;------------------------------------------------&quot;</span>
    echo <span style="color: #FF0000;">&quot;Analyse du dossier : $chemin_dossier&quot;</span>
    echo <span style="color: #FF0000;">&quot;------------------------------------------------&quot;</span>
&nbsp;
    # V&eacute;rifier si le dossier existe sur le PC
    <span style="color: #0000ff;">if</span> <span class="br0">&#91;</span> ! -d <span style="color: #FF0000;">&quot;$chemin_dossier&quot;</span> <span class="br0">&#93;</span>; <span style="color: #0000ff;">then</span>
        echo <span style="color: #FF0000;">&quot;Erreur : Le dossier n'existe pas localement.&quot;</span>
        echo <span style="color: #FF0000;">&quot;LOG: $chemin_dossier -&gt; DOSSIER INTROUVABLE&quot;</span> &gt;&gt; <span style="color: #FF0000;">&quot;$FICHIER_LOG&quot;</span>
        continue
    fi
&nbsp;
    # D&eacute;terminer le nom final du d&eacute;p&ocirc;t GitHub
    <span style="color: #0000ff;">if</span> <span class="br0">&#91;</span> -n <span style="color: #FF0000;">&quot;$nom_alt&quot;</span> <span class="br0">&#93;</span>; <span style="color: #0000ff;">then</span>
        nom_repo=<span style="color: #FF0000;">&quot;$nom_alt&quot;</span>
    <span style="color: #0000ff;">else</span>
        # Si vide, <span style="color: #0000ff;">on</span> prend le nom du dossier <span class="br0">&#40;</span>basename extrait le dernier morceau du chemin<span class="br0">&#41;</span>
        nom_repo=$<span class="br0">&#40;</span>basename <span style="color: #FF0000;">&quot;$chemin_dossier&quot;</span><span class="br0">&#41;</span>
    fi
&nbsp;
    # D&eacute;terminer le <span style="color: #0000ff;">type</span> <span class="br0">&#40;</span><span style="color: #0000ff;">public</span> ou priv&eacute;<span class="br0">&#41;</span> pour l<span style="color: #FF0000;">'API GitHub</span>
<span style="color: #FF0000;">    # Si champ1 vaut &quot;true&quot;, private=false, sinon private=true</span>
<span style="color: #FF0000;">    if [ &quot;$is_public&quot; == &quot;true&quot; ]; then</span>
<span style="color: #FF0000;">        is_private_api=&quot;false&quot;</span>
<span style="color: #FF0000;">        type_str=&quot;PUBLIC&quot;</span>
<span style="color: #FF0000;">    else</span>
<span style="color: #FF0000;">        is_private_api=&quot;true&quot;</span>
<span style="color: #FF0000;">        type_str=&quot;PRIV&Eacute;&quot;</span>
<span style="color: #FF0000;">    fi</span>
&nbsp;
<span style="color: #FF0000;">    # On entre dans le dossier cible (les guillemets g&egrave;rent les espaces du chemin)</span>
<span style="color: #FF0000;">    cd &quot;$chemin_dossier&quot; || continue</span>
&nbsp;
<span style="color: #FF0000;">    # 1. Initialisation Git locale si n&eacute;cessaire</span>
<span style="color: #FF0000;">    if [ ! -d &quot;.git&quot; ]; then</span>
<span style="color: #FF0000;">        git init</span>
<span style="color: #FF0000;">        git checkout -b main 2&gt;/dev/null || git branch -M main</span>
<span style="color: #FF0000;">    fi</span>
&nbsp;
<span style="color: #FF0000;">    # 2. Indexation et commit</span>
<span style="color: #FF0000;">    git add .</span>
<span style="color: #FF0000;">    if ! git diff-index --quiet HEAD -- 2&gt;/dev/null || [ ! -f .git/refs/heads/main ]; then</span>
<span style="color: #FF0000;">        git commit -m &quot;Automated backup&quot;</span>
<span style="color: #FF0000;">    fi</span>
&nbsp;
<span style="color: #FF0000;">    # 3. Cr&eacute;ation du d&eacute;p&ocirc;t via l'</span>API GitHub avec le token
    echo <span style="color: #FF0000;">&quot;Cr&eacute;ation du d&eacute;p&ocirc;t $type_str '$nom_repo' sur GitHub...&quot;</span>
    curl -s -u <span style="color: #FF0000;">&quot;$GITHUB_USER:$GITHUB_TOKEN&quot;</span> \
      https:<span style="color: #808080;">//api.github.com/user/repos \</span>
      -d <span style="color: #FF0000;">&quot;{\&quot;</span>name\<span style="color: #FF0000;">&quot;:\&quot;</span>$nom_repo\<span style="color: #FF0000;">&quot;, \&quot;</span><span style="color: #0000ff;">private</span>\<span style="color: #FF0000;">&quot;:$is_private_api}&quot;</span> &gt; /dev/null
&nbsp;
    # <span style="color: #cc66cc;">4</span>. Configuration de l<span style="color: #FF0000;">'URL et Push</span>
<span style="color: #FF0000;">    URL_AVEC_TOKEN=&quot;https://$GITHUB_USER:$GITHUB_TOKEN@github.com/$GITHUB_USER/$nom_repo.git&quot;</span>
<span style="color: #FF0000;">    URL_PUBLIQUE=&quot;https://github.com/$GITHUB_USER/$nom_repo&quot;</span>
&nbsp;
<span style="color: #FF0000;">    git remote remove origin 2&gt;/dev/null</span>
<span style="color: #FF0000;">    git remote add origin &quot;$URL_AVEC_TOKEN&quot;</span>
&nbsp;
<span style="color: #FF0000;">    echo &quot;Envoi des fichiers (Push)...&quot;</span>
<span style="color: #FF0000;">    if git push -u origin main; then</span>
<span style="color: #FF0000;">        echo &quot;Succ&egrave;s ! En ligne : $URL_PUBLIQUE&quot;</span>
<span style="color: #FF0000;">        echo &quot;SUCC&Egrave;S : $nom_repo ($type_str) -&gt; $URL_PUBLIQUE&quot; &gt;&gt; &quot;$FICHIER_LOG&quot;</span>
<span style="color: #FF0000;">    else</span>
<span style="color: #FF0000;">        echo &quot;&Eacute;chec du push pour $nom_repo&quot;</span>
<span style="color: #FF0000;">        echo &quot;&Eacute;CHEC  : $nom_repo ($chemin_dossier)&quot; &gt;&gt; &quot;$FICHIER_LOG&quot;</span>
<span style="color: #FF0000;">    fi</span>
&nbsp;
<span style="color: #FF0000;">    # Retour au dossier du script pour la ligne suivante</span>
<span style="color: #FF0000;">    cd &quot;$DOSSIER_SCRIPT&quot; || exit</span>
&nbsp;
<span style="color: #FF0000;">done &lt; &quot;$FICHIER_LISTE&quot;</span>
&nbsp;
<span style="color: #FF0000;">echo &quot;------------------------------------------------&quot;</span>
<span style="color: #FF0000;">echo &quot;Termin&eacute; ! Consultez le fichier log : $FICHIER_LOG&quot;</span>
<span style="color: #FF0000;">echo &quot;------------------------------------------------&quot;</span></pre></td></tr></table></code><hr />
</div>Après la fin de l’opération vous pouvez consulter le fichier log (liste_liens_git.txt) qui permet de récupérer les liens des repos nouvellement crées pour les mettre dans un sommaire par exemple.<br />
<br />
Pour pouvoir utiliser le scripte il faut avoir un jeton (token) valide ou en créer un cela autorise la création des repos dans votre compte GitHub, pour ajouter un aller sur le lien :<br />
github.com/settings/tokens<br />
puis sélectionner : Generate new token (classic)<br />
cocher l'option repo<br />
configurer dans le scripte:<br />
<br />
#Nom du compte<br />
GITHUB_USER=&quot;...&quot;<br />
<br />
# Collez votre Token (ghp_...)  <br />
GITHUB_TOKEN=&quot;ghp_..&quot;</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f784/environnements-developpement/delphi/contribuez/">Contribuez</category>
			<dc:creator>Informt2025</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2183781/environnements-developpement/delphi/contribuez/automatiser-creation-plusieurs-depots-github/</guid>
		</item>
		<item>
			<title><![CDATA[Pythia-webview2: Surface d'intégration embarquée (IA desktop)]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2183602&amp;goto=newpost</link>
			<pubDate>Wed, 06 May 2026 15:23:48 GMT</pubDate>
			<description>Bonjour, 
 
Je partage ici...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Je partage ici une première version publique de <a rel="nofollow" href="https://github.com/MaxiDonkey/Pythia-webView2" target="_blank"><b>Pythia-Webview2</b></a>, un composant Delphi que j’utilise comme base d’intégration pour des interfaces IA desktop.<br />
<br />
Le problème de départ est assez simple : dès qu’on veut ajouter une interaction de type <b><i>ChatGPT/Claude</i></b> dans une application <i>VCL </i>ou <i>FMX </i>existante, on se retrouve vite à réécrire toujours les mêmes briques : interface conversationnelle, streaming, historique, rendu <i>Markdown</i>, pièces jointes, sélection de modèles, commandes, panneaux d’intégration, gestion de thèmes, etc.<br />
<br />
<b>Pythia-Webview2</b> essaie de factoriser cette couche-là, sans déplacer le centre de gravité de l’application.<br />
<br />
Ce n’est pas un SDK LLM, ni une abstraction commune des fournisseurs IA. Je n’ai pas cherché à réduire <i>OpenAI</i>, <i>Anthropic</i>, <i>Gemini</i>, <i>Mistral </i>ou d’autres APIs à un plus petit dénominateur commun. Le composant fournit plutôt <b>une surface d’interaction embarquée</b>, basée sur <i>WebView2</i>, et laisse l’application Delphi décider comment transformer l’état utilisateur en appel réel vers un fournisseur, un backend interne, un outil métier ou autre chose.<br />
<br />
En pratique, le composant fournit notamment :<br />
<br />
<ul><li style="">une surface de chat VCL/FMX</li><li style="">l’affichage streamé des réponses</li><li style="">le rendu Markdown et média</li><li style="">la gestion des sessions</li><li style="">un sélecteur de modèles configurable</li><li style="">des commandes slash</li><li style="">un système de plugins pour ajouter des commandes personnalisées et des actions côté hôte</li><li style="">des cartes d’intégration pour fonctions, MCP, skills, agents ou éléments custom</li><li style="">une couche de thèmes et d’internationalisation</li><li style="">un pont événementiel JavaScript &lt;-&gt; Delphi</li><li style="">des points d’extension côté Delphi via services/adapters</li></ul><br />
<br />
La partie <i>WebView2 </i>est utilisée comme moteur d’interface, pas comme déplacement de l’application vers une architecture web. L’application hôte garde la main sur la logique métier, les appels réseau, la sécurité, la persistance, les choix de modèles et les règles d’exécution.<br />
<br />
Le dépôt contient des projets de démarrage <i>VCL/FMX</i>, plusieurs démos, une intégration <i>Anthropic</i>, des exemples de plugins, et une documentation d’intégration.<br />
<br />
<u>Dépôt GitHub</u> : <a rel="nofollow" href="https://github.com/MaxiDonkey/Pythia-webView2" target="_blank">https://github.com/MaxiDonkey/Pythia-webView2</a><br />
<br />
Je le publie surtout pour recueillir des retours techniques : architecture générale, découpage des responsabilités, API publique, choix du pont WebView2 &lt;-&gt; Delphi, modèle d’extension, et limites éventuelles de cette approche pour des applications desktop Delphi réelles.</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f784/environnements-developpement/delphi/contribuez/">Contribuez</category>
			<dc:creator>MaxiDonkey</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2183602/environnements-developpement/delphi/contribuez/pythia-webview2-surface-d-integration-embarquee-ia-desktop/</guid>
		</item>
		<item>
			<title><![CDATA[Delphi VCL + WebView2 component for OpenAI Realtime (WebRTC, voice & text)]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2179390&amp;goto=newpost</link>
			<pubDate>Sun, 21 Sep 2025 14:08:22 GMT</pubDate>
			<description>Bonjour à tous, 
 
Dans le...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous,<br />
<br />
Dans le prolongement du projet initial présenté sur <a rel="nofollow" href="http://Delphi VCL + WebView2 component for OpenAI Realtime (WebRTC, voice &amp; text)" target="_blank">ici </a>, ce nouveau composant VCL pour Delphi propose une intégration directe de <i>WebRTC</i> via <b><i>WebView2</i></b>, avec exploitation du VAD Realtime d’OpenAI.<br />
<br />
Ce composant prend en charge l’ensemble des <b><i>API Realtime</i></b> d’<b>OpenAI</b> (à partir de septembre 2025), y compris la gestion des <i>fonctions</i> et des outils <i>MCP distants</i>.<br />
<br />
Pour accompagner l’implémentation, un livre blanc détaillé (inclus dans le fichier README) expose l’architecture, les choix techniques et la séquence d’exécution.<br />
Une <b>archive ZIP</b> de démonstration est également disponible dans le dossier <b>samples</b> du repository pour permettre une prise en main rapide du composant dès l’installation.<br />
<br />
Le projet est accessible sur Github : <a rel="nofollow" href="https://github.com/MaxiDonkey/Edge-OpenAI-Realtime" target="_blank">https://github.com/MaxiDonkey/Edge-OpenAI-Realtime</a><br />
<br />
Je serais ravi d’entendre vos commentaires ou de répondre à vos questions !<br />
<br />
<br />
<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p670472d1758463542/environnements-developpement/delphi/contribuez/delphi-vcl-p-webview2-component-for-openai-realtime-webrtc-voice-text/sample1.png/" border="0" alt="Nom : Sample1.png
Affichages : 152
Taille : 36,4 Ko"  style="float: CONFIG" /></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p670472d1758463542/environnements-developpement/delphi/contribuez/delphi-vcl-p-webview2-component-for-openai-realtime-webrtc-voice-text/sample1.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f784/environnements-developpement/delphi/contribuez/">Contribuez</category>
			<dc:creator>MaxiDonkey</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2179390/environnements-developpement/delphi/contribuez/delphi-vcl-p-webview2-component-for-openai-realtime-webrtc-voice-text/</guid>
		</item>
		<item>
			<title>EdgeAudio – pipeline audio temps réel pour Delphi/VCL avec WebView2</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178802&amp;goto=newpost</link>
			<pubDate>Mon, 25 Aug 2025 00:52:59 GMT</pubDate>
			<description>Bonjour à tous, 
 
Je viens...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous,<br />
<br />
Je viens de mettre en ligne le projet <a rel="nofollow" href="https://github.com/MaxiDonkey/EdgeAudio" target="_blank">EdgeAudio</a> (composant VCL) qui permet la capture micro, la lecture audio, un filtre passe&#8209;haut, la VAD et un mode “Talkover”, le tout orchestré via un pont JS bidirectionnel dans TEdgeBrowser. <br />
<br />
L’architecture est centrée sur <b>TEdgeAudioControl</b> et <b>TAudioSettings</b>, appliqués en temps réel côté WebAudio, avec une intégration VCL propre (virtual host, événements typés).<br />
<br />
Points clés:<br />
<ul><li style=""> Architecture claire: capture (<i>TEdgeAudioCapture</i>), lecture (<i>TEdgeAudioPlayer + VAD/Talkover</i>), filtrage (<i>THighPassFilter</i>) et bridge WebView2; le composant <i>TEdgeAudioControl</i> expose les réglages et des événements prêts à l’emploi .</li></ul><br />
<ul><li style="">Moteur d’événements extensible: agrégation/routage des événements JSON (audio_play, audio_pause, audio_segment, etc.) via TEventEngineManager et IAudioEventHandler .</li></ul><br />
<ul><li style="">Capacités: VAD réglable (<i>threshold/silenceMs/timeslice</i>), Talkover avec cooldown/ratios anti “ping&#8209;pong”, lecture/streaming (<i>play/pause/seek/stop</i>), setSinkId, boost volume, notifications/animations intégrées, et option d’auto&#8209;blocage de la capture pendant la lecture ainsi que l'hystéresie.</li></ul><br />
<br />
Démarrage rapide<br />
<ul><li style="">Installer le package <b>EdgeAudioDesign.dproj</b> pour enregistrer <i>TEdgeAudioControl</i> dans la palette.</li></ul><br />
<ul><li style="">Deux usages: <br />
      1) Vous avez déjà un <i>TEdgeBrowser</i> &#8594; utilisez l’unité <b>Edge.Audio</b>; <br />
      2) Déposez <b>TEdgeAudioControl</b> puis copier les dossiers <i>web &amp; tools</i> dans le projet et placer <i>WebView2Loader.dll</i> (x86/x64) à côté de l’exécutable. Des exemples (AudioEdgeTest1/2.zip) sont fournis;<br />
              penser à ajouter “EDGEAUDIO\SOURCE” (et “OPENAI\SOURCE”) aux chemins de recherche .</li></ul><br />
<ul><li style="">Dépendances: Delphi 12+, WebView2 Runtime, et <b>ffmpeg</b> si conversion audio nécessaire (ffmpegPath configurable).</li></ul><br />
<br />
<br />
Pour aller plus loin: schémas, flux d’événements et points d’extension sont détaillés dans les notes “Dev note – Architecture &amp; Mechanics” et la section deep&#8209;dive du dépôt.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p669759d1756083132/environnements-developpement/delphi/contribuez/edgeaudio-pipeline-audio-temps-reel-delphi-vcl-webview2/preview.gif/" border="0" alt="Nom : Preview.gif
Affichages : 93
Taille : 463,3 Ko"  style="float: CONFIG" /></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p669759d1756083132/environnements-developpement/delphi/contribuez/edgeaudio-pipeline-audio-temps-reel-delphi-vcl-webview2/preview.gif/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f784/environnements-developpement/delphi/contribuez/">Contribuez</category>
			<dc:creator>MaxiDonkey</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178802/environnements-developpement/delphi/contribuez/edgeaudio-pipeline-audio-temps-reel-delphi-vcl-webview2/</guid>
		</item>
		<item>
			<title>Obtenir la liste exhaustive des procédures et des fonctions de Delphi</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178219&amp;goto=newpost</link>
			<pubDate>Wed, 23 Jul 2025 15:42:19 GMT</pubDate>
			<description>Ouvrez PowerShell en tant...</description>
			<content:encoded><![CDATA[<div>Ouvrez PowerShell en tant qu’administrateur.<br />
Positionnez vous dans le dossier RTL de Delphi (ajustez le chemin selon votre version).<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">cd <span style="color: #FF0000;">&quot;C:\Program Files (x86)\Embarcadero\Studio\22.0\Source\RTL&quot;</span></code><hr />
</div>Exécutez la commande suivante pour rechercher tous les débuts de lignes function ou procedure et enregistrer le résultat :<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 /></div></td><td valign="top"><pre style="margin: 0">Get-ChildItem -Recurse -Filter *.pas |
  Select-<span style="color: #0080ff;">String</span> -Pattern <span style="color: #FF0000;">'^(function|procedure)\s+'</span> -AllMatches |
  ForEach-<span style="color: #0000ff;">Object</span> <span style="color: #808080;">{ $_.Line.Trim() }</span> |
  Out-<span style="color: #0000ff;">File</span> -Encoding UTF8  C:\Users\...\Documents\AllDelphi.txt</pre></td></tr></table></code><hr />
</div>:D</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f784/environnements-developpement/delphi/contribuez/">Contribuez</category>
			<dc:creator>XeGregory</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178219/environnements-developpement/delphi/contribuez/obtenir-liste-exhaustive-procedures-fonctions-delphi/</guid>
		</item>
	</channel>
</rss>
