none
System::ComponentModel::Container ^components; RRS feed

  • Pergunta

  • Bem gente, iniciei um projeto que usará windows forms, estou tendo meu primeiro contato com WF, criei um formulário com o designer e no código gerado pelo Designer ele adicionou uma intância de System::ComponentModel::Container

    System::ComponentModel::Container ^components;
    


    Essa instância não é iniciada em nenhuma outra parte do código, qual a finalidade dessa instancia? E o que tem nesse espaço de nomes System::ComponentModel::Container

    grato gente!


    I love Difficulty
    quinta-feira, 7 de julho de 2011 01:25

Respostas

  • Matheus,

    Normalmente este field é inicializado no método InitializeComponents do seu Form. Ele serve basicamente para fazer o Dispose de componentes (visuais ou não) que implementam um construtor que tenha um parâmetro IContainer como por exemplo o ToolTip e o BindingSource.

    Geralmente quando você cria um novo formulário, este Field é declarado no seu arquivo de Code Behind e é inicializado automaticamente no InitializeComponents e quando um controle que tem um construtor que recebe este IContainter é criado (também dentro do InitializeComponents) este construtor é utilizado e este controle "se adiciona" na lista de componentes.

    Repare também que o método Dispose também é implementado automaticamente com um código para chamar o Dispose dos componentes que estão dentro deste containter.

    Repare no seu arquivo de Code Behind, o normal é ele ser assim:

    partial class Form1
    {
      /// <summary>
      /// Required designer variable.
      /// </summary>
      private System.ComponentModel.IContainer components = null;
    
      /// <summary>
      /// Clean up any resources being used.
      /// </summary>
      /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
      protected override void Dispose(bool disposing)
      {
       if (disposing && (components != null))
       {
        components.Dispose();
       }
       base.Dispose(disposing);
      }
    
      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
      private void InitializeComponent()
      {
       this.components = new System.ComponentModel.Container();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
      }
    }
    

    Mais:

    http://msdn.microsoft.com/en-us/library/system.componentmodel.container.aspx

    http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 7 de julho de 2011 13:19
    Moderador
  • Ele deveria ser inicializado no InitializeComponents, na primeira linha:

     private void InitializeComponent()
     {
      this.components = new System.ComponentModel.Container();
    

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 7 de julho de 2011 18:01
    Moderador
  • Pelo que vi não... Eu criei um form vazio aqui e ele vem com a inicialização correta.

    Agora... eu já vi acontecer de o designer "perder" este código de inicialização, agora em quais circunstâncias isto acontece eu não sei te dizer.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 7 de julho de 2011 20:22
    Moderador

Todas as Respostas

  • Matheus,

    Normalmente este field é inicializado no método InitializeComponents do seu Form. Ele serve basicamente para fazer o Dispose de componentes (visuais ou não) que implementam um construtor que tenha um parâmetro IContainer como por exemplo o ToolTip e o BindingSource.

    Geralmente quando você cria um novo formulário, este Field é declarado no seu arquivo de Code Behind e é inicializado automaticamente no InitializeComponents e quando um controle que tem um construtor que recebe este IContainter é criado (também dentro do InitializeComponents) este construtor é utilizado e este controle "se adiciona" na lista de componentes.

    Repare também que o método Dispose também é implementado automaticamente com um código para chamar o Dispose dos componentes que estão dentro deste containter.

    Repare no seu arquivo de Code Behind, o normal é ele ser assim:

    partial class Form1
    {
      /// <summary>
      /// Required designer variable.
      /// </summary>
      private System.ComponentModel.IContainer components = null;
    
      /// <summary>
      /// Clean up any resources being used.
      /// </summary>
      /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
      protected override void Dispose(bool disposing)
      {
       if (disposing && (components != null))
       {
        components.Dispose();
       }
       base.Dispose(disposing);
      }
    
      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
      private void InitializeComponent()
      {
       this.components = new System.ComponentModel.Container();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
      }
    }
    

    Mais:

    http://msdn.microsoft.com/en-us/library/system.componentmodel.container.aspx

    http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 7 de julho de 2011 13:19
    Moderador
  • Vc inicializou manualmente o seu objeto components? Ou ele é iniciado automaticamente pelo visual studio quando vc usa um componente que receba IContainer?
    I love Difficulty
    quinta-feira, 7 de julho de 2011 14:10
  • Ele deveria ser inicializado no InitializeComponents, na primeira linha:

     private void InitializeComponent()
     {
      this.components = new System.ComponentModel.Container();
    

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 7 de julho de 2011 18:01
    Moderador
  • Será que ele não inicializou pelo fato de eu não ter ainda nenhum controle no form? Está só o form vazio.
    I love Difficulty
    quinta-feira, 7 de julho de 2011 19:09
  • Pelo que vi não... Eu criei um form vazio aqui e ele vem com a inicialização correta.

    Agora... eu já vi acontecer de o designer "perder" este código de inicialização, agora em quais circunstâncias isto acontece eu não sei te dizer.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 7 de julho de 2011 20:22
    Moderador