Usuário com melhor resposta
Passar um Form como parametro

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#
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
- Marcado como Resposta Levi DomingosModerator terça-feira, 21 de agosto de 2012 15:29
-
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
- Sugerido como Resposta Levi DomingosModerator segunda-feira, 20 de agosto de 2012 20:04
- Marcado como Resposta Levi DomingosModerator terça-feira, 21 de agosto de 2012 15:29
-
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# - FirebirdOi,
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
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
- Sugerido como Resposta Levi DomingosModerator segunda-feira, 20 de agosto de 2012 20:04
- Marcado como Resposta Levi DomingosModerator terça-feira, 21 de agosto de 2012 15:29
-
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
-
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
-
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# - FirebirdOi,
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
-
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
- Marcado como Resposta Levi DomingosModerator terça-feira, 21 de agosto de 2012 15:29
-
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