Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Erro no Form1_Load Aula 7

Bom dia Galera,

Estou com o seguinte problema. Quando meu Form Load está sendo carregado ele abre o Form antes de ler todos os componentes.

Verifiquei que ele abre o Form quando passa por este objeto

 contas[0].titular.titular = "Vinicius";

Aqui eu tenho um Array de nome CONTAS, o primeiro titular faz referencia a classe Conta(), aonde tem uma referência para a classe cliente,

public Cliente titular { get; set; }

Se eu deixar somente o primeiro titular.

contas[0].titular = "Vinicius";

O compilador da erro de Cannot implicitly convert type 'String' to 'WindowsFormApp1.Cliente'

Quando eu coloco

 contas[0].titular.titular = "Vinicius";

Não da erro na tela, mas quando esta carregando o Load ele aborta após a linha.

O que pode ser??

9 respostas

Oi Vinícius, tudo bem?

Posta aqui os códigos do seu FormLoad, da classe Conta e da classe Cliente pra gente tentar descobrir o que pode estar acontecendo?

Atualmente, qual o comportamento? O form está sendo exibido de que maneira?

Abraço!

Olá Lucas,

Nenhuma dessas contas tem Load, somente a do Form1.

O problema está em carregar os valores para dentro do ComboBox.

Esse é o load do form

public void Form1_Load(object sender, EventArgs e)
        {
            contas = new Conta[2];

            contas[0] = new Conta();
            contas[0].numero = 1;
            contas[0].titular = "Vinicius";


            contas[1] = new Conta();
            contas[1].numero = 2;
            contas[1].titular.titular = "Jessyca";

            foreach (Conta conta in contas)
            {
                comboContas.Items.Add(this.conta.titular);
            }

             //textoTitular.Text = "Vinicius";
            //textoConta.Text = Convert.ToString(1);

        }

A classe conta tem uma objeto da cliente para pegar os atributos dela.

 public class Conta
    {
        public int numero { get; set; }
        public Cliente titular { get; set; }

        public double Saldo { get; protected set; }

        //atributos agencias e cpf omitidos

        Cliente cliente = new Cliente("");

Classe cliente

 public class Cliente
    {
        public string titular;
        public string rg;
        public string cpf;
        public string endereco;
        public int idade;

Quando ele passa por está linha ele carrega do form e da o erro no código, como falei anteriormente

contas[0].titular.titular = "Vinicius";

Oi Vinicius, obrigado pelos códigos.

A classe Conta tem uma propriedade chamada titular que é do tipo Cliente.

Para conseguir atribuir, você precisa criar um cliente e então atribuir para a propriedade titular da Conta. Algo como:

public void Form1_Load(object sender, EventArgs e)
        {
            contas = new Conta[2];

            // uma forma
            Cliente clienteVinicius = new Cliente();
            clienteVinicius.titular = "Vinicius"
            contas[0] = new Conta();
            contas[0].numero = 1;
            contas[0].titular = clienteVinicius;


            // outra forma
            contas[1] = new Conta();
            contas[1].numero = 2;
            contas[1].titular = new Cliente();
            contas[1].titular.tiitular = "Jessyca";

            foreach (Conta conta in contas)
            {
                comboContas.Items.Add(this.conta.titular);
            }

             //textoTitular.Text = "Vinicius";
            //textoConta.Text = Convert.ToString(1);

        }

Faz sentido? Abraço!

A primeira forma não funcionou pq estarei sempre trocando a variável cliente e todos irão ficar com o mesmo valor.

A segunda opção funcionou pois a adição do nome é por indice.

O que eu não entendi foi a necessidade de adicionar a referência para a classe cliente no titular = new cliente (); se dentro da classe Conta eu já tenho referência para Cliente.

Agora as contas estão sendo montadas no array e armazenadas no foreach, mas os valores não estão indo para o Combo Box

  foreach (Conta conta in contas)
            {
                comboContas.Items.Add(this.conta.titular);
            }

Muito obrigado pela ajuda, estamos quase lá :D

Olá amigo consegui resolver aqui.

O meu foreach ficou assim

foreach (Conta cont in contas)
            {
                comboContas.Items.Add(cont.titular.titular);
            }

Muito obrigado pela ajuda, mas se puder responder a minha pergunta na outra dúvida eu agradeço.

Oi Vinicius. Mil desculpas pela demora.

Que bom que funcionou. Esse foi um detalhe que deixei passar. É necessário usar a variável local criada no for, como você fez, utilizando a cont.

--

A sua classe Conta tem uma referência para um Cliente. Quando criamos uma classe temos uma especificação, por meio da qual conseguimos criar vários objetos na memória.

Cada vez que você utiliza o new, um novo objeto é criado na memória. O código abaixo, por exemplo, cria dois objetos do tipo Conta na memória:

new Conta();
new Conta();

Além de criar objetos na memória, conseguimos atribuir essa declaração pra variáveis:

Conta contaJoao = new Conta();
Conta contaAna = new Conta();

Quando você faz isso, contaJoao e contaAna apenas referenciam os objetos criados na memória com o new.

referencias

O objeto é quem irá guardar os valores de fato. Quando você não define qualquer valor, existem valores padrão. Tipos numéricos por exemplo, tem valor 0 por padrão.

Tipos de referência, como o Cliente titular que está dentro da sua Conta, tem valor null por padrão. O que indica que sua referência não aponta para um objeto na memória.

Quando você cria uma Conta:

Conta conta = new Conta();

Você tem a variável conta apontando para um objeto Conta na memória.

Nessa momento, dentro do seu objeto Conta, você consegue apontar para um Cliente. Se você criar uma nova Conta com new, existirá um novo objeto na memória que será capaz de referenciar um objeto Cliente.

Como são objetos separados, quando você define:

Cliente joao = new Cliente();
conta.titular  = joao;

Você está dizendo que a variável titular dentro do objeto para onde conta se referencia, deve referenciar o mesmo objeto que a variável joao se referencia. Ficaria algo como:

referencia cliente conta

Faz sentido? Abraço!

Lucas muito obrigado pela explicação, estendi sim.

A única coisa que não entendi é o motivo do sistema abortar quando eu fazia

Contas[0].titular.titular

Contas faz referência a Titular na classe Conta, que é referencia da classe Cliente.

Aí eu referenciaria o objeto Titular.

Sem a necessidade de criar o objeto através do New () .

Mas gostei muito da sua explicação, só ficou esse problema, eu acho que deveria ter aceito desta forma que fiz a cima.

O que você acha?

solução!

Oi Vinicius!

A referência pra um Cliente (titular), dentro do objeto da classe Conta, precisa apontar para um objeto Cliente. Se você apenas chamar um contas[0].titular.titular, a referencia dentro da classe Conta estará nula.

Por isso antes você precisa ir no objeto Conta e atribuir um valor para esse titular. Exemplo;

Cliente joao = new Cliente();
contas[0].titular = joao;

ou

contas[0].titular = new Cliente();

Com isso o titular dentro deste objeto conta (que é referenciado pela variável Conta) começará a apontar para um objeto. Só então você poderá fazer:

contas[0].titular.titular = "Joao Silva"

Faz sentido? Abraço!

Muto Obrigado Lucas, agora entendi