Site:  Cours VB.net  
4.1 Démarrer, arrêter un programme.

Quand vous démarrez votre programme, quelle partie du code va être exécutée en premier?

En Vb 2003

Vous pouvez le déterminer en cliquant sur le menu Projet puis Propriétés de NomduProjet, une fenêtre Page de propriétés du projet s'ouvre.

Sous la rubrique Objet du démarrage, il y a une zone de saisie avec liste déroulante permettant de choisir:

-Le nom d'un formulaire du projet

ou

-Sub Main()

 

En Vb 2005 ou 2008 :

Ouvrir le 'Projet Designer', il est directement accessible dans l'explorateur de solution (Double cliquer sur 'My Projet')ou par le menu Projet-> Propriétés de ..:

On définit:

Le Formulaire de démarrage (startUp Form).

Si 'Activer l'infrastructure de l'application' est coché, l'élément de démarrage ne peut être qu'un formulaire; s'il est décoché, on peut lancer le programme par la Sub Main().

Attention: ne pas confondre Formulaire de démarrage en haut et Ecran de démarrage (écran splash) en bas.

 

 

Démarrer par un formulaire.

Si vous tapez le nom d'un formulaire du projet, c'est celui-ci qui démarre : cette fenêtre est chargée au lancement du programme et la procédure Form_Load de cette fenêtre est effectuée.

En théorie, si vous avez une application avec un  formulaire, le fait de dessiner ce formulaire crée une Classe Form1; il faudrait donc théoriquement créer une instance de ce formulaire (par un Dim MyForm As New Form1) pour lancer l'application.

En pratique, dessinez un formulaire, lancez l'exécution, ça marche car le runtime crée une instance du formulaire automatiquement à l'aide de sa méthode New et l'affiche (sans que l'on ai besoin de l'intancier soit même).

 

Démarrer par Sub Main()

 

On rappelle qu'en VB2005 en 2008, si 'Activer l'infrastructure de l'application' est coché dans les propriétés du programme, le formulaire de démarrage ne peut être qu'un formulaire; s'il est décoché, on peut choisir dans Formulaire de démarrage 'Sub Main' et lancer le programme par la Sub Main().

 

C'est cette procédure Sub Main qui s'exécute en premier lorsque le programme est lancé.

Elle peut servir à ouvrir le formulaire de démarrage:

Exemple 1:

En mode design Form1 a été dessinée, C'est un modèle 'une Classe'.

Dans un module standard, dans une Sub Main(), on instancie initForm  à partir la Class Form1. Puis on affiche ce formulaire (cette fenêtre) avec .ShowDialog

 

Sub Main()

        Dim initForm As New Form1

        initForm.ShowDialog()

End Sub

 

Exemple 2:

Sub Main()
' Démarre l' application et affiche une instance de Form1
Application.Run(New Form1())
End Sub
 

S'il y a plusieurs threads, Application.Run commence à exécuter une boucle de messages d'application standard sur le thread en cours  et affiche le formulaire spécifié. Peut être utilisé aussi s'il y a un seul thread.

 

 

Attention Sub Main() peut se trouver dans une Classe (Y compris une classe de formulaire) ou dans un module:

Si vous déclarez la procédure Main dans une classe de formulaire, vous devez utiliser le mot clé Shared.

Class Form1

Public Shared Sub Main()

    .....

End Sub

..

End Classe

Dans un module, la procédure Main n'a pas besoin d'être partagée (Shared).

Module1

Sub Main()

...

End Sub

End Module

 

Fonction Main():

 

On peut utiliser  'Function Main' (au lieu de  'Sub Main') qui  retourne un Integer, que le système d'exploitation utilise comme code de sortie du programme. D'autres programmes peuvent tester ce code en examinant la valeur ERRORLEVEL Windows.

 

Function Main() As Integer
...
Return 0
' Zéro signifie : tout est Ok.
End Function
 

Récupération de la ligne de commande:

 

Main peut également avoir comme argument un tableau de String. Chaque élément du tableau contient un des arguments de ligne de commande utilisée pour appeler le programme. Vous pouvez réaliser diverses actions en fonction de leurs valeurs.

 

Function Main(ByVal CmdArgs() As String) As Integer
...

Return 0
End Function
 

 

 

Autre méthode de récupération de la ligne de commande en VB 2005:

On trouve les arguments de la ligne de commande dans My.Application.CommandLineArgs (VB 2005)

Exemple:

Cliquez sur un fichier de données, l'exécutable lié s'exécute et ouvre le fichier de données.

