Jump to content

Programa de pergunta - resposta


katy91
 Share

Recommended Posts

Boas pessoal, eu estou a desenvolver um projecto em vb, que é do género dos exames de código. O programa é para a conclusao do 12ºano, ou seja é a pap, o programa começou a dar uns erros, e eu não encontro solução.

Vou fazer aqui uma breve descrição, o programa escolhe uma pergunta aleatória da base de dados, e a pergunta aparece numa label, até ai tudo bem, cada pergunta tem 4 respostas e só uma delas está correcta, as respostas estão a aparecer num array de 4 botões, mas agora o problema é como vou continuar.  ?

se alguém me poder ajudar, ou se precisarem de mais informações. digam qualquer coisa  👍

Link to comment
Share on other sites

Olá, bem-vinda

o programa começou a dar uns erros, e eu não encontro solução.

E os erros são...? Os problemas com que te deparaste foram...?

Estamos cá para as tuas dúvidas 👍

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"

Link to comment
Share on other sites

bem, isto não está a fazer o que eu queria, ja consegui por os 4 botões com as respostas(cada um com uma), depois para experimentar, tentei que quando clicasse num dos botões me aparecesse uma msgbox a dizer correcto ou errado, o problema é que carrego nos botões e nada acontece, e quando carrego no formulário aparece uma msgbox a dizer correcto  👍

(vocês devem tar mais confusos que eu lool)

se for preciso meto ai uns prints do codigo ou assim, caso não tenham percebido  :dontgetit:

Link to comment
Share on other sites

Imports System.Data.SqlClient

Public Class Form1

    Inherits System.Windows.Forms.Form
    Public btnTestNumButtons() As System.Windows.Forms.Button


    Const constr As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Mario\Documents\Visual Studio 2008\Projects\Mario\Mario\mario.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Carrega na label a pergunta
        Dim db As New SqlConnection(constr)
        db.Open()
        Dim varsql As String
        varsql = "SELECT * FROM perguntas order by newid()"  'instrução SQL de selecção
        Dim cmd As New SqlCommand(varsql, db) 'construção da classe SqlCommand
        Dim dr As SqlDataReader 'declaração da classe SqlDataReader
        dr = cmd.ExecuteReader 'obtenção dos dados
        Dim id_perg As String = "" 'variável que irá conter os dados recolhidos
        Dim perg As String = "" 'variável que irá conter os dados recolhidos
        While dr.Read()
            id_perg = dr.Item("id_pergunta")
            perg = dr.Item("pergunta")

        End While
        Label1.Text = perg
        id_perg = Convert.ToInt32(id_perg)
        db.Close()


        'Colocar as respostas
        Dim db2 As New SqlConnection(constr)
        db2.Open()
        Dim varsql2 As String
        varsql2 = "SELECT resposta, pergunta_resposta.id_resposta,id_respostacorrecta FROM respostas, perguntas, pergunta_resposta WHERE perguntas.id_pergunta=pergunta_resposta.id_pergunta AND pergunta_resposta.id_resposta=respostas.id_resposta AND pergunta_resposta.id_pergunta = " & id_perg
        Dim cmd2 As New SqlCommand(varsql2, db2) 'construção da classe SqlCommand
        Dim dr2 As SqlDataReader 'declaração da classe SqlDataReader
        dr2 = cmd2.ExecuteReader 'obtenção dos dados
        Dim resp As String = "" 'variável que irá conter os dados recolhidos 
        Dim id_resp As Integer
        Dim resp_correcta As Integer

        ' array com 4 botões
        Dim i As Short
        i = 1
        ReDim btnTestNumButtons(4)
        btnTestNumButtons(4) = New System.Windows.Forms.Button

        While dr2.Read()
            resp = dr2.Item("Resposta")
            id_resp = dr2.Item("id_resposta")
            resp_correcta = dr2.Item("id_respostacorrecta")

            'atribui a resposta a um botão
            btnTestNumButtons(i) = New System.Windows.Forms.Button
            With btnTestNumButtons(i)
                .Text() = resp
                .Size() = New Size(100, 100)
                .FlatStyle() = FlatStyle.Popup
                .BackColor() = System.Drawing.Color.Transparent

            End With

            Me.Controls.AddRange(btnTestNumButtons)
            i = i + 1

        End While

        'chama a rotina de posicionamento dos botões
        ButtonStackOrder()

        db2.Close()

    End Sub


    Private Sub ButtonStackOrder()
        'posiciona os botões no form
        btnTestNumButtons(1).Location = New System.Drawing.Point(158, 176)
        btnTestNumButtons(2).Location = New System.Drawing.Point(402, 176)
        btnTestNumButtons(3).Location = New System.Drawing.Point(158, 298)
        btnTestNumButtons(4).Location = New System.Drawing.Point(402, 298)

    End Sub

    Private Sub btnTestNumButtons_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles MyBase.Click
        Dim resp As String = "" 'variável que irá conter os dados recolhidos 
        Dim id_resp As Integer
        Dim resp_correcta As Integer
        If id_resp = resp_correcta Then
            MsgBox("correcto")
        Else
            MsgBox("errado")
        End If

    End Sub

