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 :
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".
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.
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
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.
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.
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à.