Lien avec le Eventhandler perdu [Résolu]

Messages postés
36
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
23 juin 2008
- - Dernière réponse : darb66
Messages postés
36
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
23 juin 2008
- 27 mai 2008 à 09:52
Bonjour à tous,

J'ai développé un Addin pour PowerPoint 2007 et j'ai quelques soucis avec l'EventHandler des nouveaux boutons... Je m'explique:
1) Je crée une nouvelle bar d'outils avec un bouton de type popup
Office.CommandBar menuBar = this.Application.CommandBars.Add("My Tools", Office.MsoBarPosition.msoBarTop, false, true);
menuBar.Visible = true;
Office.CommandBarPopup ButtonColor = (Office.CommandBarPopup)menuBar.Controls.Add(Office.MsoControlType.msoControlPopup, missing, missing, missing, true);
ButtonColor.Caption = "Select Color";
ButtonColor.Visible = true;

2) J'ajoute dynamiquement des boutons pour ce-dernier en spécifiant la fonction lors d'un Click
Office.CommandBarButton ButtonCurrentColor;
for (int i = 0; i < COLORNAMES.GetLength(0); i++)
  {
    ButtonCurrentColor = (Office.CommandBarButton)ButtonColor.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, missing, true);
    ButtonCurrentColor.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;
    ButtonCurrentColor.Caption = COLORNAMES[i, 0];
    ButtonCurrentColor.Picture = vln_ImageConverter.Convert((System.Drawing.Bitmap)Resources.ResourceManager.GetObject(COLORNAMES[i, 1]));
    ButtonCurrentColor.Click += new Office._CommandBarButtonEvents_ClickEventHandler(ButtonColor_Click);
  }

3) La fonction "ButtonColor_Click
" assigne la couleur au texte sélectionné...
this.Application.ActiveWindow.Selection.TextRange.Font.Color.RGB = sColor;

Cela fonctionne parfaitement bien... sauf lorsque j'utilise d'abord un autre bouton - créé précédemment par le même Addin - qui ouvre une nouvelle fenêtre. Je n'arrive pas à expliquer pourquoi, suite aux lignes de code ci-dessous, mes EventHandler déclarés ci-dessus ne fonctionnent plus. Il ne se passe absolument rien...
Form myForm = new Form();
myForm.Show();

Est-ce que quelqu'un pourrait m'aider? Merci d'avance pour votre collaboration
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
36
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
23 juin 2008
3
Merci
J'ai résolu le problème  Pour les personnes intéressées, voici le descriptif de la solution trouvée sur Google Group:
Make sure you keep a reference to that button all the time. I had the same
problem. Maybe the garbage collector decides to release the object at some
point, because there is no reference to the button. I mean, if you create a
button in a method, and you declare the button object in that method, after
that you set an event handler and leave the method, the reference to the
button goes out of scope. Because of setting the event, interop mechanism
keeps a reference to the event handler for some time only. Maybe it is a
good idea to define the button object public static somewhere.

1) J'ai donc créé dans ma classe une liste qui contiendra mes boutons
private List<Office.CommandBarButton> ButtonColors;

2) Et j'ajoute mes boutons lors de leur création dans la boucle "for" (cf. Point 2 du précédent post)
for (int i = 0; i < COLORNAMES.GetLength(0); i++)
  {
    ...
    ButtonColors.Add(ButtonCurrentColor);
  }

Cela a pour effet de toujours garder une référence sur les boutons créés. Le Garbage Collector ne supprimera donc plus mes Event OnClick...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 144 internautes nous ont dit merci ce mois-ci

Commenter la réponse de darb66