se alguém poder ajudar, é que para a semana tenho que entregar :S

e nem a stora conseguiu fazer nada :o

Link to comment
Share on other sites

O problema está aqui MyBase.Click, esse é o do form... Tu queres é para cada botão por isso tens de lhe adicionar o Handler...

'...
With btnTestNumButtons(i)
                .Text = resp
                .Size = New Size(100, 100)
                .FlatStyle = FlatStyle.Popup
                .BackColor = System.Drawing.Color.Transparent
End With

AddHandler btnTestNumButtons(i).Click, AddressOf validarClick

Agora só tens que definir o procedimento...

Private Sub validarClick(ByVal sender As Object, ByVal e As EventArgs)
        MsgBox("O botão pressionado foi -> " & CType(sender, Button).Text, MsgBoxStyle.Information)
End Sub

Já agora tu estás a declarar 5 botões, e não utilizas o primeiro.... os arrays começam em 0...  👍

*EDIT* - Só olhei para o erro que referistes.

Link to comment
Share on other sites

Já fiz as alterações que me indicaste, agora só ta a dar um erro tipo no posicionamento dos botões  👍 eu já alterei a posição, o tamanho dos botões, mas da sempre o erro  :dontgetit:

http://img809.imageshack.us/img809/5586/erro.png

isto é mesmo confuso  :dontgetit:, vá eu é não percebo nada disto  :down:

obrigado por tares a ajudar  🙂

Link to comment
Share on other sites

Se antes dava agora tb deveria dar...

Só tens de adicionar o addhandler logo a seguir ao with dos botões, e deixar tudo como estava.

E adicionares o procedimento que trata do click nos botões...

Por isso o código deveria funcionar, por acaso alterares-te o tamanho do form?

Link to comment
Share on other sites

sim foi o que eu fiz, só inseri o código que me indicaste, e depois executei e deu esse erro, depois tentei resolver ao mudar a localização, tamanho dos botões, e também mudei o tamanho do form...  :dontgetit:

Link to comment
Share on other sites

Ele não está a encontrar o segundo botão, alguma coisa se passou com o array dos botões!

Public btnTestNumButtons(3) As New System.Windows.Forms.Button

Define logo globalmente os 4 botões (0,1,2,3)...

Depois remove esta linha:

ReDim btnTestNumButtons(4)

Altera o i para começar em 0, em vez de 1.

 i = 0

E por fim onde posicionas os botões, mete 0,1,2,3...

Private Sub  ButtonStackOrder()
        'posiciona os botões no form
        btnTestNumButtons(0).Location = New System.Drawing.Point(158, 176)
        btnTestNumButtons(1).Location = New System.Drawing.Point(402, 176)
        btnTestNumButtons(2).Location = New System.Drawing.Point(158, 298)
        btnTestNumButtons(3).Location = New System.Drawing.Point(402, 298)
End Sub
Link to comment
Share on other sites

essa parte já resolvi, tipo eu apaguei uma parte que tava no ciclo while

 While dr2.Read()
            resp = dr2.Item("Resposta")
            id_resp = dr2.Item("id_resposta")
            resp_correcta = dr2.Item("id_respostacorrecta")

            'atribui a resposta a um botão
            btnTestNumButtons(i) = New System.Windows.Forms.Button
            With btnTestNumButtons(i)
                .Text() = resp
                .Size() = New Size(200, 200)
                .FlatStyle() = FlatStyle.Popup
                .BackColor() = System.Drawing.Color.Red
            End With

            AddHandler btnTestNumButtons(i).Click, AddressOf validarClick
            i = i + 1
        End While

ou seja eu tinha apagado i =i+1 por isso é que o ciclo não tava completo, e dava sempre erro no 2º botão.

Agora o problema é que os botões não aparecem quando executo o programa.

