none
Passar um Form como parametro RRS feed

  • Pergunta

  • Saudações Galera !!

    Estou trabalhando com Windows Form.

    Seguinte, eu to tentando criar uma rotina para "Limpar" os campos do meu Form.

    Para isso eu to passando o meu Form por Referencia para minha função externa.

    Estou fazendo dessa forma:

        public partial class FCadastro : Form

        {
            public FCadastro()
            {
                InitializeComponent();
            }

            ...

            ...

            ...

            private void Limpar_Campos()
            {
                Form fForm = this;
                Rotina.Limpar_Formulario(ref fForm);
            }

    Rotina Externa:

            public static void Limpar_Formulario(ref Form fForm)
            {

                  // procura os tipos e limpa;

           }

    Gostaria de Saber se estou fazendo o certo, de forma correta, se eu posso fazer

    isso utilizando o "this", se realmente tenho q criar uma variavel do tipo Form e

    atribuir o Form a essa variavel e entao passa-la como referencia ??

    Hoje do jeito que esta funciona !! Porem é a melhor maneira ?

    Pergunto isso pois não tenho muita experiencia em C#

    Agradeço a todos pela ajuda !!

    Saul Gabeloni

    Londrina - PR

    C#

    segunda-feira, 20 de agosto de 2012 12:42

Respostas

  • Vixe.... cara eu so fui entender isso no ultimo ano da faculdade... na verdade pra entender isso plenamente voce teria que estar acostumado com ponteiros e etc... mas deixa eu tentar simplificar:

    voce tem 2 tipos de Types no C#, os derivados de Object e os derivados de Struct (na verdade obrigatoriamente em orientação a objetos tudo deveria ser derivado de Object, mas isso não ocorre no C#)

    Os tipo derivados de Struct são os tipos primirivos (int,  double, float, bool, decimal....) o resto é objeto (Form, TextBox, Classes...)

    quando voce cria uma variavel de um objeto... essa variavel é na verdade um endereço de memoria para o objeto... uma vez que não se sabe ao certo quantos blocos de memoria o objeto ira ocupar.... então voce trabalhar apenas com esse endereço de memoria... que é o q a gente chama de referencia...

    os tipos primitivos tem tamanho fixo (int tem 32bit, long 64bit...) então quando se cria um tipo primitivo a variavel na verdade contem o valor desse bloco de memoria, e não o seu endereço (tá.. na verdade tambem é o endereço, mas vamos fazer de conta que não é por enquanto) então quando voce passa o valor primitivo a um metodo.. voce passa o seu valor...

    Resumindo... quando for tipo primitivo a passagem é feita por valor, e ai se quiser é necessario usar o argumento pra passar por referencia.

    Quando for um objeto.. a variavel é sempre passada por referencia... não tem como passa por valor...

    Bem a explicação "oficial" ta aqui :

    http://msdn.microsoft.com/pt-br/library/cc517979.aspx

    Qualquer coisa pergunta... se eu conseguir tento explicar melhor...


    Microsoft Community Contributor

    terça-feira, 21 de agosto de 2012 13:46
    Moderador
  • Ola Saul,

        No caso de objetos...  o padrão é passar os paramentros por referencia, na verdade so usamos o ref para tipos simples como int, byte, bool e etc (derivados do struct e nao de object).

       Voce pode fazer seu metodo sem usar o ref e passar o this diretamente como paramentro:

    using System.Linq;
    using System.Reflection;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1 {
        public partial class Form1 : Form {        
            private static void Limpar_Controls(Control parent) {
                foreach (Control control in parent.Controls) {
                    if (control.HasChildren) Limpar_Controls(control);
    
                    if (control is TextBoxBase) {
                        (control as TextBoxBase).Clear();
                    }
    
                    // Limpar outros tipos de controls
                }
            }
    
            public Form1() {
                InitializeComponent();
    
            }
    
            private void button1_Click(object sender, System.EventArgs e) {
                Limpar_Controls(this);
            }
        }
    
    }
    


    Microsoft Community Contributor

    segunda-feira, 20 de agosto de 2012 13:42
    Moderador
  • Poxa vida Rui..., vc estava certo (LOGICO)..., não precisei passar o Form como referencia, mas.. mas..., eu tenho lido bastante sobre C# e não entendi o pulo do gato...pq funcionou sem eu passar por referencia o Form..., pq é uma classe static ?

    Mas até onde eu sei para "efetuar" mudanças numa variavel que vem de outra função é necessário ser por referencia....??



    Vixi.., q salada na minha cabeça....!! hehe...



    Agradeço sua atenção....ja to marcando como resposta, mas se vc puder dar um feedback sobre isso agradeço..!!



    Saul Gabeloni

    Londrina - PR

    C# - Firebird

    Oi,

       Sem problemas... pode argumentar a vontade...

       No caso acima "Limpar_Controls" é um metodo estatico, isso é não tem relação nenhuma com o objeto... eu coloquei na mesma classe no exemplo por ser mais patrico para ilustrar mas voce pode mover o metodo para outra classe em outro namespace... esse sendo publico não tem problema nenhum.

      Mas o que eu quiz ilustrar foi somente o fato que voce pode passar um formulario via paramentro a um metodo qualquer que ele vai ser passado por referencia sem a necessidade de usar o "ref" na declaração do metodo.


    Microsoft Community Contributor


    • Marcado como Resposta gabeloni terça-feira, 21 de agosto de 2012 11:38
    terça-feira, 21 de agosto de 2012 11:37

Todas as Respostas

  • Ola Saul,

        No caso de objetos...  o padrão é passar os paramentros por referencia, na verdade so usamos o ref para tipos simples como int, byte, bool e etc (derivados do struct e nao de object).

       Voce pode fazer seu metodo sem usar o ref e passar o this diretamente como paramentro:

    using System.Linq;
    using System.Reflection;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1 {
        public partial class Form1 : Form {        
            private static void Limpar_Controls(Control parent) {
                foreach (Control control in parent.Controls) {
                    if (control.HasChildren) Limpar_Controls(control);
    
                    if (control is TextBoxBase) {
                        (control as TextBoxBase).Clear();
                    }
    
                    // Limpar outros tipos de controls
                }
            }
    
            public Form1() {
                InitializeComponent();
    
            }
    
            private void button1_Click(object sender, System.EventArgs e) {
                Limpar_Controls(this);
            }
        }
    
    }
    


    Microsoft Community Contributor

    segunda-feira, 20 de agosto de 2012 13:42
    Moderador
  • Ola Rui....

    Como discutir com um Moderador...hehehe...

    Mas pelo que entendi em sua resposta a função para limpar estaria dentro do

    proprio form e namespace...!!

    Mas a função que to criando esta fora, em outro namespace e meu objetivo é tentar

    usar a limpeza dos campos para todos os formularios, salvo alguma exceção que estaria

    dentro do proprio form !

    Ou em sua opinião isso não é a melhor maneira ??

    Agradeço desde já...

    Saul Gabeloni

    Londrina - PR

    C# - Windows Form

    Ola Saul,

        No caso de objetos...  o padrão é passar os paramentros por referencia, na verdade so usamos o ref para tipos simples como int, byte, bool e etc (derivados do struct e nao de object).

       Voce pode fazer seu metodo sem usar o ref e passar o this diretamente como paramentro:

    using System.Linq;
    using System.Reflection;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1 {
        public partial class Form1 : Form {        
            private static void Limpar_Controls(Control parent) {
                foreach (Control control in parent.Controls) {
                    if (control.HasChildren) Limpar_Controls(control);
    
                    if (control is TextBoxBase) {
                        (control as TextBoxBase).Clear();
                    }
    
                    // Limpar outros tipos de controls
                }
            }
    
            public Form1() {
                InitializeComponent();
    
            }
    
            private void button1_Click(object sender, System.EventArgs e) {
                Limpar_Controls(this);
            }
        }
    
    }


    Microsoft Community Contributor


    segunda-feira, 20 de agosto de 2012 14:08
  • Oi,

       Sem problemas... pode argumentar a vontade...

       No caso acima "Limpar_Controls" é um metodo estatico, isso é não tem relação nenhuma com o objeto... eu coloquei na mesma classe no exemplo por ser mais patrico para ilustrar mas voce pode mover o metodo para outra classe em outro namespace... esse sendo publico não tem problema nenhum.

      Mas o que eu quiz ilustrar foi somente o fato que voce pode passar um formulario via paramentro a um metodo qualquer que ele vai ser passado por referencia sem a necessidade de usar o "ref" na declaração do metodo.


    Microsoft Community Contributor

    segunda-feira, 20 de agosto de 2012 14:54
    Moderador
  • Poxa vida Rui..., vc estava certo (LOGICO)..., não precisei passar o Form como referencia, mas.. mas..., eu tenho lido bastante sobre C# e não entendi o pulo do gato...pq funcionou sem eu passar por referencia o Form..., pq é uma classe static ?

    Mas até onde eu sei para "efetuar" mudanças numa variavel que vem de outra função é necessário ser por referencia....??



    Vixi.., q salada na minha cabeça....!! hehe...



    Agradeço sua atenção....ja to marcando como resposta, mas se vc puder dar um feedback sobre isso agradeço..!!



    Saul Gabeloni

    Londrina - PR

    C# - Firebird

    Oi,

       Sem problemas... pode argumentar a vontade...

       No caso acima "Limpar_Controls" é um metodo estatico, isso é não tem relação nenhuma com o objeto... eu coloquei na mesma classe no exemplo por ser mais patrico para ilustrar mas voce pode mover o metodo para outra classe em outro namespace... esse sendo publico não tem problema nenhum.

      Mas o que eu quiz ilustrar foi somente o fato que voce pode passar um formulario via paramentro a um metodo qualquer que ele vai ser passado por referencia sem a necessidade de usar o "ref" na declaração do metodo.


    Microsoft Community Contributor


    • Marcado como Resposta gabeloni terça-feira, 21 de agosto de 2012 11:38
    terça-feira, 21 de agosto de 2012 11:37
  • Vixe.... cara eu so fui entender isso no ultimo ano da faculdade... na verdade pra entender isso plenamente voce teria que estar acostumado com ponteiros e etc... mas deixa eu tentar simplificar:

    voce tem 2 tipos de Types no C#, os derivados de Object e os derivados de Struct (na verdade obrigatoriamente em orientação a objetos tudo deveria ser derivado de Object, mas isso não ocorre no C#)

    Os tipo derivados de Struct são os tipos primirivos (int,  double, float, bool, decimal....) o resto é objeto (Form, TextBox, Classes...)

    quando voce cria uma variavel de um objeto... essa variavel é na verdade um endereço de memoria para o objeto... uma vez que não se sabe ao certo quantos blocos de memoria o objeto ira ocupar.... então voce trabalhar apenas com esse endereço de memoria... que é o q a gente chama de referencia...

    os tipos primitivos tem tamanho fixo (int tem 32bit, long 64bit...) então quando se cria um tipo primitivo a variavel na verdade contem o valor desse bloco de memoria, e não o seu endereço (tá.. na verdade tambem é o endereço, mas vamos fazer de conta que não é por enquanto) então quando voce passa o valor primitivo a um metodo.. voce passa o seu valor...

    Resumindo... quando for tipo primitivo a passagem é feita por valor, e ai se quiser é necessario usar o argumento pra passar por referencia.

    Quando for um objeto.. a variavel é sempre passada por referencia... não tem como passa por valor...

    Bem a explicação "oficial" ta aqui :

    http://msdn.microsoft.com/pt-br/library/cc517979.aspx

    Qualquer coisa pergunta... se eu conseguir tento explicar melhor...


    Microsoft Community Contributor

    terça-feira, 21 de agosto de 2012 13:46
    Moderador
  • Ow loco Rui..., deu uma aula ai...hehehe..

    Entendi perfeitamente....eu ja programo a muito tempo com Delphi e Cobol.., porem tudo estruturado e qdo cai para OOP ai ja complica pra mim.., mas esse conceitos de tipos primitivos, objetos, pilha, memoria, etc.., ta tranquilo..., é q não tinha me atentado para esse detalhe que vc explicou muito bem...

    Tenho q estudar mais o manual do C# e ver os "macetes"...hehehe

    Valeu Cara...

    Muito obrigado pela ajuda...

    Saul Gabeloni

    Londrina - PR

    Vixe.... cara eu so fui entender isso no ultimo ano da faculdade... na verdade pra entender isso plenamente voce teria que estar acostumado com ponteiros e etc... mas deixa eu tentar simplificar:

    voce tem 2 tipos de Types no C#, os derivados de Object e os derivados de Struct (na verdade obrigatoriamente em orientação a objetos tudo deveria ser derivado de Object, mas isso não ocorre no C#)

    Os tipo derivados de Struct são os tipos primirivos (int,  double, float, bool, decimal....) o resto é objeto (Form, TextBox, Classes...)

    quando voce cria uma variavel de um objeto... essa variavel é na verdade um endereço de memoria para o objeto... uma vez que não se sabe ao certo quantos blocos de memoria o objeto ira ocupar.... então voce trabalhar apenas com esse endereço de memoria... que é o q a gente chama de referencia...

    os tipos primitivos tem tamanho fixo (int tem 32bit, long 64bit...) então quando se cria um tipo primitivo a variavel na verdade contem o valor desse bloco de memoria, e não o seu endereço (tá.. na verdade tambem é o endereço, mas vamos fazer de conta que não é por enquanto) então quando voce passa o valor primitivo a um metodo.. voce passa o seu valor...

    Resumindo... quando for tipo primitivo a passagem é feita por valor, e ai se quiser é necessario usar o argumento pra passar por referencia.

    Quando for um objeto.. a variavel é sempre passada por referencia... não tem como passa por valor...

    Bem a explicação "oficial" ta aqui :

    http://msdn.microsoft.com/pt-br/library/cc517979.aspx

    Qualquer coisa pergunta... se eu conseguir tento explicar melhor...


    Microsoft Community Contributor


    terça-feira, 21 de agosto de 2012 14:37