Jump to content
Vitas

Introdução e listagem dos dados sem bd

Recommended Posts

Vitas

Boas,

Estou a tentar a realizar um simples trabalho onde o utilizador tem um form onde introduz jogadores e depois uma listbox onde pode listar os mesmos, isto tudo sem base de dados com a utilização dos gets e sets e arrays, ou seja é um programa OOP.

Já criei as classes necessárias para a introdução de dados o problema é que ao introduzir um novo registo o anterior desaparece. Gostaria de saber como consigo permitir a entrada de mais registos e listar os mesmos na listbox.

Nota: estou a fazer o registo de jogadores, ao registar tenho que escolher uma equipa na combobox(as equipas ja estão predefinidas) e depois tenho que listar o plantel conforme a equipa.

Algumas sugestões?

Obrigado

Share this post


Link to post
Share on other sites
ribeiro55

Não é o usar uma base de dados que arruina o paradigma OOP...

Mostra-nos como é que estás a introduzir o novo "registo". Provavelmente estás a esmagar referências com instâncias novas.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Vitas

esse é o problema... se fosse com a base de dados era mais simples, mas o objectivo é realizar isso sem a bd.

Share this post


Link to post
Share on other sites
Caça

Mostra um bocado de código para vermos onde está o problema.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
BELGA

Se queres guardar jogadores provavelmente vais ter uma classe Jogador, depois para conseguires guardar N jogadores podes ter uma LinkedList.

 Private listaDeJogadores As LinkedList(Of Jogador) = New LinkedList(Of Jogador)

Utilizando essa lista podes adicionar / remover e percorrer os seus elementos (Jogadores).

Share this post


Link to post
Share on other sites
ribeiro55

Porquê uma LinkedList?

Uma simples List(Of ???) faz o trabalho.

Vitas, ninguém te está a dizer que tens de usar db. Estou-te apenas a dizer que o paradigma OOP pode existir com ou sem base de dados.

Mais uma vez, mostra o teu código de criação.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
BELGA

Porquê uma LinkedList?

Uma simples List(Of ???) faz o trabalho.

Vitas, ninguém te está a dizer que tens de usar db. Estou-te apenas a dizer que o paradigma OOP pode existir com ou sem base de dados.

Mais uma vez, mostra o teu código de criação.

Quando não é preciso aceder aleatoriamente aos elementos de uma lista, uma LinkedList é bastante superior, nomeadamente na inserção e eliminação.

Neste caso, se não for necessário aceder aleatóriamente aos elementos da lista não vejo qualquer mal em usar uma LinkedList.

Share this post


Link to post
Share on other sites
ribeiro55

Eu não disse que era mau... :thumbsup:

Eu é que ainda não sei o que é preciso ou não, estamos à espera do Vitas.

À falta de especificidade, a List(Of ???) cobre qualquer coisa.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Vitas

Ok, eu utilizado um modulo para declarar a variavel global

Module variaveis

    Public Jogador As Jogadores


End Module

Depois a classe Jogador

Public Class Jogadores
    Public Nome As String
    Public Posicao As String
    Public Idade As Integer
    Public Equipa As String

    Public Sub New(ByVal jNome As String, ByVal jPosicao As String, ByVal jIdade As Integer, ByVal jEquipa As String)
        Me.Nome = jNome
        Me.Posicao = jPosicao
        Me.Idade = jIdade
        Me.Equipa = jEquipa

    End Sub
    Public Property jNome() As String
        Get
            Return Me.Nome
        End Get
        Set(ByVal value As String)
            Me.Nome = jNome
        End Set
    End Property

    Public Property jPosicao() As String
        Get
            Return Me.Posicao
        End Get
        Set(ByVal value As String)
            Me.Posicao = jPosicao
        End Set
    End Property

    Public Property jIdade() As Integer
        Get
            Return Me.Idade
        End Get
        Set(ByVal value As Integer)
            Me.Idade = jIdade
        End Set
    End Property

    Public Property jEquipa() As String
        Get
            Return Me.Equipa
        End Get
        Set(ByVal value As String)
            Me.Equipa = jEquipa
        End Set
    End Property
End Class

Talvez não é necessário criar linkedlist pois nunca trabalhei com isso, sou novato, talvez um simples array resolvia o problema mas eu não sei trabalhar muito bem com isso...

