Recherche sur le blog

mardi 29 mars 2011

[WinDev] Réaliser un Drag&Drop simple

Grâce au WLangage, il est possible de créer un "drag & drop" (ou plutôt "glisser-déposer" de manière programmée). La source peut être un champ de saisie, une table, une liste (avec image ou non), ou même une image. Au contraire tous les champs peuvent être la cible du "glisser-déposer" sauf certains types comme les jauges, les objets ActiveX et OLE, les formes, les barres d'outils, et enfin les champs "HTML", "Webcam" et "Visioconférence". Dans notre exemple, nous allons permettre de déplacer une valeur d'une table à une autre. Les deux tables seront à la fois "source" et "cible", et devront donc toutes les deux générer trois événements.
         

Les tables sources nécessitent la création de l'événement pour permettre de glisser l'objet. Tandis que les tables cibles doivent gérer à la fois l'événement pour le survol du champ, ainsi que celui déclenché lorsque l'on lâche l'objet, dans cet ordre précis. On n'oubliera pas non plus de préciser que l'on va utiliser un "drag & drop" programmé.
     
1ère étape : préciser que le "glisser-déposer" sera programmé

NOM_TABLE..DndSource = dndProgrammé
NOM_TABLE..DndCible = dndProgrammé

Comme expliqué ci-dessus, les tables seront à la fois source et cible, ce qui nous force alors à utiliser les deux lignes de code précédente, dans la partie "Initialisation de la table". Pour les deux cas, on utilise donc un "drag & drop" programmé, donc entièrement géré par le développeur.

2ème étape : les événements et les fonctions associées

// Événements pour table Cible
DnDEvénement("Survol",TABLE_CIBLE,dndSurvol)
DnDEvénement("InsereDansTable",TABLE_CIBLE, dndLâcher)

// Événements pour table Source
DnDEvénement("Glisser",TABLE_SOURCE,dndDébutGlisser)

L'appel de la fonction "DNDEvénement" requiert l'utilisation de 3 paramètres :
  • Le nom de la fonction qui sera appelée lors du déclenchement de l'événement.
  • Le nom du champ concerné par cet événement.
  • Le type de l'événement (glisser, lâcher, survol, entrée dans le champ (ou sortie), etc.).
Dans notre cas tous les événements sont définis dans chacune des tables puisqu'elles sont à la fois source et cible. Mais voyons à présent ce qui se cache dans les fonctions "Survol", "Glisser" et "InsereDansTable".

3ème étape : les fonctions appelées par les événements

// Résumé : Active la gestion du drag & drop pour le déplacement.
//
PROCEDURE Glisser()
       DnDAccepte(dndDéplacer)

La fonction "Glisser" doit simplement activer et autoriser l'opération "glisser". Elle n'exécute aucune autre action dans ce cas-ci mais libre à vous d'en définir de nouvelles. La fonction "DnDAccepte" reçoit donc une constante en paramètre qui dans notre cas vaut "dndDéplacer". Sans cela, glisser un objet sera interdit.

// Résumé : Détermine si le déplacement peut être autorisé ou non.
//   Le déplacement sera interdit si la table dans laquelle on veut
//   déplacer le colis est identique.
//
PROCEDURE Survol()
       SI _DND.ChampCible = _DND.ChampSource ALORS
             Message()
             DnDAccepte(dndInterdit)
       SINON
             Message("Table cible "_DND.ChampCible)
             DnDAccepte(dndDéplacer)
       FIN

La fonction "Survol" réalise quelque chose de plus intéressant, mais encore une fois il est libre de ne pas procéder ainsi : tout d'abord, elle utilise des variables spécifiques qui ne peuvent être utilisées que lorsqu'il y a un événement de "glisser-déposer" qui se produit. On peut retrouver les différentes variables dans la documentation officielle de WinDev, mais celles que nous retiendrons ici sont "_DND.ChampCible" et "_DND.ChampSource", qui ont respectivement pour valeur le nom des tables cible et source (dans cet exemple). Ensuite, grâce à ces variables, on peut interdire de déplacer l'objet si l'on se trouve dans la table initiale, ce qui évite donc des déplacements inutiles.

//  Fonction pour insérer dans la table cible.
//
PROCEDURE InsereDansTable()
       ...
       TableAjoute(_DND.ChampCible, {_DND.ChampSource + sColTab,indChamp}[nIndiceSource])
       TableSupprime(...)
       ...
          
