Tutorial de migration VB6 en VB.Net : un cas concret

www.vbfrance.com/article.aspx?Val=5648

 

Tous les développeurs VB6 doivent envisager de migrer à VB.Net

La principale question qu'ils se posent est : Est-ce que je pourrais faire la même chose en VB.Net (et aussi facilement) ?

 

Pour tenter d'y répondre, je vous présente un cas concret d'une migration d'un projet VB6 de plus de 3000 lignes de code en VB.Net :

Gravity Screen Saver : un écran de veille chaotique :

www.vbfrance.com/article.asp?Val=2162

 

La première question à vous poser est : avez-vous besoin de passer en .Net ? vous pouvez très bien interfacer du code VB6 en .Net et continuer ainsi en VB6. Seulement, si votre code doit évoluer, ce n'est sans doute pas la meilleure solution. Dans mon projet, il y a des petits bugs d'affichage des images, et étant donnée la complexité du code, il est assez difficile de déboguer les classes graphiques que j'avais récupérées sur le web. En utilisant les classes graphiques de .Net, je me base sur du code susceptible d'être testé par des millions de développeurs. Je me lance donc dans mon premier programme .Net en testant au fur et à mesure chaque technique dont j'ai besoin :

 

Version 1.0 du 2/5/2002 : VBNetScreenSaver : Un écran de veille minimal en VB.Net (et C# aussi)

www.vbfrance.com/article.asp?Val=4061

J'ai simplement traduit en VB.Net le code en CSharp (C#, le successeur de C++ : C++++) de Tran Khanh Hien : "TKHScreen Saver.zip"

Ce code récupère l'argument de la ligne de commande afin de traiter les 2 principaux cas rencontrés dans le lancement d'un écran de veille : la configuration ou bien le lancement normal de l'écran de veille. Celui-ci affiche une bannière et quitte lorsque l'on bouge la souris. Le code VB.Net ressemble énormément au code C# : on peut presque faire du copier-coller entre les 2 langages.

 

Ensuite, il faut pouvoir sauver la configuration de l'écran de veille ; la nouvelle tendance est de ne plus utiliser la base de registre (et c'est tant mieux !), mais de revenir au bon vieux fichiers ini, sauf que c'est le format XML qui est à la mode maintenant : il permet une structuration poussée et facilite l'échange de données via la standardisation des formats XML, que l'on appelle les "applications XML" : www.oasis-open.org/cover/xml.html#applications

 

Version 2.0 du 15/5/2002 : VBNetScreenSaver2 : Un écran de veille configurable minimal en VB.Net

www.vbfrance.com/article.asp?Val=4237

La sauvegarde de la configuration a été faite à partir de l'article : "Creating Your Own Dynamic Properties and Preserve Property Settings in Visual Basic .NET" de Steve Hoag de Microsoft Visual Studio Team.

Le premier problème rencontré avec la plateforme .Net est le nom du fichier de configuration : on ne peut plus le changer, car il est basé sur le nom de l'assemblage (assembly : le code exécutable). Le problème c'est que lorsque l'écran de veille est installé, ce nom est tronqué en un nom DOS 8.3 pffffffft ! ça commence bien... (heureusement, je n'ai pas eu d'autre problème ensuite). J'ai résolu ce problème en renommant le fichier de configuration pendant l'exécution (ou en prenant un nom de 8 lettres max.).

 

Ensuite, il a fallut vérifier que la plateforme.Net était aussi performante au niveau du graphisme que VB6 (le GDI Win32 en fait) :

 

Version 3.0 du 08/07/2002 : VBNetScreenSaver3, suite : Gestion optimisée des sprites :

www.vbfrance.com/article.aspx?Val=5026

Les résultats ne sont pas très concluants : le GDI32 est sensiblement plus performant que .Net en ce qui concerne l'affichage des sprites (petite image en mouvement). Cependant, le code .Net est plus simple et il s'appui sur GDI+ qui est disponible aussi pour Win32, et qui n'est pas encore complètement interfacé dans .Net d'après ce que j'ai cru comprendre. Par exemple, ces 2 optimisations ne sont pas encore disponibles en .Net :

- CachedBitmap : dc.DrawCachedBitmap(cb, x, y)

- dc.SetInterpolationMode(InterpolationModeNearestNeighbor)

En faisant des tests, je me suis rendu compte que l'on pouvait faire absolument n'importe quoi en .Net, comme par exemple interfacer le GDI32 dans .Net, et assez facilement en plus ! Voici l'origine de la classe Win32Support en C# que j'ai traduis en VB.Net :

www.codeguru.com/cs_graphics/flicker_free.html

Mais en utilisant le double buffering pour régler le problème du scintillement (flicker) d'une animation, c'est tout aussi facile à faire que d'utiliser l'Autoredraw en VB6, et les performances sont acceptables.

 

Ensuite, la gestion des fichiers est agréablement simplifiée dans .Net :

 

VBNetScreenSaver4, suite : *.jpeg en fond d'écran et pour n sprites

www.vbfrance.com/article.aspx?Val=5202

VBNetScreenSaver4 est un écran de veille qui choisit des images de fond et de sprites au hasard : il est facilement configurable pour afficher votre collection d'images jpg. Vous pouvez reprendre ce code pour refaire par exemple un simulateur d'aquarium. Le code est beaucoup plus simple (niveau 1) qu'avec la version 3.

 

Enfin, la dernière étape de la migration concerne le simulateur de gravité et l'interface de configuration :

 

Gravity.Net : l'écran de veille chaotique en VB.Net (Gravity2.scr) :

www.vbfrance.com/article.aspx?Val=5646

Pour le simulateur, j'ai utilisé l'assistant de migration qui importe un projet VB6 depuis Visual Studio .Net et qui vous tartine votre code de commentaires du genre : "ToDo : ceci ne marche pas comme ça en VB.Net" ! C'est une bonne idée d'utiliser l'assistant, à condition de ne pas en abuser. Je préconise son utilisation pour glaner des astuces de programmation en .Net et pour faciliter le portage de portions réduites de code, et je le déconseille vivement pour la migration du code de l'interface de votre application, par exemple.

Pour l'interface, j'ai trouvé qu'une ListView.Net pouvait avoir des cases à cocher et j'ai tout de suite compris que cela allait me simplifier considérablement l'interface. Quelques lignes de codes ajoutés pour traiter les saisies et voilà !

Si vous voulez faire un écran de veille, sachez que la gestion des erreurs est améliorée dans Gravity.Net par rapport à VBNetScreenSaver4 et il y a plus d'option de transition entre les scénarios aussi.

 

Voilà ! (je ne suis pas payé par Bill G. mais Microsoft m'a tout de même offert Visual Sudio .Net à la suite d'un ancien abonnement professionnel à MSDN, sympa quand même :-)

patrice.dargenton@free.fr

http://patrice.dargenton.free.fr/index.html