Share this post


Link to post
Share on other sites
ribeiro55

A tua classe "Jogadores" deveria ser singular: a representar um único jogador.

O fazeres Jogador As Jogadores, estás a criar uma referência (nem sequer é instância) à classe Jogadores, com nome Jogador, o que não faz o menor sentido.

No teu módulo deveria constar algo como:

Public Jogadores As New List(Of Jogador)
'ou
Public Jogadores As New LinkedList(Of Jogador)

Depois basta-te criar instâncias da classe "Jogador" e despachá-las para a lista:

Dim NovoJogador As New Jogador(bla, bla, bla, o resto do teu construtor)
Jogadores.Add(NovoJogador) 'List(Of Jogador)
'ou
Jogadores.AddLast(NovoJogador) 'LinkedList(Of Jogador)

Basta-te isto para manteres uma colecção de jogadores em memória.

É importante que percebas o que estavas a tentar fazer: Estavas pura e simplesmente a referenciar uma variável do tipo jogadores. Não estavas a manter qualquer tipo de colecção.

Outra coisa, de que te vale teres propriedades quando todas as variáveis "internas" estão declaradas como public?

As propriedades existem no contexto do encapsulamento, para conseguires controlar o que entra e o que sai do teu objecto, da forma mais inteligível e segura.

Deveriam ser "Private" neste contexto. (estou a falar de Nome, Posicao, Idade e Equipa)

EDIT: Para além disso, os teus SET das propriedade, não servem para nada uma vez que não estás a utilizar o valor passado (value)

Uma propriedade das tuas correctamente especificada parece-se com isto:

    Public Property jPosicao() As String
        Get
            Return Me.Posicao
        End Get
        Set(ByVal value As String)
            Me.Posicao = value
        End Set
    End Property


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Vitas

Experimentei colocar o código no módulo mas diz me que o type 'jogador' not defined..

Depois onde coloco  o código de

Dim NovoJogador As New Jogador(jNome, jPosicao, jIdade, jEquipa)
           
Jogadores.AddLast(NovoJogador) 'LinkedList(Of Jogador)

Já tentei colocar no form onde adiciono os jogadores mas diz me que o Add is not member of torneio.Jogadores.

Isto é um bocado complicado para mim pois não percebo quase nada de vb, pois estou sempre a trabalhar em php mas agora tenho que realizar este exercício para a escola e como o meu professor disse basta acrescentares um arraylist ao código que já tens..

Não sei se seria mais fácil mas talvéz posso usar o seguinte código ListBox1.AddItem() +1..

Obrigado

Share this post


Link to post
Share on other sites
Vitas

Estou a fazer confusão com a classe jogador que é o item da lista e como adicionar esse item a lista .

Vamos ver se eu estou a perceber, a classe jogador é o item da lista e o módulo é a própria lista, ou seja, o nome, posição, idade, equipa fazem parte da classe jogador que é uma linha da lista certo?

Agora como relaciono os dados da linha com as textbox? Tentei colocar

Me.txtNome = jogador.Nome

mas não funcionou..

e como depois faço para apresentar os valores registados na listbox?

Agradecia imenso que alguém me explicasse esta parte sou mesmo nabo nisto -.-"

Share this post


Link to post
Share on other sites
Caça

Para quê tanto código?

Classe Jogadores

Public Class Jogadores
    Public Property Nome As String
    Public Property Posicao As String
    Public Property Idade As Integer
    Public Property Equipa As String
End Class

Variável onde estão guardados todos os jogadores

Dim J As New List(Of Jogadores)

Adicionar um jogador à lista

J.Add(New Jogadores With {.Nome = "Pedro", .Posicao = "Defesa", .Idade = 10, .Equipa = "Solteiros"})


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
ribeiro55

Sim. O que tens no módulo é a lista.

Cada instância da classe Jogador é "uma linha", vá.

Para levares com: Add is not member of torneio.Jogadores é porque estás a usar o método Add na LinkedList, que não o tem.

Toma atenção aos membros de cada classe.

Listar na listbox é o mais fácil. Podes usar até a própria classe Jogador como item, bastando apenas especificar uma representação string da classe:

        Public Overrides Function ToString() As String
            Return MyBase.Nome
        End Function

