Startup object :sub main vs maforme

Startup Object : Sub Main vs MaForme

Introduction

Il m'est arrivé, il y a quelques temps, d'avoir des problèmes à faire apparaitre le programme dans la barre des tâches. Comme ce petit détail m'a tout de même pris deux jours pour le régler, j'ai décidé de vous livrer immédiatement le secret.

Il y a deux méthodes pour démarrer un programme VB :

  • en définissant le startup Object comme étant la Sub Main
  • en spécifiant une forme de départ.

Il y a des avantages particuliers à chacun mais aussi des inconvénients de taille.

Il y a tout de même deux choses qui peuvent être utilisées indifféremment dans les deux cas : l'administration du commandline ( $Command ) et un "splash screen".

Startup Object : Sub Main

Dans un module, mettre une Sub Main().
Cette routine sera le tout premier code appelé par VB à l'ouverture du programme.
Tout le code contenu dans cette Sub Main(), sera exécuté sans qu'aucune forme ne soit chargée.

Avantages

  • Chargement et démarrage du programme très rapide,
  • Chargement et traitement de données lourdes n'est pas entravé par l'administration des formes et contrôles.
  • Ceux-ci effectués, les formes peuvent être chargées rapidement et afficher des résultats simplifiés.

Désavantages

  • Peu importe comment vous vous y prendrez, le programme ne sera pas affiché dans la barre des tâches. J'avais du recourir à toute sorte de gymnastiques programmatiques pour avoir un affichage. Efficace mais lourd.
  • Un autre est que si le chargement et le traitement des données à charger est long, l'usager risque de s'énerver et essayera de vous jeter des sorts. Dans ce cas, il faut utiliser un "splash screen" qui retiendra son attention et le distraira. En temps ordinateur, 30 secondes est très long.

Notes d'usage : Voici un exemple de code hyper simplifié pour une Sub Main. Notez que la forme doit être chargée modalement sinon une fois la forme chargée, le code continue à débouler et le programme s'arrête rapidement ... et de façon imprévue, surtout quand le patron regarde...

Public Sub Main()

    Load MaForme

    MaForme.Show , vbModal

End Sub

Startup Object : MaForme

Comme tout un chacun sait, une forme est tout d'abord "loadée", puis ensuite est rendue visible ('show'). Il n'y a pas de limite de temps entre ces deux étapes.

Avantages

  • Chargement qui peut être relativement rapide si cette forme principale n'est pas surchargée de contrôes ou n'as pas besoin d'attendre un traitement de données.
  • Pour afficher dans la barre des tâches, il suffit de basculer la propriété 'Show in Taskbar' à TRUE dans les propriétés de la forme.

Désavantages

Chargement long et lourd en cas de forme lourde et/ou de données nombreuses.

Pour s'en sortir, une seule façon : un 'splash screen', mon prochain sujet.

Splash Screen

Un splash screen est une forme un peu comme la forme 'About...' et peut même servir dans les deux cas. Pour une forme Splash screen, prévoir une image libre de droits (ou faite par vous) et du texte descriptif. Une barre de progrès peut y être adjointe pour distraire l'usager.

Pour le reste, tout est dans le code et les commentaires.

Une définition :

Private blnFirstTime as Boolean 'empêchera la Sub Activate de tomber en boucle.

'Ensuite le code.

Private Sub Form_Load()

    blnFirstTime = True

End Sub

Private Sub Form_Activate()

    If blnFirstTime Then

        Set frmSplash = New MyFormSplash

        Load frmSplash

        frmSplash.Init True 'cette fonction que je mets dans toutes mes formes me permet de fixer certaines propriétés avant de montrer celle-ci. TRUE veut dire ici que c'est une splash screen. FALSE voudrais dire que c'est une forme 'About.'

        frmSplash.Show ' ne pas montrer vbModal

        'Faire ici toutes vos manip et chargement de données.

        If Not frmSplash Is Nothing Then' toujours vérifier si l'objet est là

            frmSplash.Hide

            Unload frmSplash

            Set frmSplash = Nothing

            DoEvents

        End If 

        blnFirstTime = False

    End If

End Sub
</code

Chose importante à retenir : le splash screen doit être TOPMOST tout le temps où il est exposé et pour se faire, prendre ce code du Windows API et le mettre dans la Sub Activate de la forme.

Cette position ne peut être modifiée ensuite et ne disparait que quand la forme est 'unloaded'.

<code vb>
Private Sub Form_Activate()

    If blnFirstTime Then ' cette variable est private pour cette forme

        Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2
       
        SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE

        blnFirstTime = False

    End If

End Sub

Je mets ci-dessous les définitions pour SetWindowsPos.

Public Const HWND_TOPMOST = -1

Public Const SWP_NOSIZE = &H1

Public Const SWP_NOMOVE = &H2

Public Const SWP_NOACTIVATE = &H10

Public Const SWP_SHOWWINDOW = &H40

Public Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, _
ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Voila. Amusez-vous bien, là.

Ce document intitulé « Startup object :sub main vs maforme » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.