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

Dúvida no Ex. 1 da Aula 4 - Mão na Massa - Formulários

Não estou conseguindo resolver este exercício nem com o modelo que se encontra na parte de solução... Estou tendo dificuldade de retornar os valores digitados no textbox para o programa principal, sempre da erro(Referência de objeto não definida para uma instância de um objeto.).

    public partial class Form1 : Form
    {
        private Contas[] ArrayContas;
        private int numeroDeContas;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ArrayContas = new Contas[3];

            ArrayContas[0] = new ContasCorrente();
            Clientes Cliente0 = new Clientes("Robinson");
            ArrayContas[0].Cliente = Cliente0;

            ArrayContas[1] = new ContasCorrente();
            Clientes Cliente1 = new Clientes("Victor");
            ArrayContas[1].Cliente = Cliente1;

            ArrayContas[2] = new ContasCorrente();
            Clientes Cliente2 = new Clientes("Mario");
            ArrayContas[2].Cliente = Cliente2;

            for (int i = 0; i < 3; i++)
            {
                ArrayContas[i].Numero = i;
            }

            foreach (Contas contas in ArrayContas)
            {
                comboTitular.Items.Add(contas.Cliente.Titular);
            }

            foreach (Contas contas in ArrayContas)
            {
                comboDestidoDaTransferencia.Items.Add(contas.Cliente.Titular);
            }

        }

        private void comboTitular_SelectedIndexChanged(object sender, EventArgs e)
        {
            int indiceSelecionado = comboTitular.SelectedIndex;
            Contas contaSelecionada = this.ArrayContas[indiceSelecionado];

            textTitular.Text = contaSelecionada.Cliente.Titular;
            textNumero.Text = Convert.ToString(contaSelecionada.Numero);
            textSaldo.Text = Convert.ToString(contaSelecionada.Saldo);

        }

        private void buttonSaque_Click(object sender, EventArgs e)
        {
            int i = Convert.ToInt32(textNumero.Text);
            ArrayContas[i].Saque(Convert.ToDouble(textValorSaque.Text));

            textSaldo.Text = Convert.ToString(ArrayContas[i].Saldo);
        }

        private void buttonDeposito_Click(object sender, EventArgs e)
        {
            int i = Convert.ToInt32(textNumero.Text);
            ArrayContas[i].Deposito(Convert.ToDouble(textValorDeposito.Text));

            textSaldo.Text = Convert.ToString(ArrayContas[i].Saldo);

        }

        private void buttonTransferencia_Click(object sender, EventArgs e)
        {
            int i = Convert.ToInt32(textNumero.Text);
            int j = Convert.ToInt32(textNumeroTransferencia.Text);

            ArrayContas[i].Transferencia(Convert.ToDouble(textValorTransferencia.Text), ArrayContas[i], ArrayContas[j]);

            textSaldo.Text = Convert.ToString(ArrayContas[i].Saldo);

            textSaldoTransferencia.Text = Convert.ToString(ArrayContas[j].Saldo);

        }

        private void comboDestidoDaTransferencia_SelectedIndexChanged(object sender, EventArgs e)
        {
            int indiceSelecionado = comboDestidoDaTransferencia.SelectedIndex;
            Contas contaSelecionada = this.ArrayContas[indiceSelecionado];

            textTitularTransferencia.Text = contaSelecionada.Cliente.Titular;
            textNumeroTransferencia.Text = Convert.ToString(contaSelecionada.Numero);
            textSaldoTransferencia.Text = Convert.ToString(contaSelecionada.Saldo);
        }

        private void buttonAdicionarConta_Click(object sender, EventArgs e)
        {
            CadastroDeConta cadastro = new CadastroDeConta();
            cadastro.ShowDialog();
        }

        public void AdicionaConta(Contas c)
        {
            this.ArrayContas[this.numeroDeContas] = c;
            this.numeroDeContas++;
            comboTitular.Items.Add(c);
        }

    }
    public partial class CadastroDeConta : Form
    {
        private Form1 aplicacaoPrincipal;
        public CadastroDeConta(Form1 aplicacaoPrincipal)
        {
            this.aplicacaoPrincipal = aplicacaoPrincipal;
        }

        public CadastroDeConta()
        {
            InitializeComponent();
        }

        private void buttonAdicionaConta_Click(object sender, EventArgs e)
        {
            ContasCorrente c = new ContasCorrente();
            {
                c.Numero = Convert.ToInt32(textAdicionaContaNumero.Text);
                c.Titular = textAdicionaContaNome.Text;
                this.aplicacaoPrincipal.AdicionaConta(c);
            }
        }
    }
6 respostas

Eu estava com esse problema, também. Resolvi ao aumentar o tamanho do array de contas para 10, incrementar a variável numeroDeContas a cada vez que criava uma conta nova (Robinson, Victor e Mario, no seu caso) e passei essa variável como critério de parada no For que vem abaixo.

            ArrayContas = new Contas[10];

            ArrayContas[0] = new ContasCorrente();
            Clientes Cliente0 = new Clientes("Robinson");
            ArrayContas[0].Cliente = Cliente0;
            numeroDeContas++;

            for (int i = 0; i < numeroDeContas; i++)
            {
                ArrayContas[i].Numero = i;
            }

