IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

"Forcer" la fermeture de l'application


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut "Forcer" la fermeture de l'application
    Bonjour,

    Mon projet est de type Windows Form.
    Au lancement, il ouvre Form1 ce qui déclenche l'événement Form1_Load.

    Jusqu'ici, je m'en étais tiré en y consignant tout mon code d'initialisation.
    Mais j'ai dû rajouter un test sur le chemin d'accès à la base de donnée. Un Dialogbox s'ouvre pour inviter l'utilisateur à renseigner le chemin d'accès. Ce dialogbox est doté d'un bouton "quitter" (si l'utilisateur renonce...)
    S'il clique sur ce bouton, il faudrait que le lancement de l'appli avorte purement et simplement.

    J'ai tenté plusieurs choses comme
    - mettre ma procédure de test dans l'event Form1_load
    - mettre ma procédure de test dans la sub new de la class Form1 juste après le "initializeComponents"
    - faire un Stop, un Application.exit, un form1.close... en cas de clic sur Quitter de ma dialogbox

    Mais quoique je fasse, je n'arrive pas à stopper le code. Concrètement, la procédure Event Load se déroule quoi qu'il arrive après ces instructions.

    Je me doute que je dois mal m'y prendre. Mais je ne trouve pas comment il faudrait faire. Pouvez-vous m'indiquer une piste ?

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Ce qu'il te faut c'est la création d'une Sub Main sur laquelle ton programme serait lancé en 1er. Paramétrage de ton projet.

    Ensuite tu y inclus ta conditionnelle avant même de lancer ton formulaire principal.

    Voilà qui devrait te mettre sur la voie :

    http://www.developpez.net/forums/d13...a/#post7534621

    A+

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    J'ai oublié de dire que j'ai également tenté cette voie mais j'ai abandonné, apparemment un peu hâtivement sans doute. Voici la raison.

    Si j'ai bien compris, je dois transformer mon type d'application en "application console" là où auparavant il était de type "application windows forms"

    J'ai donc mis mon "test" dans une sub Main() elle même dans un "module" classique.

    Mais là, j'ai tout un tas de remarque de Intellisense sur les objets de mon code désignant des formulaires ou des objets de ces formulaires.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Class FormX
    Private Sub bla bla...
    FormY.DialogResult =... 'FormY est souligné : Une référence à un membre non partagé requiert une référence d'objet. 
    FormZ.DTG.CurrentRow... 'FormZ.DTG est souligné : Une référence à un membre non partagé requiert une référence d'objet.
    Je ne sais pas trop comment modifier mon projet pour supprimer ces erreurs et n'ose pas trop me lancer à l'aveugle vu le nombre d'occurences (48 au total, de même nature, sur l'ensemble de mon projet).

  4. #4
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Il ne faut pas modifier ton application de type Windows Forms en type Console !

    Je t'ai fais un projet test pour que tu puisses voir de toi-même :

    http://wallace87000.upd.fr/00-TheMainSub.zip

    A+

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    OK, je n'ai pas réussi à faire tourner ton appli, mais j'ai compris que pour pouvoir spécifier sub Main en démarrage tout en gardant le type "Application Windows Form", il faut que je décoche "Activer l'infrastructure d'application"
    Du coup cela résout mes 48 erreurs.

    J'ai donc crée un sub Main comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Sub Main()
            InitialiseDatabase()
            Dim f As New Form1
            f.Show()
        End Sub
    La ligne 3 a été rajoutée pour forcer la lecture de la sub new de form1 dont le code se résume à initializecomponents() (code écrit par le désigner). En effet, j'ai remarqué que, sinon, l'instruction f.show lance directement l'event form1_load ce qui n'est pas le bon ordre. Je ne me l'explique pas mais disons que c'est la parade que j'ai trouvée.

    Cependant, je fais face à deux nouveaux problèmes donc un bloquant :
    - en cours de code sur l'event form1_load (qui est assez long et passe par de nombreuses fonctions et sub), j'ai remarqué que la sub new de form1 est appelée à nouveau, par exemple suite à une instruction du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim dt as datatable = Form1.datasettypé.dt1
    Je ne me l'explique pas non plus, mais j'ai trouvé une parade (que je ne détaille pas ici)

    - grâce à toutes mes "parades", j'arrive au bout de mon sub main. L'event form1_load permet de conclure l'instruction f.show. Mais là, je m'attends à ce que mon form1 s'ouvre enfin... Mais non ! L'appli s'achève ainsi sur le End de Sub Main.

    As-tu une idée d'où peut venir mon erreur
    -

  6. #6
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    OK, je n'ai pas réussi à faire tourner ton appli
    ???? Bah voyons.....et avec quel EDI tu développes exactement ??

    Version express 2010, 2012 ou VS2010, VS2012 ou autres ?

    NB : ce n'est pas une appli c'est un projet squelette donc ça ne demande rien de particulier sauf que dans la SubMain j'ai mis une conditionnelle si ton OS n'est pas Windows 7 ou 8 alors la fenêtre ne s'affiche pas !
    C'était un exemple pour illustrer ton problème précédemment rencontré.

    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
    17
    18
    19
    20
    21
    22
     
    Imports System.Threading
     
    Friend Class Program
        <STAThread()>
        Public Shared Sub Main(ByVal Args As String())
            Application.EnableVisualStyles()
            Application.SetCompatibleTextRenderingDefault(False)
            If Not My.Computer.Info.OSVersion.StartsWith("6") Then
                Interaction.MsgBox("Only for Windows 7 or Windows 8 !!", MsgBoxStyle.Exclamation, "Invalid OS")
                Application.Exit()
            Else
                Dim instanceCountOne As Boolean = False
                Using mtex As Mutex = New Mutex(True, Application.ProductName, instanceCountOne)
                    If instanceCountOne Then
                        Application.Run(New Form1)
                        mtex.ReleaseMutex()
                    End If
                End Using
            End If
        End Sub
    End Class

  7. #7
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Citation Envoyé par noftal Voir le message
    OK, je n'ai pas réussi à faire tourner ton appli, mais j'ai compris que pour pouvoir spécifier sub Main en démarrage tout en gardant le type "Application Windows Form", il faut que je décoche "Activer l'infrastructure d'application"
    @wallace1,

    Question toute bête : ceci a pour effet de rendre inactif le champ qui permet de spécifier un écran de démarrage (splashscreen). Du coup, comment spécifier un tel écran quand même ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Forcer de tuer un process après fermeture d'une applic!
    Par _shuriken_ dans le forum Windows XP
    Réponses: 14
    Dernier message: 26/01/2007, 16h27
  2. Forcer la fermeture d'une application
    Par Bissada dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2005, 22h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo