Blogs officiels sur tous les services et produits de PC SOFT
Publié par
12:20 Jeudi
02 Juil. 2015

[Billet publié dans le blog Le blog du ST]

L'expression "un croquis vaut mieux qu'un long discours" s'applique très souvent dans toutes les communications entre développeurs et utilisateurs. Plutôt qu'une longue description écrite "cliquez ici", "observez là que...", il est souvent bien plus efficace d'échanger quelques copies des écrans manipulés, en entourant les choix effectués, en annotant. Inconvénient, fournir une série de copies d'écran, les annoter, devient rapidement fastidieux, à moins de profiter de l'utilitaire PSR ...

Problem Steps Recorder (PSR) est un utilitaire inclus en standard avec Windows, capable de fournir un zip autonome qui montre toute une série de manipulations quelque soit l'application.

Voici comme l'utiliser :
  • menu "Démarrere de Windows, 
  • saisir "PSR", 
  • clic droit sur l'icône du programme, 
  • "Exécuter en tant qu'administrateur", 

  • cliquer sur "Commencer l'enregistrement", 



  • effectuer l'ensemble des actions à montrer,
  • arrêter l'enregistrement.

C'est terminé ! Un zip est automatiquement créé avec à l'intérieur un fichier .MHT. Il suffit de le lancer avec son programme associé (Internet Explorer par défaut), afin d'avoir sous les yeux la copie des écrans qui viennent être enregistrés. Sur chaque image, une mise en évidence est faite sur le champ qui a "pris le focus", on voit donc toutes les actions faites les unes après les autres.

PSR peut être utilisé afin de joindre un mode opératoire à notre support. Vous pouvez joindre le zip dans l'utilitaire "RequeteAuSt" directement si sa taille n'excède pas 10 mo. Si le zip est plus important, il suffit de le déposer sur Internet (ftp, web, hubic, dropbox...) et de préciser le lien de téléchargement dans votre demande.
Publié par
16:08 Mardi
30 Juin 2015

[Billet publié dans le blog Le blog du ST]

Le WLangage à partir de la version 20 de WINDEV et WEBDEV permet de nommer les paramètres des procédures.

Il est ainsi possible de remplacer le traditionnel appel :

 MaProcédure("WINDEV", 20)

Par l'appel suivant :

 MaProcédure.nVersion = 20
 MaProcédure.sNomProduit = "WINDEV"
 MaProcédure()

Ou encore par l'appel suivant :

 MaProcédure(<nVersion>:20,<sNomProduit>:"WINDEV")


Dans cet exemple l'intérêt est limité. Dans une procédure existante à laquelle des paramètres sont régulièrement ajoutés, ces syntaxes deviennent extrêmement pratiques (voir "incontournables" une fois habitué !) :
  • lisibilité : le nom du paramètre est toujours visible : risque d'erreur réduit,
  • l'ordre des paramètres peut être quelconque : risque d'inversion supprimé,
  • le mécanisme de sécurité du WLangage reste complètement actif à l'exécution, en signalant par exemple les paramètres obligatoires manquants.

Une animation "live" est disponible dans un tweet :





Publié par
18:16 Mardi
16 Juin 2015

[Billet publié dans le blog Le blog du ST]

Une nouvelle version de WINDEV, WEBDEV et WINDEV Mobile 20 est disponible en téléchargement.

Il s'agit de la version 200066p disponible à partir de l'espace téléchargement de notre site :


Cette version a passé tous les niveaux de validation :

Publié par
17:05 Lundi
08 Juin 2015

[Billet publié dans le blog Le blog du ST]


Une nouvelle version de WINDEV, WEBDEV et WINDEV Mobile 20 est disponible en téléchargement.
Il s'agit de la version 200066h disponible à partir de l'espace téléchargement de notre site, en niveau 1 de validation :



Publié par
11:50 Mercredi
03 Juin 2015

[Billet publié dans le blog Le blog du ST]

Microsoft annonce officiellement la sortie de Windows 10 pour le 29 juillet 2015.

Actuellement une version Windows 10 Pro Insider Preview (build 10074) est proposée en téléchargement par l'éditeur : 

Il est tout à fait possible d'utiliser WINDEV, WEBDEV et WINDEV Mobile 20 sous Windows 10 Pro Insider Preview, il suffit de disposer de la version 7.32 du pilote SafeNet :



Il s'agit de la version minimale du pilote permettant la reconnaissance de la clé sous Windows 10 Pro Insider Preview (build 10074).

FAQ utiles sur ce thème : 


Publié par
10:17 Lundi
01 Juin 2015

[Billet publié dans le blog HFSQL & Performances]

La majeure partie des applications qui utilisent HFSQL accèdent maintenant aux données via le moteur HFSQL client/serveur.  L'utilisation d'accès par une technologie client/serveur est en effet très vivement recommandée par rapport à un accès en partage.

Pour les applications qui utilisent encore un accès direct aux données HFSQL (HFSQL classic – ISAM), dans le cas général les données sont stockées dans un emplacement sécurisé modifiable, disque local ou partage réseau, afin de permettre l'enregistrement d'informations.