Les variables "sColTab" et "nIndiceSource" ont été déclarées en début de fonction. L'indice de la source est récupéré grâce à la fonction "TableSelect", dans laquelle on passe en paramètre "_DND.ChampSource". On récupère donc l'indice de la sélection dans la table source! Tandis que dans "sColTab", on y a stocké le nom de la colonne qui stocke la valeur à déplacer. La fonction "TableSupprime" enlève l'enregistrement de la table source : à vous de deviner ce qu'il faut y écrire.
    
Pour terminer...

On l'a bien compris et c'est totalement indéniable : le "drag & drop" ou "glisser-déposer" est une fonctionnalité plus qu'intéressante et très puissante, quel que soit le langage utilisé (C#, Java, WLangage, etc). Elle permet d'améliorer la convivialité de votre application afin que l'utilisateur puisse gagner du temps lorsqu'il effectue ses opérations... Que vous l'utilisiez ou non, bonne programmation !

mercredi 16 mars 2011

[Utilitaires] DB-Main 9.1.3, outil gratuit pour modéliser

DB-Main est un logiciel distribué par la société REVER S.A. et développé par les laboratoires de DAE (Database Application Engineering) de l'Université de Namur (FUNDP). Concrètement, comme c'est expliqué sur le site officiel, cet outil est destiné à vous aider dans la tâche de modélisation de votre base de données ou de vos diagrammes divers. Il permet entre autres :
  • La conception de diagrammes MCD (Modèle Conceptuel de Données) en concordance avec la méthode d'analyse MERISE, avec les cardinalités, entités et associations, tout en définissant un type de données pour chaque élément d'une entité (utilisation avancée).
  • La transformation des MCD en MRD (Modèle Relationnel de Données), qui est donc une représentation des tables qui seront créées dans la base de données. La transformation se base bien sûr sur les règles des cardinalités (par exemple, si la cardinalité est 1-N--1-N, alors DB-Main créera une table intermédiaire correspondante à l'association).
  • La transformation "QuickSQL", qui génère un script SQL correspondant au MRD créé. Cela nécessite bien sûr des modifications ultérieures.
  • La rétro-ingénierie : analyse de programmes et de codes existants (Java, COBOL, XML).
  • La création de diagrammes UML: cas d'utilisation, diagramme d'états, acteurs et objets, etc.

L'interface est simple et sans fioritures : exit donc les icônes tape-à-l’œil ou les graphismes exagérés façon WinDev. Le principal est là et les graphiques sont créés dans leur plus simple appareil : des cadres, des traits fins et "aliasés", des notes jaunes. Il est tout de même possible de donner des couleurs aux entités et aux cadres des notes ou bien aux polices de caractère de ces éléments. Les propriétés des éléments quant à elles, sont modifiées via une fenêtre ancrée dans le coin inférieur gauche. Cette fenêtre peut bien sûr être déplacée !


DB-Main peut être téléchargé depuis le site officiel et nécessite une licence, que l'on obtient gratuitement via le site internet (en s'inscrivant) et qu'il faut renouveler tous les ans. En cas de problème avec le logiciel, il existe une FAQ et un forum de support. Et maintenant, il ne vous reste plus qu'à foncer et à essayer cet utilitaire plus qu'intéressant !

[Web] Sortie d'Internet Explorer 9

Vous tournez actuellement sur un système Windows Vista ou Windows 7, et vous développez un ou plusieurs sites internet, alors sachez que depuis déjà quelques jours, on trouve Internet Explorer 9 au téléchargement. Au menu on retrouve le support partiel du HTML 5, une meilleure compatibilité avec les fonctionnalités de Windows 7 liées au bureau (comme AeroSnap), puisqu'il est notamment possible d'épingler des onglets, ainsi qu'un meilleur respect des standards web (lors du test ACID effectué par Clubic, le navigateur a atteint 95/100, même si cela n'est pas toujours un bon indicateur du respect des normes), et une augmentation des performances dans le tout nouveau moteur JavaScript "Chakra". Bien sûr, cette petite liste n'est pas exhaustive, car elle ne reprend pas la totalité des nouveautés (amélioration de SmartScreen, gestionnaire de téléchargements, gestion du ciblage publicitaire, etc)

Découvrez donc le test sur Clubic en cliquant sur ce lien ! Le dernier navigateur de Microsoft est en plein face-à-face avec les dernières versions de Google Chrome et Firefox 4.


