Bonjour,
je suis en stage dans une très grande entreprise et je dois créer un winForm sur lequel je choisi la diapositive PowerPoint à lancer via des boutons (un panneau de contrôle en quelques sorte).
Mes PowerPoints s'instancient bien, ils s'ouvrent bien et se lancent automatiquement aussi. J'ai créé un bouton "Quitter", pour fermer l'application, et ajouté un message de confirmation pour demander si l'utilisateur veut fermer tous les powerpoints ouverts en même temps que l'appli -> dans le cas du "OUI", ça marche.
Voici le code :
Cependant, j'ai voulu ajouter un bouton "Fermer toutes les diapositives ouvertes" qui permettrai ce que décrit le nom de ce bouton.
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 #region Bouton 'Quitter' private void btn_quit_Click(object sender, EventArgs e) { this.Close(); } //Demande à l'utilisateur confirmation pour quitter, //renvoie 'true' si confirmé private bool AskConfirmQuitAppli() { //message confirmation quitter appli if (MessageBox.Show("Voulez-vous fermer les diapositives en même temps que l'application ?", "Fermer ?", MessageBoxButtons.YesNo) == DialogResult.No) { // non return false; } else { // oui, quitter return true; } } // event déclenchée par Close() // déclenche ensuite event Closed sauf si annulé private void GestionAffichage_FormClosing(object sender, FormClosingEventArgs e) { if (powerPoint != null) { if (AskConfirmQuitAppli() == true) { FermerDiapo(); LiberationRessources(); } } } #endregion #region Méthodes private void FermerDiapo() { if (powerPoint != null) { powerPoint.Quit(); powerPoint = null; } } private void LiberationRessources() { // Double appel à Collect et WaitForPendingFinalizers. // La référence mémoire vers Excel/PowerPoint peut-être conservée après le 1er appel, (raison de l'erreur provoquée si on fait un double appel) // on demande donc un deuxième passage du Garbage Collector GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); }
Mais ça ne marche pas ! Pourtant j'ai mis la fonction "fermerDiapo();" Mais ça ne marche pas. Et encore moins si le powerPoint ouvert l'a été autrement que via l'application C#.
J'ai essayé bcp de codes différents, selon les infos trouvées sur le net.
Je précise que je code sur mon PC sous windows 7 pro 32 bits avec PowerPoint 2007 mais que le logiciel est destiné à un PC sous Windows XP pro 32 bits avec PowerPoint 2003.
D'ailleurs, j'ai voulu faire afficher le fameux message "Voulez vous fermer les diapo ouvertes en même temps que l'application ?" seulement si une diapositive était ouverte. Ca fonctionne mais seulement si la diapo a été ouverte via l'appli C#, et évidemment, même en l'ouvrant avec C# puis en fermant manuellement le PowerPoint, l'appli C# la croit toujours ouverte. Et si je fais un GC.Collect() et GC.WaitForPendingFinalizers(), je finirais par obtenir un message d'erreur incompréhensible sur l'instanciation du PowerPoint ..
J'espère que c'est pas trop brouillon c'est pas évident à expliquer, si nécessaire je recommencerais tout depuis le début en essayant d'être clair.
Ca fait très longtemps que je parcours vos forums en trouvant toujours mes réponses, mais là, j'y arrive pas je suis désolé donc j'ai du m'inscrire et poser mes questions.
D'avance merci
Partager