A minha stora teve a ver, e disse que este programa ia-me dar muito trabalho,  e que não sabia se eu conseguia, visto que tenho que entregar até quarta feira e hoje foi a última aula de apoio à pap  😉

acham que devo começar um projecto novo, ou continuar com este até ao fim?

será que há outra maneira mais fácil do que o array de botões?

:dontgetit:

Link to comment
Share on other sites

Para os botões aparecerem só tens de chamar a função ButtonStackOrder depois do While...

Então e a professora em vez de te ajudar diz para desistires?!?!  ? ?

Como é que é possível...

Eu agora estou um bocado ocupado, mas mais logo tenho mais tempo... vê se te safas... se precisares de ajuda podes ir postando que eu depois vejo.  😉

Link to comment
Share on other sites

sim isso já tá depois do while, mas mesmo assim nada.

ela tentou ajudar mas não conseguiu pôr isto a dar  :dontgetit:

mas vou continuar a ver se descubro o problema no programa, entretanto vou deixar ai o código, pode ser que encontres alguma coisa que eu não veja.

Imports System.Data.SqlClient

Public Class Form1

    Inherits System.Windows.Forms.Form
    Public btnTestNumButtons() As System.Windows.Forms.Button


    Const constr As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Mario\Documents\Visual Studio 2008\Projects\Mario\Mario\mario.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Carrega na label a pergunta
        Dim db As New SqlConnection(constr)
        db.Open()
        Dim varsql As String
        varsql = "SELECT * FROM perguntas order by newid()"  'instrução SQL de selecção
        Dim cmd As New SqlCommand(varsql, db) 'construção da classe SqlCommand
        Dim dr As SqlDataReader 'declaração da classe SqlDataReader
        dr = cmd.ExecuteReader 'obtenção dos dados
        Dim id_perg As String = "" 'variável que irá conter os dados recolhidos
        Dim perg As String = "" 'variável que irá conter os dados recolhidos
        While dr.Read()
            id_perg = dr.Item("id_pergunta")
            perg = dr.Item("pergunta")

        End While
        Label1.Text = perg
        id_perg = Convert.ToInt32(id_perg)
        db.Close()


        'Colocar as respostas
        Dim db2 As New SqlConnection(constr)
        db2.Open()
        Dim varsql2 As String
        varsql2 = "SELECT resposta, pergunta_resposta.id_resposta,id_respostacorrecta FROM respostas, perguntas, pergunta_resposta WHERE perguntas.id_pergunta=pergunta_resposta.id_pergunta AND pergunta_resposta.id_resposta=respostas.id_resposta AND pergunta_resposta.id_pergunta = " & id_perg
        Dim cmd2 As New SqlCommand(varsql2, db2) 'construção da classe SqlCommand
        Dim dr2 As SqlDataReader 'declaração da classe SqlDataReader
        dr2 = cmd2.ExecuteReader 'obtenção dos dados
        Dim resp As String = "" 'variável que irá conter os dados recolhidos 
        Dim id_resp As Integer
        Dim resp_correcta As Integer

        ' array com 4 botões
        Dim i As Short
        i = 1
        ReDim btnTestNumButtons(4)
        btnTestNumButtons(4) = New System.Windows.Forms.Button

        While dr2.Read()
            resp = dr2.Item("Resposta")
            id_resp = dr2.Item("id_resposta")
            resp_correcta = dr2.Item("id_respostacorrecta")

            'atribui a resposta a um botão
            btnTestNumButtons(i) = New System.Windows.Forms.Button
            With btnTestNumButtons(i)
                .Text() = resp
                .Size() = New Size(200, 200)
                .FlatStyle() = FlatStyle.Popup
                .BackColor() = System.Drawing.Color.Red
            End With

            AddHandler btnTestNumButtons(i).Click, AddressOf validarClick
            i = i + 1
        End While
        'chama a rotina de posicionamento dos botões
        ButtonStackOrder()

        db2.Close()

    End Sub


    Private Sub ButtonStackOrder()
        'posiciona os botões no form
        btnTestNumButtons(1).Location = New System.Drawing.Point(158, 176)
        btnTestNumButtons(2).Location = New System.Drawing.Point(402, 176)
        btnTestNumButtons(3).Location = New System.Drawing.Point(158, 298)
        btnTestNumButtons(4).Location = New System.Drawing.Point(402, 298)

    End Sub

    ' Private Sub btnTestNumButtons_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles MyBase.Click
    ' Dim resp As String = "" 'variável que irá conter os dados recolhidos 
    'Dim id_resp As Integer
    'Dim resp_correcta As Integer
    'If id_resp = resp_correcta Then
    'MsgBox("correcto")
    ' Else
    ' MsgBox("errado")
    '  End If

    'End Sub

    Private Sub validarClick(ByVal sender As Object, ByVal e As EventArgs)
        MsgBox("O botão pressionado foi -> " & CType(sender, Button).Text, MsgBoxStyle.Information)
    End Sub