(Exemple: Quand on clique sur un fichier .bmp on lance automatiquement Paint qui charge l'image .bmp)

 

Il faut que l'extension du fichier soit liée avec le programme exécutable, si vous cliquez sur  le fichier de données, cela lance l'exécutable.

Modifier l'extension liée Explorer->Outils-> Option des dossiers-> Type de fichiers

Dans Form_Load mettre:

If My.Application.CommandLineArgs.ToString <> "" Then

Dim i

For i = 0 To My.Application.CommandLineArgs.Count - 1

If mid(My.Application.CommandLineArgs(i).ToString,1,2)  "-o" Then ' dans le cas ou la ligne de commande contient le nom du fichier à lancer et '-o'

FileName = Mid(My.Application.CommandLineArgs(i).ToString, 3)

OpenFile() ' charger les données

Exit For

End If

Next

End If

 

 

 Fenêtre Splash

C'est une fenêtre qui s'ouvre au démarrage d'un programme, qui montre simplement une belle image, (pendant ce temps le programme peut éventuellement initialiser des données, ouvrir des fichiers...) ensuite la fenêtre 'Splash' disparaît et la fenêtre principale apparaît.

Exemple de formulaire splash de VisualStudio 2003:

En Vb 2003 (Framework 1) il faut tout écrire:

Dans la Sub Main il est possible de gérer une fenêtre Splash.

Exemple:

Je dessine Form1 qui est la fenêtre Spash.

Dans Form2 qui est  la fenêtre principale, j'ajoute:

Public Shared Sub Main()

Dim FrmSplash As New Form1    'instance la fenêtre Splash

Dim FrmPrincipal As New Form2 'instance la feuille principale

FrmSplash.ShowDialog()        'affiche la fenêtre Splash en Modale

FrmPrincipal.ShowDialog()     'a la fermeture de Splash,  affiche la fenêtre principale

End Sub

Dans Form1 (la fenêtre Splash)

Private Sub Form1_Activated

Me.Refresh() 'pour afficher totalement la fenêtre.

'ici ou on fait plein de choses on ouvre des fichiers ou on perd du temps.

' s'il n'y a rien a faire on met un Timer pour que l'utilisateur admire la belle image.

Me.Close()

End Sub

On affiche FrmSplash un moment (Ho! la belle image) puis on l'efface et on affiche la fenêtre principale. Word, Excel.. font comme cela.

Autre méthode:

Public Sub main()

 

'création des formulaires frmmain and frmsplash

Dim frmsplash As New frmsplash

Dim frmmain As New frmmain

 

'on affiche la Splash

frmsplash.Show()

Application.DoEvents()

 

'On attend (3000 milliseconds)

System.Threading.Thread.Sleep(3000)

 

'On efface la Splash

frmsplash.Close()

 

'On affiche le formulaire principal

Application.Run(frmmain) 

 

End Sub

 

En Vb 2005 ou 2008 c'est très simple:

Ouvrir le 'Projet Designer', il est directement accessible dans l'explorateur de solution (My Projet)ou par le menu Projet-> Propriétés de..:

 Il faut que 'Activer l'infrastructure de l'application' soit coché:

On définit

Le formulaire de démarrage (startUp Form),

L'écran de démarrage (Splash Screen) en bas, il suffit d'indiquer son nom (En mode Run, VB l'affiche et le fait disparaître quand le formulaire de démarrage s'ouvre). 

 

On peut aussi ajouter un écran splash tout fait:

Menu Projet, Ajouter un formulaire Windows, double cliquer sur 'formulaire de démarrage'.

On obtient:

Le nom de l'application, la version, le nom de la société sont automatiquement mis à jour en utilisant les 'Informations de l'assembly' accessible par un bouton situé dans le projet designer, en face du nom du formulaire de démarrage.

L'inconvénient de cet écran Splash automatique est qu'il s'affiche et s'efface très rapidement, avant de charger le formulaire de démarrage!! Pour le voir une seconde, j'ai ajouté à la fin de la procédure Form_Load de cet écran:

Me.Show()

Application.DoEvents()

System.Threading.Thread.Sleep(1000)

 

Comment arrêter le programme?

Me.Close()    'Ferme la fenêtre en cours

Noter bien Me désigne le formulaire, la fenêtre en cours.

Application.Exit()    'Ferme l'application

Vide la 'pompe à messages', ferme les formulaires. Si des fichiers sont encore ouvert, cela les ferme. (Il vaut mieux les fermer avant, intentionnellement.)

 

Fin de programme :Attention!

Outre l'usage de Application.Exit(), on peut terminer une application en fermant les formulaires, mais:

Dans Visual Basic 6.0, une application ne se terminait que lorsque tous les objets créés étaient détruits.

Dans Visual Basic .NET 2003, l'application se termine lorsque l'objet de démarrage est détruit. Si le formulaire que vous fermez est le formulaire de démarrage de votre application, votre application se termine. Si la procédure Sub_Main est définie comme objet de démarrage l'application se termine dès que le code de Sub_Main a fini de s'exécuter.

Dans Visual Basic .NET 2003, l'application se termine automatiquement lorsque l'objet de démarrage est détruit.

 

En VB 2005 ou 2008 vous avez le choix entre les 2 solutions: terminer l'application quand le formulaire de démarrage est fermé ou quand tous les formulaires sont fermés.(dans l'application Designer voir 'Mode d'arrêt')