Lien avec le Eventhandler perdu

Résolu
darb66 Messages postés 36 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 23 juin 2008 - 26 mai 2008 à 10:57
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

1 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
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...
3
Rejoignez-nous