2009-03-14 5 views
0

Je reçois cette exception étrange dans les rapports de plantage automatisés, et je ne peux pas comprendre quelles sont les causes:NullReferenceException dans Forms.ToolStripMenuItemInternalLayout

V2009.3.0.0 - System.NullReferenceException - :System.Drawing.Rectangle get_ImageRectangle():0 
Version: MaxTo2009.3.0.0 
Exception: System.NullReferenceException 
Error message: Object reference not set to an instance of an object. 
Stack trace: 
    at System.Windows.Forms.ToolStripMenuItemInternalLayout.get_ImageRectangle() 
    at System.Windows.Forms.ToolStripMenuItem.OnPaint(PaintEventArgs e) 
    at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met) 
    at System.Windows.Forms.ToolStrip.OnPaint(PaintEventArgs e) 
    at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) 
    at System.Windows.Forms.Control.WmPaint(Message& m) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
    at System.Windows.Forms.ToolStrip.WndProc(Message& m) 
    at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

Cela semble arriver à beaucoup de gens, mais je ne peux pas reproduire . The clues I found on Google (essentiellement un seul article, qui est en allemand, et je ne comprends pas grand chose) me dit que cela est lié à l'état vérifié des éléments de menu. Depuis que je ne l'ai pas vu cette erreur dans les versions antérieures, et je l'ai c'est seulement changé un élément de menu dans cette version, susceptible d'être le coupable:

private void toolStripMenuItemPassiveMode_CheckedChanged(object sender, EventArgs e) 
{ 
    // Calls into an unmanaged DLL and uses PostMessage 
    SetPassiveMode(toolStripMenuItemPassiveMode.Checked); 
    String title; 
    String text; 
    if (toolStripMenuItemPassiveMode.Checked && !Settings.PassiveMode) 
    { 
     title = "Temporarily passive"; 
     text = "You have temporarily put MaxTo into passive mode. MaxTo will only intercept maximizations while you are holding the modifier key.\n\nIf you want passive mode to be the default, you have to set it in the options."; 
     notifyIcon.ShowBalloonTip(10000, title, text, ToolTipIcon.Info); 
    } 
    else if (!toolStripMenuItemPassiveMode.Checked && Settings.PassiveMode) 
    { 
     title = "Temporarily active"; 
     text = "You have temporarily put MaxTo into active mode. MaxTo will now intercept all window maximizations.\n\nIf you want active mode to be the default, you have to set it in the options."; 
     notifyIcon.ShowBalloonTip(10000, title, text, ToolTipIcon.Info); 
    } 
} 

propriété vérifié de l'élément de menu est modifié à deux endroits tout au long du code, mais rien de suspect à leur sujet, autant que je sache.

De .designer.cs:

this.toolStripMenuItemPassiveMode.CheckOnClick = true; 
this.toolStripMenuItemPassiveMode.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; 
this.toolStripMenuItemPassiveMode.Name = "toolStripMenuItemPassiveMode"; 
this.toolStripMenuItemPassiveMode.Size = new System.Drawing.Size(172, 28); 
this.toolStripMenuItemPassiveMode.Text = "&Passive mode"; 
this.toolStripMenuItemPassiveMode.CheckedChanged += new System.EventHandler(this.toolStripMenuItemPassiveMode_CheckedChanged); 

Répondre

1

Haivng regardé le code-cadre dans le réflecteur il se pourrait que votre Interop à la dll non géré est en train de modifier l'état vérifié quand/avant la OnPaint se passe. La propriété CheckedImage est utilisée dans get_ImageRectangle mais renvoie null si le bouton n'est pas coché. Normalement, j'imagine que ce ne serait pas un problème car l'état de l'article ne change pas à mi-peinture. Peut-être au lieu de passer toolStripMenuItemPassiveMode.Checked dans votre méthode SetPassive() le lire dans un booléen de la portée de la méthode et le transmettre?

En fait, ce n'est qu'une supposition.

+0

Le booléen est uniquement lu dans la DLL non managée. J'ai fait comme vous le dites, mais comme je ne peux pas reproduire cela, il est vraiment difficile de déboguer. Je ne peux vraiment pas dire si cela résout réellement le problème. –

Questions connexes