Mais il est également possible d'inclure des données HFSQL classic directement dans la bibliothèque (WDL) d'un exécutable, lorsque l'on souhaite proposer des données figées en consultation seulement.

Peu d'applications utilisent ce mécanisme puisque généralement les données sont modifiables. Ce billet le détaille cependant, car toutes les applications sont impactées par ce mécanisme. En effet, afin de permettre l'utilisation de données HFSQL classic intégrées à un exécutable, lors de l'accès à un fichier il y a d'abord sa recherche dans l'exécutable. Si cette recherche ne trouve les données HFSQL intégrées, alors les donnée sont utilisées le disque à l'emplacement spécifié par HChangeRep

De ce mécanisme découlent deux optimisations importantes pour toutes les applications qui exploitent traditionnellement les données sur disque :

  • la principale concerne la recherche des fichiers de données dans l'exécutable. En fonction du nombre d'éléments du projet, la recherche des fichiers de données peut être coûteuse en temps. Il est donc possible d'indiquer à HFSQL classic qu'il ne doit pas rechercher les fichiers HFSQL dans l'exécutable, grâce à la fonction HChangeLocalisation :

    // Ouverture du projet, avant l'accès aux données :  
    HChangeLocalisation("*",hDisque). 

    Le gain n'est pas significatif pour les projets ayant une centaine d'éléments. Il devient très intéressant dès que le projet a au moins 1000 éléments. 


  • la seconde optimisation concerne la conservation de la localisation des données utilisées via le fichier .REP. Dans le cas d'une application utilisant plusieurs jeux de données, l'accroissement progressif de la taille du .REP peut impacter les temps d'accès. Il est donc possible d'optimiser les accès en supprimant régulièrement du .REP les emplacements obsolètes, et/ou en inhibant sa gestion par HGèreRep lorsque c'est possible. 

Autres billets abordant ce sujet : 
Publié par
17:50 Jeudi
30 Avr. 2015

[Billet publié dans le blog Le blog du ST]

Les procédures internes proposées dans la version 20 de WINDEV, WEBDEV et WINDEV Mobile sont disponibles depuis la version 200057K.

Une illustration a été donnée dans le blog avec le parcours d'un document JSON. Mais les cas d'utilisation sont nombreux, y compris en "Callback" pour des fonctions asynchrones !

Leur documentation vient à l'instant d'être mise en ligne, voici le lien :


Publié par
18:31 Mardi
28 Avr. 2015

[Billet publié dans le blog Le blog du ST]

L'utilisation de données au format JSON (JavaScript Object Notation – Notation Objet issue de JavaScript) avec un formatage déterminé à l'avance, est très simple en WLangage, grâce au principe de sérialisation. En effet les fonctions Désérialise et Sérialise permettent de transférer les données JSON dans des structures et/ou tableaux WLangage, qui permettent ensuite toutes les actions possibles. 

Par contre lorsqu'une application, ou un site, doit exploiter des données JSON dont le format et les clés ne sont pas connus à l'avance, ou que le format va très probablement être changé, l'utilisation de structures alimentées par la fonction Désérialise n'est plus possible. Dans ce cas, il faut parcourir l'ensemble de la structure afin d'obtenir les différentes clés et leurs valeurs, ainsi que l'arborescence. Pour ce besoin le WLangage propose également une fonction qui fait l'essentiel du travail : JSONVersVariant. Combinée avec la propriété ..Membre, la fonction JSONVersVariant permet en effet un parcours simple d'un JSON d'une structure quelconque, via le type variant.

Voici un exemple de parcours générique, il peut être testé par un copier/coller dans le code d'un bouton par exemple. Il montre comment effectuer le parcours en faisant une "Trace" des clés et valeurs du JSON. Dans la pratique la trace peut être remplacée par tout type d'action en fonction des besoins :
  • chargement d'un tableau associatif en utilisant les clés du JSON comme indices pour le tableau
  • écriture des données dans une base ...
sJSon est une chaîne = [
 {"menu": {
 "id": "file",
 "value": "File",
 "popup": {
 "menuitem": [
 {"value": "New", "onclick": "CreateNewDoc()"},
 {"value": "Open", "onclick": "OpenDoc()"},
 {"value": "Close", "onclick": "CloseDoc()"}]}}}
] // exemple de http://json.org/example

