Bonjour,
J'aimerais publier les bugs ou erreurs de conception qui me dérangent dans WinDev et ne semblent pas choquer le support technique, ou sur lesquels il est impossible d'apporter un correctif à cause de la rétrocompatibilité.
Ca permettra d'éviter certains désagréments aux autres développeurs, et ça forcera peut-être PC Soft à réfléchir un peu plus à la qualité, car ça devrait au moins leur faire honte.
Je ne mets pas tout immédiatement, c'est un peu long.
Si vous en avez d'autres, faites passer.
1. Copie d'une Date vers un DateHeure
Quelle est la différence entre ces 2 codes ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 dhDateHeure est DateHeure = ChaîneVersDate("01/01/2013") Trace(dhDateHeure)Réponse :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 dDate est Date = "20130101" dhDateHeure est DateHeure = dDate Trace(dhDateHeure)
Quand un DateHeure reçoit une Date, la partie Heure reste inchangée, et donc ici c'est l'heure de création de la variable.
ChaîneVersDate, comme son nom ne l'indique pas, renvoie une chaîne, et quand un DateHeure reçoit une chaîne trop courte, l'heure est implicitement "00:00:00.000".
La logique voudrait qu'une Date dans un DateHeure donne la date à minuit !
Vous en voulez encore ?
Là j'ai converti un Variant Date vers DateHeure, et me voilà avec l'heure de la conversion, ajoutée à une date qui n'a rien à voir ! (le 1er janvier)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 dDate est Date = "20130101" vVariant est Variant = dDate VariantConvertit(vVariant, wlDateHeure) Trace(vVariant)
Là c'est formidable, on a une conversion non déterministe !
2. Le type "Source de Données"
Deux problèmes majeurs :
- Les variables de type Source de Données ne sont que des références (par le nom !) à des sources de données globales. Les problèmes causés par ce système sont assez connus, je ne développe pas ici.
- Les sources de données ne sont pas partageables entre les threads, ce qui rend pénible le remplissage d'une IHM à partir de requêtes exécutées en arrière plan.
3. La fonction dCopieImage
On peut féliciter PC Soft pour cette perle.
dCopieImage prend comme paramètres : X, Y, Hauteur, Largeur, dans cet ordre.
La logique voudrait : X, Y, Largeur, Hauteur.
Mais ce n'est pas tout : si vous utilisez un champ image comme source de la copie, il paraît évident que le champ restera inchangé... pas pour PC Soft ! La propriété ..Valeur qui pouvait contenir un chemin d'image n'est plus lisible, car tout champ image impliqué dans un dessin devient un Bitmap mémoire.
Imaginez alors ce code :
La deuxième ligne ne fonctionnera pas à cause de la première.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // On dessine l'icône sur le plan dCopieImage(IMG_MonIcône, IMG_Plan, 42, 42) // Le bouton d'action prend la même icône BTN_Action..Image = IMG_MonIcône
J'ai un collègue qui s'est arraché les cheuveux sur du code beaucoup plus complexe parce que certaines images ne s'affichaient plus.
4. Comparaison d'un Variant à Null
Alors là, attention les yeux, c'est spectaculaire.
Vrai = Faux... c'est ça un L5G !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 vVar1 est Variant = Null vVar2 est Variant = 0 SI vVar1 <> vVar2 ALORS SI vVar1 = vVar2 ALORS // On passera bien là ! Trace("vVar1 <> vVar2 et vVar1 = vVar2") FIN FIN SI (vVar1 <> vVar2) ALORS // On ne passera pas là SINON SI (vVar1 = vVar2) ALORS // On passera là Trace("vVar1 = vVar2 uniquement") FIN
Peut-être ont-ils voulu mimer la logique du NaN dans l'IEEE 754, ou bien celle du NULL de SQL... quoi qu'il en soit, ils se sont plantés.
(notez que j'ai mis à jour le code ci-dessus après avoir compris qu'il suffit d'un seul Null dans la comparaison)
5. Nouvelle fonction de recherche (WD18)
Si on cherche une expression régulière, ça cherche sur une ligne complète.
Ca oblige à ajouter .* en début et fin de pattern à chaque recherche.
On perd l'intérêt du surlignage (toute la ligne est surlignée, ou rien).
PC Soft ne connait peut-être pas les caractères ^ et $ ? On voit dans leur doc qu'ils ne maîtrisent pas la fonction VérifieExpressionRégulière puisqu'ils ne documentent pas toutes ses fonctionnalités.
6. dFusionne
Cette fonction ignore l'alpha de l'image source, alors que rien n'empêchait de l'utiliser uniquement pour le blend des couleurs, tout en conservant l'alpha de la destination.
7. Les fonctions gStylo, gCadrage, etc.
Complètement buggé depuis toujours : les alignements verticaux, l'espacement des caractères, le retour à la ligne automatique...
Une fenêtre de démo (en WD18) est jointe à ce message. Vous comprendrez immédiatement de quoi je parle.
8. SQLTable
Un classique.
SQLTable se base en interne sur le séparateur de colonnes TAB. Ca signifie que si vous avez des TAB dans vos données, le remplissage d'une table deviendra complètement faux.
9. Coche grisée mais active
Comme certains le savent déjà, si vous grisez une cellule de table de type case à cocher, l'utilisateur aura toujours des moyens de la cocher/décocher, via la touche Espace, la multisélection...
10. Portée de ..Défaut dans une fenêtre
Si vous utilisez la propriété ..Défaut sur un paramètre de fenêtre, celle-ci est accessible pendant toute la durée de vie du paramètre (donc la durée de vie de la fenêtre).
Pourtant, la valeur de cette propriété n'est correcte que dans le code de déclaration de la fenêtre, après c'est n'importe quoi. (toujours Vrai ou toujours Faux, je ne me souviens plus)
Pour le support, c'est normal...
Le plus fort, c'est qu'en observant cette propriété dans le débogueur on aura la bonne valeur... selon qu'on l'observe directement ou dans une expression !
Encore une fois, on peut prouver avec WinDev que Vrai = Faux.
(j'ai joint un projet de test pour mieux comprendre)
11. Précédence des opérateurs booléens
En algèbre de Boole, il est communément admis que le ET est prioritaire sur le OU.
Pourtant, dans WinDev, ces 2 opérateurs ont la même priorité.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 bA est booléen = Faux bB est booléen = Faux bC est booléen = Vrai Trace(bA ET bB OU bC) // Vrai Trace(bC OU bA ET bB) // Faux !
.
Partager