<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de dsr57 - Windev &#187; Windev</title>
	<atom:link href="https://blog.developpez.com/dsr57/pcategory/windev/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/dsr57</link>
	<description>Blog sur l&#039;edi windev</description>
	<lastBuildDate>Thu, 04 Jun 2015 11:46:25 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>WinDev : Normes de programmation V2</title>
		<link>https://blog.developpez.com/dsr57/p12818/windev/windev-normes-de-programmation-v2</link>
		<comments>https://blog.developpez.com/dsr57/p12818/windev/windev-normes-de-programmation-v2#comments</comments>
		<pubDate>Tue, 30 Dec 2014 21:44:03 +0000</pubDate>
		<dc:creator><![CDATA[dsr57]]></dc:creator>
				<category><![CDATA[Windev]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[méthodes]]></category>
		<category><![CDATA[normes de programmation]]></category>
		<category><![CDATA[procédures]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/dsr57/?p=325</guid>
		<description><![CDATA[Introduction Dans une suite de billets j&#8217;avais présenté une norme de nommage des différents éléments WinDev que je préconise et met en place lors de mes différentes programmations. Avec ce billet, je propose une amélioration sur le nom des procédures visant à améliorer la compréhension des traitements effectués par la celles-ci en lisant leur nom, pour cela j&#8217;ai mis en place un nouvelle partie dans le nom visant à isoler l&#8217;action de la procédure.Dans un [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>Introduction </strong></p>
<p>Dans une suite de billets j&rsquo;avais présenté une norme de nommage des différents éléments WinDev que je préconise et met en place lors de mes différentes programmations. Avec ce billet, je propose une amélioration sur le nom des procédures visant à améliorer la compréhension des traitements effectués par la celles-ci en lisant leur nom, pour cela j&rsquo;ai mis en place un nouvelle partie dans le nom visant à isoler l&rsquo;action de la procédure.Dans un premier temps nous allons voir la mise en place de cette amélioration pour les procédures globales, ensuite les procédures locales et pour terminer les procédures (généralement appelées méthodes) de classe. </p>
<p></p>
<ul>
Liste des billets sur les normes de programmation en WinDev :</p>
<li><a href="http://blog.developpez.com/dsr57/p12149/windev/windev-normes-de-programmation-pour-les-types-simples" title="Windev : Normes de programmation pour les variables de type simple" target="_blank">WinDev : normes de programmation pour les variables de type simple</a></li>
<li><a href="http://blog.developpez.com/dsr57/p12170/windev/windev-norme-de-programmation-pour-les-procedures-et-les-champs-graphiques" title="Windev : Norme de programmation pour les procédures et les champs graphiques" target="_blank">Windev : normes de programmation pour les procédures et les champs graphiques</a></li>
<li><a href="http://blog.developpez.com/dsr57/p12189/windev/windev-normes-de-programmation-pour-la-poo" title="Windev : normes de programmation pour la POO" target="_blank">WinDev : normes de programmation pour la POO</a></li>
</ul>
<p><strong>Global au projet (Collections de procédures)</strong></p>
<ul>
Les procédures déclarées dans une collection de procédures ont une portée globale au projet. Le nom sera composé de 3 parties : </p>
<li>préfixe : obligatoire et fixe «GProc ». « G » pour globale au projet, « Proc » pour procédure ;</li>
<li>action : obligatoire, cette partie permet en un mot de définir le type d’action de la procédure. Cf. liste des actions ci-dessous.
</li>
<li>nom : obligatoire, il doit être explicite pour permettre à la lecture de comprendre le traitement de la procédure. Par convention le nom est écrit en minuscule, sans accent, sans caractère spéciaux (€,$,%, …), et commence par une minuscule. Si le nom de l’élément est composé de plusieurs mots, la première lettre du mot est en majuscule. </li>
</ul>
<p>Les trois parties seront séparées par le caractère « _ ».</p>
<p><u>Exemple : </u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">GProc_Ini_VarGbl : Procédure qui initialise les variables globales au projet.</div></div>
<ul>
<u>Liste des actions :</u> </p>
<li>Afc : Affichage ;</li>
<li>Ajt : Ajout ;</li>
<li>Clc : Clic sur un bouton ;</li>
<li>Ent : Entrée dans un champ ;</li>
<li>Ini : Initialisation ;</li>
<li>Lst: Récupération d’une liste de valeur ou une liste d’objet ;</li>
<li>Raz : remise à zéro ;</li>
<li>Rch : Recherche ;</li>
<li>Rcp : Récupération d’une valeur ou d’un objet ;</li>
<li>Sel : Sélection (ligne de table, combo) ;</li>
<li>Sor : Sortie d’un champ ;</li>
<li>Spr : Supprime/suppression ; </li>
<li>Vrf : Vérification.</li>
</ul>
<p>Cette liste est non exhaustive, elle doit être complétée/améliorée/modifiée selon les besoins de chacun. J&rsquo;ai volontairement oublié l&rsquo;action EXE, pour éviter une utilisation massive et/ou abusive, l&rsquo;utilisation de cette action est réservée pour l&rsquo;exécution requêtes SQL, Script, &#8230;</p>
<p><strong>Local à un élément du projet</strong></p>
<ul>
Les procédures déclarées dans un élément local du projet ont un portée local, elles ne sont pas accessibles depuis un élément extérieur. Le nom sera composé en 3 parties :</p>
<li>Préfixe : Obligatoire et fixe «lProc ».</li>
<li>Action : Obligatoire, cette partie permet en un mot de définir le type d’action de la procédure. Cf. liste des actions dans le paragraphe « Global au projet (Collections de procédures) ». </li>
<li>Nom : Obligatoire, il doit être explicite pour permettre à la lecture de comprendre le traitement de la procédure. Par convention le nom est écrit en minuscule, sans accent, sans caractère spéciaux (€,$,%, …), et commence par une minuscule. Si le nom de l’élément est composé de plusieurs mots, la première lettre du mot est en majuscule. </li>
</ul>
<p>Les trois parties seront séparées par le caractère «_ ».</p>
<p><u>Exemple :</u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lProc_Sel_typeMediaCbx : Procédure qui gère la sélection d’une ligne dans la liste Type de média. <br />
LProc_Ini_typeMediaCbx : Procédure qui gère l’initialisation de la combo type de média.</div></div>
<p></p>
<p><strong>Classes</strong></p>
<ul>
Les procédures de classes sont soit public, protégée, ou privée, dans la convention de nommage, cette notion n’est pas prise en compte, car lors de la programmation en objet, WinDev fait la complétion automatique en proposant uniquement les procédures avec une portée accessible. Le nom est composé de deux parties : </p>
<li>Action : Obligatoire, cette partie permet en un mot de définir le type d’action de la procédure. Cf. liste des actions dans le paragraphe « Global au projet (Collections de procédures) ». Une exception est appliquée pour les procédures des gestions des requêtes, la partie action commence par « Exe »
</li>
<li>Nom : Obligatoire, il doit être explicite pour permettre à la lecture de comprendre le traitement de la procédure. Par convention le nom est écrit en minuscule, sans accent, sans caractère spéciaux (€,$,%, …), et commence par une minuscule. Si le nom de l’élément est composé de plusieurs mots, la première lettre du mot est en minuscule.
</li>
</ul>
<p><u>Exemple :</u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lst_societe : récupère la liste des sociétés<br />
&nbsp; &nbsp; &nbsp; &nbsp; lst_clientDebiteur : récupère la liste des clients qui ont un compte débiteur</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WinDev 20 et ses nouveautés</title>
		<link>https://blog.developpez.com/dsr57/p12817/windev/windev-20-et-ses-nouveautes</link>
		<comments>https://blog.developpez.com/dsr57/p12817/windev/windev-20-et-ses-nouveautes#comments</comments>
		<pubDate>Mon, 29 Dec 2014 21:22:37 +0000</pubDate>
		<dc:creator><![CDATA[dsr57]]></dc:creator>
				<category><![CDATA[Windev]]></category>
		<category><![CDATA[WinDev 20]]></category>
		<category><![CDATA[nouveautés]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/dsr57/?p=322</guid>
		<description><![CDATA[Comme chaque année quand on est développeur Windev (Webdev, Windev Mobile), le mois d’octobre signifie nouvelle version des produits PC-Soft et un nombre de nouveautés à couper le souffle . Cette année WinDev 20 avec &#8230; 920 nouveautés annoncées pour la version la suite d’EDI. L’ensemble des nouveautés sont consultable sur le site officiel : liste des 920 nouveautés (PDF). Dans cet article, je vais faire une énumération des nouveautés WinDev que je trouve personnellement [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Comme chaque année quand on est développeur Windev (Webdev, Windev Mobile), le mois d’octobre signifie nouvelle version des produits PC-Soft et un nombre de nouveautés à couper le souffle . Cette année WinDev 20 avec &#8230; 920 nouveautés annoncées pour la version la suite d’EDI. L’ensemble des nouveautés sont consultable sur le site officiel : <a href="http://www.pcsoft-windev-webdev.com/brochure-WX20-simple.pdf">liste des 920 nouveautés (PDF)</a>.<br />
Dans cet article, je vais faire une énumération des nouveautés WinDev que je trouve personnellement / professionnellement intéressantes. Attention, cette liste est établie par rapport mes propres besoins, vous en trouverez surement d’autres.</p>
<ul>
<li><strong>Nouveauté 36 : graphes, nouvel aspect des bulles</strong></li>
<p>Une amélioration intéressante pour l’utilisateur finale pour faciliter la lecture d&rsquo;un graphe. </p>
<li><strong>Nouveauté 37 : Mire de lecture de graphe</strong></li>
<p>Pour la même raison que la nouveauté 36, une amélioration intéressante pour l&rsquo;utilisateur </p>
<li><strong>Nouveauté 46 : Une fenêtre D&rsquo;IHM + une fenêtre de code simultanément à l&rsquo;écran</strong></li>
<p>Avec cette nouveauté, l&rsquo;espace de travail s&rsquo;améliore. un écran pour l&rsquo;interface et un autre pour le code. Reste à convaincre les responsable des achats pour un deuxième écran </p>
<li><strong>Nouveauté 53 : Ordre de tabulations recalculé a chaque modification</strong></li>
<p>Avec cette nouveauté, fini les oublis lors d&rsquo;une modification d&rsquo;IHM effectuée dans la dernière ligne droite du projet. </p>
<li><strong>Nouveauté 54 : Utilisation des ancrages en redimensionnement</strong></li>
<p>Cette nouveauté entraîne un gain de temps et un respect des proportions existantes lors de modification d&rsquo;IHM. </p>
<li><strong>Nouveauté 59 : Erreur d&rsquo;IHM, champs avec bulles d&rsquo;aide identiques signalées</strong></li>
<p>Allez soyons honnête &#8230; Vious n&rsquo;avez jamais oublier de modifier la bulle d&rsquo;aide. Avec cette nouveauté WinDev nous le rappellera en erreur d&rsquo;IHM.</p>
<li><strong>Nouveauté 63 : Centraliser les codes de mise à jour des champs d&rsquo;une fenêtre</strong></li>
<ul>
Alors cette nouveauté, c&rsquo;est surement celle que je trouve la plus &#8230; à mon gôut au sens développement et lisibilité du code. Dans mes développements et mes explications sur WinDev je met en avant la centralisation du code de mise à jour des IHM dans les fenêtres pour : </p>
<li>centraliser le code</li>
<li>améliorer la lisibilité</li>
<li>faciliter la ré utilisabilité</li>
<li>faciliter les modifications</li>
</ul>
<p>Je ne peux que inciter à l&rsquo;utilisation de ce nouveau traitement</p>
<li><strong>Nouveauté 91 : MVP, comment l&rsquo;utiliser facilement</strong></li>
<p>Après la centralisation du code dans la nouveauté 63, la séparation des actions avec le Design Pattern MVP.<br />
Impatient de voir le code à mettre en place pour utiliser ce Design Pattern</p>
<li><strong>Nouveauté 92 : Procédure interne</strong></li>
<p>Avec cette nouveauté, on va pouvoir un niveau d&rsquo;encapsulation et permette de diviser des parties de programmes procédural en sous taches qui n&rsquo;ont d&rsquo;intérêt et de sens que localement. Cela permet d&rsquo;éviter l’accumulation de fonction globale qui ont un usage très restreint.</p>
<li><strong>Nouveauté 95, 96, 97 : Programmation parallèle</strong></li>
<p>Ensemble de nouveautés intéressantes pour faciliter la programmation parallèle.</p>
<li><strong>Nouveauté 109 : Affectation multiples groupées</strong></li>
<p>Enfin, un des gros manques des versions précédentes, je n&rsquo;ai jamais compris pourquoi on pouvais déclarer sur une seule ligne des variables mais qu&rsquo;il fallait plusieurs ligne ou bloc de code pour initialiser plusieurs variables </p>
<li><strong>Nouveauté 113 : Design Pattern façade (objets associés)</strong></li>
<p>Cette nouveauté augmente les possibilités POO de WinDev. </p>
<li><strong>Nouveauté 125 : Coordonnées géographique, fonctions géoAzimuth et géoDistance</strong></li>
<p>Ces deux fonctions sont très intéressantes pour des logiciels utilisant des cartes, des adresses, des tournées, &#8230;</p>
<li><strong>Nouveauté 203 : Jauge à progression infinie</strong></li>
<p>Cette nouveauté met fin au code à plusieurs états pour afficher correctement une jauge infinie</p>
</ul>
<p><strong>Conclusion</strong></p>
<p>Cette version de Windev emmène des nouveautés intéressantes autant que ce soit au niveau développement que graphique pour le client. Le nombre de 920 me parait gonflé, mais ça c’est l’aspect commercial, et cela devient une question d&rsquo;habitude. Chacun qui verra un intérêt à migrer ou pas</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WinDev &amp; Design pattern : Strategie</title>
		<link>https://blog.developpez.com/dsr57/p12788/windev/windev-design-pattern-strategie</link>
		<comments>https://blog.developpez.com/dsr57/p12788/windev/windev-design-pattern-strategie#comments</comments>
		<pubDate>Tue, 11 Nov 2014 19:49:39 +0000</pubDate>
		<dc:creator><![CDATA[dsr57]]></dc:creator>
				<category><![CDATA[Design pattern]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Windev]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/dsr57/?p=316</guid>
		<description><![CDATA[Le premier article sur le donne une définition des design patterns (ou encore « patron de conception » en français), il en existe trois types : construction : ils définissent comment faire l&#8217;instanciation et la configuration des classes et des objets ; structure : ils définissent comment organiser les classes d&#8217;un programme dans une structure plus large (séparant l&#8217;interface de l&#8217;implémentation) ; comportement : ils définissent comment organiser les objets pour que ceux-ci collaborent (distribution [&#8230;]]]></description>
				<content:encoded><![CDATA[<ul>
Le premier article sur le <a href="http://vformet.developpez.com/tutoriels/windev/2014/" title="Design pattern singleton" target="_blank"></a> donne une définition des design patterns (ou encore « patron de conception » en français), il en existe trois types :</p>
<li>construction : ils définissent comment faire l&rsquo;instanciation et la configuration des classes et des objets ;
</li>
<li>structure : ils définissent comment organiser les classes d&rsquo;un programme dans une structure plus large (séparant l&rsquo;interface de l&rsquo;implémentation) ;</li>
<li>comportement : ils définissent comment organiser les objets pour que ceux-ci collaborent (distribution des responsabilités) et expliquent le fonctionnement des algorithmes impliqués.
</li>
</ul>
<p>Dans cet article, nous allons voir la mise en place du design pattern Stratégie de type comportemental.</p>
<p><a href="http://vformet.developpez.com/tutoriels/windev/strategy/" title="Lire la suite de l'article" target="_blank">Lire la suite de l&rsquo;article</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design pattern de création : Singleton</title>
		<link>https://blog.developpez.com/dsr57/p12602/windev/design-pattern-de-creation-singleton</link>
		<comments>https://blog.developpez.com/dsr57/p12602/windev/design-pattern-de-creation-singleton#comments</comments>
		<pubDate>Wed, 30 Apr 2014 20:18:39 +0000</pubDate>
		<dc:creator><![CDATA[dsr57]]></dc:creator>
				<category><![CDATA[Design pattern]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Windev]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/dsr57/?p=277</guid>
		<description><![CDATA[Depuis les débuts de la programmation, les développeurs ont rencontré différents problèmes de conception. La plupart de ces problèmes sont récurrents. Pour éviter aux autres développeurs de buter sur les mêmes soucis, certains groupes de développeurs ont développé ce qu&#8217;on appelle des design patterns (ou patrons de conception en français). Un design pattern est une solution à un problème récurrent dans la conception d&#8217;applications orientées objet. Il décrit alors une solution standard, utilisable dans la [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Depuis les débuts de la programmation, les développeurs ont rencontré différents problèmes de conception. La plupart de ces problèmes sont récurrents. Pour éviter aux autres développeurs de buter sur les mêmes soucis, certains groupes de développeurs ont développé ce qu&rsquo;on appelle des design patterns (ou patrons de conception en français). Un design pattern est une solution à un problème récurrent dans la conception d&rsquo;applications orientées objet. Il décrit alors une solution standard, utilisable dans la conception de logiciel.<br />
Dans une série d&rsquo;articles, j&rsquo;explique comment mettre en place les design pattern dans l&rsquo;EDI WinDev.<br />
l&rsquo;article sur le design pattern singleton est disponible sur le site developpez.com : <a href="http://vformet.developpez.com/tutoriels/windev/2014/" title="WinDev &amp; Design Pattern : Singleton" target="_blank">Windev &amp; Desin pattern : Singleton</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classes abstraites en Windev (version 18 et antérieur)</title>
		<link>https://blog.developpez.com/dsr57/p12601/windev/wd-18-classes-abstaites</link>
		<comments>https://blog.developpez.com/dsr57/p12601/windev/wd-18-classes-abstaites#comments</comments>
		<pubDate>Wed, 30 Apr 2014 20:07:43 +0000</pubDate>
		<dc:creator><![CDATA[dsr57]]></dc:creator>
				<category><![CDATA[POO]]></category>
		<category><![CDATA[Windev]]></category>
		<category><![CDATA[Windev 17]]></category>
		<category><![CDATA[Windev 18]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/dsr57/?p=270</guid>
		<description><![CDATA[Avant la version 19 (annoncée sur le site officiel le 04.10.2013), WinDev ne gérait pas explicitement les classes abstraites. Il était possible de les utiliser en modifiant l&#8217;accessibilité du constructeur de la classe de base. Cet article explique étapes par étapes comment déclarer une classe abstraite. Cela vous permettra d&#8217;utiliser cette notion de POO sans forcément upgrader votre version de WinDev. Un article expliquant comment mettre en place cette possibilité est disponible sur le site [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Avant la version 19 (annoncée sur le site officiel le 04.10.2013), WinDev ne gérait pas explicitement les classes abstraites. Il était possible de les utiliser en modifiant l&rsquo;accessibilité du constructeur de la classe de base. Cet article explique étapes par étapes comment déclarer une classe abstraite. Cela vous permettra d&rsquo;utiliser cette notion de POO sans forcément upgrader votre version de WinDev.</p>
<p>Un article expliquant comment mettre en place cette possibilité est disponible sur le site developpez.com : <a href="http://vformet.developpez.com/tutoriels/windev/2013/" title="classes abstraites en Windev (version antérieure à 19)" target="_blank">classes abstraites en WinDev (version antérieure à 19)</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Héritage en WinDev : BUG  ou subtilité du W-langage (Version 18)</title>
		<link>https://blog.developpez.com/dsr57/p12378/non-classe/heritage-en-windev-bug-version-18</link>
		<comments>https://blog.developpez.com/dsr57/p12378/non-classe/heritage-en-windev-bug-version-18#comments</comments>
		<pubDate>Sun, 08 Dec 2013 21:33:57 +0000</pubDate>
		<dc:creator><![CDATA[dsr57]]></dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Windev]]></category>
		<category><![CDATA[Windev 18]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/dsr57/?p=235</guid>
		<description><![CDATA[Ce billet est une suite d&#8217;un précédent sur l&#8217;héritage en windev : Héritage en WinDev : BUG ???, celui-ci se concluait par une subtiltilé du W-Langage. Je vous informe que celle-ci persiste en version 18, j&#8217;aurais l&#8217;occasion de tester prochainement la version 19, affaire à suivre ou plutôt BUG à suivre&#8230;]]></description>
				<content:encoded><![CDATA[<p>Ce billet est une suite d&rsquo;un précédent sur l&rsquo;héritage en windev : <a href="http://blog.developpez.com/dsr57/p12254/windev/heritage-en-windev-bug" title="Héritage en WinDev : BUG  ou subtilité du W-langage???" target="_blank">Héritage en WinDev : BUG ???</a>, celui-ci se concluait par une subtiltilé du W-Langage. Je vous informe que celle-ci persiste en version 18, j&rsquo;aurais l&rsquo;occasion de tester prochainement la version 19, affaire à suivre ou plutôt BUG à suivre&#8230;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windev 19 et ses nouveautés</title>
		<link>https://blog.developpez.com/dsr57/p12355/windev/windev-19-et-ses-nouveautes</link>
		<comments>https://blog.developpez.com/dsr57/p12355/windev/windev-19-et-ses-nouveautes#comments</comments>
		<pubDate>Fri, 22 Nov 2013 20:32:53 +0000</pubDate>
		<dc:creator><![CDATA[dsr57]]></dc:creator>
				<category><![CDATA[Windev]]></category>
		<category><![CDATA[Windev 19]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/dsr57/?p=185</guid>
		<description><![CDATA[Comme chaque année quand on est développeur Windev (Webdev, Windev Mobile), le mois d&#8217;octobre signifie nouvelle version des produits PC-Soft et un nombre de nouveautés à couper le souffle. Cette année PC-SOFT annonce 919 nouveautés pour la version 19 de sa suite d&#8217;EDI. L&#8217;ensemble des nouveautés sont consultable sur le site officiel : Windev 19. Dans cet article, je vais faire une énumération des nouveautés Windev que je trouve personnellement / professionnellement intéressantes, mais aussi [&#8230;]]]></description>
				<content:encoded><![CDATA[<div align="justified" style="text-indent: 1em">
Comme chaque année quand on est développeur Windev (Webdev, Windev Mobile), le mois d&rsquo;octobre signifie nouvelle version des produits PC-Soft et un nombre de nouveautés à couper le souffle. Cette année PC-SOFT annonce 919 nouveautés pour la version 19 de sa suite d&rsquo;EDI. L&rsquo;ensemble des nouveautés sont consultable sur le site officiel : <a href="http://www.pcsoft.fr/annonce19/index.html" title="Windev 19" target="_blank" />Windev 19</a>.<br />
Dans cet article, je vais faire une énumération des nouveautés Windev que je trouve personnellement / professionnellement intéressantes, mais aussi celles qui sont surprenantes. Attention, cette liste est établie par rapport mes propres besoins, vous en trouverez surement d&rsquo;autres.
</div>
<h2><strong>Les nouveautés intéressantes</strong></h2>
<ul>
<h4>
<li>001&#8211;&gt;003 : Nouveau champ tableau de bord</li>
</h4>
<p></p>
<p align="center"><img src="http://blog.developpez.com/dsr57/files/2013/11/TableauDeBord.jpg" align="center" alt="Tableau de bord en réunion" /></p>
<ol>
Avec une expérience dans la gestion commerciale et dans le fiduciaire pour le transport de fond, il a souvent été évoqué d&rsquo;ajouter un module &laquo;&nbsp;tableau de bord&nbsp;&raquo; au logiciel. Celui-ci aurait regroupé un ensemble d&rsquo;analyses présentées différemment (tableau de chiffres, histogramme, courbe, &#8230;), développé pour les responsables pour avoir une vue d&rsquo;ensemble de l&rsquo;activité. Malgré les discussions régulières sur ce sujet, aucune de mes activités professionnelles m&rsquo;a emmené à finaliser un tel module et souvent par manque de temps. Windev pourrait palier à cela avec cette amélioration, j&rsquo;ai hâte de pouvoir manipuler ce nouveau champ. </ol>
<h4>
<li>009 &#8211;&gt; 012 : Création d&rsquo;un champ par programmation</li>
</h4>
<p></p>
<ol>
Cette amélioration permet enfin de créer un champ par programmation en partant de 0. Fini l&rsquo;obligation d&rsquo;utiliser la fonction ChampClone. Windev prendrait-il une orientation langage Objet &#8230;</ol>
<h4>
<li>027 : Associer un champ à plusieurs plan</li>
</h4>
<p></p>
<ol>
Tout programmeur qui utilise les plans a déjà été confronté à devoir mettre un champ sur plusieurs plans sans qu&rsquo;il soit visible sur tous. Il y avait alors deux possibilités :<br />
&#8211; Relier le champ au plan 0 et programmer sa visibilité &#8211;&gt; Multiplication des lignes de codes<br />
&#8211; Dupliquer le champ et l&rsquo;associer aux plans souhaités &#8211;&gt; Multiplication des champs graphiques</p>
<p>Cette amélioration permet simplement d&rsquo;associer un champ à plusieurs plans sans multiplier ni le code ni les champs graphiques.
</ol>
<h4>
<li>040 : Animation de graphe</li>
</h4>
<p></p>
<p align="center"><img src="http://blog.developpez.com/dsr57/files/2013/11/AnimationChampGraphe.jpg" alt="" /></p>
<ol>
Cette amélioration est purement graphique et esthétique, cela permet l&rsquo;affichage d&rsquo;un graphe progressivement et donne un rendu visuel intéressant. Si on couple cette amélioration au champ graphe, on peut imaginer une personne laissant afficher sur un écran un tableau de bord, il verrait alors les valeurs progressées</ol>
<h4>
<li>062 : Impression sur plusieurs pages</li>
</h4>
<p></p>
<p align="center"><img src="http://blog.developpez.com/dsr57/files/2013/11/ImpressionPlusieursPages.jpg" alt="" /></p>
<ol>
Cette amélioration permettra d&rsquo;améliorer la présentation des analyses contenant un nombre d&rsquo;informations importantes et ainsi d&rsquo;éviter le tassement des données imprimées.</ol>
<h4>
<li>071 : Définition des images de fond des PDF augmentées </li>
</h4>
<p></p>
<p align="center"><img src="http://blog.developpez.com/dsr57/files/2013/11/ImpagePlusNet.jpg" alt="" /></p>
<ol>
Il est souvent demandé par les clients d&rsquo;informatiser des formulaires de saisie, ceux-ci ont une mise en page et une charte graphique particulière par exemple une image de fond. Une possibilité était d&rsquo;associer en image de fond un JPEG du formulaire, mais le rendu était flou et ne satisfaisant pas le client. IL fallait donc passer pas mal de temps pour reconstituer au plus juste le formulaire dans l&rsquo;état. Cette amélioration corrige le flou des images de fond et rend donc la possibilité de passer par un jpeg pour construire le formulaire client, le temps gagné est considérable et le rendu sera à l&rsquo;identique. </ol>
<h4>
<li>094 : POO &#8211; classes abstraites</li>
</h4>
<p></p>
<ol>
En un mot : ENFIN. Il était possible de simuler une classe abstraite en jouant sur les propriété d&rsquo;accès du constructeur, voir l&rsquo;article : <a href="http://vformet.developpez.com/tutoriels/windev/2013/" title="Classes abstraites en Windev" target="_blank">Classes abstraites en Windev</a><br />
<a href="http://aa" title="aa"></a>
</ol>
<h4>
<li>100 : Paramètre de procédure : utiliser directement des éléments du projet</li>
</h4>
<p></p>
<ol>
Création d&rsquo;un champ par programmation, classes abstraites et passage d&rsquo;un champ en parmètre, c&rsquo;est clair, c&rsquo;est l&rsquo;année POO pour Pc-SOFT.</ol>
<h4>
<li>101 : Surcharger la fonction ouvre</li>
</h4>
<p></p>
<ol>
<p>Intéressant, en espérant que l&rsquo;on pourra effectuer une vrai surcharge,en changeant la signature des paramètres et pas seulement une surcharge comme il existe déjà pour les fonction w-langage (cf exemple surcharge de la fonction trace). Cela permettra d&rsquo;évitera l&rsquo;accumulation de paramètres optionnels</ol>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE Trace(Information1)<br />
Message(&quot;Lancement d'une trace&quot;)<br />
WL.Trace(Information1)</div></div>
<h4>
<li>102  &#8211;&gt; 103 : Initialisation et affectation multiples de variables </li>
</h4>
<p></p>
<ol>Intéressant mais attention à ne pas tomber dans l’illisibilité de code.</ol>
<h4>
<li>127 : Erreur de compilation, complétion toujours active</li>
</h4>
<p></p>
<ol>PC-SOFT améliore enfin ce bug, gênant au quotidien. Lors d&rsquo;une erreur de compilation, Windev ne gérait pu la complétion automatique de code , il fallait alors </p>
<li>Supprimer la ligne, et la re-saisir.</li>
<p>ou</p>
<li>Finir la saisie sans assistance. </li>
</ol>
<h4>
<li>141 &#8211;&gt;145 : Gestion des types de transactions </li>
</h4>
<p></p>
<ol>
HFSQL s&rsquo;améliore et gère les différentes transactions SQL. Une amélioration qui me parait très intéressante dans le cas d&rsquo;application multi-utilisateurs.</ol>
<h4>
<li>171 : Nouveau look des ascenseurs</li>
</h4>
<p></p>
<ol>Personnalisation plus poussée de l&rsquo;interface graphique</ol>
</ul>
<h2><strong>Les nouveautés surprenantes</strong></h2>
<ul>
<h4>
<li>90 : Label automatique continuer</li>
</h4>
<p>Avec cette &laquo;&nbsp;amélioration&nbsp;&raquo;, j&rsquo;ai l&rsquo;impression que pc-soft essaye de relancer le GOTO, pour moi c&rsquo;est purement une régression. Il est possible de palier à ce label par des instructions conditionnelles, de boucles, éventuellement en dupliquant des portions de codes et/ou en utilisant des variables intermédiaires. Cf  théorème de <strong>Böhm-Jacopini</strong> sur le GOTO.</p>
<h4>
<li>91 : Label automatique Sortir</li>
</h4>
<p>Idem explications 90</p>
</ul>
<h2><strong>Conclusion</strong></h2>
<p>Cette version de Windev emmène des nouveautés intéressantes autant que ce soit au niveau développement que graphique pour le client. Le nombre de 919 me parait gonflé, mais ça c&rsquo;est l&rsquo;aspect commercial. Personnellement, je suis moyennement convaincu de l’apport de cette version, néanmoins je la recommanderais pour les raisons suivantes :</p>
<ul>
<li>Demande sur le tableau de bord.</li>
<li>Problème sur les transactions.</li>
<li>Travailler sur une version 16 voir antérieur pour ne pas avoir plus de 3 versions de retard .</li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Héritage en WinDev : BUG  ou subtilité du W-langage???</title>
		<link>https://blog.developpez.com/dsr57/p12254/windev/heritage-en-windev-bug</link>
		<comments>https://blog.developpez.com/dsr57/p12254/windev/heritage-en-windev-bug#comments</comments>
		<pubDate>Thu, 26 Sep 2013 19:48:47 +0000</pubDate>
		<dc:creator><![CDATA[dsr57]]></dc:creator>
				<category><![CDATA[Windev]]></category>
		<category><![CDATA[Windev 17]]></category>
		<category><![CDATA[BUG]]></category>
		<category><![CDATA[constructeur]]></category>
		<category><![CDATA[héritage]]></category>
		<category><![CDATA[objet]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/dsr57/?p=139</guid>
		<description><![CDATA[Dans ce billet, je vais évoquer la notion d&#8217;héritage sur l&#8217;EDI WinDev. Dans un premier temps je vais faire un rappel , pour ensuite construire un exemple simple, faire évoluer cet exemple dans les paragraphes qui suivent, et finaliser sur un &#8230; ou une &#8230;. Modification apportée le 11.12.2013 grâce à une précision de zechatdoc. L&#8217;Héritage c&#8217;est quoi ? L&#8217;héritage est un principe propre à la programmation orientée objet, permettant de créer une nouvelle classe [&#8230;]]]></description>
				<content:encoded><![CDATA[<div align="justified" style="text-indent: 1em">
Dans ce billet, je vais évoquer la notion d&rsquo;héritage sur l&rsquo;EDI WinDev. Dans un premier temps je vais faire un rappel , pour ensuite construire un exemple simple, faire évoluer cet exemple dans les paragraphes qui suivent, et finaliser sur un &#8230; ou une &#8230;.</p>
<p><em>Modification apportée le 11.12.2013 grâce à une précision de zechatdoc.</em>
</div>
<p><strong>L&rsquo;Héritage c&rsquo;est quoi ? </strong></p>
<div align="justified" style="text-indent: 1em">
L&rsquo;héritage est un principe propre à la programmation orientée objet, permettant de créer une nouvelle classe à partir d&rsquo;une classe existante. Une relation d&rsquo;héritage doit être utilisée lorsque la relation &laquo;&nbsp;est une sorte de&nbsp;&raquo; peut être appliquée entre deux classes. En WinDev, la mise est œuvre est simple au niveau du code puisque dans la déclaration de la classe il suffit de saisir &laquo;&nbsp;Hérite de&nbsp;&raquo; suivi du nom de la classe dont on souhaite hériter. A l&rsquo;intérieur de la nouvelle classe vous pouvez :
</div>
<p></p>
<ul>
<li>Utiliser les champs hérités de la classe de base ( selon leur visibilité).</li>
<li>Ajouter des nouveaux champs.</li>
<li>Utiliser une méthode héritée ( selon la visibilité).</li>
<li>Redéfinir une méthodes en la créant avec la même signature.</li>
<li>Surcharger une méthode en la créant avec un signature différente.</li>
<li>Ajouter une nouvelle méthode.</li>
<li>Ajouter un ou plusieurs constructeur.</li>
</ul>
<p><strong>L&rsquo;héritage par Windev par l&rsquo;exemple</strong></p>
<div align="justified" style="text-indent: 1em">
Pour évoquer la notion d&rsquo;héritage en WinDev, je vais construire un exemple. Un exemple bien construit permet d&rsquo;allier les explications théoriques et la pratique. Ce qui sera à mon avis, plus bénéfique, plus efficace que de longue phrase.
</div>
<p></p>
<ul>
<li>Définition de l&rsquo;exemple</li>
<ol>
Pour évoquer la notion d&rsquo;héritage en Windev, je vais créer deux classes<br />
<u>ac_voiture :</u> Classes pseudo abstraite (Cf un futur article sur les classes abstraites en windev) représentant une voiture.<br />
<u>pc_peugeot :</u> Classes héritant de ac_voiture représentant une voiture de marque &laquo;&nbsp;Peugeot&nbsp;&raquo;. </ol>
<p><u>Membres de la classe ac_voiture</u></p>
<ol>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROTÉGÉE&nbsp; <br />
&nbsp; &nbsp; ls_marque est une chaîne<br />
&nbsp; &nbsp; ls_modele est une chaîne<br />
GLOBALE<br />
&nbsp; &nbsp; li_nbVoiture est un entier</div></div>
</ol>
<p>Les membres ont des propriétés en lecture/éciture</p>
<ol>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">//-----&amp;gt;Propriété <br />
PROCEDURE Marque() //Lecture<br />
RENVOYER :ls_marque<br />
<br />
PROCEDURE Marque(ps_marque est une chaîne) //Ecriture<br />
:ls_marque = ps_marque <br />
<br />
PROCEDURE Modele() //Lecture<br />
RENVOYER :ls_modele<br />
<br />
PROCEDURE Modele(ps_modele est une chaîne) //Ecriture<br />
:ls_modele = ps_modele</div></div>
</ol>
<p><u>Membres de la classe pc_peugeot</u></p>
<ol>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">hérite de ac_voiture<br />
PRIVÉE<br />
&nbsp; &nbsp; lb_moteurHdi est un booléen</div></div>
</ol>
<p>Le membre a des propriétés en lecture/écriture</p>
<ol>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE moteurHdi() //Lecture<br />
RENVOYER :lb_moteurHdi<br />
<br />
PROCEDURE moteurHdi(pb_moteurHdi est un booléen) //Ecriture<br />
:lb_moteurHdi = pb_moteurHdi</div></div>
</ol>
<li>Constructeur sans paramètre</li>
<div align="justified" style="text-indent: 1em">
Pour continuer notre exemple, nous allons créer le constructeur par défaut (Constructeur sans paramètre) pour chacune des classes.
</div>
<p><u>Constructeur ac_voiture</u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE PROTÉGÉ Constructeur()<br />
//----&amp;gt;Pas de code</div></div>
<p><u>Constructeur pc_peugeot</u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE Constructeur()<br />
Ancêtre:Constructeur()</div></div>
<div align="justified" style="text-indent: 1em">
La première ligne fait appel au constructeur de la classe de base, WinDev n&rsquo;oblige pas cet appel et ne l&rsquo;effectue pas automatiquement (Cf langage JAVA), mais pour des questions de maintenance, de lisibilité et de compréhension, j&rsquo;effectue toujours cet appel.
</div>
<p></p>
<li>Programme principale</li>
<p>Dans le code d’initialisation de la fenêtre je vais instancier un objet de type pc_peugeot.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lo_peugeot est un pc_peugeot()</div></div>
<li>Constructeur avec paramètres. </li>
<div align="justified" style="text-indent: 1em">
Dans cette étape je supprime les constructeurs par défaut et supprime l&rsquo;accès en écriture des membres. Je re-code des constructeurs en passant en paramètre les valeurs initialisation des membres. De cette façon, je force l&rsquo;initialisation des membres de la classe par le constructeur.
</div>
<p><u>Constructeur de la classe ac_voiure</u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE PROTÉGÉE &nbsp;Constructeur(ps_marque est une chaîne,ps_modele est une chaîne)<br />
<br />
:ls_marque=ps_marque<br />
:ls_modele=ps_modele</div></div>
<p><u>Constructeur de la classe pc_peugeot</u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE Constructeur(ps_marque est une chaîne,ps_modele est une chaîne, pb_hdi est un booléen)<br />
<br />
Ancêtre:Constructeur(ps_marque,ps_modele)<br />
:lb_moteurHdi=pb_hdi</div></div>
<p>Au niveau de mon code principal, j&rsquo;effectue certaines modification :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lo_peugeot est un pc_peugeot(&quot;Peugeot&quot;,&quot;308&quot;,Vrai)</div></div>
<p>Le code se compile, mais j&rsquo;ai une erreur lors de l&rsquo;exécution.</p>
<blockquote><p>Erreur à la ligne 0 du traitement Constructeur de la classe pc_peugeot.<br />
Les paramètres d&rsquo;appel du code &lsquo;Constructeur de la classe ac_voiture&rsquo; sont incorrects : on attendait 2 paramètres et on en a reçu 0.
</p></blockquote>
<p>Apres quelques recherches, j&rsquo;ai isolé la ligne de code qui posait problème </p>
<blockquote><p>hérite de ac_voiture</p></blockquote>
<div align="justified" style="text-indent: 1em">
Si je traduis l&rsquo;erreur de WinDev, à cette ligne de code, WinDev attend les 2 paramètres du constructeur de la classe ac_voiture. Cela veut dire que quand je déclare un objet de type pc_peugeot. Avant même que le constructeur de la classe instanciée soit appelé, le constructeur de la classe de base est appelé. Pour vérifier cette hypothèse, je vais ajouter une ligne trace dans le constructeur de la classe ac_voiture et recréer le constructeur par défaut (Pour ne pas avoir l&rsquo;erreur d&rsquo;exécution).
</div>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE PROTÉGÉE &nbsp;Constructeur(ps_marque est une chaîne,ps_modele est une chaîne)<br />
<br />
:ls_marque=ps_marque<br />
:ls_modele=ps_modele<br />
<br />
Trace(&quot;Marque : &quot;+:ls_marque+&quot; - Modele : &quot;+:ls_modele)</div></div>
<p></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE PROTÉGÉE Constructeur()<br />
<br />
Trace(&quot;Marque : &quot;+:ls_marque+&quot; - Modele : &quot;+:ls_modele)</div></div>
<p><u>Le résultat de la trace</u></p>
<blockquote><p>Marque :  &#8211; Modele :<br />
Marque : Peugeot &#8211; Modele : 308
</p></blockquote>
<div align="justified" style="text-indent: 1em">
Mon hypothèse est validée, lors de l&rsquo;instanciation d&rsquo;un objet héritant d&rsquo;une classe de base, Windev appelle automatiquement le constructeur de la classe de base. Ce qui me pose problème, c&rsquo;est que cet appel n&rsquo;est pas effectué dans le constructeur, mais lors de la liaison d&rsquo;héritage : Hérite de ac_voiture.
</div>
</ul>
<p><strong>Conséquences &#8230;</strong></p>
<div align="justified" style="text-indent: 1em">
A première vue, on pourrait conclure que cet appel prématuré n&rsquo;a pas de conséquence sur le bon déroulement d&rsquo;une application. Pour simplifier la compréhension et les conséquences, nous reprenons notre exemple à l&rsquo;étape des constructeurs par défaut (Cf Paragraphe Constructeur sans paramètre), cela évite la multiplication des constructeurs. Nous avons donc un constructeur pour chaque classe </p>
</div>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Constructeur ac_voiture<br />
<br />
PROCEDURE PROTÉGÉ Constructeur()<br />
//----&amp;gt;Pas de code</div></div>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Constructeur pc_peugeot<br />
<br />
PROCEDURE Constructeur()<br />
Ancêtre:Constructeur()</div></div>
<div align="justified" style="text-indent: 1em">
Après le rappel de ces constructeurs nous allons ajouter pour chacune des classes un membre statique permettant de connaître le nombre de voitures et le nombre de Peugeots dans notre application.
</div>
<blockquote><p>Rappel : Les membres statiques sont des champs ou méthodes qui sont accessibles par la classe elle même ou par toutes les instances de la classe. on parle également de membres partagés. Ils son très utiles lorsque vous avez à gérer dans une classe des informations qui ne sont pas spécifique à une instance de classe mais à la classe elle même.
</p></blockquote>
<p><u>Classe ac_voiture</u></p>
<p>Ajout du membre statique li_nbvoiture, déclaration de la classe</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ac_voiture est une Classe<br />
PROTÉGÉE&nbsp; <br />
&nbsp; &nbsp; ls_marque est une chaîne<br />
&nbsp; &nbsp; ls_modele est une chaîne<br />
GLOBALE<br />
&nbsp; &nbsp; li_nbVoiture est un entier<br />
FIN</div></div>
<p>Propriété en lecture pour le membre li_nbVoiture</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE GLOBALE NbVoiture()<br />
<br />
RENVOYER ::li_nbVoiture</div></div>
<p>Modification du constructeur (Par défaut) pour incrémenter le membre statique</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE PROTÉGÉE Constructeur()<br />
<br />
::li_nbVoiture++</div></div>
<p><u>Classe pc_peugeot</u> </p>
<p>Ajout du membre statique li_nbPeugeot</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Déclaration de la classe<br />
<br />
pc_peugeot est une Classe<br />
hérite de ac_voiture<br />
PRIVÉE<br />
&nbsp; &nbsp; lb_moteurHdi est un booléen<br />
GLOBALE<br />
&nbsp; &nbsp; li_nbPeugeot est un entier<br />
FIN</div></div>
<p>Propriété en lecture pour le membre li_nbPeugeot</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE GLOBALE NbPeugeot<br />
<br />
RENVOYER ::li_nbPeugeot</div></div>
<p>Modification du constructeur (Par défaut) pour incrémenter le membre statique</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE Constructeur()<br />
<br />
Ancêtre:Constructeur()<br />
::li_nbPeugeot++</div></div>
<p>
Nous venons de terminer l&rsquo;ajout des membres statiques à nos classes, maintenant nous allons modifier le code principale pour avoir afficher dans une trace le nombre de voiture et le nombre de peugeot instancié.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lo_peugeot est un pc_peugeot()<br />
<br />
Trace(&quot;Voiture : &quot;+pc_peugeot.NbVoiture+&quot; &nbsp; - &nbsp;Peugeot : &quot;+pc_peugeot.nbPeugeot)</div></div>
<p>Résultat de la trace : </p>
<blockquote><p>Voiture : 2   &#8211;  Peugeot : 1</p></blockquote>
<p>J&rsquo;obtiens 2 voitures dont une Peugeot alors que je n&rsquo;ai instancier qu&rsquo;un seul objet. </p>
<p>Voila une des conséquences des appels prématurés automatiques, les données du programme sont erronées.<br />
Ensuite je vais aussi insister sur le faite que nous sommes obligés d&rsquo;avoir un constructeur par défaut dans la classe de base pour pouvoir mettre en place un héritage. </p>
<p><strong>La subtilité </strong></p>
<div align="justified" style="text-indent: 1em">
Dans les lignes de code que je viens de vous soumettre, je n&rsquo;ai pas utilisé grand chose en concept : héritage, variable statique, et appel d&rsquo;un constructeur de la classe parent. C&rsquo;est dans ce dernier qu&rsquo;intervient la subtilité pour ne pas avoir les conséquences il ne faut pas utiliser le mot ancêtre. Il faut remplacer la ligne (classe pc_voiture)</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ancetre:constructeur(ps_marque,ps_modele)</div></div>
<p>par</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Constructeur ac_voiture(ps_marque,ps_modele)</div></div>
<p>et supprimer le constructeur par défaut de ac_coiture</p>
<p>Merci zechatdoc pour m&rsquo;avoir donner cette précision, même si pour moi la programmation est exactement la même en therme d&rsquo;approche mais le résultat diffère et devient juste.
</p></div>
<p><strong>Conclusion</strong></p>
<div align="justified" style="text-indent: 1em">
Nous venons de voir la notion d&rsquo;héritage en Windev avec un subtilité windevienne, comme PC-SOFT sait le faire. Je trouve cela dommage car cela nuit à son image et impacte par liaison directe les développeurs Windev. Je comprend que Windev veuille mettre à la porter de plus de personne la programmation, mais s&rsquo;il vous plait, esssayer de respecter quand même une certaine logique et arrêter les tours de passe passe.
</div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Windev : normes de programmation pour la POO</title>
		<link>https://blog.developpez.com/dsr57/p12189/windev/windev-normes-de-programmation-pour-la-poo</link>
		<comments>https://blog.developpez.com/dsr57/p12189/windev/windev-normes-de-programmation-pour-la-poo#comments</comments>
		<pubDate>Thu, 22 Aug 2013 20:14:27 +0000</pubDate>
		<dc:creator><![CDATA[dsr57]]></dc:creator>
				<category><![CDATA[Windev]]></category>
		<category><![CDATA[convention nommage]]></category>
		<category><![CDATA[normes;normes de programmation]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/dsr57/?p=117</guid>
		<description><![CDATA[Je continue la rédaction du blog en poursuivant sur les normes de programmation, je vais maintenant m&#8217;attaquer à la POO. Ce billet n&#8217;est pas une explication de la programmation objet en windev, elle explique la convention de nommage des différents éléments de la POO. dans un premier temps les normes pour le nom des classes, ensuite les membres et leurs propriétés, les méthodes et enfin un petit détail sur l&#8217;héritage. Les classes Windev ne gère [&#8230;]]]></description>
				<content:encoded><![CDATA[<div align="justified" style="text-indent: 1em">
Je continue la rédaction du blog en poursuivant sur les normes de programmation, je vais maintenant m&rsquo;attaquer à la POO. Ce billet n&rsquo;est pas une explication de la programmation objet en windev, elle explique la convention de nommage des différents éléments de la POO. dans un premier temps les normes pour le nom des classes, ensuite les membres et leurs propriétés, les méthodes et enfin un petit détail sur l&rsquo;héritage.
</div>
<p><strong>Les classes</strong></p>
<div align="justified" style="text-indent: 1em">
Windev ne gère pas explicitement les classes abstraites. Afin de bien différencier les classes abstraites et publiques, nous allons utiliser une convention de nommage sur le même principe :
</div>
<ol>
<u>La portée :</u> Première lettre (a : abstrait, p : public).<br />
<u>le type :</u> « c » comme classe suivi de « _ ».<br />
<u>Le nom :</u> Tout ce qui est après le symbole « _ ». Pour cette partie, utiliser un nom explicite. le nom commence par une minuscule et chaque changement de mot commence par une majuscule.
</ol>
<p><u>Exemple :</u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ac_document : classe abstraite <br />
pc_article : classe publique</div></div>
<div align="justified" style="text-indent: 1em">
La déclaration d&rsquo;un objet reprend la convention de nommage pour les variables de type simple, le type étant un objet, nous allons utiliser la lettre &laquo;&nbsp;o&nbsp;&raquo;.
</div>
<p><u>Exemple : </u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lo_article est une pc_article</div></div>
<p><strong>Les membres </strong></p>
<div align="justified" style="text-indent: 1em">
les membres sont les données de l&rsquo;objet. Celles-ci sont propres à l&rsquo;objet, je les considère comme des variables locales, elles sont donc soumises à la convention de nommages des variables locales.
</div>
<p><u>Exemple :</u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">pc_article est une classe<br />
&nbsp; &nbsp;PRIVEE<br />
&nbsp; &nbsp; &nbsp; &nbsp;ls_refCommerciale est une chaine<br />
&nbsp; &nbsp; &nbsp; &nbsp;pm_montantHt est un monetaire<br />
fin</div></div>
<div align="justified" style="text-indent: 1em">
Le niveau d&rsquo;accès des membres est soit privé, soit protégé, et je définis les droits de lecture et écritures avec les propriétés. Une propriété doit avoir le même nom que sa variable sans la portée et le type. Pour l&rsquo;exemple précédent on obtient :
</div>
<p></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE refCommerciale()<br />
&nbsp;renvoyer :ls_refCommerciale<br />
<br />
PROCEDURE refCommerciale(ps_valeur est une chaine)<br />
<br />
&nbsp;:ls_refCommerciale=ps_valeur</div></div>
<p><strong>Les méthodes</strong></p>
<div align="justified" style="text-indent: 1em">
Les méthodes sont les opérations applicables aux objets. Pour celles ci je commence une méthode par &laquo;&nbsp;recup&nbsp;&raquo; si la méthode me permet de récupérer un objet et &laquo;&nbsp;recupListe&nbsp;&raquo; si la méthode permet de récupérer un tableau d&rsquo;objet.
</div>
<p><strong>Héritage</strong></p>
<div align="justified" style="text-indent: 1em">
L&rsquo;héritage est un principe propre à la programmation orientée objet, permettant de créer une nouvelle classe à partir d&rsquo;une classe existante. Le constructeur de la classe fille doit commencer par l&rsquo;appel du constructeur de la classe principale. C&rsquo;est à dire que le première ligne de code du constructeur de la classe fille doit faire un appel au constructeur de la classe de base.  Ce réflexe vient de mon expérience en programmation Java, Java fait un appel automatique au constructeur de la classe héritée, sauf si celui-ci est appelé dans le constructeur. Windev n&rsquo;effectue pas cet appel en automatique, il faut donc le forcer.
</div>
<p><u>Exemple :</u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE Constructeur()<br />
//-----Appel au constructeur par défaut<br />
Ancêtre:Constructeur()</div></div>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PROCEDURE Constructeur()<br />
//----Appel à un constructeur<br />
Ancêtre:Constructeur(&quot;Peugeot&quot;,&quot;308&quot;)</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Windev : Norme de programmation pour les procédures et les champs graphiques</title>
		<link>https://blog.developpez.com/dsr57/p12170/windev/windev-norme-de-programmation-pour-les-procedures-et-les-champs-graphiques</link>
		<comments>https://blog.developpez.com/dsr57/p12170/windev/windev-norme-de-programmation-pour-les-procedures-et-les-champs-graphiques#comments</comments>
		<pubDate>Thu, 08 Aug 2013 20:26:56 +0000</pubDate>
		<dc:creator><![CDATA[dsr57]]></dc:creator>
				<category><![CDATA[Windev]]></category>
		<category><![CDATA[champs; graphiques]]></category>
		<category><![CDATA[convention nommage]]></category>
		<category><![CDATA[normes;normes de programmation]]></category>
		<category><![CDATA[procédures]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/dsr57/?p=56</guid>
		<description><![CDATA[Après un premier billet sur les normes de programmation pour les variables de type simple, je vais continuer dans le même registre en évoquant dans un premier temps les normes pour les procédures et ensuite les champs graphiques. Les procédures (Et les fonctions ?) Après maintes hésitations et des recherches sur le web, non pas pour connaître la différence entre une fonction et une procédure, mais la source et l&#8217;utilisation dans différents langages de ces [&#8230;]]]></description>
				<content:encoded><![CDATA[<div align="justified" style="text-indent: 1em">
Après un premier billet sur <a href="http://blog.developpez.com/dsr57/p12149/windev/windev-normes-de-programmation-pour-les-types-simples" target="_blank">les normes de programmation pour les variables de type simple</a>, je vais continuer dans le même registre en évoquant dans un premier temps les normes pour les procédures et ensuite les champs graphiques.
</div>
<p><strong>Les procédures (Et les fonctions ?)</strong></p>
<div align="justified" style="text-indent: 1em">
Après maintes hésitations et des recherches sur le web, non pas pour connaître la différence entre une fonction et une procédure, mais la source et l&rsquo;utilisation dans différents langages de ces 2 notions. Ces recherches ont résulté sur le faite que cette notion était indépendante de la conception algorithmique et dépendait du langage de programmation. Après une telle conclusion, je ne vais pas différencier le nom des fonctions et des procédures, tout sera procédure avec ou non une valeur de retour. Toujours en conservant le même principe de nommage
</div>
<ol>
<u>La portée :</u> Première lettre (G : Globale, l : locale).<br />
<u>le type :</u> &laquo;&nbsp;Proc&nbsp;&raquo; comme procédure suivi de &laquo;&nbsp;_&nbsp;&raquo;.<br />
<u>Le nom :</u> Tout ce qui est après le symbole « _ ». Pour cette partie, utiliser un nom explicite. le nom commence par une minuscule et chaque changement de mot commence par une majuscule.</ol>
<p><u>Exemple  :</u></p>
<ol>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Gproc_calculDateFinContrat : Procédure globale qui calcule la date de fin de contrat.<br />
lproc_calculMontantFacture : Procédure locale qui calcule le montant d'une facture.<br />
lproc_EstSolder : Fonction qui renvoie vrai ou faux selon si la facture est soldée.</div></div>
</ol>
<p><strong>Les champs graphiques</strong></p>
<div align="justified" style="text-indent: 1em">
Ce paragraphe sera composé en première partie d&rsquo;une liste des champs graphiques utilisés principalement dans les interfaces graphique, pour ensuite évoquer brièvement les groupes de champs et pour terminer je vais raconter une petite histoire qui m&rsquo;a poussé à aller plus loin dans la convention pour les champs&#8230;
</div>
<p></p>
<ul>
<div align="justified" style="text-indent: 1em">
<li>Pour la norme sur les noms des champs le principe varie un peu, un champ graphique est forcément local, il n&rsquo;y a aucun intérêt à ajouter la portée au nom. Le nom sera composé de :
</div>
<p></p>
<ol>
<u>type :</u> cf liste suivi de &laquo;&nbsp;_&nbsp;&raquo;.<br />
<u>nom :</u> Tout ce qui est après le symbole « _ ». Pour cette partie, utiliser un nom explicite. le nom commence par une minuscule et chaque changement de mot commence par une majuscule.</ol>
<p><u>Listes des champs : </u></p>
<ol>
<u>Fenêtre :</u> Fen &#8211;&gt; Fen_nomDelaFenêtre<br />
<u>Fenêtre interne :</u> FenI &#8211;&gt; FenI_nomDelaFenêtre<br />
<u>Fenêtre modèle :</u> FenM &#8211;&gt; FenM_nomDelaFenêtre<br />
<u>Etat :</u> Etat &#8211;&gt; Etat_nomDeLEtat<br />
<u>Etat interne :</u> EtatI &#8211;&gt; EtatI_nomDeLEtat<br />
<u>Champ de saisie :</u>Txt &#8211;&gt; Txt_nomChamp<br />
<u>Bouton :</u> Btn &#8211;&gt; Btn_nomChamp<br />
<u>Image :</u> Img &#8211;&gt; Img_nomChamp<br />
<u>Sélecteur :</u> Opt &#8211;&gt; Opt_nomChamp<br />
<u>Interruptur :</u> Chk &#8211;&gt; Chk_nomChamp<br />
<u>Combo, liste :</u> Cbx &#8211;&gt; Cbx_nomChamp<br />
<u>Table :</u> TAB &#8211;&gt; TAB_nomChamp<br />
<u>Jauge :</u> Jau &#8211;&gt; Jau_nomChamp</ol>
</li>
<li>
<div align="justified" style="text-indent: 1em">
Windev permet de rassembler les champs en groupe, cela permet de consulter, modifier les caractéristiques des champs composant le groupe. Même principe que les champs graphiques, le groupe est local, on n&rsquo;aura donc pas de notion de portée, le nom sera composé de
</div>
<ol>
<u>Type :</u> &lsquo;grp&rsquo; suivi de &laquo;&nbsp;_&nbsp;&raquo;.<br />
<u>Nom :</u> Tout ce qui est après le symbole « _ ». Pour cette partie, utiliser un nom explicite. le nom commence par une minuscule et chaque changement de mot commence par une majuscule.</ol>
<p><u>Exemple : </u></p>
<ol>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">grp_boutons..visible=vrai</div></div>
</ol>
<p>Pour plus de renseignements sur les groupes voir la documentation sur le site de pc-soft : <a href="http://doc.pcsoft.fr/fr-fr/?1010016" title="Documentation 'Groupe de champs'" target="_blank">Documentation en ligne PC-Soft</a>
</li>
<li>
<div align="justified" style="text-indent: 1em">
Je vais maintenant évoquer un cas qui m&rsquo;a demandé d&rsquo;aller plus loin dans le nommage des champs. Dans ma carrière de développeur d&rsquo;applications, j&rsquo;ai créé énormément de fenêtres, dans lesquelles sont affichés différents champs. Je vais faire simple, j&rsquo;ai dû programmer une fenêtre d&rsquo;exportation selon un nombre de critères importants (Civilité, Secteur géographique, Profession, etc..)
</div>
<ul>
Chaque critère est composé de 3 champs : </p>
<li>Une zone texte &laquo;&nbsp;Code&nbsp;&raquo; : Saisir le code.</li>
<li>Une zone texte &laquo;&nbsp;Libellé&nbsp;&raquo; : Affiche le libelle du code</li>
<li>Un bouton &laquo;&nbsp;Recherche&nbsp;&raquo; : Affiche dans un tableau l&rsquo;ensemble des possibilités du critère</li>
<p>.</ul>
<ul>
Au départ j&rsquo;avais nommé mes champs </p>
<li>Code : txt_codeCritere</li>
<li>Libelle : Txt_LibelleCritere</li>
<li>Bouton recherche : Btn_RechCritere</li>
</ul>
<p>J&rsquo;ai rencontré un petit souci quand j&rsquo;ai commencé à coder la requête SQL. Je testais si le code du critère était renseigné, si oui je rajoutais une clause de sélection. </p>
<p><u>Exemple de code : </u></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Si txt_CodeSecteur&quot;&quot; alors<br />
&nbsp; &nbsp; &nbsp;ls_requete+=&quot; AND cli_secteur='&quot;+txt_codesecteur+&quot;'&quot;<br />
fin</div></div>
<p></p>
<div align="justified" style="text-indent: 1em">
Jusque là, vous ne voyez peut être pas de souçi, mon problème intervient avec la quantité de code. Quand on commence à taper le nom d&rsquo;une variable, d&rsquo;un champ ou autres objets Windev propose automatiquement une liste des champs qui commence par ce que l&rsquo;on vient de saisir. Alors en commençant à saisir &laquo;&nbsp;Txt_code&nbsp;&raquo;, je me retrouvais avec l&rsquo;ensemble des critères de sélection, et donc une liste importante à parcourir. Alors qu&rsquo;en inversant le nom du critère et le type d&rsquo;information, on obtient :
</div>
<p></p>
<ul>
<li>Code : txt_Criterecode</li>
<li>Libelle : Txt_CritereLibelle</li>
<li>Bouton recherche : Btn_CritereRech</li>
</ul>
<div align="justified" style="text-indent: 1em">
Maintenant si je saisis &laquo;&nbsp;Txt_secteur&nbsp;&raquo;, la liste affiche uniquement les champs Txt_secteurCode et Txt_secteurLibelle. La liste est diminuée, et donc plus confortable pour sélectionner le bon champs. je trouve que cette convention de nommage va plus loin dans l&rsquo;organisation des champs et donne plus de souplesse lors de la codification.
</div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
