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.
En voici la liste un peu "brute", mais un Ctrl+F permet de rechercher un sujet qui vous intéresse :
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.
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 !
30 janvier 2007
Bon à savoir, exemples revus à profusion...
Publié par Elian Lacroix 1 commentaires
17 janvier 2007
Accélérer les applications sur les configurations limitées, ou en TSE
Si les applications sont toujours plus agréables de part leur aspect et leur richesse fonctionnelle, elles sont forcément plus gourmandes en ressources.
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.
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.
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).
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Interface / Ergonomie, Programmation
16 janvier 2007
Une interface personnalisée en quelques clics avec l'opacité des champs...
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 !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.
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.
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 !
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.
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.
Publié par Elian Lacroix 1 commentaires
Rubriques associées au billet : Interface / Ergonomie
02 janvier 2007
Pour quelques lignes de code en moins...

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 !
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 :
SI ChampNom <> "" ALORS
Req.ParamNom = ChampNom
SINON
Req.ParamNom = NULL
FIN
SI ChampDNaissance <> "" ALORS
Req.ParamDNais = ChampDNais
SINON
Req.ParamDNais = NULL
FIN
..
HExecuteRequete(Req)
FichierVersTableMémoire(Req, TableSélection)
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 :
Req.ParamNom = ChampNom <> "" ? ChampNom SINON NULL
Req.ParamDNais = ChampDNais <> "" ? ChampDNais SINON NULL
..
HExecuteRequete(Req)
FichierVersTableMémoire(Req, TableSélection)
Publié par Elian Lacroix 5 commentaires
Rubriques associées au billet : Inclassable / Hors sujet, Programmation
22 décembre 2006
Fonctions WLangage dans le code SQL, mais également procédures stockées...
L'appel d'une fonction du WLangage dans une requête SQL est permis, mais bien évidement il est possible d'appeler une procédure stockée sur le serveur avec la même méthode.
La méthode est on ne peut plus simple :
- dans l'analyse, créer une collection de procédures, puis une fonction par le clic droit dans le volet,
- dans un traitement, appeler la fonction "HMiseAJourCollection" qui permet de copier la collection de procédures, sur le serveur.
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 :
sNomFichierTXT est une chaîne = "c:\temp\commande.txt"
sListeCommande est une chaîne
sCodeSQL est une chaîne
sdReq est une Source de Données
sCodeSQL = [
SELECT ProcServeur(DateCommande) as DateCommandeformatée,
NumCommande,
TotalHT
FROM COMMANDE
]
HExécuteRequêteSQL(sdReq, sCodeSQL)
POUR TOUT sdReq
sListeCommande += [RC]+HRécupèreEnregistrement(sdReq,TAB)
FIN
fSauveTexte(sNomFichierTXT, sListeCommande)
LanceAppliAssociée(sNomFichierTXT)
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.
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.
Publié par Elian Lacroix 0 commentaires
20 décembre 2006
Fonctions Wlangage dans les requêtes Hyper File avec l'opérateur "WL." (WINDEV 11)
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 !
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.
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.
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.
Voici un exemple utilisant cette possibilité (il s'agit du code de l'image de ce billet) :
sNomFichierTXT est une chaîne = "c:\temp\commande.txt"A noter qu'il est possible de donner un formatage spécifique à la date avec le code SQL suivant :
sListeCommande est une chaîne
sCodeSQL est une chaîne
sdReq est une Source de Données
sCodeSQL = [
SELECT WL.DateVersChaine(DateCommande) as DateCommandeformatée,
NumCommande,
TotalHT
FROM COMMANDE
]
HExécuteRequêteSQL(sdReq, sCodeSQL)
POUR TOUT sdReq
sListeCommande += [RC]+HRécupèreEnregistrement(sdReq,TAB)
FIN
fSauveTexte(sNomFichierTXT, sListeCommande)
LanceAppliAssociée(sNomFichierTXT)
sCodeSQL = [Le fichier généré aura les dates dans un format "Ven. 28 Jan. 2000" par exemple.
SELECT WL.DateVersChaine(DateCommande,'JJJ JJ MMM AAAA') as DateCommandeformatée,
NumCommande,
TotalHT
FROM COMMANDE
]
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 !
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Hyper File / Base de données, Programmation
19 décembre 2006
Nouveau site WINDEV : Ed4u
Apparition d'un nouveau site de ressources WINDEV : Ed4u. Peu d'informations dans l'immédiat, le site basé sur un CMS 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 !
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Inclassable / Hors sujet
15 décembre 2006
Exécuter une action lors du tri d'une colonne de table
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. Il est cependant rendu obsolète, puisque WINDEV 11 permet d'ajouter aux colonnes un code "à chaque tri" !
//1. Code d'initialisation de la table :Ndlr : ce code a pour origine un message du support.
Evenement("TRISPECIAL","TABLE1", 1529)
//2. Procédure TRISPECIAL
Procédure TRISPECIAL()
// _eve.wParam contient le numéro de la colonne
Trace("On a cliqué sur l'entête de la colonne n° "+_eve.wParam )
SI _eve.wParam = 2 ALORS
//On veut que la procédure TRISPECIAL permet d'obtenir un tri sur
//la colonne COL2 puis sur la colonne COL1:
// Annuler le tri automatique
_eve.retour = 0
tabletri("COL2"+TAB+"COL1")
FIN
Publié par Elian Lacroix 1 commentaires
Rubriques associées au billet : Programmation
Concaténation optionnelle avec WINDEV 11
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 ?
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 :
POUR TOUT Client AVEC CodePostal="26110"
sListeClient += Client.Nom+", "
FIN
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.
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 !
Voici un exemple (j'en proposerai un plus parlant prochainement en situation) :
POUR TOUT Client AVEC CodePostal="26110"
sListeClient += [", "] + Client.Nom
FIN
Publié par Elian Lacroix 1 commentaires
Rubriques associées au billet : Programmation
Composant, partage par le GDS
Essai suivant sur la version 11 de WINDEV, l’intégration des composants dans le GDS.
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.
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.
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.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).
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 !
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Programmation
Le plus bel effet, sans compétence infographique, c'est WINDEV 11
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 !
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 !
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.Pour test, j'ai utilisé un programme permettant aux enfants de réviser leur vocabulaire, en répondant aux interrogations de l'agent Microsoft !
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 !
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Interface / Ergonomie
14 décembre 2006
IE7 et le volet "Quick tab" ou "Aperçu mosaique"
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.
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à" ...
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 !
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 !
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.
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Inclassable / Hors sujet, Interface / Ergonomie
05 décembre 2006
Fonctionnalités d'exportation (RTF, XLS, RTF ...) depuis l'aperçu pour les impressions programmées
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.
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 !
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.
Le moyen pour y parvenir est très facile à mettre en œuvre, il suffit de :
- créer un état ne parcourant aucune donnée, sans aucune champ,
- placer le code de l'impression programmée dans traitement de fermeture de l'état.
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.
Publié par Elian Lacroix 1 commentaires
Rubriques associées au billet : Impressions, Programmation
04 décembre 2006
Pacte écologique / Etre un bon citoyen sans faire de politque...
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.
C'est ma façon d'être un "bon citoyen".
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.
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.
Vous pouvez signer le "Pacte écologique", 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).
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Inclassable / Hors sujet
28 novembre 2006
Inhiber une action standard sur un événement (clavier, souris...)
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 !
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.
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).
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.
Cela est également valable avec la fonction "Evénement" du WLangage qui fonctionne suivant le même principe.
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Interface / Ergonomie, Programmation
27 novembre 2006
Imprimer directement depuis un aperçu...
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 :
Aperçu personnalisé :
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.
Modification de l'aperçu :
Ouvrir la description du bouton "Imprimer", et simplement changer son nom en "ImprimerTout". Au prochaine aperçu, ce bouton lancera directement l'impression !
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Impressions, Interface / Ergonomie
23 novembre 2006
Big Brother dans les applications ...
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.
- C'est toi il y a une semaine qui m'a dit de rentrer la nouvelle adresse.
- Oui mais ensuite je l'ai changée à nouveau, tu n'aurais pas du l'écraser !
- Non je ne l'ai pas changée à nouveau, c'est toi qui a oublié de la changer ...
Au final le conflit est stoppé en se tournant vers l'informaticien en charge du programme :
- [en coeur] : on vient te voir car l'application a encore perdu une adresse.
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.
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 :- la date de l'heure de modification,
- la valeur,
- le poste depuis lequel le changement a été fait,
- le login de l'utilisateur qui a fait le changement.
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.
Plus de doute sur qui a fait quoi !
Autre intérêt, la journalisation permet après une restauration de données de rajouter à la sauvegarde les dernières modifications.
Deux recommandations pour l'utilisation de la journalisation :
- utiliser dans le programme la fonction "HPoste" pour renseigner le journal précisément sur l'auteur des changements,
- placer les journaux sur un autre disque que celui contenant les données, avec la fonction "HChangeRepJNL".
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Hyper File / Base de données, Interface / Ergonomie, Programmation
22 novembre 2006
Mémorisation de la position des colonnes de table inopérante ?
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.
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.
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.
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Interface / Ergonomie, Programmation
17 novembre 2006
Fichier en cours d'utilisation ... mais par qui ?
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...
Fichier en cours d'utilisation sur un autre poste ...
Le fichier est utilisé par un autre processus ...
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 Process Explorer, à 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 http://www.sysinternals.com est directement redirigée sur un site Microsoft !
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.Au passage, deux "pièges" pouvant aboutit à laisser un fichier de données ouvert ...
- fichier Hyper File, appeler la fonction "HFerme", mais oublier les "HAnnuleDéclaration" sur les requêtes exécutées sur ce même fichier,
- 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".
Une image (celle du site Microsoft) de l'utilitaire complet, tel qu'il apparaît si vous le substituez au gestionnaire de tâches :
Publié par Elian Lacroix 3 commentaires
Rubriques associées au billet : Généralités, Hyper File / Base de données
15 novembre 2006
Importer un fichier texte dans un fichier Hyper File en formatant des dates
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.
Dans ce cas, il faut avoir recours à une bonne vieille moulinette, facilitée par l'instruction POUR TOUT.
L'exemple ci-dessous utilise une demande du forum, 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.
Soit un fichier texte à importer avec le contenu suivant (une tabulation sépare les colonnes, un retour chariot sépare les lignes ) :
15/03/2002 abc imo 560,33
19/04/2003 klo hap 561,00
12/06/2001 dol pme 7840,00
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é :
sEnregistrementsAImporter est une chaîne
sNouvelEnreg est une chaîne
sDateNonformatée est une chaîne
sEnregistrementsAImporter = fChargeTexte("C:\MonFichier.txt")
POUR TOUTE CHAINE sNouvelEnreg DE sEnregistrementsAImporter SEPAREE PAR RC
sDateNonformatée = ExtraitChaîne(sNouvelEnreg, 1, TAB)
Fichier.Date = ChaîneVersDate(sDateNonformatée, "JJ/MM/AAAA")
Fichier.Personne = ExtraitChaîne(sNouvelEnreg, 2, TAB)
Fichier.Libellé = ExtraitChaîne(sNouvelEnreg, 3, TAB)
Fichier.Montant = ExtraitChaîne(sNouvelEnreg, 4, TAB)
HAjoute(Fichier)
FIN
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.
Publié par Elian Lacroix 4 commentaires
Rubriques associées au billet : Hyper File / Base de données, Programmation
14 novembre 2006
Une option de menu contextuel en gras
Une astuce permet de passer une unique option d'un menu contextuel, ayant le look XP, en gras.
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é.
Cela permet par exemple de mettre en évidence l'option la plus couramment utilisée, un "petit plus" dans une interface !
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Interface / Ergonomie
10 novembre 2006
Bêta Blogger avant WINDEV 11, pour une leçon d'ergonomie !
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 :
- d'ajouter des flux RSS,
- de regrouper les billets par sujets,
- d'avoir une arborescence des archives ...
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.
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.
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Inclassable / Hors sujet, Interface / Ergonomie
Stockage des images, optimisation de l'espace en changeant le format...
Une rubrique mémo image est généralement affectée par une commande de la forme Fichier.RubriqueImage = ChampImage, ou "EcranVersFichier".
Cette affectation copie fidèlement l'image contenue dans le champ, au format BMP.
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" :
Fichier.RubriqueImage = dSauveImageJPEG(ChampImage, enMémoire)
Petite astuce bien utile s'il faut gagner un peu de place, surtout si l'application doit à un moment donné transférer ces images.
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Hyper File / Base de données, Programmation
09 novembre 2006
Présentation par défaut de l'interface d'une application déployée
L'utilisateur final d'une application peut configurer la présentation de son application :
- position et taille des fenêtres,
- largeur des colonnes des tables,
- mémorisation de valeurs pour les champs...
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)".
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 !
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Interface / Ergonomie
08 novembre 2006
Loupe de recherche des colonnes des tables
Voici une "checklist" à appliquer lorsque la loupe d'une colonne de table fichier n'apparaît pas lors de l'exécution.
- la coche "Avec recherche (loupe)" doit être active dans la description de la colonne, tout comme la coche "Triable" (volet "Général"),
- la rubrique du fichier associé à la colonne (volet "Liaison") doit être une clé dans le fichier (unique ou doublon peut importe),
- 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"),
- l'option "Ascenseur proportionnel" doit également être cochée toujours dans la description de la table (volet "Détail").
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.
Publié par Elian Lacroix 0 commentaires
Rubriques associées au billet : Interface / Ergonomie