<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-29506928</id><updated>2012-01-19T23:50:07.695+01:00</updated><category term='Impressions'/><category term='Inclassable / Hors sujet'/><category term='Programmation'/><category term='Mobilité'/><category term='Interface / Ergonomie'/><category term='Généralités'/><category term='Hyper File / Base de données'/><title type='text'>Elian Lacroix</title><subtitle type='html'>&lt;b&gt;Consultant pour le compte de différentes sociétés, je regroupe sur ce blog quelques informations et liens utiles sur la programmation, et l'AGL WINDEV.
Mon cheval de bataille au quotidien est de respecter le besoin des utilisateurs, tout en respectant les contraintes des développeurs. Une question d'équilibre...&lt;br&gt;
Vous lirez ici de nombreuses évidences... que l'on ignore fréquemment au quotidien.&lt;/b&gt;&lt;br&gt;
&lt;a href="mailto:elian.lacroix@gmail.com"&gt;Contact&lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default?start-index=101&amp;max-results=100'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>121</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-29506928.post-5604585940206554778</id><published>2010-09-14T16:05:00.001+02:00</published><updated>2010-09-14T16:06:52.114+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Positionner le Débogueur sur le poste de développement à partir de conditions de production.</title><content type='html'>Lorsque le mécanisme de sécurité Wlangage est déclenché en production, il n'est pas toujours évident de parvenir à reproduire le même cas sur le poste de développement afin d'apporter les corrections nécessaires. Avant d'entreprendre un débogage à distance nécessitant une connexion au poste de l'utilisateur final, et d'être disponible au moment où l'erreur survient, il est possible d'utiliser un "Dump de débogage".&lt;br /&gt;&lt;br /&gt;Rien de plus simple, grâce au lien "Enregistrer les informations pour le fournisseur de l'application (dump de débogage)" :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_4lHIG-XlQLg/TI9_ZFjgKyI/AAAAAAAAAO8/HZCfrtoJQgY/s1600/dump+de+d%C3%A9bogage.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" qx="true" src="http://2.bp.blogspot.com/_4lHIG-XlQLg/TI9_ZFjgKyI/AAAAAAAAAO8/HZCfrtoJQgY/s320/dump+de+d%C3%A9bogage.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En effet, le lien permet d'obtenir un fichier d'extension wdump, qu'il suffit de récupérer sur le poste de développement. Une fois le fichier récupéré, un simple drag &amp;amp; drop au dessus du projet concerné permet de se retrouver dans le débogueur, au moment ou le mécanisme de sécurité a été déclenché, afin de mieux cerner le cas en consultant les variables, paramètres...&lt;br /&gt;&lt;br /&gt;Il est également possible d'obtenir un dump par programmation, par exemple dans le cas où les déclenchements du mécanisme de sécurité sont traités par l'application :&lt;br /&gt;&lt;a href="http://doc.pcsoft.fr/fr-FR/?1000018834"&gt;http://doc.pcsoft.fr/fr-FR/?1000018834&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Je profite de ce billet pour m'excuser auprès de ceux qui m'écrivent "ce blog est-il mort ?" ! Rassurez-vous il n'est pas mort. Mais comme tout le monde les "temps modernes" ne me laissent que très peu de temps pour partager, et prendre le temps pour des activités qui sortent d'un contexte purement professionnel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5604585940206554778?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5604585940206554778/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5604585940206554778' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5604585940206554778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5604585940206554778'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2010/09/positionner-le-debogueur-sur-le-poste.html' title='Positionner le Débogueur sur le poste de développement à partir de conditions de production.'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4lHIG-XlQLg/TI9_ZFjgKyI/AAAAAAAAAO8/HZCfrtoJQgY/s72-c/dump+de+d%C3%A9bogage.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-8710624717467566828</id><published>2010-05-12T10:57:00.001+02:00</published><updated>2010-05-12T10:58:48.465+02:00</updated><title type='text'>Obtenir la liste de toutes les DLL utilisées par une application</title><content type='html'>Le code suivant peut être utile pour localiser toutes les DLL utilisés par une application, durant son exécution. Affichée à partir d'une fenêtre "à propos" ou de configuration avancée, cette liste peut permettre :&lt;br /&gt;- de vérifier l'emplacement des modules réellement chargés,&lt;br /&gt;- de vérifier les versions,&lt;br /&gt;- de connaître les dépendances nécessaires.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;sListeDLL est une chaîne&lt;br /&gt;POUR TOUTE CHAINE sUneAppli DE ExeListeProcessus(exePID, exeNomCourt) SEPAREE PAR RC&lt;br /&gt;&lt;br /&gt;SI ExtraitChaîne(sUneAppli, 2, TAB) ~= fExtraitChemin(ExeInfo(exeNom), fFichier+fExtension) ALORS&lt;br /&gt;sListeDLL = ExeListeDLL(ExtraitChaîne(sUneAppli, 1, TAB))&lt;br /&gt;FIN&lt;br /&gt;&lt;br /&gt;FIN&lt;br /&gt;Saisie1 = sListeDLL&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-8710624717467566828?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/8710624717467566828/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=8710624717467566828' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8710624717467566828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8710624717467566828'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2010/05/obtenir-la-liste-de-toutes-les-dll.html' title='Obtenir la liste de toutes les DLL utilisées par une application'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-6939620886648163077</id><published>2010-04-30T15:55:00.000+02:00</published><updated>2010-04-30T15:55:57.580+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Supprimer les signes cabalistiques dans le sujet des emails envoyés avec WINDEV.</title><content type='html'>Suivant la messagerie utilisée pour la lecture d'un email envoyé avec WINDEV, Outlook notamment, le sujet des emails peut ne pas avoir les bons caractères (accents remplacés...).&lt;br /&gt;&lt;br /&gt;C'est le cas lorsque le message est envoyé avec l'appel suivant :&lt;br /&gt;&lt;blockquote&gt;EmailEnvoieMessage("SessionSMTP")&lt;/blockquote&gt;&lt;br /&gt;Pour que le mail envoyé soit correctement lu dans ce cas, il faut modifier le code d'envoi, en donnant l'option EmailOptionEncodeEntête :&lt;br /&gt;&lt;blockquote&gt;EmailEnvoieMessage("SessionSMTP", EmailOptionEncodeEntête)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Sans cette option, si le sujet du message est "c'est l'été", le message envoyé contient :&lt;br /&gt;&lt;blockquote&gt;From:...&lt;br /&gt;Subject: c'est l'été&lt;br /&gt;To:...&lt;/blockquote&gt;&lt;br /&gt;Alors qu'avec l'option, il est codé différemment, et est mieux interprété par certaines messageries :&lt;br /&gt;&lt;blockquote&gt;From:...&lt;br /&gt;Subject: =?ISO-8859-1?Q?c'est_l'=E9t=E9=00?=&lt;br /&gt;To:...&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-6939620886648163077?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/6939620886648163077/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=6939620886648163077' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6939620886648163077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6939620886648163077'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2010/04/supprimer-les-signes-cabalistiques-dans.html' title='Supprimer les signes cabalistiques dans le sujet des emails envoyés avec WINDEV.'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7151812561607986750</id><published>2010-03-17T14:24:00.001+01:00</published><updated>2010-03-17T14:27:08.694+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Déploiement en réseau des applications, comment modifier le lien entre chaque poste utilisateur et le serveur ?</title><content type='html'>Le déploiement avec &lt;a href="http://doc.pcsoft.fr/fr-FR/?2028035"&gt;mise à jour en réseau&lt;/a&gt; est extrêmement pratique, puisqu'il permet :&lt;br /&gt;- d'avoir l'application en local sur chaque poste pour de meilleures performances,&lt;br /&gt;- de ne mettre à jour que le serveur lors des modifications de l'application, afin qu'elle se propage automatiquement sur tous les postes.&lt;br /&gt;Cette solution offre donc les avantages, sans les inconvénients d'autres possibilités de déploiement.&lt;br /&gt;&lt;br /&gt;Le seul point délicat de cette solution, concerne le changement de serveur. En effet toutes les installations locales de l'application "pointent" vers le serveur en ayant son nom stocké dans un fichier de paramètres. De ce fait, si le serveur doit changer de nom, ou de ressource partagée, il est nécessaire d'intervenir sur le paramétrage de chaque poste afin de rétablir la possibilité de mise à jour automatique.&lt;br /&gt;&lt;br /&gt;Voici les solutions possibles, de la plus avantageuse à la plus contraignante :&lt;br /&gt;&lt;br /&gt;- réinstallation complète de l'application en "push"&lt;br /&gt;Sur le serveur le programme WDADMINEXE.EXE permet de déployer l'application sur les postes utilisateurs. Donc si le réseau le permet, une première possibilité consiste à déployer à nouveau l'application sur tous les postes. De cette manière sur chaque poste le lien vers le nouveau serveur sera mis à jour.&lt;br /&gt;&lt;br /&gt;- réinstallation complète de l'application sur chaque poste :&lt;br /&gt;Cette seconde solution vise à obtenir le même résultat que précédemment, en installant à nouveau l'application sur chaque poste. Le fichier de paramètre est ainsi remis à jour, par contre cette solution impose de repasser sur tous les postes pour relancer l'installation du serveur.&lt;br /&gt;&lt;br /&gt;- modification du fichier de paramètre de chaque poste :&lt;br /&gt;Le fichier de paramètre utilisé par se mécanisme ne nomme WDUPDATE.NET, il est placé dans le répertoire de l'exécutable sur chaque poste. C'est un fichier de type ".INI", il est donc possible de le modifier depuis l'application elle-même à l'aide de la fonction "AppliChangeParamètre" (ou "INIEcrit"). Il est donc envisageable avant le changement de serveur de faire une dernière mise à jour de l'application, qui sera capable via le code du projet de corriger le  WDUPDATE.NET. Une fois la mise à jour prise par chaque poste, il sera possible de changer le serveur, puisque la version locale de l'application aura maintenant l'emplacement du nouveau serveur.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7151812561607986750?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7151812561607986750/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7151812561607986750' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7151812561607986750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7151812561607986750'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2010/03/deploiement-en-reseau-des-applications.html' title='Déploiement en réseau des applications, comment modifier le lien entre chaque poste utilisateur et le serveur ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-8325012245462168182</id><published>2010-03-10T13:00:00.010+01:00</published><updated>2010-03-10T13:00:08.974+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Applet Java et exécutable Win32 générés depuis un même projet, comment supprimer les erreurs de compilation "La fonction  n'a pas d'équivalent dans le framework WL/Java" ?</title><content type='html'>Lorsqu'un projet contient deux configurations, l'une permettant de créer un exécutable Windows, l'autre permettant de créer une applet Java, tous les codes sont compilés en permanence, quelque soit la configuration en cours. Ainsi même si la configuration de projet chargée et celle de l'exécutable Windows, les erreurs de compilation de la forme suivante peuvent remonter :&lt;br /&gt;&lt;blockquote&gt;La fonction &lt;xxx&gt;n'a pas d'équivalent dans le framework WL/Java&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;L'utilisation de la fonction "EnModeTest" ne permet pas d'éviter la compilation. La solution pour éviter cette compilation systématique : le "code-cible conditionnel". Il suffit dans le code utilisant une fonction non disponible en Java, de dérouler le menu "Code / code-cible conditionnel". L'interface propose alors de sélectionner les codes à ajouter, et divise le code en sections. Il est ainsi possible d'avoir un code compilé dépendant de chaque plateforme cible. Illustration avec un bouton faisant appel à un état :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/S5d_hv4vIvI/AAAAAAAAAOs/94GxbtOmHrg/s1600-h/code-cible-conditionnel.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/S5d_hv4vIvI/AAAAAAAAAOs/94GxbtOmHrg/s400/code-cible-conditionnel.PNG" vt="true" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-8325012245462168182?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/8325012245462168182/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=8325012245462168182' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8325012245462168182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8325012245462168182'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2010/03/applet-java-et-executable-win32-generes.html' title='Applet Java et exécutable Win32 générés depuis un même projet, comment supprimer les erreurs de compilation &quot;La fonction &lt;XXX&gt; n&apos;a pas d&apos;équivalent dans le framework WL/Java&quot; ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4lHIG-XlQLg/S5d_hv4vIvI/AAAAAAAAAOs/94GxbtOmHrg/s72-c/code-cible-conditionnel.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-1617423467181365165</id><published>2010-03-09T13:00:00.001+01:00</published><updated>2010-03-09T13:00:04.529+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Où paramétrer l'utilisation d'un serveur proxy pour utiliser les fonctions FTPEnvoie, FTPRécupère ?</title><content type='html'>Les fonctions FTP* du WLangage reposent directement sur le API FTP de Internet Explorer. Si un proxy doit être utilisé, il faut donc le configurer directement dans les options de Internet Explorer, et non pas avec la fonction Proxy du WLangage.&lt;br /&gt;&lt;br /&gt;Voici en image l'emplacement du réglage dans Internet Explorer :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/S5YIxB7MVsI/AAAAAAAAAOk/9w1Trr9aZzc/s1600-h/FTP-proxy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/S5YIxB7MVsI/AAAAAAAAAOk/9w1Trr9aZzc/s400/FTP-proxy.png" vt="true" width="267" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Exception pour confirmer la règle, il y en a toujours une, la fonction "FTPCommande", contrairement à "FTPRécupère" ou "FTPEnvoie", permet d'adresser directement le serveur FTP, sans passer par les API de Interner Explorer. Elle est obligatoire si le serveur FTP n'est pas accessible au travers de Internet Explorer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-1617423467181365165?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/1617423467181365165/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=1617423467181365165' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1617423467181365165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1617423467181365165'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2010/03/ou-parametrer-lutilisation-dun-serveur.html' title='Où paramétrer l&apos;utilisation d&apos;un serveur proxy pour utiliser les fonctions FTPEnvoie, FTPRécupère ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4lHIG-XlQLg/S5YIxB7MVsI/AAAAAAAAAOk/9w1Trr9aZzc/s72-c/FTP-proxy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7364323427412186524</id><published>2010-03-08T13:50:00.000+01:00</published><updated>2010-03-08T15:12:59.500+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Exporter les données d'un champ table vers Excel sans limitation sur le nombre de lignes.</title><content type='html'>Lors de l'utilisation de l'option automatique "Exporter vers Excel" d'un champ table, ou de la fonction "TableVersExcel", l'extension "XLS" est proposée par défaut. Le fichier Excel créé a donc le format des versions de Excel antérieures à la version 2007. Ces versions sont limitées à  65 536 lignes dans une feuille.&lt;br /&gt;&lt;br /&gt;Pour exporter les données sans aucune limitation, il faut que format du fichier Excel créé soit en version 2007. Il faut pour cela préciser lors de l'exportation une extension "XLSX", au lieu de "XLS".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7364323427412186524?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7364323427412186524/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7364323427412186524' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7364323427412186524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7364323427412186524'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2010/03/exporter-les-donnees-dun-champ-table.html' title='Exporter les données d&apos;un champ table vers Excel sans limitation sur le nombre de lignes.'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-1994426727401446328</id><published>2009-05-12T09:49:00.003+02:00</published><updated>2009-05-12T09:55:49.613+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Précision dans les champs de saisie des IHM</title><content type='html'>Ce billet complète le précédent concernant la &lt;a href="http://elianlacroix.blogspot.com/2009/05/resultat-errone-dans-un-calcul-sur-des.html"&gt;précision des calculs&lt;/a&gt; faits par programmation. En effet, tout comme l'utilisation de "0n" pour l'affectation d'un numérique, l'option "Numérique haute précision" des champs permet d'obtenir une précision maximale pour les valeurs saisies :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/SgkqNKm4_rI/AAAAAAAAAOc/39Dck3qP1sg/s1600-h/numerique_haute_precision.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 274px;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/SgkqNKm4_rI/AAAAAAAAAOc/39Dck3qP1sg/s320/numerique_haute_precision.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5334841639271202482" /&gt;&lt;/a&gt;&lt;br /&gt;La coche n'est pas active par défaut, il faut donc bien penser à l'activer à partir du moment ou le domaine de l'application nécessite une précision importante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-1994426727401446328?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/1994426727401446328/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=1994426727401446328' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1994426727401446328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1994426727401446328'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2009/05/precision-dans-les-champs-de-saisie-des.html' title='Précision dans les champs de saisie des IHM'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/SgkqNKm4_rI/AAAAAAAAAOc/39Dck3qP1sg/s72-c/numerique_haute_precision.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-594957036661785840</id><published>2009-05-12T09:32:00.003+02:00</published><updated>2009-05-12T09:44:37.936+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Résultat erroné dans un calcul sur des numériques</title><content type='html'>L'expression courante "on en apprend tous les jours" est sans doute la plus vraie qui soit !&lt;br /&gt;&lt;br /&gt;Hier encore je pensais que le type "numérique" était juste comme le type "monétaire". Ce n'est pas tout à fait exact, son affectation directe se faisant via un réel, on peut avoir des valeurs ou arrondis inattendus inhérents au codage des réels de Windows (&lt;a href="http://faq.pcsoft.fr/faqread.awp?idfaq=2644&amp;search=ieee"&gt;IEEE&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Mais aujourd'hui après une consultation de l'aide sur le type numérique, j'ai appris une  syntaxe permettant de forcer une affectation pour qu'elle soit juste. Je pense qu'il est bon de garder cette information à l'esprit dès lors qu'un traitement nécessite une importante précision de calcul.&lt;br /&gt;&lt;br /&gt;Ainsi l'écriture traditionnelle :&lt;br /&gt;&lt;blockquote&gt;nValeur est un numérique&lt;br /&gt;nValeur = 1234567890123456789.01&lt;br /&gt;Trace(nValeur)&lt;/blockquote&gt;Sera avantageusement remplacée par :&lt;br /&gt;&lt;blockquote&gt;nValeur est un numérique&lt;br /&gt;nValeur = 0n1234567890123456789.01&lt;br /&gt;Trace(nValeur)&lt;/blockquote&gt;Attention le "0n" qui précède la valeur est un "zéro" combiné avec la lettre "n". Il ne s'agit pas des lettres "o" et "n".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-594957036661785840?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/594957036661785840/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=594957036661785840' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/594957036661785840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/594957036661785840'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2009/05/resultat-errone-dans-un-calcul-sur-des.html' title='Résultat erroné dans un calcul sur des numériques'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5072292627926100065</id><published>2009-01-15T17:34:00.006+01:00</published><updated>2009-01-15T17:45:56.121+01:00</updated><title type='text'>Ignorer un paramètre sur index full-text dans une requête</title><content type='html'>Lorsqu'une requête contient un paramètre portant sur un index full-text, par défaut la pertinence relative à l'index full-text fait partie du résultat. La requête est donc de la forme suivante :&lt;br /&gt;&lt;blockquote&gt;SELECT &lt;br /&gt;  MATCH(XX, YY, ZZ) AGAINST({ParamFullText}) AS PertinenceFullText&lt;br /&gt;FROM &lt;br /&gt;  TABLE&lt;br /&gt;WHERE &lt;br /&gt;  &lt;Paramètres&gt;&lt;br /&gt;  AND PertinenceFullText &gt; 0&lt;br /&gt;ORDER BY &lt;br /&gt;  PertinenceFullText DESC&lt;/blockquote&gt;Tant que cette pertinence figure dans le résultat, le paramètre de la requête s'y rapportant est obligatoire. La syntaxe suivante :&lt;br /&gt;&lt;blockquote&gt;Requête.ParamFullText = Null&lt;br /&gt;HExécuteRequête(Requête)&lt;/blockquote&gt;conduira à l'erreur :&lt;br /&gt;&lt;blockquote&gt;Erreur dans le code SQL de la requête &lt;Requête1&gt;. Initialisation de la requête impossible. Le paramètre &lt;ParamFT&gt; doit être renseigné.&lt;/blockquote&gt;Pour pouvoir rendre le paramètre optionnel, il suffit de ne pas le faire figurer dans le résultat de la requête. Dans l'éditeur de requêtes il faut pour cela sélectionner "ne pas afficher" en cliquant sur l'oeil correspondant à la condition sur l'index full-text. La requête obtenue sera de la forme suivante :&lt;br /&gt;&lt;blockquote&gt;SELECT &lt;br /&gt;  *&lt;br /&gt;FROM &lt;br /&gt;  TABLE&lt;br /&gt;WHERE &lt;br /&gt;&lt;Paramètres&gt;&lt;br /&gt;  AND MATCH(XXX, YYY, ZZZ) AGAINST({ParamFullText}) &gt; 0&lt;/blockquote&gt;Comme toujours, c'est très simple ... une fois que l'on sait.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5072292627926100065?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5072292627926100065/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5072292627926100065' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5072292627926100065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5072292627926100065'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2009/01/ignorer-un-paramtre-sur-index-full-text.html' title='Ignorer un paramètre sur index full-text dans une requête'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-2219122800095088516</id><published>2008-11-18T18:04:00.004+01:00</published><updated>2008-11-18T18:14:25.462+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Impressions'/><title type='text'>Pallier au message "L'état ?? est déjà en cours d'impression"</title><content type='html'>J'ai constaté avec surprise, suite aux plaintes d'utilisateurs, que le double-clic sur un bouton lançant un état provoquait une erreur de l'application : &lt;br /&gt;&lt;blockquote&gt;L'état ?? est déjà en cours d'impression&lt;br /&gt;Dump de l'erreur du module &lt;WD120ETAT.DLL&gt; &lt;12.00Bw&gt;.&lt;br /&gt;- Niveau : erreur fatale (EL_FATAL)&lt;br /&gt;- Code erreur : 210055&lt;br /&gt;- Infos de debug : Fonction (21,0)&lt;/blockquote&gt;&lt;br /&gt;Le défaut m'a été confirmé par le support. En palliatif immédiat, puriste s'abstenir, j'ai utilisé le code suivant qui évite de relancer l'état en cas de double clic. &lt;br /&gt;&lt;blockquote&gt;// Code de clic sur le bouton d'impression&lt;br /&gt;SI ChaîneOccurrence(dbgInfo(dbgPile), "Clic sur "+MoiMême..Nom) &gt; 1 ALORS RETOUR&lt;br /&gt;&lt;br /&gt;iAperçu(i100)&lt;br /&gt;iImprimeEtat(Etat1)&lt;/blockquote&gt;&lt;br /&gt;J'espère que cette astuce pourra resservir, même s'appuyer sur la pile n'est pas de plus "propre", cela permet de facilement régler le problème.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-2219122800095088516?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/2219122800095088516/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=2219122800095088516' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2219122800095088516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2219122800095088516'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/11/palier-au-message-ltat-est-dj-en-cours.html' title='Pallier au message &quot;L&apos;état ?? est déjà en cours d&apos;impression&quot;'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-6040693705477357290</id><published>2008-09-25T15:13:00.002+02:00</published><updated>2008-09-25T15:16:26.060+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Wlangage dans les requêtes SQL : "Vous n'êtes pas autorisé à exécuter la fonction WLangage XX dans une requête"</title><content type='html'>Les requêtes sur une base Hyper File peuvent inclure des instructions WLangage (cf billet &lt;a href="http://elianlacroix.blogspot.com/2006/12/fonctions-wlangage-dans-les-requtes.html"&gt;fonction du WLangage dans une requête SQL&lt;/a&gt;). Par contre une erreur peut se produire lors de l'exécution, mentionnant le nom de la fonction WLangage appelée dans le code SQL : &lt;br /&gt;&lt;blockquote&gt;Vous n'êtes pas autorisé à exécuter la fonction WLangage XX dans une requête&lt;/blockquote&gt;&lt;br /&gt;Où est le piège ... dans les droits définis sur le serveur !&lt;br /&gt;&lt;br /&gt;Il faut donner le droit "Droit d'exécuter des procédures stockées" à l'utilisateur connecté. Sans ce droit spécifique, l'exécution d'une requête se solde par ce retour.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-6040693705477357290?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/6040693705477357290/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=6040693705477357290' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6040693705477357290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6040693705477357290'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/09/wlangage-dans-les-requtes-sql-vous-ntes.html' title='Wlangage dans les requêtes SQL : &quot;Vous n&apos;êtes pas autorisé à exécuter la fonction WLangage XX dans une requête&quot;'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7935852778637848934</id><published>2008-09-17T18:33:00.001+02:00</published><updated>2008-09-19T09:20:07.363+02:00</updated><title type='text'>Requête DECODE pour moins de code...</title><content type='html'>Je ne découvre seulement qu'aujourd'hui l'instruction SQL DECODE. C'est un intérêt du développement on en apprend tous les jours !&lt;br /&gt;&lt;br /&gt;L'instruction SQL DECODE est très pratique, elle permet de formater une information directement dans le résultat d'une requête SQL, afin d'éviter de la programmation lors de la lecture de la requête pour présenter les données. Exemple typique d'une civilité stockée avec 1, 2 ou 3 dans une base de données, on pourra grâce à DECODE obtenir directement dans le résultat de la requête "M.", "Mme" ou "Mlle". Exemple :&lt;br /&gt;&lt;blockquote&gt;SELECT &lt;br /&gt; DECODE(CLIENT.Civilité ,1,'M. ',2,'Mme. ',3,'Melle ','') +' '+&lt;br /&gt; CLIENT.NomClient +' '+CLIENT.PrénomClient AS NomComplet&lt;br /&gt;FROM &lt;br /&gt; CLIENT&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7935852778637848934?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7935852778637848934/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7935852778637848934' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7935852778637848934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7935852778637848934'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/09/requte-decode-pour-moins-de-code.html' title='Requête DECODE pour moins de code...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-3915232764178594677</id><published>2008-09-16T15:07:00.005+02:00</published><updated>2008-09-17T18:36:53.839+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Système 32 ou 64 bits pour héberger un moteur Hyper File Client/Serveur (ou exécuter les applications) ?</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_4lHIG-XlQLg/SM-ywrjGoCI/AAAAAAAAAK0/TQ5Sc_p7GjA/s1600-h/hyper+file+64+bits.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4lHIG-XlQLg/SM-ywrjGoCI/AAAAAAAAAK0/TQ5Sc_p7GjA/s400/hyper+file+64+bits.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5246608640303341602" /&gt;&lt;/a&gt;"Qui peut le plus peut le moins" on peut donc être tenté de systématiquement partir sur du 64 bits ! Il n'y a cependant aucune obligation. La seule restriction incontournable d'un système 32 bits et de ne pas permettre à un processus d'allouer plus de 2 Go de RAM (indépendamment de la RAM totale). Donc ... système 64 bits obligatoire si le moteur Hyper File Client/serveur a besoin à un moment donné de plus de 2 Go de RAM pour répondre aux applications clientes qui le sollicitent. Dans tout autre cas un système 32 bits est suffisant. &lt;br /&gt;&lt;br /&gt;Par contre attention de ne pas sous évaluer les besoins, car d'après mes constations lorsque les 2 Go disponibles en 32 bits sont alloués, il n'est pas rare que les postes clients ne reçoivent plus de réponse (ou seulement après une attente trop importante).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-3915232764178594677?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/3915232764178594677/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=3915232764178594677' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3915232764178594677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3915232764178594677'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/09/systme-32-ou-64-bits-pour-hberger-un.html' title='Système 32 ou 64 bits pour héberger un moteur Hyper File Client/Serveur (ou exécuter les applications) ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4lHIG-XlQLg/SM-ywrjGoCI/AAAAAAAAAK0/TQ5Sc_p7GjA/s72-c/hyper+file+64+bits.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-1188829852180470130</id><published>2008-09-12T11:12:00.012+02:00</published><updated>2008-09-12T11:37:04.471+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Ajuster l'espace alloué pour le cache du moteur Hyper File Client/Serveur</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/SMo308ms-aI/AAAAAAAAAKk/7854wOlhnsM/s1600-h/cache2.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/SMo308ms-aI/AAAAAAAAAKk/7854wOlhnsM/s320/cache2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5245066098787547554" /&gt;&lt;/a&gt;Le centre de contrôle Hyper File permet d'indiquer la taille mémoire maximale à utiliser pour les caches. &lt;br /&gt;&lt;br /&gt;Afin d'accélérer les accès pour de meilleures performances, on peut être tenté d'augmenter à outrance cet espace, . Mais il faut bien garder à l'esprit que l'espace donné pour le cache, limite d'autant l'espace disponible pour les autres besoins du serveur (requêtes, traitements...).&lt;br /&gt;&lt;br /&gt;Il est donc nécessaire d'étudier en production ce qu'il se passe sur le serveur, en fonction des actions faites par les applications. En effet, en fonction des accès effectués par les applications, les caches devront être privilégiés, ou au contraire, il faudra un maximum d'espace mémoire libre pour satisfaire au plus vite les applications.&lt;br /&gt;&lt;br /&gt;Pour cela il faut activer dans la configuration du serveur les statistiques d'activités, puis les consulter sur une période de mise en production la plus représentative possible de l'utilisation courante.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/SMo4BLbbTUI/AAAAAAAAAKs/_T9vW4kyisQ/s1600-h/cache1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/SMo4BLbbTUI/AAAAAAAAAKs/_T9vW4kyisQ/s320/cache1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5245066308925214018" /&gt;&lt;/a&gt;Leur visualisation sous forme de graphe permet de voir les accès (en nombre ou en octets) fait en directs sur le disque, ou dans les caches. L'opération doit être renouvelée à plusieurs reprises, en augmentant à chaque fois sensiblement l'espace des caches. Dès que l'augmentation du cache alloué ne permet plus de faire évoluer le nombre d'accès en cache de façon significative, il ne faut plus augmenter l'espace alloué au cache sous peine de limiter l'espace mémoire inutilement.&lt;br /&gt;&lt;br /&gt;Pour une mesure précise, il faut à chaque essai de réglage de l'espace du cache consulter les statistiques d'activité sur une même période d'utilisation (même nombre d'utilisateurs, avec une même activité). Pour encore plus de précision l'observation des statistiques peut se faire sur une période ou l'application n'est exécutée que par des tests automatiques, qui permettraient d'avoir une activité constante. Personnellement, je ne suis jamais allé jusque là, la simple consultation des statistiques durant la production ayant toujours été suffisante pour se faire une bonne idée.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-1188829852180470130?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/1188829852180470130/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=1188829852180470130' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1188829852180470130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1188829852180470130'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/09/ajuster-lespace-allou-pour-le-cache-du.html' title='Ajuster l&apos;espace alloué pour le cache du moteur Hyper File Client/Serveur'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/SMo308ms-aI/AAAAAAAAAKk/7854wOlhnsM/s72-c/cache2.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7122125231977553981</id><published>2008-09-09T11:40:00.004+02:00</published><updated>2008-09-09T11:46:12.982+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Créer une copie locale pour test d'un fichier Hyper File Client/Serveur</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/Rh-M9NhqCQI/AAAAAAAAAGg/rgrQeYRNzME/s1600-h/SXP18042-80-5.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/Rh-M9NhqCQI/AAAAAAAAAGg/rgrQeYRNzME/s320/SXP18042-80-5.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5052912290163722498" /&gt;&lt;/a&gt;Il n'est pas rare d'avoir besoin pour test d'une copie locale d'un fichier de données Client/Serveur en cours d'exploitation. Dans ce cas, la fonction "HCopieFichier" ne peut pas être utilisée, car elle aurait une incidence sur les blocages et accès en cours.&lt;br /&gt;&lt;br /&gt;Le code suivant peut avantageusement être utilisé, son exécution sera transparente pour les utilisateurs.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;ConnexionHFCS est une Connexion&lt;br /&gt;sNomFicherHFCS est une chaîne = "PRODUITS.FIC"&lt;br /&gt;sdFichierHFCS est une Source de Données&lt;br /&gt;sdFichierLocal est une Source de Données&lt;br /&gt;sRepLocal est une chaîne = "C:\TEMP"&lt;br /&gt;sNomLocal est une chaîne = "PRODUITS"&lt;br /&gt;&lt;br /&gt;ConnexionHFCS..Provider = hAccèsHFClientServeur&lt;br /&gt;ConnexionHFCS..Utilisateur = "admin"&lt;br /&gt;ConnexionHFCS..MotDePasse = ""&lt;br /&gt;ConnexionHFCS..Serveur = "SRV_Data:4912"&lt;br /&gt;ConnexionHFCS..BaseDeDonnées = "FACT"&lt;br /&gt;&lt;br /&gt;HOuvreConnexion(ConnexionHFCS)&lt;br /&gt;HDéclareExterne(sNomFicherHFCS,sdFichierHFCS,ConnexionHFCS)&lt;br /&gt;&lt;br /&gt;HAlias(sdFichierHFCS, sdFichierLocal)&lt;br /&gt;HChangeRep(sdFichierLocal, sRepLocal)&lt;br /&gt;HChangeNom(sdFichierLocal, sNomLocal)&lt;br /&gt;HCréationSiInexistant(sdFichierLocal)&lt;br /&gt;&lt;br /&gt;POUR TOUT sdFichierHFCS&lt;br /&gt; &lt;br /&gt; HCopieEnreg(sdFichierLocal, sdFichierHFCS, hCopieIdAuto)&lt;br /&gt; HAjoute(sdFichierLocal,hForceIdAuto)&lt;br /&gt; &lt;br /&gt;FIN&lt;/blockquote&gt;&lt;br /&gt;Note : en fonction des actions faites sur le fichier Client/Serveur en production, il faut compléter le traitement afin de traiter les cas d'erreur.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7122125231977553981?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7122125231977553981/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7122125231977553981' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7122125231977553981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7122125231977553981'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/09/crer-une-copie-pour-test-dun-fichier.html' title='Créer une copie locale pour test d&apos;un fichier Hyper File Client/Serveur'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/Rh-M9NhqCQI/AAAAAAAAAGg/rgrQeYRNzME/s72-c/SXP18042-80-5.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-219005836196462063</id><published>2008-09-08T15:44:00.003+02:00</published><updated>2008-09-09T11:44:06.451+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Comparer deux enregistrements d'une table décrite dans l'analyse ...</title><content type='html'>Le WLangage n'a pas de fonction permettant de savoir si deux enregistrements d'un même fichier, ou de deux fichiers différents mais de même structure, sont identiques. Pour effectuer une telle comparaison, sans tester l'égalité entre toutes les rubriques, il est possible d'utiliser une fonction spécifique :&lt;br /&gt;&lt;blockquote&gt;HRécupèreEnregistrement(&lt;Nom du fichier&gt;...)&lt;/blockquote&gt;Cette dernière permet en effet d'avoir le contenu complet d'un enregistrement dans une variable chaîne de caractères. Il suffit donc de l'utiliser sur les enregistrements à comparer, puis de comparer les chaînes obtenues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-219005836196462063?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/219005836196462063/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=219005836196462063' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/219005836196462063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/219005836196462063'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/09/comparer-deux-enregistrements-dune.html' title='Comparer deux enregistrements d&apos;une table décrite dans l&apos;analyse ...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5509903889255505426</id><published>2008-05-30T14:53:00.004+02:00</published><updated>2008-05-30T14:58:16.536+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Comment récupérer le séparateur décimal de windows ?</title><content type='html'>La fonction WLangage "NumériqueVersChaine" peut retourner sous la forme d'une chaine une valeur réelle, tout en utilisant le séparateur décimal de Windows. Elle peut donc servir à récupérer si besoin ce séparateur :&lt;br /&gt;&lt;blockquote&gt;SeparateurDecimal est un caractère&lt;br /&gt;SeparateurDecimal = NumériqueVersChaîne(1.1,"3,1f")[[2]]&lt;br /&gt;Info(SeparateurDecimal)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5509903889255505426?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5509903889255505426/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5509903889255505426' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5509903889255505426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5509903889255505426'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/05/comment-rcuprer-le-sparateur-dcimal-de.html' title='Comment récupérer le séparateur décimal de windows ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7705862695155354909</id><published>2008-03-12T13:46:00.000+01:00</published><updated>2008-03-12T13:47:28.174+01:00</updated><title type='text'>Encoder un mot de passe pour un serveur LDAP</title><content type='html'>Si l'écriture dans un serveur LDAP est simple avec les fonctions LDAP* du Wlangage, il n'en est pas de même dans le cas bien particulier ou l'on souhaite écrire un mot de passe !&lt;br /&gt;&lt;br /&gt;Voici le code nécessaire à l'encodage du mot de passe pour qu'il soit "conforme" LDAP :&lt;br /&gt;&lt;blockquote&gt;sMotDePasse est une chaîne = "secret"&lt;br /&gt;sSel est une chaîne = "graindesel"&lt;br /&gt;sHash est une chaîne = HashChaîne(HA_SHA_160, sMotDePasse+sSel)&lt;br /&gt;sAttrib est une chaîne = "{SSHA}"+Crypte(sHash+sSel, "", crypteAucun, encodeBASE64)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7705862695155354909?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7705862695155354909/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7705862695155354909' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7705862695155354909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7705862695155354909'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/03/encoder-un-mot-de-passe-pour-un-serveur.html' title='Encoder un mot de passe pour un serveur LDAP'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-764748130164323862</id><published>2008-02-22T12:16:00.004+01:00</published><updated>2008-02-22T12:22:18.892+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Impressions'/><title type='text'>Placer en fond d'un état les pages d'un formulaire PDF</title><content type='html'>Suite à une demande sur le &lt;a href="http://forum.pcsoft.fr/post.awp?id=128269&amp;forum=pcsoft.fr.windev"&gt;forum&lt;/a&gt;, et intéressé par la fonctionnalité, j'ai recherché comment placer en fond d'un état les différentes pages d'un document PDF.&lt;br /&gt;&lt;br /&gt;La méthode n'a rien d'immédiate, je pense que sa publication sera appréciée !&lt;br /&gt;&lt;br /&gt;Si un état contient plusieurs pages, et qu'il a en fond un PDF contenant également plusieurs pages, les différentes pages de l'état ne peuvent pas prendre les différentes pages du PDF, mais une seule (et c'est vraiment dommage) :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/R76vMdLblgI/AAAAAAAAAJY/auxxXQtAh0Y/s1600-h/formulaire.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/R76vMdLblgI/AAAAAAAAAJY/auxxXQtAh0Y/s320/formulaire.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5169762050793772546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Il faut donc jongler et créer plusieurs états qui vont être imbriqués les uns dans les autres :&lt;br /&gt;- un premier état est associé à la page 1 du formulaire PDF, &lt;br /&gt;- un deuxième état est associé à la page 2 du formulaire PDF, &lt;br /&gt;- un troisième état est associé à la page 3 du formulaire PDF ....&lt;br /&gt;&lt;br /&gt;L'application fera ainsi un iImprimeEtat() du premier état. Ce premier état fera dans son code après impression un iImprimeEtat() du deuxième état, qui appellera à son tour le troisième état...&lt;br /&gt;&lt;br /&gt;J'ai testé la solution d'états internes, mais je n'ai pas eu de bons résultats. De façon générale il me semble que les états imbriqués sont à préférer aux états internes.&lt;br /&gt;&lt;br /&gt;Gageons que PC SOFT saura faire évoluer la fonctionnalité pour plus de simplicité. Car cette solution s'applique si les pages de l'état sont différentes, mais pas dans le cas ou c'est le bloc corps d'un état qui va se dérouler sur différentes pages ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-764748130164323862?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/764748130164323862/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=764748130164323862' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/764748130164323862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/764748130164323862'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/02/placer-en-fond-dun-tat-les-pages-dun.html' title='Placer en fond d&apos;un état les pages d&apos;un formulaire PDF'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4lHIG-XlQLg/R76vMdLblgI/AAAAAAAAAJY/auxxXQtAh0Y/s72-c/formulaire.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-77687821169323219</id><published>2008-02-20T18:13:00.004+01:00</published><updated>2008-02-22T12:22:35.347+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Utilisateur courant dans la barre de message, sans programmation comme la date ou l'heure...</title><content type='html'>Sans aucune programmation il est possible d'insérer des informations dans la barre de messages des applications : date, heure, depuis peu l'utilisateur en cours dans le cas ou l'application utilise le Groupware utilisateur !&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/R7xf1dLblfI/AAAAAAAAAJQ/rOsmWYDYhgo/s1600-h/case+barre+de+message+groupware.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/R7xf1dLblfI/AAAAAAAAAJQ/rOsmWYDYhgo/s320/case+barre+de+message+groupware.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5169111844284765682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ce principe du "Zéro code" se développe, avec les actions prédéfinies et les FAA notamment, et c'est une bonne chose pour accélérer les développements, limiter les risques d'erreur, ajouter des fonctionnalités !&lt;br /&gt;&lt;br /&gt;Ndlr : terminant une longue intervention sur site, je devrais retrouver avec plaisir un peu de temps pour le blog et le forum dans les semaines qui viennent !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-77687821169323219?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/77687821169323219/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=77687821169323219' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/77687821169323219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/77687821169323219'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2008/02/utilisateur-courant-dans-la-barre-de.html' title='Utilisateur courant dans la barre de message, sans programmation comme la date ou l&apos;heure...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4lHIG-XlQLg/R7xf1dLblfI/AAAAAAAAAJQ/rOsmWYDYhgo/s72-c/case+barre+de+message+groupware.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-6102007661302420204</id><published>2007-12-20T15:15:00.001+01:00</published><updated>2008-06-03T14:32:14.008+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Aide à la saisie obligatoire !!!</title><content type='html'>Voici une fonctionnalité de la version 12 qu'il faudrait rendre obligatoire, par respect pour les utilisateurs des applications !&lt;br /&gt;&lt;br /&gt;Un jour ou l'autre on se retrouve devant un champ, sans savoir où trouver l'information attendue. Dans le meilleur des cas une bulle d'aide est proposée, ou un bouton d'aide dans la fenêtre, mais il n'est pas rare de ne pas être assisté.&lt;br /&gt;&lt;br /&gt;Alors que toute saisie respectueuse de l'utilisateur, devrait permettre instantanément de savoir de quoi il s'agit. Voici un exemple de mise en oeuvre de l'aide à la saisie avec WINDEV 12 (c'est également disponible pour les pages WEB des sites WEBDEV) :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/R2p5IFVC-wI/AAAAAAAAAJA/8trYERwTySs/s1600-h/saisie1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/R2p5IFVC-wI/AAAAAAAAAJA/8trYERwTySs/s400/saisie1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5146058704000580354" /&gt;&lt;/a&gt;&lt;br /&gt;Dès que le curseur est placé dans le champ, l'information d'aide s'efface progressivement avec un effet de fondu pour laisser place à la saisie.&lt;br /&gt;&lt;br /&gt;Aucune programmation n'est requise, il suffit de fournir l'information qui guidera l'utilisateur dans la description du champ :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/R2p5QFVC-xI/AAAAAAAAAJI/RhKly2-Q7ME/s1600-h/saisie2.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/R2p5QFVC-xI/AAAAAAAAAJI/RhKly2-Q7ME/s320/saisie2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5146058841439533842" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-6102007661302420204?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/6102007661302420204/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=6102007661302420204' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6102007661302420204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6102007661302420204'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/12/aide-la-saisie-obligatoire.html' title='Aide à la saisie obligatoire !!!'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4lHIG-XlQLg/R2p5IFVC-wI/AAAAAAAAAJA/8trYERwTySs/s72-c/saisie1.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-6627491619231571716</id><published>2007-12-13T17:46:00.000+01:00</published><updated>2007-12-13T17:54:20.054+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>WINDEV 12 non documenté !</title><content type='html'>Deux fonctionnalités non documentées de WINDEV 12 découvertes après quelques minutes d'utilisation, certes avec l'aide du support, mais cela vaut un petit billet pour faire circuler l'information en attendant que la documentation rattrape la productivité des développeurs !&lt;br /&gt;&lt;br /&gt;1. Recherche dans les styles et les options d'édition des champs, information sur le &lt;a href="http://blogs.webdev.info/billets.awp?blog=supporttechnique&amp;id=121"&gt;Blog du support&lt;/a&gt;. A vos claviers pour tester le Ctrl+F, il y en a peut être d'autres du même type à découvrir !&lt;br /&gt;&lt;br /&gt;2. Afficher un PDF dans une image est enfantin :&lt;br /&gt;&lt;blockquote&gt;IMG_TEST_PDF = fRepExe()+["\"]+"AideDépart.PDF"&lt;/blockquote&gt;Le positionner sur une page précise est ... tout aussi simple, à condition d'avoir trouvé la bonne propriété (ce que l'aide ne donne pas par défaut pour le moment) :&lt;br /&gt;&lt;blockquote&gt;IMG_TEST_PDF..NuméroPage = 4&lt;/blockquote&gt;&lt;br /&gt;Au passage le support m'informe qu'à terme le champ image lorsqu'il est affecté avec un PDF, aura une gestion d'ascenseurs, de zoom. Le tout basé sur la technologie "Zéro code" chère à PC SOFT !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-6627491619231571716?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/6627491619231571716/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=6627491619231571716' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6627491619231571716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6627491619231571716'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/12/windev-12-non-document.html' title='WINDEV 12 non documenté !'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-6133577540365979565</id><published>2007-11-29T18:21:00.000+01:00</published><updated>2007-11-29T18:27:03.706+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Généralités'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Compléter les appels aux navigateurs par un message d'information</title><content type='html'>Il n'est pas rare de lancer depuis une application le navigateur Web par défaut sur un site. Le traitement est de la forme :&lt;br /&gt;&lt;blockquote&gt;LanceAppliAssociée("http://elianlacroix.blogspot.com")&lt;/blockquote&gt;&lt;br /&gt;Mais les configurations de plus en plus sécurisées peuvent bloquer cette ouverture du navigateur. L'action pourrait en effet être commandée par un programme malveillant...&lt;br /&gt;&lt;br /&gt;Il est donc bon lorsque cette ouverture est ponctuelle de donner au passage un message d'information indiquant l'action, et la conduite à tenir en cas de difficulté. Ceci est d'autant plus vrai dans le cas d'une application dite "grand public".&lt;br /&gt;&lt;br /&gt;Voici une illustration de ce mécanisme mis en place dans l'application Tomtom Home lorsque l'on tente de consulter la documentation d'un GPS fraîchement déballé :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_4lHIG-XlQLg/R071VliveII/AAAAAAAAAI4/2d9kzS_k6M0/s1600-h/tomtom.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4lHIG-XlQLg/R071VliveII/AAAAAAAAAI4/2d9kzS_k6M0/s320/tomtom.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5138313976080201858" /&gt;&lt;/a&gt;&lt;br /&gt;Ainsi même si l'ouverture est impossible, l'utilisateur final n'est pas dérouté par un bouton sans aucun effet. L'ajout d'une minuterie sur le bouton peut être un plus, ainsi que d'une coche "ne plus afficher ce message".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-6133577540365979565?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/6133577540365979565/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=6133577540365979565' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6133577540365979565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6133577540365979565'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/11/complter-les-appels-aux-navigateurs-par.html' title='Compléter les appels aux navigateurs par un message d&apos;information'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4lHIG-XlQLg/R071VliveII/AAAAAAAAAI4/2d9kzS_k6M0/s72-c/tomtom.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-1471451335450917408</id><published>2007-10-11T10:23:00.000+02:00</published><updated>2007-10-11T10:42:40.295+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Accélérer les traitements d'importation de données</title><content type='html'>Les temps de traitement pour des importations de données peuvent générer une attente importante si se cumulent des volumes importants, et des index nombreux. En effet, chaque ajout va nécessiter de mettre à jour les différents index correspondant aux données.&lt;br /&gt;&lt;br /&gt;Une alternative permettant des traitements d'importations plus rapides, consiste à différer la mise à jour des index en s'appuyant sur le mécanisme de réindexation.&lt;br /&gt;&lt;br /&gt;La phase d'importation se fait en utilisant la fonction "HEcrit" en lieu et place de "HAjoute". Elle permettra d'insérer les données à importer, sans aucune mise à jour des index. Cela permet un gain de temps, très significatif dans le cas d'un fichier ayant de nombreux index.&lt;br /&gt;&lt;br /&gt;Une fois les données importées, il suffit d'utiliser la fonction "HRéindexe" qui va mettre à jour les index avec les nouvelles données. Dans bien des cas, cette méthode en deux temps est plus rapide qu'une importation traditionnelle avec la fonction "HAjoute".&lt;br /&gt;&lt;br /&gt;Sur le même sujet :&lt;br /&gt;&lt;a href="http://elianlacroix.blogspot.com/2007/07/synthse-pour-aller-plus-vite.html"&gt;Synthèse pour aller plus vite !&lt;/a&gt;&lt;br /&gt;&lt;a href="http://elianlacroix.blogspot.com/2007/10/acclrer-le-lancement-des-applications.html"&gt;Accélérer le lancement des applications&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-1471451335450917408?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/1471451335450917408/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=1471451335450917408' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1471451335450917408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1471451335450917408'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/10/acclrer-les-traitements-dimportation-de.html' title='Accélérer les traitements d&apos;importation de données'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5879650824672924973</id><published>2007-10-05T10:06:00.000+02:00</published><updated>2007-10-11T10:42:18.549+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Accélérer le lancement des applications</title><content type='html'>Par facilité on place régulièrement la fonction "HCréationSiInexistant" au début des applications pour s'assurer de la création systématique de tous les fichiers de données. Le piège, la base grandissante, est d'avoir une attente importante lors de cet appel, car il provoque une ouverture de tous les fichiers de données. Et l'ouverture initiale des fichiers fait partie des opérations les plus coûteuses en temps.&lt;br /&gt;&lt;br /&gt;Il y a une solution, presque miracle, c'est l'option "hOuvertureDifférée" de la fonction :&lt;br /&gt;&lt;blockquote&gt;HCréationSiInexistant("*", hOuvertureDifférée)&lt;/blockquote&gt;&lt;br /&gt;En effet, le but escompté est atteint, car tous les fichiers restent créés automatiquement. Mais pour les fichiers existants, l'ouverture ne sera pas faite immédiatement. Elle sera différée à la première utilisation effective du fichier. On comprend aisément le gain de temps très appréciable puisque :&lt;br /&gt;- le temps d'ouverture des fichiers est réparti au fil de l'application,&lt;br /&gt;- seuls les fichiers réellement utilisés seront ouverts.&lt;br /&gt;&lt;br /&gt;Sur le même sujet :&lt;br /&gt;&lt;a href="http://elianlacroix.blogspot.com/2007/07/synthse-pour-aller-plus-vite.html"&gt;Synthèse pour aller plus vite !&lt;/a&gt;&lt;br /&gt;&lt;a href="http://elianlacroix.blogspot.com/2007/10/acclrer-les-traitements-dimportation-de.html"&gt;Accélérer les traitements d'importation de données&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5879650824672924973?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5879650824672924973/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5879650824672924973' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5879650824672924973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5879650824672924973'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/10/acclrer-le-lancement-des-applications.html' title='Accélérer le lancement des applications'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-8297472060284087982</id><published>2007-10-02T09:35:00.000+02:00</published><updated>2007-10-02T09:50:17.597+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Contrôle lors du changement de volet d'un onglet</title><content type='html'>Le champ onglet est pourvu d'un code de modification, appelé lorsque l'utilisateur change de volet. Ce code permet d'exécuter des traitements concernant le volet qui vient d'être affiché. Il s'exécute lorsque le &lt;strong&gt;changement de volet est déjà fait&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Pour toutes sortes de raisons, il peut être utile d'exécuter un traitement lorsque l'utilisateur clic sur un nouveau volet, mais &lt;strong&gt;avant&lt;/strong&gt; même que le nouveau volet ne soit affiché. Il faudrait pour cela un code de modification sur l'onglet, mais &lt;strong&gt;avant changement &lt;/strong&gt;!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/RwH1fkYf9LI/AAAAAAAAAIw/G_UdzX5T9is/s1600-h/onglet.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/RwH1fkYf9LI/AAAAAAAAAIw/G_UdzX5T9is/s200/onglet.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5116640574360777906" /&gt;&lt;/a&gt;Ce code n'étant pas proposé par défaut, il est possible d'utiliser en lieu et place le code optionnel "Bouton gauche enfoncé" du champ onglet. En effet ce code est bien appelé avant même que le changement de volet ne soit effectif. Il permet donc par exemple de faire un contrôle de saisie sur le volet sélectionné avant le clic, pour si besoin interdire le changement de volet en inhibant l'événement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-8297472060284087982?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/8297472060284087982/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=8297472060284087982' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8297472060284087982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8297472060284087982'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/10/contrle-lors-du-changement-de-volet-dun.html' title='Contrôle lors du changement de volet d&apos;un onglet'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4lHIG-XlQLg/RwH1fkYf9LI/AAAAAAAAAIw/G_UdzX5T9is/s72-c/onglet.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-4167573532336371627</id><published>2007-09-25T13:37:00.000+02:00</published><updated>2007-09-25T17:27:35.283+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Impressions'/><title type='text'>Imprimer une image en gardant le choix de l'imprimante dans l'aperçu...</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/RvkngkYf9JI/AAAAAAAAAIg/TgFwRUf45js/s1600-h/choix+imprimante+aper%C3%A7u+1.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/RvkngkYf9JI/AAAAAAAAAIg/TgFwRUf45js/s200/choix+imprimante+aper%C3%A7u+1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5114162292331639954" /&gt;&lt;/a&gt;En créant un aperçu d'une image avec les fonctions "iAperçu", "iImprimeImage" et "iFinImprime", la fenêtre d'aperçu obtenue ne permet pas la sélection de l'imprimante. C'est pourtant bien utile notamment pour les applications qui s'exécutent depuis des postes portables qui changent régulièrement d'imprimante.&lt;br /&gt;&lt;br /&gt;Une astuce permettant d'obtenir une impression d'image avec le choix de l'imprimante, consiste à utiliser un état créé par l'éditeur d'états, plutôt qu'une impression programmée. &lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/Ru5oqMlkvEI/AAAAAAAAAIY/AB-00j1uRyc/s1600-h/choix+imprimante+aper%C3%A7u+2.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/Ru5oqMlkvEI/AAAAAAAAAIY/AB-00j1uRyc/s200/choix+imprimante+aper%C3%A7u+2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5111137701254708290" /&gt;&lt;/a&gt;Il suffit ensuite de lancer l'aperçu avec la fonction "iImprimeEtat", et l'aperçu sera pourvu du choix de l'imprimante. L'état sera on ne peut plus simple, avec un champ image affecté par un paramètre de l'état, paramètre recevant le nom de de l'image à afficher à l'ouverture de l'état.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-4167573532336371627?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/4167573532336371627/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=4167573532336371627' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/4167573532336371627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/4167573532336371627'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/09/imprimer-une-image-en-gardant-le-choix.html' title='Imprimer une image en gardant le choix de l&apos;imprimante dans l&apos;aperçu...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4lHIG-XlQLg/RvkngkYf9JI/AAAAAAAAAIg/TgFwRUf45js/s72-c/choix+imprimante+aper%C3%A7u+1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-592535177742803321</id><published>2007-09-17T13:13:00.000+02:00</published><updated>2007-09-17T13:29:30.595+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Eviter les oublis avec les règles</title><content type='html'>Les projets ont toujours des traitements, ou des champs, qui doivent se comporter de façon uniforme, ou provoquer d'autres actions obligatoires au domaine d'application.&lt;br /&gt;&lt;br /&gt;Dans la précipitation quotidienne, il n'est pas rare de faire un oubli, préjudiciable en temps par la suite puisqu'il faut revenir sur le traitement ou l'interface, dans le pire des cas après un signalement de l'utilisateur final. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/Ru5i2MlkvCI/AAAAAAAAAII/2aHaxFWaqD8/s1600-h/regle.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/Ru5i2MlkvCI/AAAAAAAAAII/2aHaxFWaqD8/s200/regle.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5111131310343371810" /&gt;&lt;/a&gt;Il y a une fonctionnalité que j'avais initialement sous-estimée, baptisée "règle métier" qui limite grandement les risques d'oublis. En effet, elles permettent d'indiquer pour des champs ou fenêtres, des actions obligatoires, qui seront automatiquement rappelées pendant les phases de développement qui suivront.&lt;br /&gt;&lt;br /&gt;Une illustration en image maintenant que l'information circule en vidéo :&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="353"&gt;&lt;param name="movie" value="http://www.youtube.com/v/n9KKbaXu6VI"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/n9KKbaXu6VI" type="application/x-shockwave-flash" wmode="transparent" width="425" height="353"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-592535177742803321?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/592535177742803321/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=592535177742803321' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/592535177742803321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/592535177742803321'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/09/eviter-les-oublis-avec-les-rgles.html' title='Eviter les oublis avec les règles'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4lHIG-XlQLg/Ru5i2MlkvCI/AAAAAAAAAII/2aHaxFWaqD8/s72-c/regle.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-6805128614982076482</id><published>2007-09-17T08:00:00.000+02:00</published><updated>2007-09-17T14:30:02.317+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inclassable / Hors sujet'/><title type='text'>Toujours plus d'informations !</title><content type='html'>Le site de PC SOFT propose de nouvelles sources d'informations à ne pas négliger pour ne pas passer à côté de fonctionnalités précieuses (cf. prochain billet sur les règles métiers). &lt;br /&gt;&lt;br /&gt;Tout d'abord un nouveau blog "&lt;a href="http://blogs.webdev.info/billets.awp?blog=technologies_marches"&gt;Technologies et Marchés&lt;/a&gt;" de l'équipe commerciale, mais contenant surtout de l'information technique (&lt;a href="http://blogs.webdev.info/"&gt;tous les blogs&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;D'autre part des &lt;a href="http://www.pcsoft.fr/windev/videos.htm"&gt;vidéos&lt;/a&gt; en grande quantité pour présenter bon nombre de fonctionnalités. Sans rentrer dans le détail, elles permettent de découvrir de nombreux principes, qu'il est ensuite facile de mettre en œuvre grâce à la simplicité des éditeurs. On retrouve même ces vidéos sur &lt;a href="http://fr.youtube.com/results?search_query=windev"&gt;Youtube&lt;/a&gt; !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-6805128614982076482?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/6805128614982076482/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=6805128614982076482' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6805128614982076482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6805128614982076482'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/09/toujours-plus-dinformations.html' title='Toujours plus d&apos;informations !'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-2800908390638962191</id><published>2007-07-30T12:28:00.000+02:00</published><updated>2007-10-11T10:41:54.822+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Synthèse pour aller plus vite !</title><content type='html'>Voyant apparaître sur les forums des demandes de conseils pour optimiser les accès aux données, j'ai regroupé ici les principaux éléments de réponse, et méthodes à employer. L'optimisation des accès est primordiale, surtout lorsqu'ils sont faits au travers d'Internet qui n'offre pas les débits d'un réseau local.&lt;br /&gt;&lt;br /&gt;Privilégier les sélections par des requêtes :&lt;br /&gt;Il est préférable d'effectuer les sélections de données au travers de requêtes. En effet, par opposition à des accès enregistrement par enregistrement, elles vont permettre de "ramener" sur le poste client les données sélectionnées, par "paquets" réseau bien remplis. Des lectures enregistrement par enregistrement vont au contraire générer du trafic avec à chaque fois peu de données. De plus la lecture d'un enregistrement impose de récupérer toutes ces rubriques, alors que la sélection d'une requête peut être affinée en ne prenant que les rubriques utiles à un moment donné. Ceci est d'autant plus vrai si la connexion se fait par Internet.&lt;br /&gt;&lt;br /&gt;Optimisation des requêtes :&lt;br /&gt;Le menu "Requête / Optimiser la requête" accessible en édition d'une requête doit finaliser la phase de création d'une interrogation. Il permet d'ajouter si besoin les clés dont la requête aura besoin pour un maximum de rapidité.&lt;br /&gt;&lt;br /&gt;Statistiques des index à jour :&lt;br /&gt;Les clés dans le fichier sont importantes, à condition que les &lt;a href="http://elianlacroix.blogspot.com/2006/09/quiz-connaissez-vous-la-fonction.html"&gt;statistiques&lt;/a&gt; des index soient régulièrement mis à jour (surtout après des ajouts en grand nombre).&lt;br /&gt;&lt;br /&gt;Rester raisonnable :&lt;br /&gt;La facilité avec laquelle on programme et accède aux données, le tout généralement dans l'urgence, provoque parfois une négligence de l'évaluation de ce que l'on demande. Chaque enregistrement à une taille bien précise, chaque interrogation va ramener un ensemble d'enregistrements, donc un volume précis. Il faut tenir compte, surtout en accès via Internet, de ce volume, afin d'évaluer avec le débit minimal si l'application ne demande pas trop par rapport à ce qu'elle peut recevoir.&lt;br /&gt;&lt;br /&gt;Client/Serveur :&lt;br /&gt;Privilégier un accès aux données au travers du moteur Hyper File Client/Serveur, il va permettre de soulager grandement le travail de chaque poste client, et donc de gagner en performances. Les procédures stockées vont offrir également des gains. Typiquement, un long calcul statistiques pourra être fait en "différé" de l'application, permettant à un utilisateur d'avoir un résultat immédiat en remplacement d'une attente.&lt;br /&gt;Son mécanisme de "Log" pourra également permettre un suivi très fin des interrogations en vue de rechercher notamment des abus d'une station, ou d'un traitement.&lt;br /&gt;&lt;br /&gt;Analyseur de performances :&lt;br /&gt;Lorsque l'on a encore des attentes, il faut exécuter l'analyseur de performances qui va permettre de les localiser très précisément. Une fois que l'on sait où passe le temps, il devient possible de voir comment l'influencer (dans un programme uniquement à mon grand regret).&lt;br /&gt;Cas particulier pour &lt;a href="http://elianlacroix.blogspot.com/2007/07/attente-au-matin-lors-de-la-mise-jour.html"&gt;l'attente du matin&lt;/a&gt;, il faut garder dans un coin de tête le possible trouble que peut engendrer la restauration du système.&lt;br /&gt;&lt;br /&gt;Ce billet n'a rien d'exhaustif le sujet étant si vaste, je tenterai de le compléter régulièrement. Mais pas trop vite tout de même, car il est temps pour moi de prendre quelques jours de repos en cette période estivale !&lt;br /&gt;&lt;br /&gt;Sur le même sujet :&lt;br /&gt;&lt;a href="http://elianlacroix.blogspot.com/2007/10/acclrer-le-lancement-des-applications.html"&gt;Accélérer le lancement des applications&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://elianlacroix.blogspot.com/2007/10/acclrer-les-traitements-dimportation-de.html"&gt;Accélérer les traitements d'importation de données&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-2800908390638962191?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/2800908390638962191/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=2800908390638962191' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2800908390638962191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2800908390638962191'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/07/synthse-pour-aller-plus-vite.html' title='Synthèse pour aller plus vite !'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-9215138230767401341</id><published>2007-07-18T18:14:00.000+02:00</published><updated>2007-07-18T18:25:35.803+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Attente au matin lors de la mise à jour d'un fichier ...</title><content type='html'>Description surprenante d'un utilisateur final :&lt;blockquote&gt;Tous les matins le premier enregistrement d'une commande prend du temps, les suivants sont immédiats !?&lt;/blockquote&gt;&lt;br /&gt;Surprenante, car c'est plutôt au fur et à mesure que l'on "charge" la machine tout au long de la journée qu'elle ralentit, plutôt qu'à son démarrage. Et pourtant, cela peut se produire avec les postes XP configurés par défaut et utilisant une base Hyper File.&lt;br /&gt;&lt;br /&gt;Le fautif : la restauration du système de Windows car elle pense que les fichiers NDX (index Hyper File) sont des fichiers systèmes à sauvegarder. De ce fait, après chaque démarrage du poste, si une modification est demandée sur un fichier Hyper File ("HModifie", "HAjoute", "HSupprime"...), une sauvegarde du fichier est faite et peut donc être coûteuse en temps suivant sa taille. Plus généralement, sont concernées toutes les actions qui provoquent une modification de l'index. En revanche la simple consultation n'a pas d'incidence sur la restauration du système.&lt;br /&gt;&lt;br /&gt;La solution consiste à indiquer au mécanisme de restauration du système qu'il doit ignorer les fichiers d'index de votre application. Pour cela une clé de registre est mise à disposition par Microsoft. Il suffit donc d'aller insérer une valeur dans cette clé avec la fonction "RegistreEcrit".&lt;br /&gt;&lt;br /&gt;La clé de registre est la suivante : HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\BackupRestore\FilesNotToBackup&lt;br /&gt;Il faut insérer une valeur texte dont le nom est une chaîne quelconque, par exemple le nom de votre application, et la donnée le chemin à exclure.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_4lHIG-XlQLg/Rp48ZFldnbI/AAAAAAAAAH4/Zay4wrs08Mk/s1600-h/restauration.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4lHIG-XlQLg/Rp48ZFldnbI/AAAAAAAAAH4/Zay4wrs08Mk/s200/restauration.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5088571030668942770" /&gt;&lt;/a&gt;La copie d'écran ci-contre donne une illustration, et ce &lt;a href="http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/regentry/75814.mspx?mfr=true"&gt;lien donne une page de détail sur un site Microsoft&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-9215138230767401341?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/9215138230767401341/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=9215138230767401341' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/9215138230767401341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/9215138230767401341'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/07/attente-au-matin-lors-de-la-mise-jour.html' title='Attente au matin lors de la mise à jour d&apos;un fichier ...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4lHIG-XlQLg/Rp48ZFldnbI/AAAAAAAAAH4/Zay4wrs08Mk/s72-c/restauration.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5882229758314243907</id><published>2007-07-16T18:17:00.000+02:00</published><updated>2007-07-16T18:26:36.857+02:00</updated><title type='text'>Echec de visualisation des pages d'une aide CHM</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_4lHIG-XlQLg/RpuaH1ldnaI/AAAAAAAAAHw/NecGHbsY6B8/s1600-h/chm.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4lHIG-XlQLg/RpuaH1ldnaI/AAAAAAAAAHw/NecGHbsY6B8/s320/chm.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5087829663479078306" /&gt;&lt;/a&gt;Surprise après le déploiement d'une application déployée sur un serveur (aucun fichier sur les postes des utilisateurs à part un raccourci) : les aides au format CHM présentaient une erreur de "Navigation vers la page Web annulée".&lt;br /&gt;&lt;br /&gt;Renseignement pris auprès du support, rien de plus normal avec un Windows XP à jour : ce n'est pas autorisé !!! Sécurité Microsoft oblige, les .CHM doivent être en local pour une visualisation directe. Il est cependant possible de passer outre cette "sécurité", en suivant les recommandations de cet article :&lt;br /&gt;&lt;a href="http://support.microsoft.com/default.aspx?scid=kb;fr;902225"&gt;http://support.microsoft.com/default.aspx?scid=kb;fr;902225&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5882229758314243907?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5882229758314243907/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5882229758314243907' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5882229758314243907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5882229758314243907'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/07/echec-de-visualisation-des-pages-dune.html' title='Echec de visualisation des pages d&apos;une aide CHM'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4lHIG-XlQLg/RpuaH1ldnaI/AAAAAAAAAHw/NecGHbsY6B8/s72-c/chm.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-1555802833804034690</id><published>2007-07-11T09:34:00.000+02:00</published><updated>2007-07-11T09:39:31.826+02:00</updated><title type='text'>Mon état est devenu fou, il ne voit pas mon paramètre !</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/RpSIPtt7csI/AAAAAAAAAHg/eSwV_eT8Vzw/s1600-h/etat.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/RpSIPtt7csI/AAAAAAAAAHg/eSwV_eT8Vzw/s200/etat.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5085839682759783106" /&gt;&lt;/a&gt;"Tranche de vie", avec un long moment perdu à ne pas réussir à passer un paramètre à un état. Malgré un iImprimeEtat(NomEtat, Paramètre), j'avais systématiquement le message "on attendait 1 paramètres, on en a reçu 0".&lt;br /&gt;&lt;br /&gt;Après de longues minutes à chercher, j'ai finalement trouvé mon erreur dans la description de l'état, ou par mégarde les bornes "min" et "max" étaient cochées je ne sais plus pour quelle raison. Le bon code d'appel de l'état avec des bornes et un paramètre aurait du être iImprimeEtat(NomEtat, ValeurBorneMin, ValeurBorneMax, Paramètre).&lt;br /&gt;&lt;br /&gt;J'espère que ce billet pourra dépanner quelqu'un, un jour, ce qui me permettra de me sentir moins seul sur pareil bêtise !&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/RpSIVtt7ctI/AAAAAAAAAHo/PU3FMT2ddU8/s1600-h/etat2.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/RpSIVtt7ctI/AAAAAAAAAHo/PU3FMT2ddU8/s320/etat2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5085839785838998226" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-1555802833804034690?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/1555802833804034690/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=1555802833804034690' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1555802833804034690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1555802833804034690'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/07/mon-tat-est-devenu-fou-il-ne-voit-pas.html' title='Mon état est devenu fou, il ne voit pas mon paramètre !'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/RpSIPtt7csI/AAAAAAAAAHg/eSwV_eT8Vzw/s72-c/etat.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-2490547849094257037</id><published>2007-07-10T11:03:00.000+02:00</published><updated>2007-07-10T11:10:29.806+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Identifier les emails entrants qui sont des réponses aux précédents emails sortants</title><content type='html'>Il est de plus en plus fréquent de devoir implémenter un suivi des emails dans les systèmes d'information, par exemple pour qu'une réponse soit directement dirigée vers le bon collaborateur.&lt;br /&gt;&lt;br /&gt;L'exemple WD Suivi Email de la LST 68 donne le principe de base, en utilisant la variable Email.Référence. Mais j'ai eu besoin d'aller plus loin pour le cas ou l'on souhaite récupérer directement l'identifiant du dernier message que l'on a envoyé. En effet, le champ Email.Référence empile les identifiants des différents messages, il peut donc être utilise de faire un parcours en sens inverse de son contenu pour trouver l'identifiant du dernier message envoyé. D'autre part dans la structure des emails on peut trouver directement l'identifiant du dernier message, dans une section "In-Reply-To".&lt;br /&gt;&lt;br /&gt;Voici donc deux fonctions permettant de parvenir au résultat attendu, n'hésitez pas à les réutiliser si elles répondent à vos attentes !&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;FONCTION ChercheRéférence(_SourceEmail)&lt;br /&gt;&lt;br /&gt; // Recherche dans le code source d'un email reçu en paramètre&lt;br /&gt; // s'il s'agit d'une réponse à un message envoyé précédemment&lt;br /&gt; // On recherche d'abord la balise In-Reply-To, puis dans les&lt;br /&gt; // références (en partant de la fin)&lt;br /&gt; // MESSAGEID_DOMAINE est une constante du projet contenant&lt;br /&gt; // le domaine donné lors de l'envoi des messages (partie droite du @)&lt;br /&gt;&lt;br /&gt; sReference est une chaîne&lt;br /&gt; sListeRéférence est une chaîne&lt;br /&gt; &lt;br /&gt; sReference = :InReplyTo(_SourceEmail)&lt;br /&gt; &lt;br /&gt; SI Position(sReference, MESSAGEID_DOMAINE, 1, SansCasse) ALORS&lt;br /&gt;  // Une référence a été trouvée, elle est renvoyée.&lt;br /&gt;  RENVOYER sReference&lt;br /&gt; SINON&lt;br /&gt;  // Pas de "InReplyTo" dans ce message, on va regarder les références de l'email en partant de la fin.&lt;br /&gt;  SI Email.Référence &lt;&gt; "" ALORS&lt;br /&gt;   // On supprime les espaces entre les références pour les parcourir&lt;br /&gt;   sListeRéférence = Remplace(Email.Référence, " ", "")&lt;br /&gt;   POUR TOUT CHAINE sReference DE sListeRéférence SEPAREE PAR "&gt;&lt;" DEPUISFIN&lt;br /&gt;    // On teste si la référence en cours nous appartient&lt;br /&gt;    // Si oui, on a retoure car c'est la plus récente et donc celle que l'on veut.&lt;br /&gt;    SI Position(sReference, MESSAGEID_DOMAINE, 1, SansCasse) ALORS&lt;br /&gt;     RENVOYER SansEspace(Remplace(Remplace(sReference, "&gt;", ""), "&lt;", ""))&lt;br /&gt;    FIN&lt;br /&gt;   FIN&lt;br /&gt;   // Pas de référence trouvée si on arrive jusque là&lt;br /&gt;   RENVOYER ""&lt;br /&gt;  SINON&lt;br /&gt;   // Par de référence non plus (nouveau message ou réception d'un Webmail qui ne les fait pas suivre)&lt;br /&gt;   RENVOYER ""&lt;br /&gt;  FIN  &lt;br /&gt; FIN&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;FONCTION InReplyTo(_SourceEmail)&lt;br /&gt;&lt;br /&gt; // Retourne le In-Reply-To d'un email dont on reçoit&lt;br /&gt; // le source complet en paramètre (par exemple Email.Source)&lt;br /&gt; // Le In-Reply-To trouvé correspond à l'identifiant d'un email &lt;br /&gt; // envoyé précédemment&lt;br /&gt;&lt;br /&gt; sInReplyToBalise est une chaîne = RC+"In-REPLY-TO:"&lt;br /&gt; sInReplyTo est une chaîne&lt;br /&gt; nPosInReplyTo est un entier&lt;br /&gt; &lt;br /&gt; nPosInReplyTo = Position(_SourceEmail, sInReplyToBalise, 1, SansCasse)&lt;br /&gt;&lt;br /&gt; SI nPosInReplyTo &gt; 0 ALORS&lt;br /&gt;  sInReplyTo = ExtraitChaîne(_SourceEmail[[(nPosInReplyTo+Taille(sInReplyToBalise)+1) A ]], 1, RC)&lt;br /&gt;  RENVOYER SansEspace(Remplace(Remplace(sInReplyTo, "&gt;", ""), "&lt;", ""))&lt;br /&gt; SINON&lt;br /&gt;  // L'info n'est pas trouvée&lt;br /&gt;  RENVOYER ""&lt;br /&gt; FIN&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Si vous faites un copier/coller du code dans votre éditeur, utilisez ensuite le menu "Code ... Réindentation automatique" afin d'avoir le code correctement affiché.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-2490547849094257037?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/2490547849094257037/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=2490547849094257037' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2490547849094257037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2490547849094257037'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/07/identifier-les-emails-entrants-qui-sont.html' title='Identifier les emails entrants qui sont des réponses aux précédents emails sortants'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7280424254767930289</id><published>2007-07-09T13:27:00.000+02:00</published><updated>2007-07-09T13:31:22.410+02:00</updated><title type='text'>Pourquoi le code de modification d'un champ s'exécute à l'ouverture d'une fenêtre ?</title><content type='html'>Dans l'ordre normal des choses, l'ouverture d'une fenêtre provoque l'enchaînement des traitements suivants :&lt;br /&gt;- code de déclaration des globales de la fenêtres,&lt;br /&gt;- code d'initialisation successives des différents champs,&lt;br /&gt;- et enfin le code d'initialisation de la fenêtre.&lt;br /&gt;&lt;br /&gt;Alors qu'elle peut être l'option qui provoque l'exécution du code de modification d'un des champs, avant le code d'initialisation de la fenêtre ? &lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/RpIbtNt7crI/AAAAAAAAAHY/1WgKRw7LV8A/s1600-h/onglet.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/RpIbtNt7crI/AAAAAAAAAHY/1WgKRw7LV8A/s200/onglet.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5085157392845075122" /&gt;&lt;/a&gt;C'est l'option "Mémoriser la valeur" du détail de la description des champs. En effet, j'ai bataillé un moment pour trouver pourquoi j'avais un onglet dont le code était appelé de la sorte. C'est comme tout, une fois qu'on le sait, cela devient simple et évident. En effet, comme le système restaure un choix de l'utilisateur de l'application, il exécute également le code qui avait été provoqué par ce choix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7280424254767930289?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7280424254767930289/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7280424254767930289' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7280424254767930289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7280424254767930289'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/07/pourquoi-le-code-de-modification-dun.html' title='Pourquoi le code de modification d&apos;un champ s&apos;exécute à l&apos;ouverture d&apos;une fenêtre ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/RpIbtNt7crI/AAAAAAAAAHY/1WgKRw7LV8A/s72-c/onglet.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5545691474903586382</id><published>2007-07-03T22:51:00.000+02:00</published><updated>2007-07-03T22:57:47.780+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobilité'/><title type='text'>Installation MSI ou CAB ? Localisation Framework ?</title><content type='html'>Les combinaisons d'installations d'une application WINDEV MOBILE sur un périphérique mobile sont nombreuses, il n'est pas évident de s'y retrouver au départ :&lt;br /&gt;- Utiliser le Framework PC SOFT non renommé,&lt;br /&gt;- Utiliser un jeu de DLL renommées,&lt;br /&gt;- Utiliser un Framework commun renommé.&lt;br /&gt;Le tout à combiner avec le type d'installation retenue : via un fichier MSI ou un fichier .CAB.&lt;br /&gt;&lt;br /&gt;Pour faire un bon choix, il faut avoir les réponses aux questions suivantes qui vont dépendre du domaine d'activité, du matériel (...) :&lt;br /&gt;- l'installation sera-t-elle faite sur un mobile directement, sans connexion à un PC ?&lt;br /&gt;- le mobile dispose-t-il d'un espace de stockage important (carte mémoire additionnelle) ?&lt;br /&gt;- plusieurs applications devront-elle être installées ?&lt;br /&gt;&lt;br /&gt;Avec ces réponses, il est facile de s'orienter vers le choix le plus adapté, sachant qu'il s'agit de toute façon de compromis :&lt;br /&gt;&lt;br /&gt;- installation sur mobile sans connexion à un PC ?&lt;br /&gt;Dans ce cas il faut générer une installation en .CAB qui sera copiée sur le mobile (et automatiquement supprimée après exécution). Dans le cas contraire, un MSI sera préférable car exécuté au travers d'un installeur Microsoft avec lequel l'utilisateur est généralement familiarisé.&lt;br /&gt;&lt;br /&gt;- le mobile dispose d'espace avec une carte additionnelle ?&lt;br /&gt;Dans ce cas il est préférable d'utiliser un jeu de DLL renommées, unique pour l'application. De cette manière un .CAB unique sera créé facilitant l'installation. Dans le cas contraire, il faut limiter l'espace occupé en ayant un unique Framework sur le mobile. Si une seule application doit être installée, on garde un jeu de DLL renommées, unique pour l'application. Par contre s'il faut installer plusieurs applications, on retient le choix :&lt;br /&gt;-- utiliser le Framework PC SOFT non renommé pour placer le Framework directement dans le mobile,&lt;br /&gt;-- ou utiliser un Framework commun renommé pour placer le Framework directement sur une carte mémoire.&lt;br /&gt;Dans ces deux cas, 2 fichiers .CAB sont générés : un pour l'application, l'autre pour le Framework.&lt;br /&gt;&lt;br /&gt;J'espère que ce résumé pourra donner quelques orientations...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5545691474903586382?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5545691474903586382/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5545691474903586382' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5545691474903586382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5545691474903586382'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/07/installation-msi-ou-cab-localisation.html' title='Installation MSI ou CAB ? Localisation Framework ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5188928318623726244</id><published>2007-07-02T23:24:00.000+02:00</published><updated>2007-07-02T23:51:58.929+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobilité'/><title type='text'>"Mobilité" en nouveau sujet</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/RoltGNt7cqI/AAAAAAAAAHQ/c3EnWXGVD8c/s1600-h/htc.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/RoltGNt7cqI/AAAAAAAAAHQ/c3EnWXGVD8c/s400/htc.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5082713607993258658" /&gt;&lt;/a&gt;Quelques jours passés en Suisse le mois dernier, de nouveaux matériels répondants maintenant à des attentes réelles des utilisateurs, et une bonne &lt;a href="http://www.pcsoft.fr/un-euro-de-plus/index.htm"&gt;promo à "1 euro de plus"&lt;/a&gt; comme PC SOFT en a le secret, ont eu raison de moi : me voilà tout fraîchement équipé d'un &lt;a href="http://www.qtek.fr/produits_detail.php?produit_id=347"&gt;Smartphone (QTEK) HTC S710&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;L'occasion donc d'ajouter une nouvelle catégorie dans le Blog : la mobilité ! J'espère prochainement vous faire partager mes premières astuces et conseils, mais il va falloir que je découvre auparavant ce "nouveau monde" ou l'ergonomie doit être sans cesse la priorité du Développeur !&lt;br /&gt;&lt;br /&gt;Il ne faut pas se fier aux idées reçues, ces petits concentrés de technologies ne sont plus des gadgets !&lt;br /&gt;&lt;br /&gt;Ndlr : ne vous méprenez pas en ce qui concerne la Suisse, j'ai simplement pu y observer une utilisation bien plus fréquente de ce type d'équipement qu'en France. Rien à voir avec ce qui pourrait fâcher un douanier !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5188928318623726244?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5188928318623726244/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5188928318623726244' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5188928318623726244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5188928318623726244'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/07/mobilit-en-nouveau-sujet.html' title='&quot;Mobilité&quot; en nouveau sujet'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4lHIG-XlQLg/RoltGNt7cqI/AAAAAAAAAHQ/c3EnWXGVD8c/s72-c/htc.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7597969422635035360</id><published>2007-06-27T09:34:00.000+02:00</published><updated>2007-06-27T09:36:02.072+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Obtenir une représentation hexadécimale d'une chaîne de caractères alphanumérique</title><content type='html'>Petite astuce lorsque l'on doit donner une forme hexadécimale à une chaine : utiliser la fonction "NumériqueVersChaine" qui permet la conversion simple d'une valeur décimale en hexadécimale. Exemple :&lt;br /&gt;&lt;blockquote&gt;sChaine est une chaîne = "Bonjour, 27 juin 2007"&lt;br /&gt;sChaineHexa est une chaîne&lt;br /&gt;&lt;br /&gt;POUR i = 1 A Taille(sChaine)&lt;br /&gt; sChaineHexa += NumériqueVersChaîne(Asc(sChaine[[i]]), "2X")&lt;br /&gt;FIN&lt;br /&gt;&lt;br /&gt;Info(sChaineHexa)&lt;/blockquote&gt;Une application directe, visualiser le Hash d'un fichier par exemple, car sans conversion de ce type la valeur contient des signes cabalistiques peu lisibles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7597969422635035360?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7597969422635035360/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7597969422635035360' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7597969422635035360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7597969422635035360'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/06/obtenir-une-reprsentation-hexadcimale.html' title='Obtenir une représentation hexadécimale d&apos;une chaîne de caractères alphanumérique'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-626169961333130984</id><published>2007-06-25T12:03:00.000+02:00</published><updated>2007-06-25T12:05:54.571+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Pourquoi le fond d'une fenêtre ne change pas avec la propriété ..ImageFond ?</title><content type='html'>Pour le déploiement des applications, il faut garder dans un coin de tête que les éléments (fenêtres, états, images ...) de la bibliothèque sont prioritaires à ceux localisés sur disque.&lt;br /&gt;&lt;br /&gt;Exemple type, dans une application on propose à l'utilisateur de changer l'image de fond de sa fenêtre principale. Pour cela, on a dans le code de déclaration des globales de la fenêtre :&lt;br /&gt;&lt;blockquote&gt;MaFenêtre..ImageFond = ComplèteRep(fRepExe())+"ImageFond.jpg"&lt;/blockquote&gt;Il suffit de changer l'image "ImageFond.jpg" du répertoire de l'exécutable pour personnaliser l'image de fond de la fenêtre. Mais attention, cela ne fonctionne que si dans l'application aucune image "ImageFond.jpg" n'est utilisée par ailleurs. Dans le cas contraire, l'image utilisée par l'application est incluse dans la bibliothèque, elle est prioritaire, et une nouvelle image "ImageFond.jpg" dans le répertoire de l'exécutable est tout simplement ignorée.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-626169961333130984?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/626169961333130984/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=626169961333130984' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/626169961333130984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/626169961333130984'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/06/pourquoi-le-fond-dune-fentre-ne-change.html' title='Pourquoi le fond d&apos;une fenêtre ne change pas avec la propriété ..ImageFond ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-6854956909619456525</id><published>2007-05-10T12:30:00.000+02:00</published><updated>2007-07-02T23:47:38.476+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Colonne combo d'une table, syntaxe de récupération de la valeur donnée par "gLien" au chargement</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/RkL0csqIPiI/AAAAAAAAAHI/OkiRP6PfwOg/s1600-h/VST15450-80-5.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/RkL0csqIPiI/AAAAAAAAAHI/OkiRP6PfwOg/s400/VST15450-80-5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5062877704979234338" /&gt;&lt;/a&gt;Lorsqu'une colonne combo d'une table est chargée par programmation avec "ListeAjoute", et que chaque élément a un identifiant donné avec "gLien", la récupération de cet identifiant n'est pas immédiate.&lt;br /&gt;&lt;br /&gt;D'abord il ne faut pas cocher l'option "retourner la valeur spécifiée avec la fonction gLien" dans le détail de la description de la colonne combo.&lt;br /&gt;&lt;br /&gt;Ensuite il faut utiliser dans le code la syntaxe suivante :&lt;br /&gt;&lt;blockquote&gt;Info(NomTable.NomColonneCombo[NuméroLigne][NomTable.NomColonneCombo[NuméroLigne]])&lt;/blockquote&gt;&lt;br /&gt;Sans cette syntaxe, la récupération de l'information donnée au chargement avec "gLien" n'est que partielle.&lt;br /&gt;&lt;br /&gt;Ndlr : ne pensez pas que j'ai trouvé cette syntaxe par moi-même, il s'agit d'une information obtenue du support !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-6854956909619456525?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/6854956909619456525/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=6854956909619456525' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6854956909619456525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6854956909619456525'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/05/colonne-combo-dune-table-syntaxe-de.html' title='Colonne combo d&apos;une table, syntaxe de récupération de la valeur donnée par &quot;gLien&quot; au chargement'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4lHIG-XlQLg/RkL0csqIPiI/AAAAAAAAAHI/OkiRP6PfwOg/s72-c/VST15450-80-5.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5789198268985442647</id><published>2007-04-25T21:47:00.000+02:00</published><updated>2007-07-02T23:47:38.476+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Comment stopper un sablier récalcitrant ?</title><content type='html'>Pour faire patienter un utilisateur, l'utilisation d'un sablier est parfaitement adaptée. Mais dans la "vie" d'une application, un traitement simple au départ s'enrichie au fil du temps, fait appel à des composants, dialogues avec d'autres applications ... bref au final, il y a quelque part un Sablier(Vrai) qui persiste et ne veut plus s'enlever même avec un Sablier(Faux) dans le traitement.&lt;br /&gt;&lt;br /&gt;Voici une méthode de contournement permettant de s'assurer de la disparition définitive d'un sablier laissé par un traitement.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/Ri-wmsqIPhI/AAAAAAAAAHA/pv0a_QIAzxM/s1600-h/stop_sablier.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/Ri-wmsqIPhI/AAAAAAAAAHA/pv0a_QIAzxM/s200/stop_sablier.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5057455085429734930" /&gt;&lt;/a&gt;Il faut créer une procédure globale "StopSablier", qui contiendra uniquement un appel de Sablier(Faux). Les automatismes de procédure feront le reste, comme le montre la copie d'écran du billet. Pour résumer, avec un seul appel de la procédure dans le code, on va appeler 3 fois Sablier(Faux), on est ainsi certain de reprendre le curseur de souris standard !&lt;br /&gt;&lt;br /&gt;Pas forcément élégant, mais radicalement efficace !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5789198268985442647?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5789198268985442647/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5789198268985442647' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5789198268985442647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5789198268985442647'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/04/comment-stopper-un-sablier-rcalcitrant.html' title='Comment stopper un sablier récalcitrant ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/Ri-wmsqIPhI/AAAAAAAAAHA/pv0a_QIAzxM/s72-c/stop_sablier.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5337514730082936568</id><published>2007-04-20T09:13:00.000+02:00</published><updated>2007-04-20T09:16:40.415+02:00</updated><title type='text'>Définir l'instruction suivante pour déboguer 10 fois plus vite !</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/Rihozd8I_NI/AAAAAAAAAG4/R1g20NlDsaI/s1600-h/debogueur_instruction_suivante.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/Rihozd8I_NI/AAAAAAAAAG4/R1g20NlDsaI/s400/debogueur_instruction_suivante.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5055405815142874322" /&gt;&lt;/a&gt;Pendant longtemps le passage au Débogueur d'un code permettait :&lt;br /&gt;- de suivre l'exécution en pas à pas (F7),&lt;br /&gt;- de repérer le traitement à corriger,&lt;br /&gt;- faire la correction,&lt;br /&gt;- relancer un test pour s'assurer du résultat en ayant donc à refaire tout le processus permettant d'arriver au traitement...&lt;br /&gt;&lt;br /&gt;Mais maintenant il y a le bouton que je surnomme le "bouton magique du Débogueur", qui permet de définir l'instruction suivante, tout en débogant. Il facilite en effet considérablement la mise au point et permet :&lt;br /&gt;- de suivre l'exécution en pas à pas (F7),&lt;br /&gt;- de repérer le traitement à corriger,&lt;br /&gt;- faire la correction, et immédiatement rexécuter le code juste avant cette modification !!! Il n'est plus nécessaire de relancer le test et donc de refaire tout le processus permettant d'arriver au traitement.&lt;br /&gt;&lt;br /&gt;Il est même possible de changer une fenêtre sous l'éditeur, et de réexécuter son ouverture. Mais là les cas d'usage sont moins fréquents.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5337514730082936568?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5337514730082936568/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5337514730082936568' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5337514730082936568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5337514730082936568'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/04/dfinir-linstruction-suivante-pour.html' title='Définir l&apos;instruction suivante pour déboguer 10 fois plus vite !'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/Rihozd8I_NI/AAAAAAAAAG4/R1g20NlDsaI/s72-c/debogueur_instruction_suivante.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-2089600515689834155</id><published>2007-04-16T14:27:00.001+02:00</published><updated>2007-04-16T14:28:48.893+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Migrer une analyse vers une autre base de données...</title><content type='html'>Les forums contiennent souvent des sujets de la forme "comment migrer mon analyse" en Oracle, en SQL SERVER, MYSQL...&lt;br /&gt;&lt;br /&gt;J'avais évoqué ce sujet dans un &lt;a href="http://elianlacroix.blogspot.com/2006/10/hyper-file-hyper-file-clientserveur.html"&gt;précédent billet&lt;/a&gt;, il n'y a aucune migration à faire au niveau des descriptions de fichiers pour utiliser une base de données ou une autre ! Si dans l'analyse un fichier est décrit en Oracle, sa description peut être appliquée en Hyper File, SQL SERVER ou tout autre base pour laquelle on dispose d'un provider OLE DB ou d'un accès natif.&lt;br /&gt;&lt;br /&gt;La clé du mécanisme : les fonctions "HOuvreConnexion" et "HChangeConnexion".&lt;br /&gt;&lt;br /&gt;Peu importe le type indiqué dans l'analyse, à tout moment le programme peut :&lt;br /&gt;- appeler "HOuvreConnexion" pour ouvrir une connexion vers une base de données,&lt;br /&gt;- puis appeler "HChangeConnexion" pour associer les tables de l'analyse, à cette nouvelle connexion.&lt;br /&gt;&lt;br /&gt;C'est donc un mécanisme à garder dans un coin de tête, bien plus rapide que de se lancer dans des modifications de l'analyse, générations ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-2089600515689834155?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/2089600515689834155/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=2089600515689834155' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2089600515689834155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2089600515689834155'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/04/migrer-une-analyse-vers-une-autre-base.html' title='Migrer une analyse vers une autre base de données...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-3196380879481071544</id><published>2007-04-14T23:33:00.000+02:00</published><updated>2007-04-14T23:37:01.288+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Jauge en lieu et place du sablier lors de l'exécution d'une requête, la "soluce" !?</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_4lHIG-XlQLg/RiFI5NhqCRI/AAAAAAAAAGo/firZxiMZvbc/s1600-h/VST12479-80-5.bmp"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4lHIG-XlQLg/RiFI5NhqCRI/AAAAAAAAAGo/firZxiMZvbc/s320/VST12479-80-5.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5053400404606978322" /&gt;&lt;/a&gt;Les utilisateurs ne supportent pas les écrans figés avec un sablier, pourtant imposés lorsqu'une requête importante doit être exécutée.&lt;br /&gt;&lt;br /&gt;Afin d'afficher une jauge durant le traitement d'une requête, il faut bien récupérer en premier lieu le nombre d'enregistrements à traiter avec la fonction "HNbEnr", et cette dernière fige l'application avec le sablier tant que toute la requête n'est pas exécutée dans sa totalité.&lt;br /&gt;&lt;br /&gt;Et bien cela n'est plus vrai, après consultation des dernières nouveautés !!!&lt;br /&gt;&lt;br /&gt;La fonction "HNbEnr" a été dotée d'une option "hNonBloquant". Elle permet de connaître immédiatement après l'appel de la requête, le nombre d'enregistrements déjà récupérés. Il est donc possible de débuter le traitement de la requête par son parcours, tout en affichant une jauge certes approximative, mais une jauge. Au fur et à mesure du parcours, si la propriété "..ExécutionTerminée" retourne faux, il est possible de réajuster la jauge avec le nombre d'enregistrements récupérés en rappelant "HNbEnr".&lt;br /&gt;&lt;br /&gt;Tous ceux qui aiment observer les utilisateurs de nos applications, savent déjà que le traitement sera jugé plus rapide, du moment qu'une progression est visible !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-3196380879481071544?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/3196380879481071544/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=3196380879481071544' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3196380879481071544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3196380879481071544'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/04/jauge-en-lieu-et-place-du-sablier-lors.html' title='Jauge en lieu et place du sablier lors de l&apos;exécution d&apos;une requête, la &quot;soluce&quot; !?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4lHIG-XlQLg/RiFI5NhqCRI/AAAAAAAAAGo/firZxiMZvbc/s72-c/VST12479-80-5.bmp' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5903764021159458894</id><published>2007-04-13T16:58:00.000+02:00</published><updated>2007-04-13T17:00:12.696+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Extraire sur disque des fichiers contenus dans une bibliothèque ?</title><content type='html'>J'ai longtemps pensé que cela n'était pas possible, et pourtant ... astuce découverte sur le forum WIN DEV, elle mérite d'être connue j'espère pouvoir la relayer par ce billet !&lt;br /&gt;&lt;br /&gt;Je remercie son auteur que je cite (presque) directement :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;- Faire un fichier Hyper File avec une rubrique mémo binaire,&lt;br /&gt;- Ajouter les fichiers que l'on veut pouvoir extraire dans le mémo binaire,&lt;br /&gt;- Inclure ce fichier (.fic, .ndx, .mmo) dans l'exécutable,&lt;br /&gt;- dans le code indiquer que pour ce fichier il faut le rechercher dans la bibliothèque :&lt;br /&gt;HChangeLocalisation(Fichier, hWDL)&lt;br /&gt;&lt;br /&gt;Et voila.&lt;br /&gt;&lt;br /&gt;Il suffit de rechercher dans le fichier Hyper File l'enregistrement qui contient le fichier que l'on souhaite extraire, puis de l'extraire avec :&lt;br /&gt;HExtraitMémo(Fichier,MemoFichier,"C:\chemin...\FichierDestination")&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://forum.pcsoft.fr/post.awp?id=108164&amp;forum=pcsoft.fr.windev&amp;from=0&amp;gmt=P0100"&gt;Message d'origine.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5903764021159458894?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5903764021159458894/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5903764021159458894' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5903764021159458894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5903764021159458894'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/04/extraire-sur-disque-des-fichiers.html' title='Extraire sur disque des fichiers contenus dans une bibliothèque ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7195856994513687354</id><published>2007-04-13T16:15:00.000+02:00</published><updated>2007-04-13T16:29:11.175+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Ajout de descriptions de tables MYSQL dans une analyse provoque une erreur MSVCRT.DLL ou WDHF</title><content type='html'>Rien de pire qu'une action que l'on utilise couramment, et qui sur un poste ne daigne pas s'exécuter. J'ai rencontré ce cas avec l'importation d'une table MYSQL dans une analyse. Après le listage des tables de la base MYSQL, un des messages suivants était affiché :&lt;br /&gt;&lt;blockquote&gt;Une erreur système inattendue est survenue.&lt;br /&gt;Si cet incident se produit de manière systématique&lt;br /&gt;Module MSVCRT.DLL...&lt;/blockquote&gt;Ou :&lt;br /&gt;&lt;blockquote&gt;Erreur interne à la DLL WDHF&lt;/blockquote&gt;L'origine de la panne ? Une version de LIBMYSQL.DLL qui ne convenait pas à WINDEV.&lt;br /&gt;Le problème a donc disparu en installant un MYSQL et en récupérant sa LIBMYSQL.DLL standard. Précédemment il s'agissait d'un MYSQL installé avec par EasyPHP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7195856994513687354?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7195856994513687354/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7195856994513687354' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7195856994513687354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7195856994513687354'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/04/ajout-de-descriptions-de-tables-mysql.html' title='Ajout de descriptions de tables MYSQL dans une analyse provoque une erreur MSVCRT.DLL ou WDHF'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-628673932746836500</id><published>2007-04-13T15:59:00.000+02:00</published><updated>2007-04-13T16:02:50.317+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Pourquoi la taille d'un fichier Hyper File n'est pas réduite après un lot de suppressions ?</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/Rh-M9NhqCQI/AAAAAAAAAGg/rgrQeYRNzME/s1600-h/SXP18042-80-5.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/Rh-M9NhqCQI/AAAAAAAAAGg/rgrQeYRNzME/s320/SXP18042-80-5.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5052912290163722498" /&gt;&lt;/a&gt;L'appel en série de la fonction "HSupprime()" ne provoque pas la diminution de la taille du fichier. Ceci est valable pour le fichier de données (.FIC) et pour son mémo (.MMO).&lt;br /&gt;&lt;br /&gt;Déroutant au premier abord, mais normal en creusant un peu. En effet, pour le système de fichiers (FAT32, NTFS...) l'allocation d'un espace ou sa restitution est coûteuse en temps. Il n'y a qu'à voir la différence de temps entre un copier/coller par l'explorateur, et un couper/coller du même volume. De ce fait en cas de suppression, la taille initiale est conservée, il y a simplement un "marquage" des enregistrements laissés libres par les suppressions. Les ajouts ultérieurs viendront réutiliser ces espaces vides.&lt;br /&gt;&lt;br /&gt;Si après une suppression importante on souhaite récupérer l'espace disque correspondant, il est possible d'exécuter la fonction "HRéindexe" avec compression : là tout l'espace est restitué.&lt;br /&gt;&lt;br /&gt;A noter que par un parcours séquentiel du fichier sur les numéros d'enregistrements, on peut passer sur les enregistrement marqués à réutiliser (cf. fonction "HEtat").&lt;br /&gt;&lt;br /&gt;A noter d'autre part que ce mécanisme met clairement en évidence le fait qu'il ne faut jamais baser un traitement, encore moins une liaison, sur un numéro d'enregistrement puisqu'il n'est pas fixe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-628673932746836500?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/628673932746836500/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=628673932746836500' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/628673932746836500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/628673932746836500'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/04/pourquoi-la-taille-dun-fichier-hyper.html' title='Pourquoi la taille d&apos;un fichier Hyper File n&apos;est pas réduite après un lot de suppressions ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/Rh-M9NhqCQI/AAAAAAAAAGg/rgrQeYRNzME/s72-c/SXP18042-80-5.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-4965821797282333384</id><published>2007-03-27T09:42:00.000+02:00</published><updated>2007-03-27T09:46:17.504+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Récupération d'un variant provenant d'une DLL ActiveX...</title><content type='html'>Lorsqu'une procédure WLangage est appelée par une DLL en passant un variant en paramètre, une "gymnastique" est nécessaire pour récupérer l'information renvoyée par la DLL. Cela vaut bien un billet, pour gagner un peu de temps, car en tout premier lieu on aurait tendance à écrire l'entête de la procédure avec :&lt;br /&gt;&lt;blockquote&gt;PROCEDURE AppeléeParDLL(RecupValeur est un variant)&lt;/blockquote&gt;&lt;br /&gt;Pourtant avec cette déclaration le message suivant sera obtenu lors de l'exécution :&lt;br /&gt;&lt;blockquote&gt;"Un élément de type  ne peut pas être converti vers le type variant"&lt;/blockquote&gt;&lt;br /&gt;La bonne déclaration, puis syntaxe de récupération du paramètre est la suivante :&lt;br /&gt;&lt;blockquote&gt;PROCEDURE AppeléeParDLL(RecupValeur)&lt;br /&gt;&lt;br /&gt;varRecupVariant est un Variant = RecupValeur&lt;br /&gt;VariantConvertit(varRecupVariant, wlChaîne)&lt;br /&gt;Info(varRecupVariant)&lt;/blockquote&gt;&lt;br /&gt;A noter que l'appel de la procédure "AppeléeParDLL" en réponse à la DLL ActiveX est initialisé avec la fonction "AutomationEvénement".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-4965821797282333384?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/4965821797282333384/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=4965821797282333384' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/4965821797282333384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/4965821797282333384'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/03/rcupration-dun-variant-provenant-dune.html' title='Récupération d&apos;un variant provenant d&apos;une DLL ActiveX...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-2521113014903578220</id><published>2007-03-08T00:40:00.000+01:00</published><updated>2007-03-08T00:42:46.611+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Le numéro d'enregistrement des fichiers et des requêtes.</title><content type='html'>Lors du parcours d'un fichier, on peut connaître la position physique de l'enregistrement dans le fichier avec la fonction HNumEnr(&lt;Fichier&gt;). A partir de ce numéro, il est possible par la suite d'effectuer un accès direct à l'enregistrement avec la fonction "HLit", ou une modification avec "HMofifie(&lt;Fichier&gt;,&lt;Num. Enreg.&gt;)".&lt;br /&gt;&lt;br /&gt;Par contre lors du parcours du résultat d'une requête, cette même fonction "HNumEnr" donne un numéro d'enregistrement dans la requête, mais pas celui de l'enregistrement d'origine dans le fichier. Pour avoir le numéro de l'enregistrement du fichier, il est possible d'utiliser la variable d'état "H.NumEnr" après une lecture dans la requête. On peut ainsi envisager après une lecture d'un enregistrement du résultat d'une requête, de modifier directement l'enregistrement correspondant dans le fichier avec "HMofifie(&lt;Fichier&gt;,&lt;Num. Enreg.&gt;)".&lt;br /&gt;&lt;br /&gt;Attention par contre à l'utilisation du numéro d'enregistrement pour accéder aux données. Cette technique convient à un instant donné dans l'application. Par contre il ne faut pas utiliser ce numéro d'enregistrement par exemple pour lier des enregistrements. En effet, la position physique d'un enregistrement dans un fichier est modifiée lors d'opérations de maintenance. Pour les liaisons, l'utilisation de l'identifiant automatique est la meilleure solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-2521113014903578220?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/2521113014903578220/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=2521113014903578220' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2521113014903578220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2521113014903578220'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/03/le-numro-denregistrement-des-fichiers.html' title='Le numéro d&apos;enregistrement des fichiers et des requêtes.'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-2028950623981811127</id><published>2007-03-07T15:05:00.000+01:00</published><updated>2007-03-07T15:06:26.162+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Copier un menu contextuel d'une fenêtre à une autre ?</title><content type='html'>Les menus contextuels n'étant pas proposés dans le volet de l'éditeur ou la zone Kouglof, il faut donc "ruser" pour récupérer un menu contextuel d'une fenêtre vers une autre. L'astuce est la suivante :&lt;br /&gt;- dans la fenêtre contenant le menu contextuel, créer un bouton,&lt;br /&gt;- associer ce bouton au menu contextuel,&lt;br /&gt;- copier/coller ce bouton vers la fenêtre qui doit recevoir ce menu ... &lt;br /&gt;et c'est fait ! La fenêtre dans laquelle le bouton a été copié contient maintenant le menu. Le bouton peut être supprimé.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-2028950623981811127?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/2028950623981811127/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=2028950623981811127' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2028950623981811127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2028950623981811127'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/03/copier-un-menu-contextuel-dune-fentre.html' title='Copier un menu contextuel d&apos;une fenêtre à une autre ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7285006440851757149</id><published>2007-03-02T12:54:00.000+01:00</published><updated>2007-03-02T12:59:10.191+01:00</updated><title type='text'>Plus qu'une ligne de code : One-liner</title><content type='html'>En clin d'oeil au billet "&lt;a href="http://elianlacroix.blogspot.com/2007/01/pour-quelques-lignes-de-code-en-moins.html"&gt;Pour quelques lignes de code en moins&lt;/a&gt;", je pousse le bouchon un peu plus loin avec un programme WIN DEV qui n'a plus qu'une ligne de code, ou "one-liner". Il s'agit de remplacer dans un fichier le caractère de code ascii 10 par un traditionnel "retour-chariot" ou RC. Les adeptes auront reconnus un fichier provenant de Linux devant être transformé pour faciliter son utilisation sous Windows !&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;fSauveTexte(Remplace(LigneCommande(), fExtraitChemin... (LigneCommande(), fExtension), ...&lt;br /&gt;       "New"+fExtraitChemin(LigneCommande(), fExtension)),...&lt;br /&gt;       Remplace(fChargeTexte(LigneCommande()), Caract(10),RC))&lt;/blockquote&gt;&lt;br /&gt;Le code se trouve dans le code du projet, aucune interface n'est requise pour ce "convertisseur". Une copie du fichier dont le nom est reçu en ligne de commande est créée, avec remplacement du "Caract(10)" par un "retour-chariot". La copie garde le nom et l'emplacement d'origine, seul un "New" est ajouté au nom, juste avant l'extension.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7285006440851757149?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7285006440851757149/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7285006440851757149' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7285006440851757149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7285006440851757149'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/03/plus-quune-ligne-de-code-one-liner.html' title='Plus qu&apos;une ligne de code : One-liner'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-3002774415091788227</id><published>2007-02-28T22:39:00.000+01:00</published><updated>2007-02-28T22:41:43.226+01:00</updated><title type='text'>Pour quelques sourires de plus : améliorer l'accessibilité de la Loupe.</title><content type='html'>Au petit matin dans les bouchons, il y a deux attitudes. Coller le pare choc de son prédécesseur en se jurant, une main crispée sur le volant et l'autre sur le klaxon, que personne ne vous volera une place. Ce mode de conduite permet de s'assurer un gain de temps pouvant aller jusqu'à 3 secondes, pour l'arrivée au feu suivant 75 mètres plus loin. A l'inverse, il est possible de toujours laisser une distance de sécurité raisonnable avec son prédécesseur, afin de permettre aux autres usagers de prendre leur place dans le trafic. Cette attitude permet de récolter le sourire d'autres conducteurs, soulagés d'enfin trouver une âme charitable tolérant un changement de file, l'accès ou la sortie d'une place de parking... J'opte personnellement pour cette seconde attitude. Pour une journée efficace, la récolte quotidienne de 3 s/km (1) me semble une bonne moyenne.&lt;br /&gt;&lt;br /&gt;Un bonus de sourires (2) peut être obtenu en ajoutant un "plus" à une application existante, avec un coût de programmation quasiment nul.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/ReX2t5KlNII/AAAAAAAAAGQ/o2WqewrOzCA/s1600-h/loupe.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/ReX2t5KlNII/AAAAAAAAAGQ/o2WqewrOzCA/s320/loupe.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5036703026583516290" /&gt;&lt;/a&gt;Cas typique, une table fichier permet de rechercher un enregistrement via la loupe. La plupart des recherches se font via une même colonne de la table (numéro de commande, de téléphone, adresse email de plus en plus souvent ...). L'opérateur arrive sur sa fenêtre de recherche, vient cliquer sur la Loupe pour entamer une nouvelle recherche. C'est le genre d'opération que l'utilisateur final peut faire 50 fois dans la journée dans bien des applications.&lt;br /&gt;&lt;br /&gt;Pour le "bonus sourires", ajoutez un tri automatique sur la colonne qui est la plus utilisée, et forcer dès l'ouverture de la fenêtre le "focus" sur la table en question. Il suffit d'insérer les appels des fonctions "TableTrie" et "EcranPremier" dans le code d'initialisation de la fenêtre. Le résultat : l'utilisateur dès l'ouverture de sa fenêtre de recherche peut immédiatement entamer la saisie d'une valeur, le passage en saisie dans la loupe de la colonne triée devenant ainsi automatique.&lt;br /&gt;&lt;br /&gt;Un détail diront certains. Oui, mais je peux vous assurer qu'une personne ayant pendant des mois eu à faire cette recherche en allant cliquer sur cette loupe, va gagner un grand confort d'utilisation et vous faire de grands sourires le jour ou vous lui permettrez d'éviter ce clic en plus !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(1) s/km : sourires obtenus par kilomètre parcouru à moins de 10 km/h.&lt;br /&gt;(2) rassurez-vous, si vous vous êtes reconnus dans la première attitude au volant, il en faut pour que les garagistes aient encore à changer des embrayages ;-), cela n'empêche pas d'aimer les sourires des Utilisateurs de vos applications !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-3002774415091788227?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/3002774415091788227/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=3002774415091788227' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3002774415091788227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3002774415091788227'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/02/pour-quelques-sourires-de-plus-amliorer.html' title='Pour quelques sourires de plus : améliorer l&apos;accessibilité de la Loupe.'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/ReX2t5KlNII/AAAAAAAAAGQ/o2WqewrOzCA/s72-c/loupe.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-6766955482841975313</id><published>2007-02-25T21:21:00.000+01:00</published><updated>2007-02-28T09:31:47.707+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>64 Bits, mais à tous les étages</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/ReH0CglpezI/AAAAAAAAAE8/J0-2bPirGlA/s1600-h/64bits-2.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/ReH0CglpezI/AAAAAAAAAE8/J0-2bPirGlA/s400/64bits-2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5035574182321683250" /&gt;&lt;/a&gt;La création d'applications 64 bits peut être nécessaire pour répondre à certaines exigences de mise en exploitation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/ReH6BAlpe2I/AAAAAAAAAFg/mrSoZnAQXSE/s1600-h/64bits-1.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/ReH6BAlpe2I/AAAAAAAAAFg/mrSoZnAQXSE/s320/64bits-1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5035580753621646178" /&gt;&lt;/a&gt;Le passage d'une application existante en 64 bits, se fait simplement via la coche d'une option dans la description du projet. Mais attention tout de même, si c'est très simple dans une application constituée d'une unique bibliothèque, s'il y a au contraire de nombreux composants la tâche est plus importante. En effet, si l'application est compilée avec la compatibilité 64 bits activée, les composants qu'elle utilise devront également être générés avec la compatibilité 64 bits. Il faut donc penser à cocher l'option de compatibilité 64 bits dans les composants.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/ReH6Lglpe3I/AAAAAAAAAFo/mJmKV8M8uHE/s1600-h/64bits-3.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/ReH6Lglpe3I/AAAAAAAAAFo/mJmKV8M8uHE/s320/64bits-3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5035580934010272626" /&gt;&lt;/a&gt;Rassurez-vous, l'éditeur vous indique par un message d'information la présence d'un composant qui ne serait pas à jour (ci-contre).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/ReKbBwlpe4I/AAAAAAAAAF4/AZmpHVIYEU8/s1600-h/64bits-4.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/ReKbBwlpe4I/AAAAAAAAAF4/AZmpHVIYEU8/s200/64bits-4.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5035757787878620034" /&gt;&lt;/a&gt;L'activation de la compatibilité 64 bits n'a que très peu d'effets sur les traitements. Les modifications à effectuer vont concerner les types des variables du WLangage, notamment dans les appels de fonctions des API Windows. En effet, une déclaration "est un entier système" doit être faite en lieu et place de déclarations avec "est un entier sur x octets". Là également c'est l'éditeur de code qui indique après une compilation les changements à faire, il n'est pas nécessaire de "fouiller" son code.&lt;br /&gt;&lt;br /&gt;Il peut également être nécessaire d'ajouter des variables intermédiaires, car les fonctions du WLangage ne retournent pas des "entier système". C'est par exemple le cas de la fonction "Dimension" qui ne peut donc pas être donnée directement à la fonction "API" si la compatibilité 64 bits est active. Sur ce dernier point, PC SOFT proposera sans doute des évolutions, car cet ajout pourrait être évité.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/ReU8h5KlNHI/AAAAAAAAAGE/NSqHMfS7ttE/s1600-h/64bits-5.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/ReU8h5KlNHI/AAAAAAAAAGE/NSqHMfS7ttE/s200/64bits-5.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5036498311262319730" /&gt;&lt;/a&gt;Pour la phase finale de création de l'exécutable, il est bien d'avoir recours à une nouvelle configuration de projet. Elle permettra via un unique projet de générer un exécutable 32 bits et un exécutable 64 bits. Elle permettra également si besoin la création de composants, de Web services, le tout en une seule opération par le menu "Atelier / Génération multiple".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-6766955482841975313?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/6766955482841975313/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=6766955482841975313' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6766955482841975313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6766955482841975313'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/02/64-bits-tous-les-tages.html' title='64 Bits, mais à tous les étages'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4lHIG-XlQLg/ReH0CglpezI/AAAAAAAAAE8/J0-2bPirGlA/s72-c/64bits-2.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5604431767310979984</id><published>2007-02-20T09:43:00.000+01:00</published><updated>2007-02-20T11:29:01.502+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Généralités'/><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>A savoir avant de déployer sous Windows Vista...</title><content type='html'>Après, au fil des bêtas, les incertitudes sur les fonctionnalités qui seraient actives ou non par défaut, Windows VISTA est devenu une réalité. Le voile est levé, plus aucun incertitude ne subsiste l'UAC est active par défaut.&lt;br /&gt;&lt;br /&gt;L'UAC, ou pour les initiés &lt;strong&gt;U&lt;/strong&gt;ser &lt;strong&gt;A&lt;/strong&gt;ccount &lt;strong&gt;C&lt;/strong&gt;ontrol, est une des fonctionnalités majeure de Windows VISTA. Elle doit permettre de redonner au système la sécurité qui faisait défaut aux précédentes versions. &lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/Rdq1BglpewI/AAAAAAAAAEY/pI95bXsqf6Y/s1600-h/uac1.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/Rdq1BglpewI/AAAAAAAAAEY/pI95bXsqf6Y/s200/uac1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5033534571072289538" /&gt;&lt;/a&gt;Lorsqu'elle est active, et que le programmeur ne tient pas compte de ses spécificités, un panneau d'information avec l'icône ci-contre sera fréquemment donné à l'utilisateur final qui risque d'être dérouté. En effet par défaut les privilèges sont restreints, il faut jusqu'à &lt;a href="http://www.flickr.com/photo_zoom.gne?id=151250154&amp;size=o"&gt;7 clics&lt;/a&gt; par exemple pour supprimer un raccourci sur le bureau.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_4lHIG-XlQLg/Rdq7SAlpeyI/AAAAAAAAAEo/A2sb-eOh0ig/s1600-h/uac3.JPG"&gt;&lt;img style="float:right; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4lHIG-XlQLg/Rdq7SAlpeyI/AAAAAAAAAEo/A2sb-eOh0ig/s320/uac3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5033541451609897762" /&gt;&lt;/a&gt;Ainsi par défaut un message relatif à l'élévation des privilèges peut être affiché régulièrement. N'ayant qu'une expertise limitée sur le sujet, je n'aurai pas la prétention de vous décrire les méandres de ce mécanisme. En revanche un article Microsoft détaille ce qu'il faut absolument connaître de l'UAC avant d'aborder Windows VISTA. Je vous encourage donc vivement à le &lt;a href="http://www.programmez.com/vista_article.php?id_article=10"&gt;consulter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Si besoin dans un tout premier temps, notamment pour le Développement, il est possible de &lt;a href="http://www.laboratoire-microsoft.org/t/23933"&gt;désactiver&lt;/a&gt; l'UAC. Plus généralement, les fonctionnalités de VISTA peuvent être activées ou désactivées via ce &lt;a href="http://www.laboratoire-microsoft.org/t/23891"&gt;mode opératoire&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5604431767310979984?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5604431767310979984/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5604431767310979984' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5604431767310979984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5604431767310979984'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/02/savoir-avant-de-dployer-sous-windows.html' title='A savoir avant de déployer sous Windows Vista...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/Rdq1BglpewI/AAAAAAAAAEY/pI95bXsqf6Y/s72-c/uac1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-6155480773974592704</id><published>2007-01-30T12:04:00.000+01:00</published><updated>2007-01-30T12:07:46.878+01:00</updated><title type='text'>Bon à savoir, exemples revus à profusion...</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/Rb8mx4rvacI/AAAAAAAAAEM/TI9wpsU03FQ/s1600-h/lst66.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/Rb8mx4rvacI/AAAAAAAAAEM/TI9wpsU03FQ/s200/lst66.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5025778347640056258" /&gt;&lt;/a&gt;Le DVD de la LST 66 contient en plus des exemples de la LST elle-même, une série d'exemples des précédentes versions ou LST, revus et améliorés.&lt;br /&gt;&lt;br /&gt;En voici la liste un peu "brute", mais un Ctrl+F permet de rechercher un sujet qui vous intéresse :&lt;br /&gt;&lt;br /&gt;WD Arbres en saisie, WD Calcul statistiques Hyper File, WD DerniersDocuments, WD Ecran Tactile, WD Fenêtres furtives, WD FileImpression, WD GANTT, WD Glossaire, WD JournalEvenement, WD ListeGraphique, WD ModeleImpression, WD PartageMemoire, WD Pays du Monde, WD photocopieur, WD Saisie assistée de répertoire, WD Saisie Email, WD Scanner, WD Select RTF, WD Table Etendue, WD Active Directory DotNet, WD JaugeFTP, WD Lecteur RSS, WD MotDePasse, WD ProxyPOP3, WD Threads FTP, WD VisuTIF, WD WMI DOTNET, WD APISystemes, WD Appels JAVA, WD Arbre Doublons, WD ContrôleADistance, WD ExtractionMIME, WD GroupwareCS, WD Impression de Tree View, WD Licence, WD ListeChaînée, WD Masque de saisie avancé, WD Onglets glissants, WD Paramètres Impressions, WD Persistance, WD Serveur RMI, WD Trace Socket, WW_DiagrammeGANTT, WW_ImagePass, WW_VitrineAWP, WW_ChangementCSS, WW_FlashParametrable, WW_Fraimes, WW_MapArea, WW_MiseEnEvidence, WW_ReassortXML, Pocket GANTT, Pocket Clavier Virtuel, Pocket ExtractionMIME, Pocket MotDePasse, Pocket Persistance, Socket Unicode.&lt;br /&gt;&lt;br /&gt;Ndlr : je fais ce billet car je n'avais pas vu ce contenu lors de l'installation de cette LST, je me dis du coup pour me rassurer que je ne dois pas être le seul !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-6155480773974592704?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/6155480773974592704/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=6155480773974592704' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6155480773974592704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6155480773974592704'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/01/bon-savoir-exemples-revus-profusion.html' title='Bon à savoir, exemples revus à profusion...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/Rb8mx4rvacI/AAAAAAAAAEM/TI9wpsU03FQ/s72-c/lst66.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7571322199707356900</id><published>2007-01-17T00:11:00.000+01:00</published><updated>2007-01-17T00:20:17.502+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Accélérer les applications sur les configurations limitées, ou en TSE</title><content type='html'>Si les applications sont toujours plus agréables de part leur aspect et leur richesse fonctionnelle, elles sont forcément plus gourmandes en ressources.&lt;br /&gt;&lt;br /&gt;Il arrive donc que des configurations ne suivent plus, soit en raison des caratéristiques d'une station, soit en raison d'une limitation des ressources dans un contexte TSE.&lt;br /&gt;&lt;br /&gt;Une astuce à connaître dans pareil situation, consiste à "jouer" de la propriété "..AffichageActif". Pendant toute la durée d'un traitement important (remplissage de champs, calculs...), il sera possible de "débrayer" l'affichage qui est généralement le plus couteux en temps. &lt;br /&gt;&lt;br /&gt;Si cela n'est pas suffisant, la création d'un rapport "WPF" avec les fonctions "AnalyseurDébut" puis "AnalyseurFin" permet généralement de repérer le(s) traitement(s) à optimiser avec l'analyseur de performances (appelé également Profiler).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7571322199707356900?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7571322199707356900/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7571322199707356900' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7571322199707356900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7571322199707356900'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/01/acclrer-les-applications-sur-les.html' title='Accélérer les applications sur les configurations limitées, ou en TSE'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-3875494337550634033</id><published>2007-01-16T23:18:00.000+01:00</published><updated>2007-01-16T23:39:10.041+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Une interface personnalisée en quelques clics avec l'opacité des champs...</title><content type='html'>S'il y a bien un domaine dans lequel il est difficile de progresser lorsque l’on n’a pas la science infuse, c'est bien celui des interfaces !&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_4lHIG-XlQLg/Ra1TyeXxR_I/AAAAAAAAAD0/P1icNBuNjoI/s1600-h/fiche_vista_initiale.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4lHIG-XlQLg/Ra1TyeXxR_I/AAAAAAAAAD0/P1icNBuNjoI/s200/fiche_vista_initiale.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5020761286199298034" /&gt;&lt;/a&gt;Heureusement, les gabarits font une grosse partie du travail, en permettant d’avoir d’emblée une interface agréable, comme le montre l’image ci-contre avec une fenêtre au look Vista exécutée sur mon poste XP.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/Ra1Sf-XxR8I/AAAAAAAAADM/q8emsDoYsw8/s1600-h/catalogue+image.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/Ra1Sf-XxR8I/AAAAAAAAADM/q8emsDoYsw8/s200/catalogue+image.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5020759868860090306" /&gt;&lt;/a&gt;Mais avec quelques clics en plus, il y a moyen de se différencier du gabarit standard. En effet, l’opacité des champs permet d’apporter une touche esthétique supplémentaire. Il suffit de placer sous les champs une image piochée dans le catalogue. Une image en rapport avec le contenu de la fenêtre est vivement recommandée, ou une image type "splash screen" également proposée dans le catalogue.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/Ra1SvOXxR9I/AAAAAAAAADU/UoFPUfomINg/s1600-h/opacite.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/Ra1SvOXxR9I/AAAAAAAAADU/UoFPUfomINg/s200/opacite.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5020760130853095378" /&gt;&lt;/a&gt;Une fois l’image en place, il suffit de jouer sur son opacité, ainsi que sur celle des champs par-dessus pour obtenir un effet tout a fait convenable, et surtout sans passer par un outil de retouche d’image qui aurait nécessité de jouer de la transparence avec différents calques !&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/Ra1T8-XxSAI/AAAAAAAAAD8/FU27D8GIadg/s1600-h/fiche_vista_opacit%C3%A9.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/Ra1T8-XxSAI/AAAAAAAAAD8/FU27D8GIadg/s200/fiche_vista_opacit%C3%A9.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5020761466587924482" /&gt;&lt;/a&gt;Voici un exemple de résultat, certes de piètre qualité car en cherchant une image d’une taille plus adaptée il aurait été possible de faire bien mieux, toujours en quelques clics.&lt;br /&gt;&lt;br /&gt; A noter en astuce que le modifieur est très utile dans ce type de manœuvre pour par exemple changer l’opacité de plusieurs champs à la fois. D’interface austère, il est cependant parfaitement adapté à la manipulation des propriétés des champs de l’interface.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-3875494337550634033?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/3875494337550634033/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=3875494337550634033' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3875494337550634033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3875494337550634033'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/01/une-interface-personnalise-en-quelques.html' title='Une interface personnalisée en quelques clics avec l&apos;opacité des champs...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4lHIG-XlQLg/Ra1TyeXxR_I/AAAAAAAAAD0/P1icNBuNjoI/s72-c/fiche_vista_initiale.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-5715834227015986487</id><published>2007-01-02T23:35:00.000+01:00</published><updated>2007-01-02T23:45:12.842+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inclassable / Hors sujet'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Pour quelques lignes de code en moins...</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/RZrfN2b0ZxI/AAAAAAAAAC4/X9jDMAGNZsg/s1600-h/images.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/RZrfN2b0ZxI/AAAAAAAAAC4/X9jDMAGNZsg/s320/images.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5015566564073957138" /&gt;&lt;/a&gt;&lt;br /&gt;Je profite de ce premier billet de l'année 2007 pour souhaiter une excellente année à ceux qui me lisent, régulièrement ou non !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Il n'est pas rare d'empiler des SI ... SINON ... FIN pour des affectations de variables, de paramètres... Il en résulte un "code à rallonge", qui même avec l'enroulé de l'éditeur code reste long à manipuler. Typiquement, l'affectation des paramètres d'une requête, lorsque certains ne doivent pas être pris en compte, exemple :&lt;br /&gt;&lt;blockquote&gt;SI ChampNom &lt;&gt; "" ALORS&lt;br /&gt; Req.ParamNom = ChampNom&lt;br /&gt;SINON&lt;br /&gt; Req.ParamNom = NULL&lt;br /&gt;FIN&lt;br /&gt;&lt;br /&gt;SI ChampDNaissance &lt;&gt; "" ALORS&lt;br /&gt; Req.ParamDNais = ChampDNais&lt;br /&gt;SINON&lt;br /&gt; Req.ParamDNais = NULL&lt;br /&gt;FIN&lt;br /&gt;&lt;br /&gt;..&lt;br /&gt;&lt;br /&gt;HExecuteRequete(Req)&lt;br /&gt;FichierVersTableMémoire(Req, TableSélection)&lt;/blockquote&gt;&lt;br /&gt;L'alternative se nomme "instruction conditionnelle monoligne" (cf entrée d'aide "Condition, Instruction ?"). Beaucoup de vocabulaire pour un principe tout simple : affecter une variable par une valeur, ou par une autre, en fonction d'une condition. L'écriture ci-dessus est ainsi simplifiée à l'extrême tout en restant lisible, une fois l'habitude acquise :&lt;br /&gt;&lt;blockquote&gt;Req.ParamNom = ChampNom &lt;&gt; "" ? ChampNom SINON NULL&lt;br /&gt;Req.ParamDNais = ChampDNais &lt;&gt; "" ? ChampDNais SINON NULL&lt;br /&gt;..&lt;br /&gt;HExecuteRequete(Req)&lt;br /&gt;FichierVersTableMémoire(Req, TableSélection)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-5715834227015986487?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/5715834227015986487/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=5715834227015986487' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5715834227015986487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/5715834227015986487'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2007/01/pour-quelques-lignes-de-code-en-moins.html' title='Pour quelques lignes de code en moins...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/RZrfN2b0ZxI/AAAAAAAAAC4/X9jDMAGNZsg/s72-c/images.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-3838213638141772220</id><published>2006-12-22T21:25:00.000+01:00</published><updated>2006-12-22T21:37:05.522+01:00</updated><title type='text'>Fonctions WLangage dans le code SQL, mais également procédures stockées...</title><content type='html'>L'appel d'une &lt;a href="http://elianlacroix.blogspot.com/2006/12/fonctions-wlangage-dans-les-requtes.html"&gt;fonction du WLangage dans une requête SQL&lt;/a&gt; est permis, mais bien évidement il est possible d'appeler une procédure stockée sur le serveur avec la même méthode.&lt;br /&gt;&lt;br /&gt;La méthode est on ne peut plus simple : &lt;br /&gt;- dans l'analyse, créer une collection de procédures, puis une fonction par le clic droit dans le volet,&lt;br /&gt;- dans un traitement, appeler la fonction "HMiseAJourCollection" qui permet de copier la collection de procédures, sur le serveur.&lt;br /&gt;&lt;br /&gt;A ce stade, il est possible d'insérer l'appel des procédures de la collection, dans les requetes SQL lancées. Exemple avec le même modèle de traitement que dans le précédent billet :&lt;blockquote&gt;sNomFichierTXT est une chaîne = "c:\temp\commande.txt"&lt;br /&gt;sListeCommande est une chaîne&lt;br /&gt;sCodeSQL est une chaîne&lt;br /&gt;sdReq est une Source de Données&lt;br /&gt;&lt;br /&gt;sCodeSQL = [&lt;br /&gt;SELECT ProcServeur(DateCommande) as DateCommandeformatée,&lt;br /&gt;NumCommande,&lt;br /&gt;TotalHT&lt;br /&gt;FROM COMMANDE&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;HExécuteRequêteSQL(sdReq, sCodeSQL)&lt;br /&gt;&lt;br /&gt;POUR TOUT sdReq&lt;br /&gt;sListeCommande += [RC]+HRécupèreEnregistrement(sdReq,TAB)&lt;br /&gt;FIN&lt;br /&gt;&lt;br /&gt;fSauveTexte(sNomFichierTXT, sListeCommande)&lt;br /&gt;LanceAppliAssociée(sNomFichierTXT)&lt;/blockquote&gt;&lt;br /&gt;La procédure "ProcServeur" aura un code WLangage qui pourra traiter la date reçue en paramètre, pour la formater différemment par exemple, ou pour la modifier en fonction de données, requêtes de la base.&lt;br /&gt;&lt;br /&gt;Attention, dans la version en cours de WINDEV 11 je n'ai pu appeler la procédure que par la fonction "HExecuteRequeteSQL". Sauf mauvaise manipulation de ma part, l'éditeur de requêtes n'a pas encore l'air adapté à l'appel des procédures stockées.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-3838213638141772220?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/3838213638141772220/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=3838213638141772220' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3838213638141772220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3838213638141772220'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/12/fonctions-wlangage-dans-le-code-sql.html' title='Fonctions WLangage dans le code SQL, mais également procédures stockées...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-3759637001759245372</id><published>2006-12-20T15:42:00.000+01:00</published><updated>2006-12-20T16:49:25.157+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Fonctions Wlangage dans les requêtes Hyper File avec l'opérateur "WL." (WINDEV 11)</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/RYlaruXaXZI/AAAAAAAAACs/wYzQleGgK_Y/s1600-h/requetewl2.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/RYlaruXaXZI/AAAAAAAAACs/wYzQleGgK_Y/s200/requetewl2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5010635767653490066" /&gt;&lt;/a&gt;Le moteur Hyper File Client/Serveur propose les procédures stockées, et de ce fait permet l'appel de fonctions du Wlangage, directement dans le code SQL des requêtes !&lt;br /&gt;&lt;br /&gt;J'ai fait quelques tests de procédures stockées, et au passage j'ai utilisé cette possibilité. Cela va simplifier bien des traitements nécessitant le formatage du résultat d'une requête, en vue d'une exportation par exemple.&lt;br /&gt;&lt;br /&gt;Un cas typique, je dois générer un fichier texte contenant des dates / numéros / montants de commandes. La date doit être lisible, et non pas au format "AAAAMMJJ" utilisé pour le stockage et l'affectation des champs ou colonnes de type date des interfaces.&lt;br /&gt;&lt;br /&gt;Le résultat peut être obtenu immédiatement dans la requête, ce qui évite un traitement des données lors du parcours qui suit la requête.&lt;br /&gt;&lt;br /&gt;Voici un exemple utilisant cette possibilité (il s'agit du code de l'image de ce billet) :&lt;br /&gt;&lt;blockquote&gt;sNomFichierTXT est une chaîne = "c:\temp\commande.txt"&lt;br /&gt;sListeCommande est une chaîne&lt;br /&gt;sCodeSQL est une chaîne&lt;br /&gt;sdReq est une Source de Données&lt;br /&gt;&lt;br /&gt;sCodeSQL = [&lt;br /&gt;SELECT WL.DateVersChaine(DateCommande) as DateCommandeformatée,&lt;br /&gt;NumCommande,&lt;br /&gt;TotalHT&lt;br /&gt;FROM COMMANDE&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;HExécuteRequêteSQL(sdReq, sCodeSQL)&lt;br /&gt;&lt;br /&gt;POUR TOUT sdReq&lt;br /&gt; sListeCommande += [RC]+HRécupèreEnregistrement(sdReq,TAB)&lt;br /&gt;FIN&lt;br /&gt;&lt;br /&gt;fSauveTexte(sNomFichierTXT, sListeCommande)&lt;br /&gt;LanceAppliAssociée(sNomFichierTXT)&lt;/blockquote&gt;A noter qu'il est possible de donner un formatage spécifique à la date avec le code SQL suivant :&lt;br /&gt;&lt;blockquote&gt;sCodeSQL = [&lt;br /&gt;SELECT WL.DateVersChaine(DateCommande,'JJJ JJ MMM AAAA') as DateCommandeformatée,&lt;br /&gt;NumCommande,&lt;br /&gt;TotalHT&lt;br /&gt;FROM COMMANDE&lt;br /&gt;]&lt;/blockquote&gt;Le fichier généré aura les dates dans un format "Ven. 28 Jan. 2000" par exemple.&lt;br /&gt;&lt;br /&gt;Ndlr : la requête est volontairement simpliste pour l'illustration, elle permet dans un cas réel une sélection de données. Ce qui est très intéressant, c'est le code d'exportation qui est simplifié à l'extrême, et qui dit code simple, dit code plus rapide avec un risque d'erreur de programmation moindre !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-3759637001759245372?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/3759637001759245372/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=3759637001759245372' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3759637001759245372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3759637001759245372'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/12/fonctions-wlangage-dans-les-requtes.html' title='Fonctions Wlangage dans les requêtes Hyper File avec l&apos;opérateur &quot;WL.&quot; (WINDEV 11)'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/RYlaruXaXZI/AAAAAAAAACs/wYzQleGgK_Y/s72-c/requetewl2.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-3580358089263403546</id><published>2006-12-19T23:36:00.000+01:00</published><updated>2006-12-19T23:38:14.805+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inclassable / Hors sujet'/><title type='text'>Nouveau site WINDEV : Ed4u</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/RYgaxuXaXXI/AAAAAAAAACQ/Iin2HJ242ms/s1600-h/ed4u.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/RYgaxuXaXXI/AAAAAAAAACQ/Iin2HJ242ms/s200/ed4u.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5010284027011816818" /&gt;&lt;/a&gt;Apparition d'un nouveau site de ressources WINDEV : &lt;a href="http://ed4u.free.fr"&gt;Ed4u&lt;/a&gt;. Peu d'informations dans l'immédiat, le site basé sur un &lt;a href="http://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_de_contenu"&gt;CMS&lt;/a&gt; vient d'être publié ces derniers jours c'est donc un peu tôt. Les auteurs semblent cependant très motivés, je leur souhaite de réussir dans leur projet !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-3580358089263403546?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/3580358089263403546/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=3580358089263403546' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3580358089263403546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3580358089263403546'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/12/nouveau-site-windev-ed4u.html' title='Nouveau site WINDEV : Ed4u'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4lHIG-XlQLg/RYgaxuXaXXI/AAAAAAAAACQ/Iin2HJ242ms/s72-c/ed4u.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-8638438924619825630</id><published>2006-12-15T18:32:00.000+01:00</published><updated>2006-12-15T18:40:44.387+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Exécuter une action lors du tri d'une colonne de table</title><content type='html'>Il est fréquent de devoir effectuer une action lorsque l'utilisateur trie les données d'une table. Une capture d'événement était requise jusqu'à la version 10, ce sujet a été fréquement abordé sur le forum. Le code nécessaire se trouve ci-dessous. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/RYLdhoN6zLI/AAAAAAAAACE/skTwrnxLZ3M/s1600-h/a_chaque_tri.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/RYLdhoN6zLI/AAAAAAAAACE/skTwrnxLZ3M/s200/a_chaque_tri.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5008809305390632114" /&gt;&lt;/a&gt;Il est cependant rendu obsolète, puisque WINDEV 11 permet d'ajouter aux colonnes un code "à chaque tri" !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;//1. Code d'initialisation de la table : &lt;br /&gt;Evenement("TRISPECIAL","TABLE1", 1529)&lt;br /&gt;&lt;br /&gt;//2. Procédure TRISPECIAL&lt;br /&gt;Procédure TRISPECIAL()&lt;br /&gt;// _eve.wParam contient le numéro de la colonne&lt;br /&gt;Trace("On a cliqué sur l'entête de la colonne n° "+_eve.wParam )&lt;br /&gt;SI _eve.wParam = 2 ALORS&lt;br /&gt;     //On veut que la procédure TRISPECIAL permet d'obtenir un tri sur &lt;br /&gt;     //la colonne COL2 puis sur la colonne COL1:&lt;br /&gt;&lt;br /&gt;    // Annuler le tri automatique&lt;br /&gt;    _eve.retour = 0&lt;br /&gt;     tabletri("COL2"+TAB+"COL1")&lt;br /&gt;FIN&lt;/blockquote&gt;Ndlr : ce code a pour origine un message du support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-8638438924619825630?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/8638438924619825630/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=8638438924619825630' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8638438924619825630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8638438924619825630'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/12/excuter-une-action-lors-du-tri-dune.html' title='Exécuter une action lors du tri d&apos;une colonne de table'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4lHIG-XlQLg/RYLdhoN6zLI/AAAAAAAAACE/skTwrnxLZ3M/s72-c/a_chaque_tri.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-7277631907346935818</id><published>2006-12-15T01:33:00.000+01:00</published><updated>2006-12-15T01:48:41.505+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Concaténation optionnelle avec WINDEV 11</title><content type='html'>Combien de bogues ont été générés par un caractère en trop en début ou fin de chaîne ? Ou un "\" manquant dans un chemin d'accès, ou un "/" dans une URL ?&lt;br /&gt;&lt;br /&gt;Le cas de figure est très fréquent, on doit fournir une liste construire dans une itération, avec un séparateur bien déterminé. Le code à la forme suivante : &lt;br /&gt;&lt;blockquote&gt;POUR TOUT Client AVEC CodePostal="26110"&lt;br /&gt;   sListeClient += Client.Nom+", "&lt;br /&gt;FIN&lt;/blockquote&gt;&lt;br /&gt;Et il faut ensuite supprimer le ", " en trop en fin de chaîne s'il y a eu au moins un client. Ou alors faire une condition dans la boucle pour gérer le séparateur ... Bref plusieurs méthodes que l'on panache, ce qui augmente encore le risque d'erreur. &lt;br /&gt;&lt;br /&gt;Du coup la fonctionnalité "concaténation optionnelle" avait attiré mon attention dans la brochure, je l'ai mise en ouvre et immédiatement adoptée !&lt;br /&gt;Voici un exemple (j'en proposerai un plus parlant prochainement en situation) :&lt;br /&gt;&lt;blockquote&gt;POUR TOUT Client AVEC CodePostal="26110"&lt;br /&gt;   sListeClient += [", "] + Client.Nom&lt;br /&gt;FIN&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-7277631907346935818?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/7277631907346935818/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=7277631907346935818' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7277631907346935818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/7277631907346935818'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/12/concatnation-optionnelle-propose-sous.html' title='Concaténation optionnelle avec WINDEV 11'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-3651972529891005960</id><published>2006-12-15T01:13:00.000+01:00</published><updated>2006-12-15T01:29:28.504+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Composant, partage par le GDS</title><content type='html'>Essai suivant sur la version 11 de WINDEV, l’intégration des composants dans le GDS.&lt;br /&gt;&lt;br /&gt;Je ne pense pas qu'il soit nécessaire de rappeler l'intérêt des composants, salutaires dans les projets pour partager des fonctionnalités entre les différents modules, et surtout pour sécuriser les accès au système d'information.&lt;br /&gt;&lt;br /&gt;De la même manière, le GDS est également devenu totalement incontournable pour gérer les modifications des projets, et leur partage entre les développeurs.&lt;br /&gt;&lt;br /&gt;Mais la gestion des composants n’étant pas intégrée au GDS en version 10, des gymnastiques étaient souvent nécessaires pour assurer la mise à jour des composants d’un projet, et il ne fallait pas non plus oublier de les transmettre d’un développeur à l’autre, ou d’un site à un autre suivant le cas. Ayant plusieurs fois mentionné ces difficultés à PC SOFT, j’ai prioritairement regardé les possibilités du GDS en matière de gestion des composants. Nouvelle bonne surprise, puisque le GDS a inclus le nécessaire.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/RYHr6YN6zJI/AAAAAAAAABs/UOKMyNjDYWw/s1600-h/gds_et_composant_2.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/RYHr6YN6zJI/AAAAAAAAABs/UOKMyNjDYWw/s200/gds_et_composant_2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5008543648778472594" /&gt;&lt;/a&gt;La création d’un composant tout d’abord permet dans son assistant de placer le composant dans l’arborescence du GDS, en plus du centre de réutiliabilité (ce dernier n’était pas facilement partageable entre sites distants comme l’est le GDS).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_4lHIG-XlQLg/RYHsA4N6zKI/AAAAAAAAAB0/cnfxESYN2bY/s1600-h/gds_et_composant.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/RYHsA4N6zKI/AAAAAAAAAB0/cnfxESYN2bY/s200/gds_et_composant.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5008543760447622306" /&gt;&lt;/a&gt;Ensuite l’intégration d’un composant dans le projet propose également la récupération d’un composant, depuis le GDS. La mise en place des ressources partagées va être facilitée. Par contre je ne crois pas avoir vu d’option permettant d’inclure les composants utilitaires fournis par PC SOFT dans le GDS. Il me semble que l’installation de WINDEV pourrait proposer d’ajouter ses composants dans la base GDS, la réutilisation sera encore accrue. Peut être ma première suggestion pour WINDEV 11 !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-3651972529891005960?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/3651972529891005960/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=3651972529891005960' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3651972529891005960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/3651972529891005960'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/12/composant-partage-par-le-gds.html' title='Composant, partage par le GDS'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4lHIG-XlQLg/RYHr6YN6zJI/AAAAAAAAABs/UOKMyNjDYWw/s72-c/gds_et_composant_2.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-8486401251359686876</id><published>2006-12-15T00:35:00.000+01:00</published><updated>2006-12-15T01:03:58.480+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Le plus bel effet, sans compétence infographique, c'est WINDEV 11</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/RYHlpoN6zII/AAAAAAAAABg/TR6NckTHi0g/s1600-h/apropos_de_windev11.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/RYHlpoN6zII/AAAAAAAAABg/TR6NckTHi0g/s200/apropos_de_windev11.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5008536763945897090" /&gt;&lt;/a&gt;Malgré la "suractivité" qu’entraîne la période de fin d'année, je débute la découverte de WINDEV 11 installé il y a quelques minutes sur mon portable. Je manque cruellement de temps ces jours-ci, mais je ne peux pas résister à quelques essais !&lt;br /&gt;&lt;br /&gt;Le premier lancement est une surprise visuelle, l'interface est profondément améliorée en terme d'esthétisme : effets de transparence, animation des boutons, halos, alors que mon poste est équipé de Windows XP SP2 et non pas de Vista !&lt;br /&gt;&lt;br /&gt;Comme je suis d'un naturel envieux, je me suis en priorité demandé s'il serait aisé de reproduire ces effets dans des modules existants.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_4lHIG-XlQLg/RYHiZIN6zGI/AAAAAAAAABE/GFnAF80R82s/s1600-h/gabaritvista_avant.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4lHIG-XlQLg/RYHiZIN6zGI/AAAAAAAAABE/GFnAF80R82s/s200/gabaritvista_avant.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5008533181943172194" /&gt;&lt;/a&gt;Pour test, j'ai utilisé un programme permettant aux enfants de réviser leur vocabulaire, en répondant aux interrogations de l'agent Microsoft ! &lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_4lHIG-XlQLg/RYHijYN6zHI/AAAAAAAAABM/LWfiN0Vhfp4/s1600-h/gabaritvista_apres.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4lHIG-XlQLg/RYHijYN6zHI/AAAAAAAAABM/LWfiN0Vhfp4/s200/gabaritvista_apres.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5008533358036831346" /&gt;&lt;/a&gt;Et bien plus que jamais, le savoir faire PC SOFT est bien présent dans cette version, puisque avec mes piètres compétences graphiques, sans programmation, "Appliquer un gabarit" et quelques clics m'ont permis d'obtenir une interface "Vista" telle que la propose WINDEV 11, toujours sur mon système XP !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-8486401251359686876?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/8486401251359686876/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=8486401251359686876' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8486401251359686876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8486401251359686876'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/12/le-plus-bel-effet-sans-comptence.html' title='Le plus bel effet, sans compétence infographique, c&apos;est WINDEV 11'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/RYHlpoN6zII/AAAAAAAAABg/TR6NckTHi0g/s72-c/apropos_de_windev11.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-1626377888785329526</id><published>2006-12-14T09:39:00.000+01:00</published><updated>2006-12-14T10:25:19.037+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inclassable / Hors sujet'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>IE7 et le volet "Quick tab" ou "Aperçu mosaique"</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_4lHIG-XlQLg/RYEQloN6zEI/AAAAAAAAAAw/Z8A5PfwNl_I/s1600-h/IE7.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/RYEQloN6zEI/AAAAAAAAAAw/Z8A5PfwNl_I/s200/IE7.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5008302499249704002" /&gt;&lt;/a&gt;La nouvelle version du navigateur Internet Explorer propose une fonctionnalité bien intéressante, avec l'ouverture des sites dans des volets. Cette possibilité n'a rien de révolutionnaire, Firefox la propose depuis longtemps, et la navigation par des volets dans une application est chose commune. Par contre, dès qu'au moins deux volets sont ouverts, un volet "Quick tab", ou "Aperçu mosaïque" est ajouté. Là c'est une révolution dans la présentation des données pour l'utilisateur, en un coup d'œil il repère le volet sur lequel il souhaite retourner. Et à tout moment le raccourci Ctrl+Q permet de revenir à la mosaïque.&lt;br /&gt;&lt;br /&gt;Au quotidien, cette méthode de présentation peut faire gagner un temps précieux en Alt+tab, "non c'est pas celui là", Alt+tab, "non c'est pas celui là" ...&lt;br /&gt;&lt;br /&gt;Pour les applications, cette possibilité sera peut être proposée par WINDEV pour les champs onglets ou boite à outils ! C'est en tout cas une suggestion que je vais m'empresser de faire à PC SOFT !&lt;br /&gt;&lt;br /&gt;La copie d'écran ci-dessus montre IE7 en position de recherche d'informations WINDEV. Mais j'en ai également un ouvert avec des volets remplis de cadeaux, Noël oblige !&lt;br /&gt;&lt;br /&gt;Un bémol tout de même dans la fonctionnalité, elle est gourmande en mémoire. 100 Mo de RAM sont rapidement nécessaires pour ouvrir plusieurs volets.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-1626377888785329526?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/1626377888785329526/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=1626377888785329526' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1626377888785329526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1626377888785329526'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/12/ie7-et-le-volet-quick-tab-ou-aperu.html' title='IE7 et le volet &quot;Quick tab&quot; ou &quot;Aperçu mosaique&quot;'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/RYEQloN6zEI/AAAAAAAAAAw/Z8A5PfwNl_I/s72-c/IE7.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-4912956275423897138</id><published>2006-12-05T13:30:00.000+01:00</published><updated>2006-12-05T14:19:35.449+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Impressions'/><title type='text'>Fonctionnalités d'exportation (RTF, XLS, RTF ...) depuis l'aperçu pour les impressions programmées</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4lHIG-XlQLg/RXVwF13lsdI/AAAAAAAAAAM/WW9H1b0mIVs/s1600-h/aper%C3%A7u.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4lHIG-XlQLg/RXVwF13lsdI/AAAAAAAAAAM/WW9H1b0mIVs/s200/aper%C3%A7u.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5005029806554067410" /&gt;&lt;/a&gt;L'aperçu des états imprimés créés avec l'éditeur d'états propose par défaut des sorties dans différents formats : RTF pour Word, XLS pour EXCEL, PDF, XML, ou envoi par email.&lt;br /&gt;&lt;br /&gt;Cette même possibilité n'est pas disponible pour les impressions programmées par les fonctions "iImprime", "iImprimeMot", "iImprimeZone", "iImprimeImage"... alors qu'elle est bien utile !&lt;br /&gt;&lt;br /&gt;Il existe un moyen de combiner ces deux "méthodes" d'impression pour avoir une impression programmée, imprimée au travers d'un état. Ainsi l'impression programmée bénéficie des possibilités d'exportation dans l'aperçu.&lt;br /&gt;&lt;br /&gt;Le moyen pour y parvenir est très facile à mettre en œuvre, il suffit de :&lt;br /&gt;- créer un état ne parcourant aucune donnée, sans aucune champ,&lt;br /&gt;- placer le code de l'impression programmée dans traitement de fermeture de l'état.&lt;br /&gt;Le lancement de cet état "spécial" avec la commande "iImprimeEtat" permettra d'avoir un aperçu contenant une impression programmée, et les possibilités d'exportation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-4912956275423897138?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/4912956275423897138/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=4912956275423897138' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/4912956275423897138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/4912956275423897138'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/12/fonctionnalits-dexportation-rtf-xls-rtf.html' title='Fonctionnalités d&apos;exportation (RTF, XLS, RTF ...) depuis l&apos;aperçu pour les impressions programmées'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4lHIG-XlQLg/RXVwF13lsdI/AAAAAAAAAAM/WW9H1b0mIVs/s72-c/aper%C3%A7u.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-1078772917084588808</id><published>2006-12-04T21:00:00.000+01:00</published><updated>2006-12-15T01:07:11.701+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inclassable / Hors sujet'/><title type='text'>Pacte écologique / Etre un bon citoyen sans faire de politque...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4lHIG-XlQLg/RXWBjF3lsfI/AAAAAAAAAAk/pOEQ1KUm5lE/s1600-h/250x250.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4lHIG-XlQLg/RXWBjF3lsfI/AAAAAAAAAAk/pOEQ1KUm5lE/s320/250x250.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5005049000762913266" /&gt;&lt;/a&gt;Je ne profite d'aucune ressource de façon abusive (chômage, RMI, allocations...). Tous mes revenus sont déclarés, et j'estime mérités, car je ne profite pas de l'argent d'autres contribuables.&lt;br /&gt;&lt;br /&gt;C'est ma façon d'être un "bon citoyen".&lt;br /&gt;&lt;br /&gt;Je ne fais pas de politique : gauche ou droite au pouvoir ne change rien à mon quotidien. L'un comme l'autre au travers de leurs représentants n'ont qu'un objectif, la présidence en 2007, le reste n'a que peu d'importance. Même armé de très bonnes intentions le meilleur des candidats ne pourra pas mettre les fainéants au travail, soigner les malades imaginaires ou mettre au pas ceux qui n'ont aucune règle.&lt;br /&gt;&lt;br /&gt;Cela ne m'empêche pas d'être optimiste pour l'avenir, car je ne suis pas le seul à rester animé des saines valeurs héritées du travail des générations précédentes. Aussi, j'ai signé le "Pacte écologique", qui j'en suis sûr rencontrera un vif succès, et permettra de montrer que finalement, tout le monde ne se fout pas de tout.&lt;br /&gt;&lt;br /&gt;Vous pouvez signer le "&lt;a href="http://www.pacte-ecologique-2007.org/nicolas-hulot/pages/01_je_signe/01_01_jesigne.php?provenance=250_mes1"&gt;Pacte écologique&lt;/a&gt;", et peut être plus encore, ajouter quelques gestes quotidiens supplémentaires en faveur de l'environnement. Par exemple si vous faites plus de 20 minutes de bouchon le matin, demandez-vous si le vélo n'est pas plus rapide au final (tout en permettant au passage de profiter pleinement des friandises de noël sans crainte pour votre ligne).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-1078772917084588808?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/1078772917084588808/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=1078772917084588808' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1078772917084588808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1078772917084588808'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/12/pacte-cologique.html' title='Pacte écologique / Etre un bon citoyen sans faire de politque...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4lHIG-XlQLg/RXWBjF3lsfI/AAAAAAAAAAk/pOEQ1KUm5lE/s72-c/250x250.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-8845145979957851649</id><published>2006-11-28T00:20:00.000+01:00</published><updated>2006-11-27T21:28:00.761+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Inhiber une action standard sur un événement (clavier, souris...)</title><content type='html'>Windows apporte pour tous les champs des comportements standard pour lesquels aucune programation n'est requise, et c'est tant mieux par ce que je ne programmerai pas tout ça tous les jours !&lt;br /&gt;&lt;br /&gt;Mais comme il est toujours bon d'en vouloir plus, on peut dans certain cas ne pas vouloir du comportement standard sur une action bien précise. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/7536/3601/1600/69050/codestop.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger2/7536/3601/400/776214/codestop.jpg" border="0" alt="" /&gt;&lt;/a&gt;Par exemple, on pourrait décider qu'un champ ascenseur ne doit pas réagir à la roulette de la souris. Il suffit pour y parvenir d'ajouter le traitement optionnel "roulette souris", puis de faire renvoyer la valeur "0" à l'événement Windows correspondant (cf. montage écran).&lt;br /&gt;&lt;br /&gt;En effet, le traitement optionnel est appelé lorsque Windows fait l'envoi de l'événement au champ, et avant même que Windows n'ait effectué son action standard. De ce fait on peut très bien exécuter un code avant l'action standard de Windows, et aller jusqu'à l'inhiber comme dans ces exemples.&lt;br /&gt;&lt;br /&gt;Cela est également valable avec la fonction "Evénement" du WLangage qui fonctionne suivant le même principe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-8845145979957851649?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/8845145979957851649/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=8845145979957851649' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8845145979957851649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8845145979957851649'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/inhiber-une-action-standard-sur-un.html' title='Inhiber une action standard sur un événement (clavier, souris...)'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-4461969387508888618</id><published>2006-11-27T12:30:00.000+01:00</published><updated>2006-11-27T10:50:48.697+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Impressions'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Imprimer directement depuis un aperçu...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/7536/3601/1600/924531/aper%3Fu1.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger2/7536/3601/200/136977/aper%3Fu1.jpg" border="0" alt="" /&gt;&lt;/a&gt;La fenêtre d'aperçu propose lors de l'impression de choisir le nombre de pages à imprimer, ainsi que le nombre de copies. D'un point de vue ergonomique, cela peut ne pas convenir à certains usages, voici la méthode pour ne pas avoir de confirmation et imprimer directement :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/7536/3601/1600/40868/aper%3Fu.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger2/7536/3601/200/453757/aper%3Fu.jpg" border="0" alt="" /&gt;&lt;/a&gt;Aperçu personnalisé :&lt;br /&gt;Il faut tout d'abord copier dans le répertoire du projet la fenêtre de l'aperçu, c'est une fenêtre WINDEV dans le répertoire des exemples. Ouvrir ensuite cette fenêtre dans le projet, afin de l'enregistrer dans les éléments du projet. Par le menu "Projet / Description du projet" et le volet "Style", il faut donner cette fenêtre comme fenêtre d'aperçu. A ce stade, il est possible de personnaliser la fenêtre utilisée lors de l'aperçu depuis l'application.&lt;br /&gt;&lt;br /&gt;Modification de l'aperçu :&lt;br /&gt;Ouvrir la description du bouton "Imprimer", et simplement changer son nom en "ImprimerTout". Au prochaine aperçu, ce bouton lancera directement l'impression !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-4461969387508888618?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/4461969387508888618/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=4461969387508888618' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/4461969387508888618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/4461969387508888618'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/imprimer-directement-depuis-un-aperu.html' title='Imprimer directement depuis un aperçu...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-8638618236509742152</id><published>2006-11-23T22:30:00.000+01:00</published><updated>2006-11-24T10:51:17.592+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Big Brother dans les applications ...</title><content type='html'>Dans un site en exploitation avec des données en perpétuelle mouvements, il n'est pas rare de rencontrer deux utilisateurs se disputant la propriété ... d'une erreur de manipulation.&lt;br /&gt;&lt;blockquote&gt;- C'est toi il y a une semaine qui m'a dit de rentrer la nouvelle adresse.&lt;br /&gt;- Oui mais ensuite je l'ai changée à nouveau, tu n'aurais pas du l'écraser !&lt;br /&gt;- Non je ne l'ai pas changée à nouveau, c'est toi qui a oublié de la changer ...&lt;/blockquote&gt;&lt;br /&gt;Au final le conflit est stoppé en se tournant vers l'informaticien en charge du programme :&lt;br /&gt;&lt;blockquote&gt;- [en coeur] : on vient te voir car l'application a encore perdu une adresse.&lt;/blockquote&gt;&lt;br /&gt;Ca sent le vécu pour beaucoup j'en suis certain. Un remède très efficace existe, c'est la journalisation. Cerise sur le gâteau, son activation se fait par une case à cocher dans la description des fichiers de l'analyse, aucune programmation n'est requise. La journalisation des écritures est suffisante pour régler tout litige tel que décrit ci-dessus.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/7536/3601/1600/491625/historique.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger2/7536/3601/320/23894/historique.jpg" border="0" alt="" /&gt;&lt;/a&gt;Lorsque la journalisation est active, le menu contextuel des champs reliés aux rubriques de fichiers dispose d'une option "Historique..." qui permet de connaître toutes les valeurs successivement prises par la rubrique avec :&lt;br /&gt;- la date de l'heure de modification, &lt;br /&gt;- la valeur,&lt;br /&gt;- le poste depuis lequel le changement a été fait,&lt;br /&gt;- le login de l'utilisateur qui a fait le changement.&lt;br /&gt;&lt;br /&gt;Toutes ces informations peuvent également être proposées par une interface spécifique de l'application, avec la fonction "HHistoriqueModification" qui retourne, entre autre, toutes ces informations sur les modifications.&lt;br /&gt;&lt;br /&gt;Plus de doute sur qui a fait quoi !&lt;br /&gt;&lt;br /&gt;Autre intérêt, la journalisation permet après une restauration de données de rajouter à la sauvegarde les dernières modifications.&lt;br /&gt;&lt;br /&gt;Deux recommandations pour l'utilisation de la journalisation : &lt;br /&gt;- utiliser dans le programme la fonction "HPoste" pour renseigner le journal précisément sur l'auteur des changements,&lt;br /&gt;- placer les journaux sur un autre disque que celui contenant les données, avec la fonction "HChangeRepJNL".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-8638618236509742152?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/8638618236509742152/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=8638618236509742152' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8638618236509742152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/8638618236509742152'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/big-brother-dans-les-applications.html' title='Big Brother dans les applications ...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-2381591538531278575</id><published>2006-11-22T22:45:00.000+01:00</published><updated>2006-11-22T22:49:44.430+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Mémorisation de la position des colonnes de table inopérante ?</title><content type='html'>Option à ne pas oublier dans la description des tables : mémoriser la position des colonnes. Elle permet sans ajouter de code, de proposer à l'utilisateur final de toujours retrouver les colonnes comme il les a lui-même positionnées.&lt;br /&gt;&lt;br /&gt;Seulement il peut arriver que cette mémorisation soit inefficace sur une table donnée, sans raison apparente. Il y a bien sûr une explication : la propriété "..MenuContextuel". En effet, l'affectation de la propriété "..MenuContextuel" d'une table, inhibe la restauration de ses paramètres mémorisés. Ceci dans le but de ne pas avoir de colonne invisible, qui ne pourrait pas être restaurée. Mais encore faut-il le savoir, je n'ai pas trouvé l'information dans la documentation. Je l'ai obtenue du support après avoir cherché un long moment pourquoi dans une même fenêtre une première table avait ses colonnes bien remises en place, mais pas une seconde. &lt;br /&gt;&lt;br /&gt;Peut-être qu'une prochaine version de WINDEV pourra afficher des informations aux développeurs pour les informer lors de l'utilisation d'une propriété de ce type des effets engendrés sur d'autres fonctions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-2381591538531278575?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/2381591538531278575/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=2381591538531278575' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2381591538531278575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/2381591538531278575'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/mmorisation-de-la-position-des-colonnes.html' title='Mémorisation de la position des colonnes de table inopérante ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-1879198238025816061</id><published>2006-11-17T12:15:00.000+01:00</published><updated>2006-11-17T11:34:14.210+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Généralités'/><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Fichier en cours d'utilisation ... mais par qui ?</title><content type='html'>Un fichier de données reste parfois ouvert, alors que l'on est persuadé qu'il n'est plus utilisé, et que tous les programmes l'utilisant sont arrêtés...&lt;br /&gt;&lt;blockquote&gt;Fichier en cours d'utilisation sur un autre poste ...&lt;br /&gt;Le fichier est utilisé par un autre processus ...&lt;/blockquote&gt;&lt;br /&gt;Un utilitaire pouvant se substituer au gestionnaire de tâches est très commode, car il permet de connaître les processus qui utilisent un fichier. Il s'agit de &lt;a href="http://www.microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx"&gt;Process Explorer&lt;/a&gt;, à toujours garder dans ses outils de travail. Anecdote, l'éditeur d'origine est Sysinternal, mais il semble qu'il y ait eu récemment une absorption de Microsoft. En effet, l'adresse &lt;a href="http://www.microsoft.com/technet/sysinternals/default.mspx"&gt;http://www.sysinternals.com&lt;/a&gt; est directement redirigée sur un site Microsoft !&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/7536/3601/1600/490426/process1.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger2/7536/3601/200/690779/process1.jpg" border="0" alt="" /&gt;&lt;/a&gt;Bref, le menu "Find / Find handle or DLL" permet de donner le chemin d'accès au fichier de données en cours d'utilisation ... qui ne devrait pas l'être. La recherche vous donne ensuite la liste de tous les processus utilisant ce fichier.&lt;br /&gt;&lt;br /&gt;Au passage, deux "pièges" pouvant aboutit à laisser un fichier de données ouvert ...&lt;br /&gt;- fichier Hyper File, appeler la fonction "HFerme", mais oublier les "HAnnuleDéclaration" sur les requêtes exécutées sur ce même fichier,&lt;br /&gt;- fichier externe : appeler "fCrée" et "fOuvre", et ne faire qu'un seul "fFerme". Pour éviter tout risque d'erreur, préférer "fOuvre" seule, mais avec le paramètre "foCréation".&lt;br /&gt;&lt;br /&gt;Une image (celle du site Microsoft) de l'utilitaire complet, tel qu'il apparaît si vous le substituez au gestionnaire de tâches :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/7536/3601/1600/183461/ProcessExplorer.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger2/7536/3601/320/562463/ProcessExplorer.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-1879198238025816061?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/1879198238025816061/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=1879198238025816061' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1879198238025816061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1879198238025816061'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/fichier-en-cours-dutilisation-mais-par.html' title='Fichier en cours d&apos;utilisation ... mais par qui ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-1619513050881997400</id><published>2006-11-15T19:45:00.000+01:00</published><updated>2006-11-15T18:22:39.793+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Importer un fichier texte dans un fichier Hyper File en formatant des dates</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/7536/3601/1600/monfichiertxt.0.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/7536/3601/200/monfichiertxt.jpg" border="0" alt="" /&gt;&lt;/a&gt;L'importation d'un fichier texte dans un fichier Hyper File est facilitée par la commande "HImporteTexte". Dans le cas favorable, l'importation est donc extrêmement simple grâce à cette fonction. Bien évidemment, suivant l'origine des données à importer, on se trouve en dehors du "cas favorable", il suffit par exemple qu'une date n'ait pas le format "AAAAMMJJ" attendu.&lt;br /&gt;&lt;br /&gt;Dans ce cas, il faut avoir recours à une bonne vieille moulinette, facilitée par l'instruction POUR TOUT.&lt;br /&gt;&lt;br /&gt;L'exemple ci-dessous utilise une &lt;a href="http://forum.pcsoft.fr/post.awp?id=97991&amp;forum=pcsoft.fr.windev&amp;from=0&amp;gmt=P0100"&gt;demande du forum&lt;/a&gt;, ce sujet revenant assez régulièrement d'ou l'idée de ce billet. Il faut souligner qu'il s'applique aux dates, mais également à tout ce qui peut nécessiter une conversion avant la mise en base.&lt;br /&gt;&lt;br /&gt;Soit un fichier texte à importer avec le contenu suivant (une tabulation sépare les colonnes, un retour chariot sépare les lignes ) :&lt;br /&gt;&lt;blockquote&gt;15/03/2002 abc imo 560,33&lt;br /&gt;19/04/2003 klo hap 561,00&lt;br /&gt;12/06/2001 dol pme 7840,00&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Si la date dans le fichier texte avait été codée sous la forme "20020315" la fonction "HImporteTexte" aurait fait l'affaire. Mais avec ce codage de date, il faut mouliner (une fois de plus ?). Voici un exemple de code pouvant être utilisé :&lt;br /&gt;&lt;blockquote&gt;sEnregistrementsAImporter est une chaîne&lt;br /&gt;sNouvelEnreg est une chaîne&lt;br /&gt;sDateNonformatée est une chaîne&lt;br /&gt;&lt;br /&gt;sEnregistrementsAImporter = fChargeTexte("C:\MonFichier.txt")&lt;br /&gt;&lt;br /&gt;POUR TOUTE CHAINE sNouvelEnreg DE sEnregistrementsAImporter SEPAREE PAR RC&lt;br /&gt;&lt;br /&gt; sDateNonformatée = ExtraitChaîne(sNouvelEnreg, 1, TAB)&lt;br /&gt; Fichier.Date = ChaîneVersDate(sDateNonformatée, "JJ/MM/AAAA")&lt;br /&gt; Fichier.Personne = ExtraitChaîne(sNouvelEnreg, 2, TAB)&lt;br /&gt; Fichier.Libellé = ExtraitChaîne(sNouvelEnreg, 3, TAB)&lt;br /&gt; Fichier.Montant = ExtraitChaîne(sNouvelEnreg, 4, TAB)&lt;br /&gt;&lt;br /&gt; HAjoute(Fichier) &lt;br /&gt;FIN&lt;/blockquote&gt;&lt;br /&gt;Une bonne évolution de la fonction "HImporteTexte", serait de pouvoir donner dans les délimiteurs un format de date comme le prend la fonction "ChaîneVersDate". Le champ d'action de "HImporteTexte" serait grandement étendu. J'en ai fait la suggestion au support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-1619513050881997400?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/1619513050881997400/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=1619513050881997400' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1619513050881997400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1619513050881997400'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/importer-un-fichier-texte-dans-un.html' title='Importer un fichier texte dans un fichier Hyper File en formatant des dates'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-6422169722258662644</id><published>2006-11-14T12:26:00.000+01:00</published><updated>2006-11-14T12:34:44.001+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Une option de menu contextuel en gras</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/7536/3601/1600/menugras.0.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/7536/3601/200/menugras.jpg" border="0" alt="" /&gt;&lt;/a&gt;Une astuce permet de passer une unique option d'un menu contextuel, ayant le look XP, en gras.&lt;br /&gt;&lt;br /&gt;Il suffit d'intervenir sur le libellé, et de l'encadrer avec les balises HTML de mise en gras, l'image ci-contre met en évidence ce procédé.&lt;br /&gt;&lt;br /&gt;Cela permet par exemple de mettre en évidence l'option la plus couramment utilisée, un "petit plus" dans une interface !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-6422169722258662644?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/6422169722258662644/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=6422169722258662644' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6422169722258662644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/6422169722258662644'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/une-option-de-menu-contextuel-en-gras.html' title='Une option de menu contextuel en gras'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-4043405128184323577</id><published>2006-11-10T23:55:00.000+01:00</published><updated>2006-11-10T23:00:22.009+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inclassable / Hors sujet'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Bêta Blogger avant WINDEV 11, pour une leçon d'ergonomie !</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/7536/3601/1600/blogger1.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/7536/3601/200/blogger1.jpg" border="0" alt="" /&gt;&lt;/a&gt;En attendant de pouvoir m'initier aux nouveautés de WINDEV 11, je découvre la bêta version des Blogs façon Google. Un sacré chamboulement puisqu'en terme de fonctionnalités, visibles tout autour de ce billet, il est maintenant possible :&lt;br /&gt;- d'ajouter des flux RSS,&lt;br /&gt;- de regrouper les billets par sujets,&lt;br /&gt;- d'avoir une arborescence des archives ...&lt;br /&gt;&lt;br /&gt;Mais surtout, et là chapeau, surtout il est possible d'obtenir tout cela sans aucune programmation Web, dans un environnement totalement dynamique. Un simple glisser/déplacer d'un élémement dans la page permet de disposer les différentes zones du blog. Un modèle d'ergonomie.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/7536/3601/1600/blogger2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/7536/3601/200/blogger2.jpg" border="0" alt="" /&gt;&lt;/a&gt;J'encourage tous ceux qui le peuvent à prendre quelques minutes pour créer un blog de test, juste pour découvrir la simplicité avec laquelle toutes les possibilités du blog sont proposées. Les développeurs se sont réellement creusés pour parvenir à un tel résultat, c'est un très bel exemple de respect de l'utlisateur.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-4043405128184323577?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/4043405128184323577/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=4043405128184323577' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/4043405128184323577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/4043405128184323577'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/bta-blogger-avant-windev-11-pour-une.html' title='Bêta Blogger avant WINDEV 11, pour une leçon d&apos;ergonomie !'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-1198449254797415952</id><published>2006-11-10T17:00:00.000+01:00</published><updated>2006-11-10T18:05:13.310+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Stockage des images, optimisation de l'espace en changeant le format...</title><content type='html'>Une rubrique mémo image est généralement affectée par une commande de la forme Fichier.RubriqueImage = ChampImage, ou "EcranVersFichier".&lt;br /&gt;&lt;br /&gt;Cette affectation copie fidèlement l'image contenue dans le champ, au format BMP. &lt;br /&gt;&lt;br /&gt;En fonction du contenu de l'image, un enregistrement en JPEG est souvent suffisant en qualité, et permet de diviser la taille de l'image par un facture important. Il suffit pour cela d'affecter la rubrique avec un appel de la fonction "dSauveimageJPEG" :&lt;br /&gt;&lt;blockquote&gt;Fichier.RubriqueImage = dSauveImageJPEG(ChampImage, enMémoire)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Petite astuce bien utile s'il faut gagner un peu de place, surtout si l'application doit à un moment donné transférer ces images.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-1198449254797415952?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/1198449254797415952/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=1198449254797415952' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1198449254797415952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/1198449254797415952'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/stockage-des-images-optimisation-de.html' title='Stockage des images, optimisation de l&apos;espace en changeant le format...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116299016128455005</id><published>2006-11-09T00:21:00.000+01:00</published><updated>2006-11-10T13:10:27.805+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Présentation par défaut de l'interface d'une application déployée</title><content type='html'>L'utilisateur final d'une application peut configurer la présentation de son application :&lt;br /&gt;- position et taille des fenêtres,&lt;br /&gt;- largeur des colonnes des tables,&lt;br /&gt;- mémorisation de valeurs pour les champs...&lt;br /&gt;&lt;br /&gt;Comme il est courant pour tout le monde de changer d'avis, il est souhaitable de lui proposer une option de l'application permettant de revenir à l'état initial pour toutes les informations mémorisées. Il peut s'agit d'un menu "Paramètres / Rétablir l'affichage par défaut". Cette option devra simplement faire la suppression dans la base de registres de la clé retournée par la fonction "ProjetInfo(piRegistre)".&lt;br /&gt;&lt;br /&gt;Pour aller plus loin sur ce mécanisme, il est également possible de remplacer la sauvegarde faite dans la base de registres, par une sauvegarde dans un fichier XML. Cette possibilité est donnée par la fonction "InitParamètre". L'avantage est alors de pouvoir facilement "transporter" les paramètres sauvegardés d'un poste à un autre. Il est même envisageable de conserver le fichier XML dans un fichier de la base de données, afin de le restituer automatiquement au lancement de l'application en fonction de l'utilisateur qui se connecte !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116299016128455005?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116299016128455005/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116299016128455005' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116299016128455005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116299016128455005'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/prsentation-par-dfaut-de-linterface.html' title='Présentation par défaut de l&apos;interface d&apos;une application déployée'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116298947266338369</id><published>2006-11-08T13:28:00.000+01:00</published><updated>2006-11-10T13:10:27.649+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Loupe de recherche des colonnes des tables</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/loupe.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/400/loupe.jpg" border="0" alt="" /&gt;&lt;/a&gt;Voici une "checklist" à appliquer lorsque la loupe d'une colonne de table fichier n'apparaît pas lors de l'exécution.&lt;br /&gt;&lt;br /&gt;- la coche "Avec recherche (loupe)" doit être active dans la description de la colonne, tout comme la coche "Triable" (volet "Général"),&lt;br /&gt;&lt;br /&gt;- la rubrique du fichier associé à la colonne (volet "Liaison") doit être une clé dans le fichier (unique ou doublon peut importe),&lt;br /&gt;&lt;br /&gt;- le remplissage de la table doit se faire sans programmation. Il s'agit du sélecteur "Parcours automatique" dans la description de la table (volet "Contenu"),&lt;br /&gt;&lt;br /&gt;- l'option "Ascenseur proportionnel" doit également être cochée toujours dans la description de la table (volet "Détail").&lt;br /&gt;&lt;br /&gt;Toutes ces conditions doivent être réunies dans le cas d'une table directement reliée à un fichier. Si la table est reliée à une requête, la nécessité de clé dans le fichier de données disparaît.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116298947266338369?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116298947266338369/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116298947266338369' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116298947266338369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116298947266338369'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/loupe-de-recherche-des-colonnes-des.html' title='Loupe de recherche des colonnes des tables'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116256053435863346</id><published>2006-11-03T13:15:00.000+01:00</published><updated>2006-11-10T13:10:27.563+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Accélérateur de traitement ...</title><content type='html'>Avec son nom tout à fait anodin, la propriété "..AffichageActif" peut accélérer de façon considérables des traitements. En effet, vous pouvez l'observer avec l'analyseur de performances, les accès à l'interface sont coûteux temps. Par exemple un parcours de données avec des "TableAjoute" dans une table mémoire (champ d'affichage) sera plus long qu'un même parcours chargeant une variable tableau (fonction "TableauAjoute"). Là peut intervenir avantageusement la propriété, en inhibant provisoirement l'affichage. Exemple :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;NomFenêtre..AffichageActif = Faux&lt;br /&gt;TraitementXYZ()&lt;br /&gt;NomFenêtre..AffichageActif = Vrai&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Simple, mais redoutable d'efficacité dans bien des cas de figure !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116256053435863346?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116256053435863346/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116256053435863346' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116256053435863346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116256053435863346'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/acclrateur-de-traitement.html' title='Accélérateur de traitement ...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116247086842619601</id><published>2006-11-02T13:26:00.000+01:00</published><updated>2006-11-10T13:10:27.493+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Etat imprimé à tout faire (zone répétée, variable tableau...)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/etatatoutfaire.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/200/etatatoutfaire.jpg" border="0" alt="" /&gt;&lt;/a&gt;Par défaut l'assistant de création des états permet de sélectionner des données dans les fichiers de l'analyse, une requête, un champ table...&lt;br /&gt;&lt;br /&gt;Il existe une méthode d'impression "passe partout" car elle permet d'imprimer tout aussi facilement tout et n'importe quoi. L'idée de ce billet m'est venue en voyant le &lt;a href="http://forum.pcsoft.fr/post.awp?id=97044&amp;forum=pcsoft.fr.windev&amp;from=0&amp;gmt=P0100"&gt;forum&lt;/a&gt;, pour l'impression des données d'une zone répétée.&lt;br /&gt;&lt;br /&gt;Il suffit dans l'assistant de création d'état d'indiquer "Je programme la lecture de ma source de données", puis de créer dans l'état des champs avec les types et masques désirés. C'est le code de l'état et du bloc corps que se chargeront du parcours des données, la programmation est minime :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;// code d'ouverture de l'état&lt;br /&gt;// Déclaration d'une globale pour parcourir les répétitions&lt;br /&gt;// ou pourquoi pas les éléments d'une variable tableau...&lt;br /&gt;gnIndice est un entier = 1&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;// Code de lecture des données de l'état&lt;br /&gt;// Termine l'impression si toutes les répétitions ont été vues&lt;br /&gt;SI gnIndice &gt; ZoneRépétéeOccurrence(FEN_FenetreAppelante.ZR_ZoneRépétée1) ALORS&lt;br /&gt; RENVOYER Faux&lt;br /&gt;SINON&lt;br /&gt; RENVOYER Vrai&lt;br /&gt;FIN&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;// Code avant impression du bloc corps&lt;br /&gt;// Affectation des champs de l'état avec les attributs&lt;br /&gt;// de la zone qui permettent d'avoir les valeurs&lt;br /&gt;RUB_RUBRIQUE1 = FEN_FenetreAppelant.ZR_ZoneRépétée1.ATT_Attribut1[gnIndice]&lt;br /&gt;RUB_RUBRIQUE2 = FEN_FenetreAppelant.ZR_ZoneRépétée1.ATT_Attribut2[gnIndice]&lt;br /&gt;RUB_RUBRIQUE3 = FEN_FenetreAppelant.ZR_ZoneRépétée1.ATT_Attribut3[gnIndice]&lt;br /&gt;...&lt;br /&gt;// Incrémentation du compteur pour passer à la prochaine répétition.&lt;br /&gt;gnIndice++&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Cette méthode peut être étendue à tout ce qui peut se parcourir, dans l'exemple on lit les répétitions d'une zone répétée, mais il peut s'agit d'un tableau, d'une zone mémoire, un fichier texte...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116247086842619601?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116247086842619601/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116247086842619601' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116247086842619601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116247086842619601'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/etat-imprim-tout-faire-zone-rpte.html' title='Etat imprimé à tout faire (zone répétée, variable tableau...)'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116246595163161347</id><published>2006-11-02T12:09:00.000+01:00</published><updated>2006-11-10T13:10:27.407+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Représentation binaire d'une valeur.</title><content type='html'>A toute fin utile, voici un traitement proposé en réponse sur le &lt;a href="http://forum.pcsoft.fr/post.awp?id=97024&amp;forum=pcsoft.fr.windev&amp;from=0&amp;gmt=P0100"&gt;forum&lt;/a&gt; pour obtenir la représentation binaire d'une valeur. La fonction de conversion inverse est donnée également.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;FONCTION VersBinaire(nValeurDecimal)&lt;br /&gt;&lt;br /&gt;sBinaire est une chaîne = ""&lt;br /&gt;nb est un entier = nValeurDecimal&lt;br /&gt;&lt;br /&gt;TANTQUE nb &gt; 0&lt;br /&gt; SI modulo(nb,2) ALORS &lt;br /&gt;  sBinaire = "1" + sBinaire&lt;br /&gt; SINON&lt;br /&gt;  sBinaire = "0" + sBinaire&lt;br /&gt; FIN&lt;br /&gt; nb = nb/2&lt;br /&gt;FIN&lt;br /&gt;RENVOYER sBinaire&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Et la récupération d'une valeur exprimée en décimal, à partir de sa représentation binaire :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;FONCTION DepuisBinaire(schaineBinaire)&lt;br /&gt;&lt;br /&gt;sBinaire est une chaîne = schaineBinaire&lt;br /&gt;i est un entier&lt;br /&gt;j est un entier&lt;br /&gt;nDecimal est un entier&lt;br /&gt;nCalcul est un entier&lt;br /&gt;&lt;br /&gt;POUR i = Taille (sBinaire) A 1 PAS -1&lt;br /&gt; nCalcul = 2*Val (sBinaire[[i A i]])&lt;br /&gt; SI nCalcul ALORS&lt;br /&gt;  nDecimal += Puissance (nCalcul,j)&lt;br /&gt; FIN&lt;br /&gt; j++&lt;br /&gt;FIN&lt;br /&gt;&lt;br /&gt;RENVOYER nDecimal&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116246595163161347?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116246595163161347/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116246595163161347' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116246595163161347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116246595163161347'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/11/reprsentation-binaire-dune-valeur.html' title='Représentation binaire d&apos;une valeur.'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116184357424095270</id><published>2006-10-25T00:15:00.000+02:00</published><updated>2006-11-10T13:10:27.341+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inclassable / Hors sujet'/><title type='text'>Comment suis-je devenu définitivement accro des outils PC SOFT (partie 1) ?</title><content type='html'>J'ai découvert le savoir faire PC SOFT en 1994 avec le trio Hyper Screen, Hyper File et Hyper Screen. Travaillant sur la réalisation d'un tableau de bord(1) pour une chaîne de grande distribution, fraîchement diplômé de l'université de Grenoble, je n'avais jamais fait autre chose que des programmes noirs, avec des interfaces en mode texte. Et là, je faisais des programmes en couleurs, gérant la souris, le défilement de données avec des ascenseurs, l'ouverture de fenêtres les unes par-dessus les autres ... le tout depuis un QBasic sous DOS 6.2 et sa compilation en ligne de commande. Le principe(2) était des plus simple, les 3 produits PC SOFT ajoutaient en quelque sorte des commandes au QBasic, commandes pour gérer l'interface, les données et les éditions. Le résultat était sidérant, avec très peu de commandes le programme était d'une efficacité redoutable, aussi conviviale qu'une application sous Windows 3.1 de l'époque, les problèmes de pilotes en moins !&lt;br /&gt;&lt;br /&gt;Sorti de la tristesse des interfaces texte du DOS grâce à Hyper Screen, je me suis tout naturellement mis à la programmation sous Windows. J'ai compulsé de nombreuses heures le Petzold, et, je ne pouvais pas choisir mes outils à cette époque, j'ai fait mes premières fenêtres sous Visual C++ 1.5. Avec la première mouture des MFC (Microsof Foundation Classes), je pensais que la gestion de l'interface et des données serait aussi simple qu'avec Hyper Screen et Hyper File sous DOS. C'était une erreur, je me suis retrouvé avec des compilations infernales et interminables, des classes dans tous les sens, loin très loin de la simplicité de mes précédents développements. Heureusement, mon employeur a changé son fusil d'épaule avec l'arrivée de WINDEV 1.5, et depuis, avec des contextes professionnels différents, je travaille avec les outils PC SOFT. Ca fait donc plus de 12 ans !&lt;br /&gt;&lt;br /&gt;Avec WINDEV 1.5 j'ai pu faire mes premières applications Windows en quelques clics, comme on peut le faire aujourd'hui. Le principe est en effet resté le même, on dessine la fenêtre en y plaçant les champs et boutons. On clic sur Go pour tester, sur l'engrenage pour créer l'exécutable à diffuser. J'ai ainsi enchaîné mes créations avec la version 1.5, puis les versions 2, 4 et enfin 5.5 qui a permis le passage en 32 bits. Passage douloureux pour bon nombre de mes collègues qui devaient se soucier de la portée de leurs pointeurs, de la taille de leurs variables entières (...), aisé pour moi qui devait uniquement cocher un sélecteur à la création de l'exécutable (juste les appels des API à adapter). PC SOFT avait tout prévu, comme sous Hyper Screen, et Hyper File qui restait le même avec déjà son système de modification automatique des fichiers de données.&lt;br /&gt;&lt;br /&gt;La suite au prochain épisode ... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(1) Tableau de bord : vous comprenez mon &lt;a href="http://elianlacroix.blogspot.com/2006/10/synthse-de-linformation-par-google-et.html"&gt;billet&lt;/a&gt; relatif au tableau de bord des versions 11, j'ai fréquemment travaillé de tout temps sur la présentation des données, et l'aperçu du tableau de bord de suivi des projets est de très bonne augure pour WINDEV 11 !&lt;br /&gt;&lt;br /&gt;(2) Cette technique de programmation reste disponible en version 10, elle est illustrée pas des exemples du dossier \Langages Externes\. En C, C#, Basic, Cobol, Fortran on ajoute des "includes" qui donnent accès à Hyper File, Wlangage et aux éléments d'une bibliothèque (.WDL).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116184357424095270?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116184357424095270/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116184357424095270' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116184357424095270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116184357424095270'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/comment-suis-je-devenu-dfinitivement.html' title='Comment suis-je devenu définitivement accro des outils PC SOFT (partie 1) ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116134115698075888</id><published>2006-10-20T12:38:00.000+02:00</published><updated>2006-11-10T13:10:27.270+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Section critique à la bonne place, avec le bon nom...</title><content type='html'>Dans un programme utilisant plusieurs thread (messagerie instantanée avec Socket, traitements batch...), il peut arriver après un certain temps d'utilisation un blocage (pas de réponse...), ou une disparition pure et simple de la liste des processus, ou un message du mécanisme de sécurité WLangage :&lt;br /&gt;&lt;blockquote&gt;Une erreur système inattendue est survenue.&lt;br /&gt;Module : WD100VM.DLL&lt;br /&gt;Erreur système : Access violation (GPF)&lt;br /&gt;EIP = 12345678&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;C'est une difficulté sérieuse, car il n'y a en général aucune reproduction systématique, et le traitement donné dans la pile de l'erreur change d'une exécution à l'autre. La piste de recherche à privilégier dans pareil cas, se nomme "section critique". En effet, dès que plusieurs threads s'exécutent en parallèle, ils vont nécessairement à un moment ou à un autre accéder à des éléments partagés. Typiquement, une variable globale du projet, un membre de classe utilisé dans une méthode exécutée par un thread secondaire, et une autre partie de la classe sollicitée dans le thread principal ... les combinaisons sont infinies.&lt;br /&gt;&lt;br /&gt;Il faut donc en tout premier lieu en cas d'instabilité vérifier que tous les éléments (variables, membres...) qui sont utilisés par deux thread distincts sont dans une section critique. Sans cela, l'erreur ou le blocage "aléatoire" est quasiment garanti à un moment ou à un autre dans le déroulement de l'application, et le plus souvent après un important nombre d'heures d'utilisation.&lt;br /&gt;&lt;br /&gt;A titre d'exemple, si une variable globale du projet est affectée dans un thread secondaire, le code devra être de la forme suivante :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/sc1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/320/sc1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Et bien sûr, la consultation de cette variable dans le thread principal devra se faire avec la même section critique (attention à ne pas faire une faute de frappe dans le nom de la section) :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/sc2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/320/sc2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Ce billet est motivé par plusieurs instabilités aléatoires résolues en ajoutant les bonnes sections critiques. La dernière en date, hier, provenait d'une faute de frappe avec un nom de section critique erroné lors de l'affectation d'un membre !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116134115698075888?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116134115698075888/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116134115698075888' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116134115698075888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116134115698075888'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/section-critique-la-bonne-place-avec.html' title='Section critique à la bonne place, avec le bon nom...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116101313414593481</id><published>2006-10-17T23:38:00.000+02:00</published><updated>2006-11-10T13:10:27.187+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Demander de l'aide au Framework DotNet ...</title><content type='html'>Dans le meilleur des mondes, le développeur aurait dans son environnement de développement toutes les fonctions possibles et imaginables créées depuis l'origine de la micro-informatique. Le temps passé à "réinventer la roue" serait enfin réduit à un minimum acceptable. Bien évidemment, ce meilleur des mondes n'est qu'utopie, et c'est tant mieux car le quotidien du développeur deviendrait bien monotone s'il n'était plus nécessaire de se creuser la tête de temps à autre !&lt;br /&gt;&lt;br /&gt;Dans la pratique donc, il n'est donc pas rare d'avoir une fonction manquante, nécessitant dans le pire des cas un recodage. Mais c'est un cas extrême avec WINDEV car deux Framework sont à la disposition du développeur.&lt;br /&gt;&lt;br /&gt;On pense immédiatement au Framework PC SOFT inclus avec toutes les applications. Il contient à lui seul des centaines de fonctions, des propriétés, l'accès moteur Hyper File, aux bases de données via OLE DB ...&lt;br /&gt;&lt;br /&gt;Mais il ne faut pas omettre le Framework .NET directement accessible également. Il apporte de nombreuses possibilités supplémentaires.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/dotnet3.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/400/dotnet3.jpg" border="0" alt="" /&gt;&lt;/a&gt;Une illustration, obtenir du système un identifiant unique, plus communément appelé &lt;a href="http://fr.wikipedia.org/wiki/Globally_Unique_Identifier"&gt;GUID&lt;/a&gt; (cf. ci-contre). La fonction "iDonneIdentifiant" du WLangage ne convient pas si l'on désire un identifiant unique au niveau du poste, elle ne convient que pour une instance de l'application. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/dotnet1.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/200/dotnet1.jpg" border="0" alt="" /&gt;&lt;/a&gt;La classe GUID de MSCORLIB inclus en standard dans .NET donne l'information. Il devient alors très facile d'avoir l'information en quelques clics. Le menu "Atelier" donne la possibilité d'ajouter dans le projet les classes de MSCORLIB. Il suffit ensuite de déclarer un objet "GUID" pour obtenir l'information attendue.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/dotnet2.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/400/dotnet2.jpg" border="0" alt="" /&gt;&lt;/a&gt;L'éditeur de code propose une complétion automatique pour les classes .NET intégrées, cela facile leur utilisation.&lt;br /&gt;&lt;br /&gt;Notez qu'en utilisant le Framework .NET dans votre application sa présence sur l'installation cliente sera indispensable. Il faut donc vérifier avant tout le déploiement du Framework .NET sur les postes cibles. Normalement il est fait du moment que Windows update est actif.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116101313414593481?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116101313414593481/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116101313414593481' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116101313414593481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116101313414593481'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/demander-de-laide-au-framework-dotnet.html' title='Demander de l&apos;aide au Framework DotNet ...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116073116170626805</id><published>2006-10-13T12:15:00.000+02:00</published><updated>2006-11-10T13:10:27.109+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Généralités'/><title type='text'>Synthèse de l'information, par Google et WINDEV 11 !</title><content type='html'>C'est chose faite, la &lt;a href="http://www.pcsoft.fr/annonce11/index.html"&gt;version 11 de WINDEV&lt;/a&gt; est annoncée. En même temps Google propose une nouvelle version de &lt;a href="http://www.blogger.com"&gt;Blogger&lt;/a&gt;. Moi qui adore les découvertes, je suis comblé !&lt;br /&gt;&lt;br /&gt;Je suis régulièrement amené ces derniers temps à travailler sur la présentation des données dans des applications existantes. Les tableaux statistiques d'époque ou autre ne conviennent plus à l'utilisateur final, qui veut en un clin d'oeil avoir accès à toute l'information. C'est par exemple une des clés du succès des portails Web qui savent proposer un accueil regroupant les éléments dont a besoin l'Internaute. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/betatour-dashboard.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/200/betatour-dashboard.png" border="0" alt="" /&gt;&lt;/a&gt;Cette "tendance" ressort des nouveautés, puisque Google, et WINDEV 11 propose une notion de "tableau de bord" (dashboard en anglais dans le texte). L'interface du futur Windows Vista est également orientée vers une présentation réellement pensée pour l'utilisateur, et non plus pour le "bidouilleur", ou le connaisseur.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/wdtdb.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/200/wdtdb.jpg" border="0" alt="" /&gt;&lt;/a&gt;Gageons qu'avec de telles sources d'inspiration, les applications vont prendre un sacré "coup de jeune" en terme d'interface, et d'ergonomie. Alors synthèse de l'information dans nous outils de travail, mais également dans nos productions pour rendre l'outil informatique plus accessible en pensant toujours à ce dont à réellement besoin l'utilisateur final !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116073116170626805?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116073116170626805/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116073116170626805' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116073116170626805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116073116170626805'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/synthse-de-linformation-par-google-et.html' title='Synthèse de l&apos;information, par Google et WINDEV 11 !'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116059711457075909</id><published>2006-10-12T19:35:00.000+02:00</published><updated>2006-11-10T13:10:27.010+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>On en apprend tous les jours ...</title><content type='html'>Le développement est un domaine si vaste, qu'il ne se passe pas une journée sans faire de découverte. Ma nouveauté du jour, est la fonction "ChaineRécupère" ! J'ai de tout temps utilisé la fonction "Transfert" qui n'est plus nécessaire maintenant. J'étais passé à côté de cette fonction, je ne sais pas dire dans quelle version de WINDEV elle est apparue.&lt;br /&gt;&lt;br /&gt;Un &lt;a href="http://forum.pcsoft.fr/post.awp?id=95460&amp;forum=pcsoft.fr.windev"&gt;fil du forum&lt;/a&gt; décrit l'aspect technique de cette commande.&lt;br /&gt;&lt;br /&gt;Moralité, n'oubliez pas de relire régulièrement les documentations diverses, on ne sait jamais tout. Et puis il vient un stade ou l'on en apprend tous les jours, mais on en oublie également.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116059711457075909?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116059711457075909/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116059711457075909' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116059711457075909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116059711457075909'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/on-en-apprend-tous-les-jours.html' title='On en apprend tous les jours ...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116058119386383573</id><published>2006-10-11T22:18:00.000+02:00</published><updated>2006-11-10T13:10:26.916+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Généralités'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Poser la bonne question !</title><content type='html'>Le dialogue instauré entre une application et ses utilisateurs est primordiale. Même avec des modes opératoires parfaitement définis, si l'application propose un choix ambigu l'utilisateur risque une fausse manipulation. Il aura de plus un ressenti négatif envers l'application, la trouvant difficile à utiliser.&lt;br /&gt;&lt;br /&gt;Il paraît donc évident que toutes les applications devraient avoir des dialogues peaufinés. Cependant la réalité est différente, car historiquement le développeur disposait pour solliciter l'utilisateur de la fameuse "MessageBox" Windows, accessible en Wlangage au travers des fonctions "OuiNon", "Confirmez" avec les traditionnels boutons Oui, Non, Annuler. Difficile de proposer un dialogue efficace à partir de ce jeu d'instructions, sans passer un temps important dans la création de fenêtres spécifiques.&lt;br /&gt;&lt;br /&gt;Pour trouver un juste équilibre entre des messages conviviaux à la réponse facile, sans rallonge de planning, le Wlangage propose une fonction "Dialogue", dotée d'un assistant de mise en œuvre, que je recommande de rendre obligatoire dans toutes vos règles ou chartes de programmation !&lt;br /&gt;&lt;br /&gt;En effet, cette fonction permet de trouver le juste équilibre pour que le développeur en un minimum de temps puisse créer une interface de dialogue agréable, et surtout complète.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/dialogue4.0.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/320/dialogue4.jpg" border="0" alt="" /&gt;&lt;/a&gt;Voici une illustration, avec une action courante, l'envoi d'un email. Dans le cas ou l'utilisateur final ne renseigne pas le sujet de son message, on va l'en informer. La méthode originale "OuiNon" pouvait donner le type de message ci-contre. Oui, il est un peu caricatural, mais je vous assure l'avoir trouvé dans des applications.&lt;br /&gt;&lt;br /&gt;L'utilisation de la fonction "Dialogue" permet d'éviter pareil "désagrément", car elle va permettre au développeur de bien poser la question, tout en proposant des boutons de réponses en texte clair. Notez que l'internationalisation est prise en charge par la fonction "Dialogue". Cette vue de l'assistant se passe quasiment de commentaire. Au centre le message, à droite on gère la présence des boutons, en bas leurs caractéristiques, à gauche l'icone système à afficher...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/dialogue2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/320/dialogue2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/dialogue3.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/200/dialogue3.jpg" border="0" alt="" /&gt;&lt;/a&gt;L'assistant va plus loin, le code de traitement du choix de l'utilisateur est immédiatement généré. Il ne reste plus qu'à insérer l'appel de vos procédures.&lt;br /&gt;&lt;br /&gt;Un principe similaire pour un dialogue de saisie est proposé grâce à la fonction "Saisie". Ci-dessous, son illustration extraite de l'aide de WINDEV.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/saisie.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/200/saisie.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/minuterie.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/200/minuterie.jpg" border="0" alt="" /&gt;&lt;/a&gt;Astuce, n'oubliez pas les minuteries. Il est rare de bloquer une application sur un dialogue, il peut être utile de forcer sa validation sans réponse de l'utilisateur après un certain laps de temps. C'est la fonction "DélaiAvantFermeture" qui appelée avant "Dialogue" vous permet d'ajouter une minuterie sur le bouton qui valide le dialogue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116058119386383573?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116058119386383573/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116058119386383573' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116058119386383573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116058119386383573'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/poser-la-bonne-question.html' title='Poser la bonne question !'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116048039575081910</id><published>2006-10-10T13:31:00.000+02:00</published><updated>2006-11-10T13:10:26.809+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Piloter la sauvegarde d'une base de données Hyper File Client/Serveur</title><content type='html'>Voici un code prêt à l'emploi qui m'a donné du fil à retordre, car l'aide en ligne de la commande était erronée ! En effet, il y avait une coquille sur le paramètre permettant de donner le mot de passe. Le bon paramètre est &lt;span style="font-weight:bold;"&gt;/MDP_DB&lt;/span&gt; et non pas &lt;span style="font-weight:bold;"&gt;/MDP_BD&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/wdjournal.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/320/wdjournal.jpg" border="0" alt="" /&gt;&lt;/a&gt;Vous pouvez copier directement le code sur le &lt;a href="http://forum.pcsoft.fr/post.awp?id=95065&amp;forum=pcsoft.fr.windev"&gt;fil correspondant&lt;/a&gt; dans le forum&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116048039575081910?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116048039575081910/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116048039575081910' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116048039575081910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116048039575081910'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/piloter-la-sauvegarde-dune-base-de.html' title='Piloter la sauvegarde d&apos;une base de données Hyper File Client/Serveur'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116037641744173008</id><published>2006-10-09T08:33:00.000+02:00</published><updated>2006-11-10T13:10:26.519+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Hyper File, Hyper File Client/Serveur, MYSQL, Oracle, SQL SERVER...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/SXP18042-80-5.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/400/SXP18042-80-5.gif" border="0" alt="" /&gt;&lt;/a&gt;Une demande très &lt;a href="http://forum.pcsoft.fr/post.awp?id=95152&amp;forum=pcsoft.fr.windev&amp;from=0&amp;gmt=P0100"&gt;courante&lt;/a&gt; des développeurs, et de pouvoir changer ou alterner la base de données utilisée par l'application. Utiliser une base Hyper File en mode partage (dit "classique"), ou en mode Client/Serveur suivant le site, ou une base MYSQL...&lt;br /&gt;&lt;br /&gt;La solution est très simple, mais de part notre naturel à toujours chercher compliqué, les méthodes employées sont souvent les moins efficaces. Pourtant, avec seulement deux commandes, le W-Langage permet de facilement jongler d'une base de données à l'autre, &lt;span style="font-weight:bold;"&gt;sans intervenir sur la description des tables dans l'analyse&lt;/span&gt;. En effet, le type de base de données indiqué dans l'analyse est indicatif, il est utilisé uniquement par défaut sans mention contraire dans vos traitements. Ainsi dans votre code vous pouvez à tout moment appeler :&lt;br /&gt;- "&lt;span style="font-weight:bold;"&gt;HOuvreConnexion&lt;/span&gt;" : elle permet d'ouvrir une connexion vers une base quelconque, du moment que vous avez une accès natif, ou un provider OLE DB.&lt;br /&gt;- "&lt;span style="font-weight:bold;"&gt;HChangeConnexion&lt;/span&gt;" : elle permet d'associer une ou plusieurs tables de l'analyse, à une connexion qui vient d'être ouverte.&lt;br /&gt;Ainsi une application simplement en redéfinissant la connexion peut changer la base utilisée. Un extrait de code est proposé dans une &lt;a href="http://faq.pcsoft.fr/webdev9/faqread.awp?idfaq=3114"&gt;FAQ PC SOFT&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Attention, il s'agit là du principe de connexion. Bien entendu, le simple faire de changer de base peut ne pas suffire, car chaque base a ses propres spécificités d'utilisation. Si la base Hyper File est en mode Client/Serveur, il faudra privilégier les requêtes pour en tirer les meilleures performances. Mais cela dans un but d'optimisation. Dans tous les cas ou le volume de données traité reste raisonnable, il n'est pas indispensable d'avoir un travail d'optimisation intensif, il est ainsi possible de jongler facilement d'une base à une autre juste avec les commandes "HOuvreConnexion"et "HChangeConnexion".&lt;br /&gt;&lt;br /&gt;Ce principe de connexion peut également être utilisé pour effectuer un transfert de données lorqu'il s'agit de bases de données différentes. La notion d'alias vient en renfort, et va permettre d'avoir un unique fichier de l'analyse, accessible en deux exemplaires dans deux connexions différentes. Le traitement peut alors être de la forme suivante :&lt;br /&gt;- "HOuvreConnexion" pour vous connecter à une base quelconque,&lt;br /&gt;- "HAlias" pour avoir une copie du fichier,&lt;br /&gt;- "HChangeConnexion" pour que l'alias travail sur la base sur laquelle la &lt;br /&gt;connexion a été ouverte,&lt;br /&gt;- "POUR TOUT" pour parcourir les enregistrements du fichier source,&lt;br /&gt;- "HCopieEnreg" et "HAjoute" pour copier les enregistrements.&lt;br /&gt;Il est même envisageable de traiter une analyse complète, et plaçant le tout &lt;br /&gt;dans parcours de la liste des fichiers (fonction "HListeFichier").&lt;br /&gt;Il existe également des &lt;a href="www.sqlmanagerx.com"&gt;outils&lt;/a&gt; permettant d'effectuer des transferts de données.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116037641744173008?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116037641744173008/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116037641744173008' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116037641744173008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116037641744173008'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/hyper-file-hyper-file-clientserveur.html' title='Hyper File, Hyper File Client/Serveur, MYSQL, Oracle, SQL SERVER...'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116007851311107394</id><published>2006-10-06T00:36:00.000+02:00</published><updated>2006-11-10T13:10:26.357+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inclassable / Hors sujet'/><title type='text'>Echanger des sources et techniques avec Google ?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/codesearch_logo.1.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/200/codesearch_logo.png" border="0" alt="" /&gt;&lt;/a&gt;L'&lt;a href="http://www.zdnet.fr/actualites/internet/0,39020774,39363811,00.htm?xtor=1"&gt;actualité&lt;/a&gt; Google est toujours chargée ces dernières années, elle concerne aujourd'hui tous les développeurs adeptes du partage de sources, et qui ne souhaitent plus réinventer en permanence la roue !&lt;br /&gt;&lt;br /&gt;Un nouveau portail "&lt;a href="http://www.google.com/codesearch"&gt;codesearch&lt;/a&gt;" a donc vu le jour, et permet d'effectuer des recherches dans les codes sources recensés par Google. Et en matière de recensement, Google sait y faire !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116007851311107394?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116007851311107394/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116007851311107394' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116007851311107394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116007851311107394'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/echanger-des-sources-et-techniques.html' title='Echanger des sources et techniques avec Google ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116004350589394754</id><published>2006-10-05T12:34:00.000+02:00</published><updated>2006-11-10T13:10:26.264+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Impressions'/><title type='text'>Limiter les ressources sollicitées par les impressions.</title><content type='html'>Je l'ai évoqué dans un précédent billet, s'il y a bien un domaine dans lequel il faut s'appliquer à ne pas trop solliciter le système, c'est bien celui de l'impression. En effet, si pour l'utilisateur le fait d'imprimer une action anodine, pour le système ce n'est pas rien, il va abondamment solliciter les pilotes de périphériques, les ressources graphiques...&lt;br /&gt;&lt;br /&gt;Voici quelques astuces qui vous permettront je l'espère d'augmenter la réussite de vos impressions, essentiellement sur les configurations les plus faiblement dotées (hard et soft).&lt;br /&gt;&lt;br /&gt;1. réinitialiser le mécanisme d'impression avant chaque nouvelle impression, avec un appel de la fonction "iRAZ".&lt;br /&gt;&lt;br /&gt;2. éviter les images volumineuses en fond de page par exemple en utilisant une image enregistrée pour le Web.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/impression_a_chaque_page.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/320/impression_a_chaque_page.jpg" border="0" alt="" /&gt;&lt;/a&gt;3. sélectionner dans la confi- guration des états, l'option d'impres- sion à chaque page. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. ralentir l'impression avec la fonction "Multitache" dans le code après impression du bas de page. L'attente doit varier en fonction de la configuration, elle peut être mémorisée dans la base de registres. Un menu "Configuration" de l'application pourra permettre son réglage d'un poste à un autre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116004350589394754?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116004350589394754/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116004350589394754' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116004350589394754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116004350589394754'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/limiter-les-ressources-sollicites-par.html' title='Limiter les ressources sollicitées par les impressions.'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-115980576258622416</id><published>2006-10-03T23:19:00.000+02:00</published><updated>2006-11-10T13:10:26.018+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Créer une fenêtre, à partir d'une application existante</title><content type='html'>Il peut arriver de trouver une fenêtre dans une application existante, avec une interface novatrice ou non, mais en tout cas interessante. Pour réaliser la même dans votre application, une première alternative consiste à recréer champs par champs les éléments de la fenêtre qui aide votre inspiration (notez que je ne parle jamais de copie...).&lt;br /&gt;&lt;br /&gt;Mais il y a bien mieux, dans l'assistant de création d'une nouvelle fenêtre. Le volet "Import" vous liste les applications lancées, et vous permet d'en choisir une. A la validation, vous obtiendrez sous WINDEV une fenêtre dont vous pourrez coder les traitements, reprenant tout ou partie de l'interface de l'application existante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-115980576258622416?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/115980576258622416/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=115980576258622416' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115980576258622416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115980576258622416'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/crer-une-fentre-partir-dune.html' title='Créer une fenêtre, à partir d&apos;une application existante'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-115986775381425087</id><published>2006-10-03T12:35:00.000+02:00</published><updated>2006-11-10T13:10:26.083+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Mise en forme RTF programmée</title><content type='html'>Voici une méthode que j'utilise couramment pour mettre en forme un texte RTF. Elle permet de créer un "modèle" en RTF, puis de l'utiliser dans un traitement pour une mise en base, ou un affichage.&lt;br /&gt;&lt;br /&gt;Première étape, sous Wordpad, préparer le texte avec la mise en forme. Dans le texte, placer des %1, %2 en lieu et place des données effectives, en effectuant toute la mise en forme désirée.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/Rtf1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/4337/3145/320/Rtf1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Seconde étape, récupérer à l'aide du bloc note le code RTF avec sa mise en forme, afin de le placer dans une constante du projet. Dans le cas ou la mise en forme doit évoluer régulièrement, il peut être avantageux de récupérer la mise en forme au lancement de l'application, avec la fonction "fChargeTexte".&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/rtf2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/4337/3145/320/rtf2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La technique est en place, pour obtenir l'information avec sa mise en forme dans l'application, il suffira d'affecter un champ RTF, un libellé RTF, ou une rubrique de fichier avec la fonction "ChaineConstruit". Exemple :&lt;br /&gt;LIB_RTF = &lt;span style="color: rgb(51, 51, 255);"&gt;ChaineConstruit&lt;/span&gt;(RTF_RAPPORT, &lt;span style="color: rgb(51, 51, 255);"&gt;RéseauUtilisateur&lt;/span&gt;(), &lt;span style="color: rgb(51, 51, 255);"&gt;DateVersChaine&lt;/span&gt;(&lt;span style="color: rgb(51, 51, 255);"&gt;DateSys&lt;/span&gt;()), sRapport)&lt;br /&gt;&lt;br /&gt;Ce texte mise en forme peut également compléter un texte existant, en utilisant la fonction "RTFInsére".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-115986775381425087?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/115986775381425087/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=115986775381425087' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115986775381425087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115986775381425087'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/mise-en-forme-rtf-programme.html' title='Mise en forme RTF programmée'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-116003850447213617</id><published>2006-10-02T21:34:00.000+02:00</published><updated>2006-11-10T13:10:26.168+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Les possibilités d'un service Web ... sans Web service</title><content type='html'>L'utilisation d'un Web service peut être commode dans bien des situations pour interroger depuis une application un système distant qui va vous retourner une information : une clé pour l'installation de l'application, l'état d'un processus distant ...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/soap.0.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/200/soap.jpg" border="0" alt="" /&gt;&lt;/a&gt;Vous pouvez avec WINDEV créer un Web service, qui sera configuré sur le serveur Web avec l'extension standard SOAP. Cela reviendra à accéder à une bibliothèque (.WDL) regroupant vos traitements, en "traversant" le serveur Web. Vous pouvez obtenir le détail de ce principe, et de sa configuration, dans l'aide de WINDEV, le schéma de principe ci-contre en est issu. Le site "&lt;a href="http://www.soapuser.com/fr/index.html"&gt;Soapuser.com&lt;/a&gt;" montre les principes de communication qui régissent les services Web. Vous pourrez constater que cela n'est pas simple, pour finalement peu de chose : récupérer le résultat d'un traitement exécuté sur un serveur Web.&lt;br /&gt;&lt;br /&gt;Le but de ce billet, est de présenter une alternative à la mise en place d'un Web Service, donnant le même résultat, mais évitant la configuration de l'extension SOAP du serveur Web, et le déploiement des modules WINDEV spécifiques (WD100SIIS.DLL, WD100SAPA.DLL ou WD100SAPA2.DLL). Cette alternative peut être mise en œuvre, à partir du moment ou vous disposez d'une application WEBDEV déployée. Cette application, en un minimum de programmation peut devenir un "Web service". Le principe est le suivant :&lt;br /&gt;&lt;br /&gt;Côté site WEBDEV, le code du projet sera piloté via sa ligne de commande. Exemple :&lt;br /&gt;&lt;br /&gt;ValeurReçueEnParamètre est une chaine&lt;br /&gt;ValeurReçueEnParamètre = PageParamètre("AFAIRE")&lt;br /&gt;&lt;br /&gt;SELON ValeurReçueEnParamètre&lt;br /&gt;CAS : "XYZ"&lt;br /&gt;// On a reçu la tâche XYZ à faire&lt;br /&gt;// comme retourner une clé d'installation&lt;br /&gt;// On appelle une procédure qui retourne le résultat&lt;br /&gt;ChaineAffiche(FonctionXYZ())&lt;br /&gt;// On termine le site la session est terminée&lt;br /&gt;FinProgramme()&lt;br /&gt;&lt;br /&gt;AUTRES CAS :&lt;br /&gt;// Aucune action spécifique à faire&lt;br /&gt;// lancement normal du site sur sa page&lt;br /&gt;PageAffiche(&lt;1ière&gt;)&lt;br /&gt;FIN&lt;br /&gt;&lt;br /&gt;Côté WINDEV, le code n'est pas plus complexe pour interroger le "Web service" grâce à la fonction "HTTPRequete". Voici un exemple :&lt;br /&gt;&lt;br /&gt;HTTPRequete("http://serveur/WD100AWP/WD100AWP.EXE/CONNECT/MONSITE?AFAIRE=XYZ")&lt;br /&gt;Info(HTTPDonneRésultat())&lt;br /&gt;&lt;br /&gt;La fonction "HTTPDonneRésultat" va retourner l'information renvoyée par la fonction "FonctionXYZ" du site WEBDEV, par l'intermédiaire de la fonction WLangage "ChaineAffiche". En utilisant différentes valeurs pour le paramètre "AFAIRE" il est possible d'utiliser un même site WEBDEV pour effectuer toutes sortes d'actions, en quelque sorte donc de sous-traiter des traitements. Mais appelé sans paramètre, le site WEBDEV garde sa vocation première.&lt;br /&gt;&lt;br /&gt;Voilà comment en 5 fonctions WLangage ajouter des fonctionnalité délocalisées à une application WINDEV, en limitant les étapes de configuration. Il est toujours préférable d'utiliser ce que l'on a déjà, plutôt que d'ajouter une couche de technologie supplémentaire.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-116003850447213617?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/116003850447213617/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=116003850447213617' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116003850447213617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/116003850447213617'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/les-possibilits-dun-service-web-sans_02.html' title='Les possibilités d&apos;un service Web ... sans Web service'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-115977917831503031</id><published>2006-10-02T12:25:00.000+02:00</published><updated>2006-11-10T13:10:25.828+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Configurations de projet</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/config-projet2.0.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/320/config-projet2.jpg" border="0" alt="" /&gt;&lt;/a&gt;Une possibilité de WINDEV peu connue des développeurs, les "configurations de projet". Il s'agit pourtant de la possibilité de préparer à partir d'un unique projet, plusieurs exécutables avec des contenus différenciés. Les configurations de projet permettent également la création de composants (.WDK), de bibliothèques (.WDL), de Web Service ou d'assemblage .NET.&lt;br /&gt;&lt;br /&gt;La mise en pratique des configurations de projet est capitale, dès qu'un projet va être diffusé à plusieurs sites ayant des spécificités. Si une partie du projet est commune à tous les sites, mais que certaines fenêtres et états auront des particularités, ou ne servent que sur un site donné, les configurations de projet évitent de créer les exécutables les uns à la suite des autres.&lt;br /&gt;C'est à la création des configurations que le contenu de chaque exécutable est déterminé en fonction des éléments déjà présents dans le projet. Ensuite le menu "Atelier ... Génération multiple" permet en une seule opération de recréer tous les exécutables. J'ai déjà vu des développeurs crées un exécutable en cochant certains éléments du projet à inclure, puis créer un deuxième exécutable avec d'autres éléments, puis créer un troisième exécutable avec encore de nouveaux éléments pour un autre site ...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/config-projet.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/200/config-projet.jpg" border="0" alt="" /&gt;&lt;/a&gt;Les configurations n'étant pas limitées aux exécutables, elles permettent d'aller bien plus loin en générant par exemple :&lt;br /&gt;- l'exécutable de l'application,&lt;br /&gt;- un composant avec des fenêtres internes qui permettront d'intégrer des parties de l'application dans un autre projet,&lt;br /&gt;- un Web service regroupant des procédures de l'application pour les exploiter via des requêtes http...&lt;br /&gt;&lt;br /&gt;Une fois les configurations décrites avec tous leurs éléments, elles sont transparentes pour la suite du développement. Il faut simplement lors de l'ajout d'un nouvel élément (état, classe, fenêtre...) préciser la configuration dans laquelle il doit être placé.&lt;br /&gt;&lt;br /&gt;Si un traitement ne doit être exécuté que dans le cas d'une configuration précise, il est possible d'utiliser la commande "ProjetInfo" avec le paramètre "piConfiguration". Il est dommage sur cet aspect que le "code cible conditionnel" ne propose pas les configurations, et qu'il soit nécessaire d'utiliser un traditionnel SELON ProjetInfo(iConfiguration) ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-115977917831503031?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/115977917831503031/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=115977917831503031' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115977917831503031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115977917831503031'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/10/configurations-de-projet.html' title='Configurations de projet'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-115944843252717951</id><published>2006-09-28T22:49:00.001+02:00</published><updated>2008-06-03T14:34:32.321+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Impressions'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface / Ergonomie'/><title type='text'>Filigrane / image en fond d'un état</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/filigrane.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/4337/3145/200/filigrane.jpg" alt="" border="0" /&gt;&lt;/a&gt;J'ai vu de nombreux développeurs, et encore un &lt;a href="http://forum.pcsoft.fr/post.awp?id=94305&amp;from=&amp;amp;forum=pcsoft.fr.windev"&gt;fil de discussion récent sur le forum&lt;/a&gt;, batailler pour ajouter dans le fond d'un état une image. Typiquement, une mention "duplicata" en diagonale dans le fond d'un état. Le piège consiste à partir sur la fonctionnalité de "formulaire" que propose l'éditeur d'état, elle est très spécifique. Il faut utiliser la solution "Image de fond" donnée dans la description de l'état (cf image du billet). Cette solution consiste à appeler dans le code avant impression du bloc de haut de page, la commande suivante :&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;iImprimeImage&lt;/span&gt;("Image.jpg", 0, 0, &lt;span style="color: rgb(51, 102, 255);"&gt;iLargeurPage&lt;/span&gt;(), &lt;span style="color: rgb(51, 102, 255);"&gt;iHauteurPage&lt;/span&gt;())&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il n'y a rien d'autre à faire !&lt;br /&gt;&lt;br /&gt;Astuce : pensez à optimiser la taille de cette image, car elle sera envoyée au pilote de l'imprimante. Et s'il y a bien un domaine dans lequel il faut éviter d'être trop gourmand en ressources, c'est bien celui de l'impression.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-115944843252717951?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/115944843252717951/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=115944843252717951' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115944843252717951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115944843252717951'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/09/filigrane-image-en-fond-dun-tat.html' title='Filigrane / image en fond d&apos;un état'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-115945089164694568</id><published>2006-09-28T16:10:00.000+02:00</published><updated>2006-11-10T13:10:25.761+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyper File / Base de données'/><title type='text'>Quiz - connaissez-vous la fonction "HStatCalcule" ?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/chrono.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/320/chrono.gif" border="0" alt="" /&gt;&lt;/a&gt;Il s'agit probablement d'une des fonctions WLangage les plus méconnue du moteur Hyper File, et pourtant elle est primordiale ! Dernier exemple en date, une requête récupère 350 enregistrements, dans une table en comportant 400 000. Les 350 enregistrements sont rapidement récupérés (fonction "ConstruitTableFichier" pour leur visualisation), pourtant la requête ne rend pas la main et la table reste bloquée avec le sablier. Renseignement pris sur l'application et son activité, il s'avère que d'importants mouvements ont été faits sur ce fichier.&lt;br /&gt;&lt;br /&gt;Solution dans pareil cas : appeler la fonction "HStatCalcule", pour obtenir un chargement immédiat et complet des données de la requête.&lt;br /&gt;&lt;br /&gt;Voici la description de la fonction donnée dans l'aide :&lt;br /&gt;&lt;blockquote&gt;Ces statistiques sont utilisées lors de la pose d'un filtre, la création d'une requête ou encore la création d'une vue sur le fichier. Le moteur Hyper File analyse la condition de sélection et s'appuie ensuite sur ces statistiques pour déterminer les rubriques les plus discriminantes qui permettront d'optimiser les parcours des fichiers.&lt;br /&gt;Les statistiques permettent d'avoir des informations sur le contenu du fichier au moment de leur calcul. Aussi, plus il y a de modifications du fichier après ce calcul et moins ces statistiques sont fidèles au contenu du fichier. Plus le fichier contient d'enregistrements et moins la modification d'un enregistrement a d'impact sur le reflet du fichier que les statistiques renvoient.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Un autre point important sur le sujet "performances", concerne la densité des index. Un fichier de stockage peut être utilisé pour de l'insertion permanente de données, mais peut avoir peu de consultations. A l'inverse, un fichier peut être consulté en permanence, tout en étant que rarement complété. Et bien en fonction de l'usage du fichier, il peut être bon d'ajuster le "taux de densité" de l'index, afin de favoriser les insertions, ou les consultations. Le taux de densité est modifiable lors de la réindexation des fichiers (WDOptimiseur, ou fonction "HRéindexe").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-115945089164694568?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/115945089164694568/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=115945089164694568' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115945089164694568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115945089164694568'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/09/quiz-connaissez-vous-la-fonction.html' title='Quiz - connaissez-vous la fonction &quot;HStatCalcule&quot; ?'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29506928.post-115892530548057816</id><published>2006-09-22T22:47:00.000+02:00</published><updated>2006-11-10T13:10:25.461+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>Exécutables WINDEV et Framework</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4337/3145/1600/forum.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4337/3145/400/forum.png" border="0" alt="" /&gt;&lt;/a&gt;Un billet de remerciement pour le support technique PC SOFT, qui a publié de l'information sur la méthode de &lt;a href="http://forum.pcsoft.fr/post.awp?id=93988&amp;forum=pcsoft.fr.windev&amp;from=50&amp;gmt=P0100"&gt;téléchargement du Framework par les exécutables&lt;/a&gt;. La documentation ne va pas aussi loin, et la compréhension d'un mécanisme de ce type permet une bien meilleure utilisation.&lt;br /&gt;&lt;br /&gt;En complément, il est bon de préciser que la sélection d'un Framework commun lors de la création d'un exécutable est une possibilité, mais pas une obligation pour l'exécutable. Je reformule, si vous créez un exécutable en demandant l'utilisation d'un Framework commun, cet exécutable utilisera bien le Framework commun mais à la condition qu'il ne trouve pas un Framework dans son propre répertoire.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29506928-115892530548057816?l=elianlacroix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forum.pcsoft.fr/post.awp?id=93988&amp;forum=pcsoft.fr.windev&amp;from=50&amp;gmt=P0100' title='Exécutables WINDEV et Framework'/><link rel='replies' type='application/atom+xml' href='http://elianlacroix.blogspot.com/feeds/115892530548057816/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29506928&amp;postID=115892530548057816' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115892530548057816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29506928/posts/default/115892530548057816'/><link rel='alternate' type='text/html' href='http://elianlacroix.blogspot.com/2006/09/excutables-windev-et-framework.html' title='Exécutables WINDEV et Framework'/><author><name>Elian Lacroix</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
