![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Invité de passage
![]() Date d'inscription: août 2008
Localisation: Pyrénées Atlantiques
Âge: 29
Messages: 8
|
Bonjour à tous,
J'ai développé récemment un petit programme en VB2005 qui, grâce à la plateforme .NET, me permet d'afficher une sorte de timer sur mes diapositives. Ce timer est en réalité une barre que j'affiche en bas de l'écran et dont la longueur correspond au temps restant. Pour des raisons d'affichage, je crée cette barre sur le masque de diapositive, et sa longueur est ajustée toutes les 10 secondes. Tout marchait parfaitement bien sous Office 2003... Mais la nouvelle version 2007 me pose un problème. En effet, lorsque PowerPoint 2007 affiche la diapositive i, il prépare également la diapositive i+1. Si plus de 10 secondes passent lorsque la diapositive i est affichée, ma barre de progression se réduit (jusque là tout va bien). Mais quand je passe à la diapositive i+1, la barre de progression s'affiche avec la longueur qu'elle avait au début de la diapositive i, c'est à dire sa longueur avant la réduction. Au prochain tick du timer qui contrôle tout cela, sa longueur est réajustée correctement, mais au final, ça donne l'impression d'une barre de progression qui joue au yoyo. Ce problème est dû à la mise en cache de la diapositive suivante. C'est une fonctionnalité intéressante de PowerPoint pour fluidifier les présentations, mais dans mon cas, ça pose un problème. Savez-vous s'il est possible de désactiver cette mise en cache par programmation ? Merci d'avance, Merhandir |
|
|
|
|
|
#2 (permalink) |
![]() |
Bonjour
Ce n'est pas évident de te réponde sans faire de test. Pourrais-tu nous donner un petit bout de programme (la partie pilotage de PPT) pour faire des tests, car comme cela sans plus d'indications je ne peux vraiment pas te répondre. En VBA on a une instruction DoEvents, elle permet d'attendre la fin d'un processus avant d'en lancer un autre, cela règle souvent les problèmes d'affichage. Je t'avoue que je n'ai pas regardé VB2005 depuis un moment, j'avais fait des tests sur la version Express, mais peut-être qu'une instruction de ce type existe. Regarde la définition dans l'aide VBA pour comprendre à quoi cela sert, et trouver un équivalent sous VB2005. Starec |
|
|
|
|
|
#3 (permalink) |
|
Invité de passage
![]() Date d'inscription: août 2008
Localisation: Pyrénées Atlantiques
Âge: 29
Messages: 8
|
Bonjour,
Je ne pense pas qu'un DoEvents soit la solution ici. En effet, sauf erreur de ma part, cette instruction sert habituellement à redonner la main au système de temps en temps pour qu'il puisse gérer les événements en attente lorsque le programme est "bloqué" dans une boucle un peu gourmande en temps machine. Dans mon cas, je n'utilise pas ce type de boucle. Le .NET permet de gérer les threads, et le timer que j'utilise pour réduire ma barre de progression toutes les 10 secondes est géré par un thread indépendant. De ce fait, le programme ne reste jamais "bloqué" dans une procédure, et je ne vois pas du tout où je pourrais insérer un DoEvents pour améliorer mon affichage. Je pense vraiment que le problème vient de PowerPoint 2007 qui calcule à l'avance le fond de la diapositive suivante, basé sur le masque. Or, comme il y a un élément dynamique dans le mien, ça pose un problème. Il faut reconnaître qu'un masque de diapositive n'est pas spécialement conçu pour évoluer au cours de la présentation ! C'est mon besoin qui crée le problème, j'en suis conscient. Mais ça marchait si bien sous PowerPoint 2003 ! Bref, pour l'instant, je ne vois que les solutions suivantes : - soit je trouve une instruction qui permette de désactiver le pré-calcul de la diapositive suivante (mais rien ne dit qu'elle existe...), - soit je trouve une instruction qui permette de rafraîchir le fond d'une diapo avant de l'afficher (mais je n'ai trouvé aucun QuelqueChose.Refresh ou autre), - soit je reprends tout mon code pour créer une barre sur les diapos et non sur le masque. J'ai déjà commencé à y réfléchir, mais je vois déjà se profiler quelques problèmes... Enfin, pour ceux qui voudraient essayer sur VB2005 ou le retranscrire sous VBA, voici quelques pistes. Je crée tout d'abord une instance d'une application PowerPoint, avec l'option WithEvents pour pouvoir récupérer les événements de cet objet. Code :
Private WithEvents m_objAppPowerPoint As Microsoft.Office.Interop.PowerPoint.Application Code :
With m_objAppPowerPoint.ActivePresentation.SlideMaster m_objEcran.Largeur = .Width m_objEcran.Hauteur = .Height m_objCallout = .Shapes.AddCallout(MsoCalloutType.msoCalloutFour, 0, m_objEcran.Hauteur - 5, m_objEcran.Largeur, 5) End With With m_objCallout .Callout.Border = MsoTriState.msoFalse .Fill.ForeColor.RGB = RGB(0, 255, 0) .Fill.Transparency = 0 End With Ensuite, je crée un timer : Code :
Private WithEvents m_tmrCompteur As New System.Timers.Timer Code :
With m_tmrCompteur .Interval = 10000 .AutoReset = True .Start() End With Code :
Private Sub m_tmrCompteur_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles m_tmrCompteur.Elapsed Dim intDureeSec As Integer intDureeSec = CInt(DateDiff(DateInterval.Second, m_datT0, Now)) m_objCallout.Width = CSng(m_objEcran.Largeur * (1 - intDureeSec / (m_intDureeMax * 60))) End Sub Je vous rappelle que pour faire apparaître le problème, il faut utiliser PowerPoint 2007, et attendre que la barre de progression se réduise (10 sec dans mon cas, ou changez la valeur de m_tmrCompteur.Interval) avant de passer à la diapo suivante. Cordialement, Merhandir Dernière modification par Philippe JOCHMANS ; 20/08/2008 à 11h18 Motif: Ajout des balises codes (sélection du code + #), ce n'est pas facultatif |
|
|
|
|
|
#4 (permalink) | |
![]() |
Bonjour
Citation:
Code :
- soit je trouve une instruction qui permette de rafraîchir le fond d'une diapo avant de l'afficher (mais je n'ai trouvé aucun QuelqueChose.Refresh ou autre),
Code :
Sub RefreshSlide() Dim lSlideIndex As Long lSlideIndex = SlideShowWindows(1).View.CurrentShowPosition SlideShowWindows(1).View.GotoSlide lSlideIndex End Sub Code :
- soit je reprends tout mon code pour créer une barre sur les diapos et non sur le masque. J'ai déjà commencé à y réfléchir, mais je vois déjà se profiler quelques problèmes... Cependant, PPT 2007 permet de créer un masque, mais aussi des sortes de sous-masques, peut-être une piste de ce coté, avec chargement d'un sous-masque, à voir. Starec |
|
|
|
|
|
|
#5 (permalink) |
|
Invité de passage
![]() Date d'inscription: août 2008
Localisation: Pyrénées Atlantiques
Âge: 29
Messages: 8
|
Bonjour,
Suite à mes difficultés précédentes, j'ai opté pour un changement dans mon algorithme. Au lieu de tracer ma barre de progression sur le masque des diapositives, je la dessine directement sur la diapositive i, ainsi que sur les diapositives i-1 et i+1 pour anticiper sur le choix de l'utilisateur qui voudrait avancer ou reculer dans sa présentation. Maintenant, l'évolution de ma barre de progression est celle qui est attendue... Mais j'ai un nouveau problème. Lorsque le timer de 10 secondes souhaite modifier la taille de la barre, cette modification graphique réinitialise les animations éventuelles sur la diapositive en cours, ce qui est très gênant... Existe-t-il un moyen pour que ma modification n'influe pas sur les animations ? Merci d'avance, Merhandir |
|
|
|
|
|
#7 (permalink) |
|
Invité de passage
![]() Date d'inscription: août 2008
Localisation: Pyrénées Atlantiques
Âge: 29
Messages: 8
|
Bonjour,
Ci-joint, vous trouverez une présentation (d'une diapo seulement) qui montre le problème que j'ai mentionné au sujet des animations qui sont réinitialisées. Ce problème ne se manifeste pas non plus sous PPT 2003, mais uniquement sous PPT 2007. Voici un exemple de programme pour la création de la barre de progression et du timer associé, en VB 2005 : Code :
Imports Microsoft.Office.Interop Imports Microsoft.Office.Core Public Class CompteurPowerPoint Private Structure TailleEcran Dim Largeur As Single Dim Hauteur As Single End Structure Private WithEvents m_objAppPowerPoint As PowerPoint.Application Private WithEvents m_tmrCompteur As New System.Timers.Timer Private m_objCallout As PowerPoint.Shape Private m_objEcran As New TailleEcran Private m_datT0 As Date Private Const m_intDureeMax As Integer = 1 ' Durée de la présentation = 1 min Public Sub New() m_objAppPowerPoint = New PowerPoint.Application End Sub Private Sub m_objAppPowerPoint_SlideShowBegin(ByVal Wn As Microsoft.Office.Interop.PowerPoint.SlideShowWindow) _ Handles m_objAppPowerPoint.SlideShowBegin With m_objAppPowerPoint.ActivePresentation.SlideMaster m_objEcran.Largeur = .Width m_objEcran.Hauteur = .Height End With ' Création de la barre de progression au lancement du diaporama m_objCallout = m_objAppPowerPoint.ActivePresentation.Slides(1).Shapes.AddCallout(MsoCalloutType.msoCalloutFour, 0, m_objEcran.Hauteur - 5, _ m_objEcran.Largeur, 5) With m_objCallout .Callout.Border = MsoTriState.msoFalse .Fill.ForeColor.RGB = RGB(0, 255, 0) .Fill.Transparency = 0 .Fill.Visible = MsoTriState.msoTrue End With ' Lance le timer de rafraîchissement de la barre de progression With m_tmrCompteur .Interval = 2000 ' Rafraîchir toutes les 2 sec .AutoReset = True .Start() End With m_datT0 = Now End Sub Private Sub objAppPowerPoint_SlideShowEnd(ByVal Pres As Microsoft.Office.Interop.PowerPoint.Presentation) _ Handles m_objAppPowerPoint.SlideShowEnd ' Arrête le timer m_tmrCompteur.Stop() ' Supprime les objets créés par le compteur sur le fichier PPT m_objCallout.Delete() ' Empeche l'apparition du requester de sauvegarde de fichier m_objAppPowerPoint.ActivePresentation.Saved = MsoTriState.msoTrue End Sub Private Sub m_tmrCompteur_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles m_tmrCompteur.Elapsed Try Dim intDureeSec As Integer ' Ajustement de la largeur de la barre de progression intDureeSec = CInt(DateDiff(DateInterval.Second, m_datT0, Now)) m_objCallout.Width = CSng(m_objEcran.Largeur * (1 - intDureeSec / (m_intDureeMax * 60))) Catch ex As Exception ' Gestionnaire d'erreur au cas où l'objet m_objCallout serait déjà détruit lors de l'exécution du thread Debug.Print("Erreur du timer m_tmrCompteur : " & ex.Message) End Try End Sub End Class Code :
Private objCompteurPowerPoint As New CompteurPowerPoint |
|
|
|
|
|
#9 (permalink) |
|
Invité de passage
![]() Date d'inscription: août 2008
Localisation: Pyrénées Atlantiques
Âge: 29
Messages: 8
|
Merci Starec,
C'est sympa de m'accorder tout ce temps :-) Le modèle objet de PowerPoint sous VBA n'est donc pas le même ? Ca fait longtemps que je n'ai pas touché au VBA, et à l'époque je ne connaissais pas grand chose de la programmation objet... Encore merci, Merhandir |
|
|
|
|
|
#11 (permalink) |
|
Invité de passage
![]() Date d'inscription: août 2008
Localisation: Pyrénées Atlantiques
Âge: 29
Messages: 8
|
Bonjour à tous, bonjour Starec,
Encore merci d'avoir essayé de régler mes problèmes. Pour ma part, j'ai également essayé d'apporter des solutions aux deux : - comment rafraîchir le masque avant l'affichage de la diapo suivante (ou bien empêcher la mise en cache de la diapo suivante), - comment empêcher les animations de se réinitialiser lors de la modification d'un élément graphique sur ma diapo. J'ai parcouru l'arborescence du modèle objet de PowerPoint dans tous les sens, je ne vois rien qui permette de faire ce que je veux. De plus, les modifications du modèle par rapport au modèle PowerPoint 2003 ne sont pas nombreuses, et aucune ne semble concerner les fonctionnalités que je recherche. Aussi, puisque j'ai besoin d'un programme fonctionnel d'ici la fin de la semaine pour un congrès, ai-je opté pour une toute nouvelle piste. Je n'en suis encore qu'au début car je n'ai eu l'idée qu'hier soir, mais cette voie semble prometteuse. Voici l'idée : j'utilise un formulaire Windows (classe Form) en guise de barre de progression, en fixant sa propriété TopMost à True. Ainsi, elle reste toujours en avant-plan, et je n'ai plus qu'à modifier sa largeur. De plus, je n'ai plus besoin d'apporter de modifications aux diapositives comme je le faisais avant. Cette méthode me semble plus "respectueuse" du document PowerPoint Je vous tiens au courant du déroulement de l'opération. Bien cordialement, Merhandir |
|
|
|
|
|
#12 (permalink) |
|
Invité de passage
![]() Date d'inscription: août 2008
Localisation: Pyrénées Atlantiques
Âge: 29
Messages: 8
|
Bonjour,
Ma nouvelle technique fonctionne à merveille ! J'ai enfin le résultat voulu. En fin de compte, j'utilise le composant COM de PowerPoint uniquement pour détecter le lancement du diaporama et sa fermeture. Tout le reste est géré en VB. Cordialement, Merhandir |
|
|
|
![]() |
![]() |
||
PPT2007 : problème de mise à jour du masque de diapositive
|
||
Offres d'
emploi informatique
sur Lesjeudis.com
|
| Outils de la discussion | |
|
|