[Mono-winforms-list] Bug in System.Windows.Forms.Control:get_ContainsFocus ()?

Paddy Joy mono at paddyjoy.com
Wed Jun 21 18:33:25 EDT 2006


Hi Rafael,

Yes this problem exists in a much larger application involving lots of 
custom controls, I have just created this code to demonstrate the 
problem as simply as possible.

I have tested the code in MS .NET and it works ok and returns False to 
the console as expected so I have logged a bug 
http://bugzilla.ximian.com/show_bug.cgi?id=78685

Thanks for your help,
Paddy


Rafael Teixeira wrote:
> Hi Paddy,
>
> Why do you return base.ContainFocus instead of base.Focused from your
> overriden Focused? That way you are introducing infinite recursion as
> Control.ContainsFocus calls Control.Focused, that in your case is
> overriden.
>
> In truth, unless this is just some small code to show the problem, I
> don't see any need to override Focused... Even more to change its
> semantics.
>
> Anyway if that code works in MS.NET, we should not rely on Focused to
> determine partially the value of ContainsFocus (ContainsFocus also
> checks children if the Control per se isn't with focus). Test it in
> MS.NEt and if it works OK, please fill a bug for MWF, thanks.
>
> :|
>
> On 6/21/06, Paddy Joy <mono at paddyjoy.com> wrote:
>> How about this code, I'm pretty sure that it instantiates button2
>> correctly now but still gives the segmentation error.
>>
>> I have declared the button with:
>> private testbutton button2;
>>
>> and instantiated it with:
>> this.button2 = new testbutton();
>>
>> Thanks for the help,
>> Paddy
>>
>>
>> using System;
>> using System.Drawing;
>> using System.Collections;
>> using System.ComponentModel;
>> using System.Windows.Forms;
>> using System.Data;
>>
>> namespace WindowsApplication4
>> {
>>     /// <summary>
>>     /// Summary description for Form1.
>>     /// </summary>
>>     public class Form1 : System.Windows.Forms.Form
>>     {
>>         private System.Windows.Forms.Button button1;
>>         private testbutton button2;
>>         /// <summary>
>>         /// Required designer variable.
>>         /// </summary>
>>         private System.ComponentModel.Container components = null;
>>
>>         public Form1()
>>         {
>>             //
>>             // Required for Windows Form Designer support
>>             //
>>             InitializeComponent();
>>
>>             //
>>             // TODO: Add any constructor code after 
>> InitializeComponent call
>>             //
>>         }
>>
>>         /// <summary>
>>         /// Clean up any resources being used.
>>         /// </summary>
>>         protected override void Dispose( bool disposing )
>>         {
>>             if( disposing )
>>             {
>>                 if (components != null)
>>                 {
>>                     components.Dispose();
>>                 }
>>             }
>>             base.Dispose( disposing );
>>         }
>>
>>         #region Windows Form Designer generated code
>>         /// <summary>
>>         /// Required method for Designer support - do not modify
>>         /// the contents of this method with the code editor.
>>         /// </summary>
>>         private void InitializeComponent()
>>         {
>>             this.button1 = new System.Windows.Forms.Button();
>>             this.button2 = new testbutton();
>>             this.SuspendLayout();
>>             //
>>             // button1
>>             //
>>             this.button1.Location = new System.Drawing.Point(96, 32);
>>             this.button1.Name = "button1";
>>             this.button1.TabIndex = 0;
>>             this.button1.Text = "button1";
>>             this.button1.Click += new
>> System.EventHandler(this.button1_Click);
>>             //
>>             // button2
>>             //
>>             this.button2.Location = new System.Drawing.Point(96, 80);
>>             this.button2.Name = "button2";
>>             this.button2.TabIndex = 1;
>>             this.button2.Text = "button2";
>>             //
>>             // Form1
>>             //
>>             this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
>>             this.ClientSize = new System.Drawing.Size(292, 262);
>>             this.Controls.Add(this.button2);
>>             this.Controls.Add(this.button1);
>>             this.Name = "Form1";
>>             this.Text = "Form1";
>>             this.ResumeLayout(false);
>>
>>         }
>>         #endregion
>>
>>         /// <summary>
>>         /// The main entry point for the application.
>>         /// </summary>
>>         [STAThread]
>>         static void Main()
>>         {
>>             Application.Run(new Form1());
>>         }
>>
>>         private void button1_Click(object sender, System.EventArgs e)
>>         {
>>             Console.Write(button2.Focused);
>>         }
>>     }
>>
>>     public class testbutton : System.Windows.Forms.Button
>>     {
>>
>>         public testbutton()
>>         {
>>
>>
>>         }
>>
>>         public override bool Focused
>>         {
>>             get
>>             {
>>                 return base.ContainsFocus;
>>             }
>>         }
>>
>>
>>
>>     }
>> }
>>
>>
>> > Hi,
>> >
>> >
>> >> So do you think it could be a bug with resolving the base class? It
>> >> seems from the trace that it is going into a continuous loop, like 
>> it is
>> >> calling ContainsFocus on itself.
>> >>
>> >
>> > To be honest, all I saw was the segfault rather than the tonnes of
>> > output. The baseclass seems to be working fine as well
>> >
>> > I did the following to your code and if you run it, you'll see that 
>> the
>> > baseclass is fine
>> >
>> > using System;
>> > using System.Drawing;
>> > using System.Collections;
>> > using System.ComponentModel;
>> > using System.Windows.Forms;
>> > using System.Data;
>> >
>> > namespace WinApp4
>> > {
>> >   public class Form1 : System.Windows.Forms.Form
>> >   {
>> >     private System.Windows.Forms.Button button1;
>> >     private System.Windows.Forms.Button button2;
>> >     private System.ComponentModel.Container components = null;
>> >
>> >     public Form1()
>> >     {
>> >       InitializeComponent();
>> >     }
>> >
>> >     protected override void Dispose(bool disposing)
>> >     {
>> >       if (disposing)
>> >       {
>> >         if (components != null)
>> >         {
>> >           components.Dispose();
>> >       }
>> >       }
>> >       base.Dispose(disposing);
>> >     }
>> >
>> >     private void InitializeComponent()
>> >     {
>> >       this.button1 = new System.Windows.Forms.Button();
>> >       this.button2 = new System.Windows.Forms.Button();
>> >       this.SuspendLayout();
>> >
>> >       this.button1.Location = new System.Drawing.Point(96, 32);
>> >       this.button1.Name = "button1";
>> >       this.button1.TabIndex = 0;
>> >       this.button1.Text = "button1";
>> >       this.button1.Click += new 
>> System.EventHandler(this.button1_Click);
>> >
>> >       this.button2.Location = new System.Drawing.Point(96, 80);
>> >       this.button2.Name = "button2";
>> >       this.button2.TabIndex = 1;
>> >       this.button2.Text = "button2";
>> >       this.button2.Click += new 
>> System.EventHandler(this.button2_Click);
>> >
>> >       this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
>> >       this.ClientSize = new System.Drawing.Size(292, 262);
>> >       this.Controls.Add(this.button2);
>> >       this.Controls.Add(this.button1);
>> >       this.Name = "Form1";
>> >       this.Text = "Form1";
>> >       this.ResumeLayout(false);
>> >     }
>> >
>> >     [STAThread]
>> >     static void Main()
>> >     {
>> >       Application.Run(new Form1());
>> >     }
>> >
>> >     private void button1_Click(object sender, System.EventArgs e)
>> >     {
>> >       Console.Write(base.ContainsFocus);
>> >     }
>> >
>> >     private void button2_Click(object sender, System.EventArgs e)
>> >     {
>> >       Console.WriteLine(base.ContainsFocus);
>> >     }
>> >   }
>> > }
>> >
>> > The output (at least on my box) is
>> >
>> > True (button 1 pressed - no return feed)
>> > TrueTrue (button 2 pressed)
>> >
>> > >From the looks of the original code, you've created the second 
>> button,
>> > but never properly instantated it (it is declared as private 
>> swf.button
>> > button2 at the start, but never created using this.button2 = new
>> > swf.button()). That (to me) is the most likely candidate for the
>> > breakage.
>> >
>> > TTFN
>> >
>> > Paul
>> >
>> >
>>
>> _______________________________________________
>> Mono-winforms-list maillist  -  Mono-winforms-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-winforms-list
>>
>
>


More information about the Mono-winforms-list mailing list