End Class

e mais uma vez muito obrigado por tares a perder tempo comigo  😉

Link to comment
Share on other sites

Já consigo resolver o problema que tinha. 😉

faltava o seguinte comando no ciclo while

me.Controls.AddRange(btnTestNumButtons)

tipo agora qual achas que é a melhor forma de continuar o jogo, tipo ao escolher a resposta, dizer se ta certo ou errado.

Link to comment
Share on other sites

Essa linha já lá estava antes...  😉

Agora para continuar o jogo,  tens de alterar um bocado a lógica do programa...

A lógica carregas a primeira pergunta, o utilizador acerta, carregas a 2 pergunta, e por aí adiante...

Deves ter uma variável global para guardar o número de falhas para saber quando terminar, tipo 3 falhas.

Link to comment
Share on other sites

Katy91,

Onde estás a adicionar os botoes ao form ?

O projecto necessita de ter o uso de arrays? É que não faz sentido nenhum estares a usar esse array

O projecto vai mostrar sempre a ultima pergunta que estiver na tabela "perguntas" ?

Atenção ao "scope" das variaveis....

Para a questão dos botoes podes colocar no form load.

        Dim btnResposta As System.Windows.Forms.Button
        Dim xpos As Integer = Me.Size.Width - 200 - 15 ' tamanho do form - tamanho do botao - 15 de margem
        Dim ypos As Integer = 10 ' margem
        For nBtn As Integer = 0 To 4
            btnResposta = New System.Windows.Forms.Button
            btnResposta.Name = "Nome" & nBtn
            btnResposta.Text = btnResposta.Name
            btnResposta.Size = New Size(200, 50)
            btnResposta.FlatStyle = FlatStyle.Popup
            btnResposta.BackColor = Color.Red
            Me.Controls.Add(btnResposta)

            btnResposta.Location = New System.Drawing.Point(xpos, ypos + 50 * (nBtn + 1) + 5) ' margem superior + tamanho do botao * ( indice + 1 ) + margem

            AddHandler btnResposta.Click, AddressOf validarClick
        Next
Link to comment
Share on other sites

bem, ele adiciona os botões automaticamente no form1, através do array.

a minha prof, disse-me quando comecei o projecto, que era necessário o array, pk quando se chamava a pergunta, vinham 4 respostas e dai a ser necessário o array (segundo ela, e eu tive que confiar :dontgetit:).

o projecto selecciona uma pergunta aleatória da base de dados

Link to comment
Share on other sites

Não tinha visto a linha: Me.Controls.AddRange(btnTestNumButtons).

onde está:

            resp = dr2.Item("Resposta")
            id_resp = dr2.Item("id_resposta")
            resp_correcta = dr2.Item("id_respostacorrecta")

            'atribui a resposta a um botão
            btnTestNumButtons(i) = New System.Windows.Forms.Button
            With btnTestNumButtons(i)
                .Text() = resp
                .Size() = New Size(200, 200)
                .FlatStyle() = FlatStyle.Popup
                .BackColor() = System.Drawing.Color.Red
            End With

escreve isto:

            resp = dr2.Item("Resposta")

            'atribui a resposta a um botão
            btnTestNumButtons(i) = New System.Windows.Forms.Button
            With btnTestNumButtons(i)
                .Text() = resp
                .Size() = New Size(200, 200)
                .FlatStyle() = FlatStyle.Popup
                .BackColor() = System.Drawing.Color.Red
                .Tag = dr2.Item("id_resposta").ToString = dr2.Item("id_respostacorrecta").ToString
            End With

a funcao validarClick fica assim:

if CType(sender, Button).Tag then msgbox("Correcto") else msgbox("Errado")

Nao testei .... 😉  mas no fundo estou a usar a propriedade "Tag" do botao cujo o data type é um object para colocar la um boolean com a comparacao da id da resposta com a id da resposta correcta.

Link to comment
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
 Share

×
×
  • 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.