Pour télécharger cette nouvelle version RTM, cliquez sur le lien adéquat ci-dessous (tous redirigent vers le site www.clubic.com). Elle écrasera n'importe quelle version précédente, même la "Release Candidate" :

[WinDev] Bug lors de la restauration du projet (WD15)

Le but n'étant pas de critiquer le travail des développeurs du logiciel, mais pour signaler aux utilisateurs qu'ils ne sont pas seuls dans ce cas : lors de la restauration du projet (accessible via "Outils", "Restauration du projet"), quand on clique dans la zone de saisie ("textbox") où le nom de fichier d'archive doit s'afficher, il devient impossible de sélectionner une archive par le bouton "...". Une erreur s'affiche indiquant "Archive : saisie obligatoire". 


Le seul moyen de contourner l'erreur est de sélectionner une archive sans cliquer dans ce champ lors de l'ouverture de la fenêtre, ou coller un chemin existant. Encore une fois, bon développement !

[WinDev] Déclarer des variables globales dans une fenêtre (WD15)

Dans votre application, il y a plusieurs façons de déclarer des variables globales dans une fenêtre. 
  • Dans une procédure d'initialisation de la fenêtre, pour permettre un passage de paramètres à cette fenêtre.
  • Directement dans le code "déclarations globales" de la fenêtre.
Cependant, deux problèmes surviennent dans chacun des deux cas lorsque l'on renomme la fenêtre ou lorsque l'on renomme ces variables puis que l'on tente de redéfinir le nom d'origine de celles-ci. 
            

Première méthode

Après avoir renommé la fenêtre, une erreur s'affiche vous indiquant que les variables existent déjà. Il en est de même lorsque vous renommez vos variables puis que vous tentez de leur remettre leur nom d'origine. L'erreur de compilation indique que ces variables existent déjà dans la fenêtre. 

Solutions : fermer le projet et le rouvrir, ou compiler le projet une nouvelle fois (peut s'avérer être un gros inconvénient à partir du moment où le projet est en réseau et/ou contient un paquet de fenêtres).

Seconde méthode

Le problème est le même sauf qu'il n'y a qu'une seule solution dans notre cas : compiler le projet une nouvelle fois. Comme indiqué précédemment, cela peut être une perte de temps. Il est dommage qu'il n'ait pas été prévu une sorte de correction automatique ou une compilation de la fenêtre uniquement lorsque ce genre de chose est modifiée.

 
Dans tous les cas, on espère que PC SOFT apportera des améliorations quant au fonctionnement des variables globales dans l'éditeur de code, pour les fenêtres en tout cas.

En attendant, bon développement à toutes et à tous !

jeudi 3 mars 2011

[WinDev] Copier du texte dans le presse-papiers

Dans le but de faciliter l'exécution de requêtes SQL sur l'AS/400 (IBM iSeries 520 V5R3), j'ai eu l'idée de développer une petite application en WinDev qui permet de lancer plusieurs requêtes successivement les unes à la suite des autres, ou bien de sélectionner des enregistrements dans une table, avec des options spécifiques. Mais là n'est pas vraiment le sujet, car vous dévoiler son fonctionnement serait équivalent à donner des informations classées secrètes.

Pour l'article d'aujourd'hui, j'ai décidé de vous parler de la fonction très utile : VersPressePapier(Texte). Elle permet aussi d'envoyer une image et fonctionne aussi bien sous Linux, Windows et Android (voir la documentation pour la compatibilité avec les différents systèmes d'exploitation et les différentes plate-formes).

VersPressePapier(SAI_Champ)

Attention : Lorsque le champ est Unicode et que vous souhaitez coller les valeurs enregistrées dans le champ, des caractères peuvent être perdus. L'utilisation de la propriété "..Valeur" permet de résoudre le problème, mais ne résout pas l'encodage des caractères tels que "é","è","à", etc. Vous obtiendrez donc des erreurs d'encodage lors du collage.

Pour coller le texte, il suffit d'utiliser la fonction suivante, qui vérifie que le contenu du presse-papiers est bien du texte et si c'est le cas, va rechercher les informations dans celui-ci pour remplacer le contenu actuel du champ :

SI PressePapierFormat(ppfTexte) = Vrai ALORS 
    SAI_Requetes = PressePapier() // Contenu du presse-papiers
FIN

Vous pouvez donc maintenant créer des fonctionnalités amusantes, pour permettre par exemple de copier tout le contenu d'un champ sans que l'utilisateur ait à le sélectionner.