vJSON est un Variant = JSONVersVariant(sJSon)

 
ParcoursMembresVariant(vJSON)


 Procedure INTERNE ParcoursMembresVariant(_ObjetOuTableau)
 
 SELON _ObjetOuTableau..Type
 
  CAS wlVariantObjet :
 
   POUR TOUT _Membre DE _ObjetOuTableau..Membre
   
    SI _Membre..Membre..Occurrence = 0 ALORS
     
     SELON _Membre..Type
      CAS wlVariantTableau :
       Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +...
       "Le membre " + _Membre..Nom +...
        " contient un tableau...")
       ParcoursMembresVariant(_Membre)
      AUTRES CAS :
       Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +...
        "Le membre " + _Membre..Nom + " a la valeur " +...
         _Membre..Valeur)
     FIN
    SINON
     Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +...
       "Le membre " + _Membre..Nom + " a " +...
        _Membre..Membre..Occurrence + " autres membres...")
     ParcoursMembresVariant(_Membre)
    FIN
   FIN
   
  CAS wlVariantTableau :
   Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +...
    "Tableau de "+_ObjetOuTableau..Occurrence+" éléments...")
   
   POUR TOUT ELEMENT UnElement, Compteur DE _ObjetOuTableau
    Trace(Répète("--", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +...
     "Exploration de l'élément "+Compteur+"/"+_ObjetOuTableau..Occurrence)
    ParcoursMembresVariant(UnElement)
   FIN
   
  AUTRES CAS : Trace("A gérer ("+_ObjetOuTableau..Type+") !?"+_ObjetOuTableau)
 FIN
 FIN
 



A noter que le code utilise une procédure interne. Elles sont très pratique lorsqu'un code à besoin d'une procédure qui lui est dédiée (récursivité comme ici, et les fonctions WLangage utilisant une "callback"). Elles évitent la création d'une procédure locale à la fenêtre. De plus lorsque le code est copié/collé, la procédure interne l'est également. 

Publié par
09:45 Mercredi
08 Avr. 2015

[Billet publié dans le blog Le blog du ST]

Une nouvelle version de WINDEV, WEBDEV et WINDEV Mobile 20 est disponible en téléchargement. Il s'agit de la version 200057h proposée en niveau 1 de validation : 


Accéder à l'espace téléchargement


S'agissant d'une version en niveau 1 de validation, elle n'est pas proposée par WDAutomaticupdate. La mise à jour automatique s'activera lorsque la version sera en niveau 2 de validation.

Publié par
19:22 Jeudi
12 Mar. 2015

[Billet publié dans le blog Le blog du ST]

Un point s'impose sur la place du menu principal dans les applications pour Android. En effet, les applications les plus anciennes initialement développées pour Android 1.X ou 2.X, peuvent ne plus afficher le bouton d'ouverture du menu principal en fonction de options de compilation de la version de WINDEV Mobile utilisée pour générer l'application. 

Avant la version la version 3.0 de Android, les applications offraient généralement un accès au menu principal des fenêtres via un bouton dans la barre de navigation pour les appareils ne disposant pas de boutons physique :
  • si le menu comportait moins de 6 options, il s'affichait sous forme de boutons en bas de l'écran, 
  • si le menu comportait plus de 6 options, les 5 premières options s'affichaient sous forme de gros boutons, et un sixième bouton automatique "Plus" permettait à l'utilisateur de voir la suite du menu sous forme d'un menu déroulant. 
A partir de la version 3.0 de Android, pour une "expérience utilisateur" améliorée et une homogénéisation des application, Google recommande l'utilisation de l'Action Bar pour permettre un accès au menu principal.

Cette différence de gestion du menu principal n'avait pas d'impact sur les application WINDEV Mobile compilées avec une version antérieure à la 20. En effet, WINDEV Mobile 19 par exemple compilait l'application en indiquant dans sa description une compatibilité relativement ancienne (via le "targetSdkVersion" de son "manifeste"). Les périphériques Android utilisaient ainsi un mode de compatibilité permettant dans tous les cas l'affichage du menu.

A partir de la version 20 de WINDEV Mobile, les applications sont générées avec une compatibilité plus élevée (le "targetSdkVersion" de son "manifeste" passe à 14). C'est nécessaire afin que les applications bénéficient des améliorations et de l'apparence des versions les plus récentes du système Android. Mais cela a pour conséquence sur les périphériques de désactiver le mode de compatibilité permettant l'affichage systématique du bouton d'accès au menu principal.

Afin de permettre l'utilisation du menu principal dans tous les cas de figure, les solutions dépendent donc des périphériques utilisés pour le déploiement :

1. Si tous les périphériques des utilisateurs de l'application sont sous Android 3.X, 4.X ou 5.X :

  • La solution vivement recommandée consiste à utiliser un champ Action Bar. Il permettra l'accès au menu via l'Action Bar, tout en donnant à l'application l'aspect "standard" des applications Android ce qui facilite sa prise en mains par les utilisateurs. 
  • L'autre alternative peut consister à ajouter un bouton appelant la fonction OuvreMenuPrincipal
2. Si des périphériques Android 1.X ou 2.X restent utilisés pour cette application :

  • restaurer une compatibilité antérieure pour l'application lors de sa génération :  
    • génération de l'application,
    • étape "Configuration",
    • bouton "Configuration avancée",
    • bouton "Editer le manifeste",
    • dérouler le nœud "uses-sdk",
    • modifier la valeur de "targetSdkVersion" en précisant la même valeur que "minSdkVersion" : 

  • ou ajouter un bouton appelant la fonction OuvreMenuPrincipal