E por fim dizer que a DataSource da listbox é nada mais nada menos do que a colecção que tens no módulo.

Poderias também especificar uma propriedade de Jogador para o DisplayMember e poupar o override.

Alternativamente, podes trabalhar directamente com a ListBox, esquecendo a ArrayList, List(Of) ou LinkedList. Não é bonito mas é provavelmente mais fácil de entenderes.

Se trabalhares directamente com a ListBox tens obrigatoriamente de fazer o Override ao método ToString.

Nota: Não podes definir uma LinkedList como DataSource de uma ListBox sem implementar uns interfaces. List(Of) não precisa.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Vitas

Obrigado!

Criei tudo como o caça disse e ficou algo deste género:

Classe Jogadores:

Public Class Jogadores
    Public Nome As String
    Public Posicao As String
    Public Idade As Integer
    Public Equipa As String
    Public Property jNome() As String
        Get
            Return Me.Nome
        End Get
        Set(ByVal value As String)
            Me.Nome = value
        End Set
    End Property
    Public Property jPosicao() As String
        Get
            Return Me.Posicao
        End Get
        Set(ByVal value As String)
            Me.Posicao = value
        End Set
    End Property
    Public Property jIdade() As Integer
        Get
            Return Me.Idade
        End Get
        Set(ByVal value As Integer)
            Me.Idade = value
        End Set
    End Property
    Public Property jEquipa() As String
        Get
            Return Me.Equipa
        End Get
        Set(ByVal value As String)
            Me.Equipa = value
        End Set
    End Property
End Class

Modulo:

Module Lista
    Public J As New List(Of Jogadores)
End Module

Form:

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        J.Add(New Jogadores With {.Nome = Me.TextBox1.Text, .Posicao = Me.TextBox2.Text, .Idade = Me.TextBox3.Text, .Equipa = Me.ComboBox1.Text})
    End Sub
End Class

Agora gostaria de saber como meto os valores na ListBox. Utilizando o Listbox.Items.Add(textbox1.text & textbox2.text...?

Gostaria de saber se é possível filtrar os dados, ou seja, tenho uma combobox com as equipas predefinidas e ao escolher a equipa e ao clicar no botão listar aparece só os jogadores da equipa seleccionada.

Algumas sugestões?

Obrigado

Share this post


Link to post
Share on other sites
ribeiro55

Listar na listbox é o mais fácil. Podes usar até a própria classe Jogador como item, bastando apenas especificar uma representação string da classe:

        Public Overrides Function ToString() As String
            Return MyBase.Nome
        End Function

E por fim dizer que a DataSource da listbox é nada mais nada menos do que a colecção que tens no módulo.

Poderias também especificar uma propriedade de Jogador para o DisplayMember e poupar o override.

Alternativamente, podes trabalhar directamente com a ListBox, esquecendo a ArrayList, List(Of) ou LinkedList. Não é bonito mas é provavelmente mais fácil de entenderes.

Se trabalhares directamente com a ListBox tens obrigatoriamente de fazer o Override ao método ToString.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Vitas

Onde coloco este código no form? E coloco para cada dado um return? como por exemplo

Return MyBase.Nome
Return MyBase.Idade

etc..

Desculpa estar a fazer perguntas um bocado "parvas" mas não conheço o vb e não sei algumas funções  -.-"

Share this post


Link to post
Share on other sites
ribeiro55

Não te desculpes. Ninguém tem de saber tudo.

Não, só pode existir uma devolução por função. Se colocares todas, só a primeira é que volta.

Quando adicionamos a classe Jogador à listbox, não se trata de texto nem números... é uma classe.

Como não há maneira de a identificar para apresentação em texto, por defeito é feita uma tentativa de devolver a representação string da classe.

Se não existir um override a esse método, o que existe por defeito devolveria-te o nome da classe, com namespaces até ela.

Ao fazermos o override estamos a dizer:

"Calma, quando te pedirem para te representares em string, dá-lhes este campo específico, o Nome."

É o que a listbox vai apresentar.

Poderias também concatenar nome com idade, e seria o que aparecia na listbox.

Vais ver resultados se simplesmente colocares o código que te dei na classe Jogador, e adicionares uma nova instância de jogador à listbox.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.