Assim ainda não está dando certo, continua com erro no mesmo lugar...

Robinson,

Você disse que não está conseguindo recuperar os valores digitados no textbox para o programa principal. Isso seria nos métodos dos botões de Saque e Depósito, certo?

De qualquer forma, eu achei meio estranho o código deles:

        private void buttonSaque_Click(object sender, EventArgs e)
        {
            int i = Convert.ToInt32(textNumero.Text);
            ArrayContas[i].Saque(Convert.ToDouble(textValorSaque.Text));

            textSaldo.Text = Convert.ToString(ArrayContas[i].Saldo);
        }

        private void buttonDeposito_Click(object sender, EventArgs e)
        {
            int i = Convert.ToInt32(textNumero.Text);
            ArrayContas[i].Deposito(Convert.ToDouble(textValorDeposito.Text));

            textSaldo.Text = Convert.ToString(ArrayContas[i].Saldo);

        }

A forma como você está recuperando a conta e fazendo o depósito/saque está errada. Você deveria recuperar a conta usando a comboContas:

        private void buttonSaque_Click(object sender, EventArgs e)
        {
            int indiceSelecionado = comboDestidoDaTransferencia.SelectedIndex;
            Contas contaSelecionada = this.ArrayContas[indiceSelecionado];
            contaSelecionada.Saque(Convert.ToDouble(textValorSaque.Text));

            textSaldo.Text = Convert.ToString(contaSelecionada.Saldo);
        }

        private void buttonDeposito_Click(object sender, EventArgs e)
        {
            int indiceSelecionado = comboDestidoDaTransferencia.SelectedIndex;
            Contas contaSelecionada = this.ArrayContas[indiceSelecionado];
            contaSelecionada.Deposito(Convert.ToDouble(textValorDeposito.Text));

            textSaldo.Text = Convert.ToString(contaSelecionada.Saldo);

        }

Outra dúvida que tenho é: Por que você criou dois campos de texto para valor? Um para Depósito e um para Saque? Dá para você trabalhar com um campo de texto somente (textoValor) e usar nas duas ações. Inclusive, no transfere tb

Na verdade os métodos de saque e depósito estão funcionando corretamente, o que não funciona é o método de inclusão de nova conta. Excluí todo o código e estou fazendo de novo, para ver o que eu perdi...

Ah...entendi. Isso responde a pergunta e eu consigo responder sua dúvida.

A sua classe CadastroDeConta está com dois construtores. Veja:

public partial class CadastroDeConta : Form
    {
        private Form1 aplicacaoPrincipal;
        public CadastroDeConta(Form1 aplicacaoPrincipal)
        {
            this.aplicacaoPrincipal = aplicacaoPrincipal;
        }

        public CadastroDeConta()
        {
            InitializeComponent();
        }

        private void buttonAdicionaConta_Click(object sender, EventArgs e)
        {
            ContasCorrente c = new ContasCorrente();
            {
                c.Numero = Convert.ToInt32(textAdicionaContaNumero.Text);
                c.Titular = textAdicionaContaNome.Text;
                this.aplicacaoPrincipal.AdicionaConta(c);
            }
        }
    }

Veja que vocẽ tem o construtor padrão e tem o construtor que recebe uma referência de aplicacaoPrincipal. Para você poder adicionar um usuário no seu Array, você precisa de uma referência da aplicação principal.

Por isso, a classe CadastroDeConta NÃO pode ter o construtor padrão (sem parâmetros). Somente o construtor que recebe a referência da aplicação principal.

Ou seja, sua classe deve ficar assim:

public partial class CadastroDeConta : Form
    {
        private Form1 aplicacaoPrincipal;
        public CadastroDeConta(Form1 aplicacaoPrincipal)
        {
            this.aplicacaoPrincipal = aplicacaoPrincipal;
        }

        private void buttonAdicionaConta_Click(object sender, EventArgs e)
        {
            ContasCorrente c = new ContasCorrente();
            {
                c.Numero = Convert.ToInt32(textAdicionaContaNumero.Text);
                c.Titular = textAdicionaContaNome.Text;
                this.aplicacaoPrincipal.AdicionaConta(c);
            }
        }
    }

E vocẽ tem que mudar também na classe Form1 o método:

private void buttonAdicionarConta_Click(object sender, EventArgs e)
        {
            CadastroDeConta cadastro = new CadastroDeConta(this);
            cadastro.ShowDialog();
        }

Você tem que passar o this como argumento do construtor.

solução!

Consegui resolver o problema... A maior parte dele era uma coisa bem simples que faltava.

foreach (Conta conta in ArrayContas)
            {
                if (conta != null)
                {
                    comboTitular.Items.Add(conta.Cliente.Titular);
                }
            }

Até colocar, tudo que usava como base o tamanha do array dava errado.