Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Edierb en 29 Marzo 2017, 18:37 PM

Título: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Edierb en 29 Marzo 2017, 18:37 PM
Hola muchachos buen día.
Bueno el asunto es el siguiente, estoy creando un cuestionario con 5 preguntas una pregunta por cada form, lo que quiero es hacer que cuando inicie el programa las preguntas o mas bien los form salgan de una forma aleatoria y que no se repitan las que ya se han contestado.
Título: Re: Crear forma que aparezcan en forma aleatoria.
Publicado por: Eleкtro en 29 Marzo 2017, 19:05 PM
Cita de: Edierb en 29 Marzo 2017, 18:37 PM
Hola muchachos buen día.
Hola.

Cita de: Edierb en 29 Marzo 2017, 18:37 PMBueno el asunto es el siguiente, estoy creando un cuestionario con 5 preguntas una pregunta por cada forma

Pues lo primero de todo: muestra el código -y aclara si tu duda es sobre VB6, o más bien VB.NET.

¡Saludos!
Título: Re: Crear forma que aparezcan en forma aleatoria.
Publicado por: Edierb en 29 Marzo 2017, 20:05 PM
Bueno estoy trabajando con VB 2012
Título: Re: Crear forma que aparezcan en forma aleatoria.
Publicado por: Edierb en 29 Marzo 2017, 21:32 PM
bueno el código es este.

Código (vbnet) [Seleccionar]
Private Sub Siguiente_Click(sender As Object, e As EventArgs) Handles Siguiente.Click
       form3.Show()
       Me.Hide()
   End Sub

este es el código que tengo para pasar de un form a otro, las preguntas las tengo en form independientes.
lo que quiero es que cada ves que clike en el boton los form no salgan en orden si no en forma aleatoria y que no se repitan los que ya han salido.

y este es el codigo donde se hace la verificación de las respuestas

Código (vbnet) [Seleccionar]
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Me.Close()
       Dim puntaje As Integer
       puntaje = 0
       If Form2.RadioButton3.Checked = True Then puntaje = puntaje + 5
       If form3.RadioButton3.Checked = True Then puntaje = puntaje + 5
       If Form4.RadioButton1.Checked = True Then puntaje = puntaje + 5
       If RadioButton1.Checked = True Then puntaje = puntaje + 5


       MsgBox("Su puntuacion es:" + Str(puntaje) + "/25", MsgBoxStyle.Exclamation)
       If puntaje >= 20 Then
           MsgBox("Felicidades")
           Timer1.Enabled = True
       ElseIf MsgBox("Debe estudiar un poco más") Then
           Timer1.Enabled = False
       End If
   End Sub


Título: Re: Crear forma que aparezcan en forma aleatoria.
Publicado por: Eleкtro en 29 Marzo 2017, 23:19 PM
Cita de: Edierb en 29 Marzo 2017, 21:32 PM
bueno el código es este.

Código (vbnet) [Seleccionar]
Private Sub Siguiente_Click(sender As Object, e As EventArgs) Handles Siguiente.Click
       form3.Show()
       Me.Hide()
   End Sub

este es el código que tengo para pasar de un form a otro, las preguntas las tengo en form independientes.
lo que quiero es que cada ves que clike en el boton los form no salgan en orden si no en forma aleatoria y que no se repitan los que ya han salido.

Bueno, una forma óptima de hacerlo sería mediante el uso de una pila:

Código (vbnet) [Seleccionar]
' Una colección enumerable para especificar cuales forms queremos procesar/mostrar.
Private forms As IEnumerable(Of Form) = {Form2, Form3, Form4, Form5, etc...}

' Una pila en la que iremos añadiendo una referencia de los forms de manera desordenada (aleatoria).
Private ReadOnly stackForm As New Stack(Of Form)

' Una instancia de la class Random que utilizaremos para generar secuencias numéricas aleatorias.
Private ReadOnly rand As New Random()

Private Sub Siguiente_Click(sender As Object, e As EventArgs) Handles Siguiente.Click

   ' Si la pila de forms está vacía...
   If (stackForm.Count = 0) Then
       ' Ordenamos la secuencia enumerable de forma aleatoria.
       Me.forms = (From x As Form In forms Order By rand.Next())
       ' e iteramos la secuencia resultante para ir añadiendo todos los forms a la pila.
       For Each f As Form In Me.forms
           stackForm.Push(f)
       Next f
   End If

   ' Eliminanos el siguiente elemento de la pila para obtener el siguiente Form.
   Dim nextForm As Form = stackForm.Pop()
   ' Ocultamos el Form principal, mostramos el form obtenido, y etcétera...
   Me.Hide()
   nextForm.ShowDialog(Me)
   Me.Show()

End Sub


Si tienes cualquier duda al respecto, pregunta.

¡Un saludo!
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Edierb en 30 Marzo 2017, 00:18 AM
Hola muchas gracias por responder, bueno la verdad si tengo preguntas, la verdad soy nuevo y no se mucho de programación,  mi pregunta seria: este código que me das los ingreso en un form nuevo o lo ingredo en cada uno de los form donde tengo las preguntas.
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Eleкtro en 30 Marzo 2017, 00:25 AM
Cita de: Edierb en 30 Marzo 2017, 00:18 AMeste código que me das los ingreso en un form nuevo o lo ingredo en cada uno de los form donde tengo las preguntas.

Ese código debes añadirlo tan solo al Form principal, o mejor dicho al form que vayas a usar para mostrar los demás forms que contengan "las preguntas".

EDITO:
Por cierto, en el código que te mostré me acabo de dar cuenta que escribí mal el nombre del botón:
Private Sub Siguiente_Click(sender As Object, e As EventArgs) Handles Button.Click
Debería ser así:
Private Sub Siguiente_Click(sender As Object, e As EventArgs) Handles Siguiente.Click
...lo comento para evitarte posibles confusiones.

¡Saludos!
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Edierb en 30 Marzo 2017, 01:23 AM
ok gracias
voy a intentar, luego le comento haber como me va
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Edierb en 30 Marzo 2017, 14:45 PM
Cita de: Eleкtro en 30 Marzo 2017, 00:25 AM
Ese código debes añadirlo tan solo al Form principal, o mejor dicho al form que vayas a usar para mostrar.
Hola saludos.
Bueno el código corre bien cumple su función que es la de generar form  aleatoriamente, el problema es que para que esto suceda siempre tengo que darle clik al form  principal y esto no es lo que se quiere, lo que yo busco es que cuando de clik en el botón iniciar me abra un form hay contesto una serie de preguntas y luego le doy clik en el botón siguiente y que me habrá otro form y asi sucesivamente, además los form  que ya he contestado se repiten y no quiero que se repitan.
Le agradezco por su colaboración, claro que si hay otra forma de crear un cuestionario tipo text con preguntas aleatorias me gustaría me comentara como hacerlo.
Saludos.
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Serapis en 30 Marzo 2017, 18:45 PM
Crea un nuevo proyecto, añade un formulario con un solo botón y añade una clase llamada "cuestionario"...

No he tenido tiempo de probarlo (creando un fichero de ejemplo y tal) si te sale algún error trata de solucionarlo y si no puedes me comentas... ahora tengo que salir...

Este sería el código para la clase:
Código (vbnet) [Seleccionar]

Public Class Cuestionario
   Private p_Preguntas() As CuestionProfesor
   Private p_NumPreguntas As Integer
   Private p_Next As Integer
   Private p_Aciertos As Integer

   Private Rnd_M As Integer
   Private Rnd_Q As Integer
   Private Rnd_P As Integer


   Public Enum RespuestasPosibles
       RESPUESTA_A = 0
       RESPUESTA_B = 1
       RESPUESTA_C = 2
       RESPUESTA_D = 3
   End Enum

   ''' <summary>
   ''' La pregunta que rellena el profesor.
   ''' </summary>
   ''' <remarks>Al hacer el test, se envía al alumno, una copia de la pregunta y respuestas únicamente.</remarks>
   Public Structure CuestionProfesor
       Public Pregunta As String
       Public Respuesta1 As String
       Public Respuesta2 As String
       Public Respuesta3 As String
       Public Respuesta4 As String
       Public Solucion As RespuestasPosibles    '
       Friend Acierto As Boolean ' para no hacer trampas...

       ''' <summary>
       ''' Convierte una pregunta del profesor en una del alumno.
       ''' </summary>
       ''' <returns>Devuelve una copia idéntica de la pregunta y las posibles respuestas.</returns>
       ''' <remarks></remarks>
       Friend Function Convertir() As CuestionAlumno
           With Convertir
               .Pregunta = Me.Pregunta
               .Respuesta1 = Me.Respuesta1
               .Respuesta2 = Me.Respuesta2
               .Respuesta3 = Me.Respuesta3
               .Respuesta4 = Me.Respuesta4
           End With
           Return Convertir
       End Function
   End Structure

   ''' <summary>
   ''' La pregunta que se envía para ser respondida.
   ''' </summary>
   ''' <remarks>Es una copia de la "pregunta del profesor"</remarks>
   Public Structure CuestionAlumno
       Public Pregunta As String
       Public Respuesta1 As String
       Public Respuesta2 As String
       Public Respuesta3 As String
       Public Respuesta4 As String

       Public Function Convertir(ByRef Texto As String) As RespuestasPosibles
           Select Case Texto
               Case "0" : Return RespuestasPosibles.RESPUESTA_A
               Case "1" : Return RespuestasPosibles.RESPUESTA_B
               Case "2" : Return RespuestasPosibles.RESPUESTA_C
               Case "3" : Return RespuestasPosibles.RESPUESTA_D
               Case Else : Return RespuestasPosibles.RESPUESTA_A
           End Select
       End Function
   End Structure

   ''' <summary>
   ''' Envía al cliente la pregunta actual del test.
   ''' </summary>
   ''' <param name="Pregunta">Una estructura conteniendo la pregunta y las posibles respuestas.</param>
   ''' <param name="Respuesta">El índice de respuesta que dió el usuario del cliente.</param>
   ''' <remarks></remarks>
   Public Event Test(ByRef Pregunta As CuestionAlumno, ByRef Respuesta As RespuestasPosibles)
   ''' <summary>
   ''' Solicita al cliente los datos de una cuestión.
   ''' </summary>
   ''' <param name="Pregunta">Pregunta que se formula</param>
   ''' <param name="Respuesta1">Posible respuesta -A-</param>
   ''' <param name="Respuesta2">Posible Respuesta -B-</param>
   ''' <param name="Respuesta3">Posible respuesta -C-</param>
   ''' <param name="Respuesta4">Posible respuesta -D-</param>
   ''' <param name="Solucion">Indice de la solución correcta a la pregunta entre las 4 (rango 0-3)</param>
   ''' <remarks></remarks>
   Public Event EntrarPregunta(ByRef Pregunta As String, ByRef Respuesta1 As String, ByRef Respuesta2 As String, ByRef Respuesta3 As String, ByRef Respuesta4 As String, ByRef Solucion As RespuestasPosibles)
   ''' <summary>
   ''' Informa al cliente que se ya se han realizado todas las preguntas del cuestionario.
   ''' </summary>
   ''' <param name="Aciertos">Entrega el número de aciertos que se obtuvo.</param>
   ''' <param name="RepetirTest">Pregunta al cliente si se desea repetir (reiniciar) el mismo test</param>
   ''' <remarks></remarks>
   Public Event FinDeCuestionario(ByVal Aciertos As Byte, ByRef RepetirTest As Boolean)
   ''' <summary>
   ''' Solicita el cliente si desea rellenar el cuestionario actual
   ''' </summary>
   ''' <param name="NumPreguntas">Un valor 0, expresa que no se desea realizar otro cuestionario.</param>
   ''' <remarks></remarks>
   Public Event IntroducirNuevoCuestionario(ByRef NumPreguntas As Byte)




   ''' <summary>
   ''' Devuelve el número de preguntas que tiene el cuestionario actual.
   ''' </summary>
   ''' <value></value>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public ReadOnly Property CantidadDePreguntas As Integer
       Get
           Return p_NumPreguntas
       End Get
       'Set(ByVal value As Byte)
       '    Call ComenzarTest(value)
       'End Set
   End Property

   ''' <summary>
   ''' Solicita la entrega de una nueva cuestión.
   ''' </summary>
   ''' <remarks>Si alcanza el final, devuelve un evento para solicitar si se desea barajar de nuevo el test actual.</remarks>
   Public Sub Siguiente()
       Dim r As RespuestasPosibles
       Dim ca As CuestionAlumno
       Dim np As Byte = 0

       If (p_Next < p_NumPreguntas) Then
           ca = p_Preguntas(p_Next).Convertir
           RaiseEvent Test(ca, r)
           If (p_Preguntas(p_Next).Solucion = r) Then
               p_Preguntas(p_Next).Acierto = True
               p_Aciertos += 1
           End If

           p_Next += 1
       End If

       If (p_Next = p_NumPreguntas) Then
           Dim barajaOtraVez As Boolean = False

           RaiseEvent FinDeCuestionario(p_Aciertos, barajaOtraVez)

           If (barajaOtraVez = True) Then
               Call Barajar()
               ca = p_Preguntas(p_Next).Convertir
               RaiseEvent Test(ca, r) ' aquí, p_next vale ahora mismo 0.
               If (p_Preguntas(p_Next).Solucion = r) Then
                   p_Preguntas(p_Next).Acierto = True
                   p_Aciertos += 1
               End If
           Else
               RaiseEvent IntroducirNuevoCuestionario(np)
               If (np > 0) Then
                   Call ComenzarTest(np)
               End If
           End If
           'Call MessageBox.Show("No existe la pregunta número: " & p_next.ToString & vbNewLine & "Realice una nueva petición, el número máximo de pregunta es: " & (p_NumPreguntas-1).ToString)
       End If
   End Sub

   'Public Sub New()
   '    Me.New(6)
   'End Sub

   'Public Sub New(ByVal NumPreguntas As Byte)
   '    Call ComenzarTest(NumPreguntas)
   'End Sub

   ''' <summary>
   ''' Solicita al cliente que introduzca los datos del nuevo cuestionario.
   ''' </summary>
   ''' <param name="NumPreguntas">Cantidad de preguntas que tendrá el cuestionario</param>
   ''' <remarks>Se invoca al crear la clase y cuendo se ha finalizado el cuestionario actual</remarks>
   Public Sub ComenzarTest(ByVal NumPreguntas As Byte)
       Dim k As Integer, q As CuestionProfesor

       If (p_NumPreguntas = 0) Then
           Rnd_M = 5 : Rnd_Q = 11 : Rnd_P = 767
       Else ' evitamos números pares...
           Rnd_M = ((Rnd_M Mod 81) + 2)
           Rnd_Q = ((Rnd_Q Mod 353) + 4)
           Rnd_P = ((Rnd_P Mod 2311) + 8)
       End If

       p_NumPreguntas = NumPreguntas
        ReDim p_Preguntas(0 To p_NumPreguntas)

        For k = 0 To NumPreguntas - 1
           With q
               .Pregunta = ""
               .Respuesta1 = ""
               .Respuesta2 = ""
               .Respuesta3 = ""
               .Respuesta4 = ""
               .Solucion = 0
               ' ahora se ofrece la oportunidad de rellenar el cuestionario (que quizás esté guardado en un fichero)...
               RaiseEvent EntrarPregunta(.Pregunta, .Respuesta1, .Respuesta2, .Respuesta3, .Respuesta4, .Solucion)
               p_Preguntas(k) = q ' y se almacena...
           End With
       Next

       Call Barajar()
   End Sub


   ''' <summary>
   ''' Reinicia el cuestionario. Baraja los test del cuestionario actual y restablece a 0 el número de aciertos.
   ''' </summary>
   ''' <remarks></remarks>
   Public Sub Reset()
       Call Barajar()
   End Sub

   ''' <summary>
   ''' Baraja las preguntas del test y se obtiene una lista en orden aleatorio.
   ''' </summary>
   ''' <remarks>El 'siguiente' se resetea al índice 0 del cuestionario.</remarks>
   Private Sub Barajar() ' es mejor que sea un método privado, Y a su vez Se crea el método Reset, más explícito...
       Dim k As Integer, az As Integer, tmp As CuestionProfesor

       For k = p_NumPreguntas - 1 To 1 Step -1
           az = (Random(az) Mod (k + 1)) ' proporciona un valor entre 0 y k.

           tmp = p_Preguntas(az)
           p_Preguntas(az) = p_Preguntas(k)
           p_Preguntas(k) = tmp
       Next
       p_Next = 0
       p_Aciertos = 0
   End Sub

   ''' <summary>
   ''' Genera un número random pseudoaleatorio.
   ''' </summary>
   ''' <param name="n">Semilla desde la que generar el siguiente número</param>
   ''' <returns>Devuelve un entero entre 0 y (Rnd_P -1)</returns>
   ''' <remarks>Hay que ser cuidadoso al elegir el valor de los parámetros internos que utiliza la función. Si todos los parámetros son congruentes entre sí, podría devolver números predecibles, incluso siempre el mismo (típicamente el 0).</remarks>
   ''' Puede recurrirse al propio entorno NET para generar los números aleatorios.
   Private Function Random(ByVal n As Integer) As Integer
       Random = (((n * Rnd_M) + Rnd_Q) Mod Rnd_P)
   End Function

End Class


Y éste el código para el formulario:
Código (vbnet) [Seleccionar]

Public Class Form1
   Private WithEvents Test As New Cuestionario
   Private Fios As IO.StreamReader

   ' Realizar la siguiente pregunta
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Test.Siguiente()
   End Sub

   ' Hacer la pregunta.
   ' La rpopia clase, verifica la respuesta y lleva la cuenta de aciertos y al final del test, notifica el resultado.
   Private Sub Test_Test(ByRef Pregunta As Cuestionario.CuestionAlumno, ByRef Respuesta As Cuestionario.RespuestasPosibles) Handles Test.Test
       With Pregunta
           Dim R As String = InputBox(.Respuesta1 & vbNewLine & .Respuesta2 & vbNewLine & .Respuesta3 & vbNewLine & .Respuesta4 & vbNewLine & vbTab & "( ELIJA COMO RESPUESTA 0, 1,2 Ó 3)", .Pregunta)
           Respuesta = Pregunta.Convertir(R)
       End With
   End Sub


   ' El cliente debe indicar las preguntas que tendrá el nuevo cuestionario.
   ' un valor de 0, indica que ya no se desea hacer más test.
   ' En el ejemplo, se lee la primera línea del fichero, que contiene el número de preguntas que contiene el cuestionario dentro del fichero.
   ' Uno debe proveer
   Private Sub Test_IntroducirNuevoCuestionario(ByRef NumPreguntas As Byte) Handles Test.IntroducirNuevoCuestionario
       Fios.Close()
       Dim fin As Boolean = MessageBox.Show("¿Desea dar por finalizado la sesión de tests (S/N)?", "Nuevo cuestionario...", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
       If (fin = False) Then
           Fios = New IO.StreamReader(Application.ExecutablePath & "\Cuestionario.txt")
           NumPreguntas = Convert.ToByte(Fios.ReadLine) ' ojo: Cambiar al gusto y necesidad...
       Else
           NumPreguntas = 0
       End If
   End Sub

   ' Solicita al cliente cada test, uno a uno. debe introducirse los datos procedentes de donde sea...
   '   en este ejemplo se proveen de un simple fichero de texto, que está formateado así:
   '  NumPreguntas: ' tiene el número de preguntas que aloja el fichero, en el ejemplo no se verifica si esto es correcto.
   '  Pregunta X
   '    Respuesta A
   '    Respuesta B
   '    Respuesta C
   '    Respuesta D
   '    Solución A-D
   ' En el ejemplo provisto no se verifica que todo esté correcto, se da por hecho que es así.
   Private Sub Test_EntrarPregunta(ByRef Pregunta As String, ByRef Respuesta1 As String, ByRef Respuesta2 As String, ByRef Respuesta3 As String, ByRef Respuesta4 As String, ByRef Solucion As Byte) Handles Test.EntrarPregunta
       Pregunta = Fios.ReadLine

       Respuesta1 = Fios.ReadLine
       Respuesta2 = Fios.ReadLine
       Respuesta3 = Fios.ReadLine
       Respuesta4 = Fios.ReadLine

       Solucion = Fios.ReadLine
   End Sub


   Private Sub Test_FinDeCuestionario(ByVal Aciertos As Byte, ByRef RepetirTest As Boolean) Handles Test.FinDeCuestionario
       Dim numPreg As Integer = Test.CantidadDePreguntas        
       Dim btn As Windows.Forms.MessageBoxButtons = vbYesNo
       Dim ico As Windows.Forms.MessageBoxIcon

       ' Seleccionamos un icono en función del número de aciertos podría personalizarse mejor con iconos específicos creados al efecto).
       If (Aciertos < (numPreg / 2)) Then
           ico = MessageBoxIcon.Warning
       Else
           ico = MessageBoxIcon.Information
       End If

       RepetirTest = MessageBox.Show("El número de aciertos fue: " & Aciertos.ToString & vbNewLine & "Sobre " & numPreg.ToString & " preguntas" & vbNewLine & vbNewLine & vbTab & "¿Desea repetir el mismo cuestionario (S/N)?", "Se ha finalizado el cuestionario.", btn, ico)
   End Sub

   

   
   Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       Fios = New IO.StreamReader(Application.StartupPath & "\Cuestionario.txt")
       Test.ComenzarTest(Convert.ToByte(Fios.ReadLine))
   End Sub

   Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
       Fios.Close()
       Fios = Nothing
   End Sub
End Class


Para probarlo debes crear un fichero de texto llamado cuestionario.txt en la ruta del ejecutable (nota que si está en debug, la carpeta es distinta de si está compilado), con la siguiente estructura (OJO un dato por cada línea, y por línea se entiende Un SALTO de LINEA...

'  NumPreguntas: ' tiene el número de preguntas que aloja el fichero, en el ejemplo
(por cada pregunta que indique numpreguntas debe haber esta estructura)
'  Pregunta X el texto de la pregunta, por ejemplo: Test 01: De qué color es la hierba?
'    Respuesta A  el texto de una posible respuesta, por ejemplo: 0 - Azul
'    Respuesta B   por ejemplo 1 - Blanco
'    Respuesta C  por ejemplo 2 - verde
'    Respuesta D  por ejemplo 3 - Gris
'    Solución 0-3 un valor numérico entre 0 y 3 , por ejemplo 2


---------------------------------------------------
p.d.: no se utiliza ningún formulario extra, todo la operación de mostrar los test recáe sobre un objeto inputbox.... que para el caso de ejemplo que se trata, es más que suficiente... ya tu tendrás que poner algo de tu parte y modificarlo a tus necesidades.

Lo que se hace aleatoriamente es reordenar las preguntas en el array y lueo se procede a mostrarlas en ese orden (desordenado, barajado), como cuando barajas un mazo de cartas y luego las muestras una a una...
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Serapis en 30 Marzo 2017, 20:24 PM
Bien... ya estoy de vuelta.
He corregido un par de sencillos bugs... ahora funciona correctamente.

Recuerda que el inputbox, limita mucho el ancho para preguntas y respuestas largas, lo mejor es que lo remplaces por un formulario y tener un método similar (al inputbox), donde envías los mismos parámetros que el inputbox, que muestre la ventana y recoja el resultado del usuario de vuelta... Vamos emular al inputbox... eso queda a tu esfuerzo.
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Edierb en 30 Marzo 2017, 22:39 PM
ufff esta larrrgo jeje bueno ya lo probé y parce que va bien, solo que tengo inconveniente con el archivo .txt, ya lo cree pero lo tengo en blanco por que no se que formato lleva, me imagino que hay es donde van alojadas las preguntas..
manda algunos errores pero debe ser por que el archivo.text esta en blanco.
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Serapis en 30 Marzo 2017, 23:03 PM
Te decía al final:
Citar

'  NumPreguntas: ' tiene el número de preguntas que aloja el fichero, en el ejemplo
(por cada pregunta que indique numpreguntas debe haber esta estructura)
'  Pregunta X el texto de la pregunta, por ejemplo: Test 01: De qué color es la hierba?
'    Respuesta A  el texto de una posible respuesta, por ejemplo: 0 - Azul
'    Respuesta B   por ejemplo 1 - Blanco
'    Respuesta C  por ejemplo 2 - verde
'    Respuesta D  por ejemplo 3 - Gris
'    Solución 0-3 un valor numérico entre 0 y 3 , por ejemplo 2

Un ejemplo para copiar y pegar en un fichero de texto:
Citar
6
01. ¿Cuál, de entre los siguientes, es requisito para la recuperación de la nacionalidad española?
0 - Ser residente legal en España durante los tres años anteriores a la petición.
1 - Renunciar a la anterior nacionalidad.
2 - Tener al menos más de una nacionalidad en la U.E.
3 - Inscribir la recuperación en el Registro Civil.
3
02. ¿Qué tipo de leyes no pueden ser aprobadas en Comisión?
0 - Todas las leyes pueden aprobarse en Comisión.
1 - La reforma Constitucional, las cuestiones internacionales, las leyes Orgánicas y de bases y los Presupuestos Generales del Estado.
2 - Todas las leyes pueden aprobarse en comisión, excepto las orgánicas que necesita mayoría absoluta del Pleno.
3 - Solo las leyes orgánicas.
1
03. Señale la respuesta correcta respecto a la vecindad civil:
0 - El matrimonio no altera la vecindad Civil.
1 - La vecindad civil se adquiere por residencia continuada durante un año, siempre que el interesado manifieste ser esa su voluntad.
2 - La vecindad civil se adquiere por residencia continuada de siete años, sin declaración en contrario en este plazo.
3 - Ninguna respuesta es cierta.
0
04. El domicilio de los diplomáticos residentes en el extranjero por razón de su cargo, que gocen del derecho de extraterritorialidad, será el último que hubieren tenido en territorio español; ¿qué nombre recibe este domicilio?
0 - Real o voluntario.
1 - Legal o necesario.
2 - Electivo o especial.
3 - Domicilio diplomaturado.
0
05. Siendo la capacidad de obrar o de ejercicio, la posibilidad que tiene una persona de actuar jurídicamente por sí mismo, señale, entre las siguientes, la que considere limitación de dicha capacidad:
0 - La incapacitación.
1 - La prodigalidad.
2 - Ambas respuestas son ciertas.
3 - Ninguna respuesta es cierta.
2
06. ¿Cuándo se concede la nacionalidad española por carta de naturaleza?
0 - Te la dan cuando demuestras tener una permanecnia en el país superior a 2 años.
1 - Pertenece concederla al Rey en base a su derecho constitucional de gracia.
2 - Tiene que dar su consentimiento el ministerio del Interior.
3 - Cuando en el interesado concurren circunstancias excepcionales.
3

...y el fichero debe estar situado en la misma carpeta donde está el ejecutable, la carpeta varía en función de si estás en modo debug o compilado...

En debug, la ruta sería más o menos esta:
... \WindowsApplication1\bin\Debug\Cuestionario.txt
ó si está compilado:
... \WindowsApplication1\bin\Release\Cuestionario.txt

la ruta y el nombre del fichero, se pueden cambiar en la línea:
CitarFios = New IO.StreamReader(Application.ExecutablePath & "\Cuestionario.txt")
que aparece dos veces, una en el método de evento:
Test_IntroducirNuevoCuestionario
y otra en método de carga del formulario:
Form1_Load

El código sale largo, porque lleva comentarios, estructuras y demás... (pueden omitirse o remplazarse por alogo más sencillo)... además, puede ser optimizado, está sencillo y 'expandido para que te sea más asequible de entender...


Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Edierb en 30 Marzo 2017, 23:10 PM
me sale un error acá
Test.ComenzarTest(Convert.ToByte(Fios.ReadLine))
me sale este mensage
"La cadena de entrada no tiene el formato correcto."
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Serapis en 31 Marzo 2017, 00:15 AM
lo primero en el fichero debe ser una línea donde haya un valor numérico entre 1 y 255
Ese valor indica cuántas preguntas hay en es efichero, en mi ejemplo he puesto 6 preguntas, por eso en la primera línea aparece un 6.

Al leer esa línea (al comienzo del fichero), lo convierte a byte, si hay un texto largo, evidentemente no podrá convertirlo a byte

6 hola que tal <--- no puede ser convertido a byte un texto así.

¿Puedes volcar el texto que has puesto en tu fichero???. eso ayudaría ver más claro donde está el error.
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Edierb en 31 Marzo 2017, 00:54 AM
ya corregí el error te pregunto algo en ves de que las respuestas sean seleccionadas 1 2 0 3, puedo poner A, B, C?
y me gustaría saber como es eso de cambiar el imputbox por el formulario, no se la verdad, es muy básico el conocimiento que tengo de este lenguaje.


Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Serapis en 31 Marzo 2017, 17:00 PM
El texto de las preguntas pon lo que te dé la gana...
Las líneas que son excepción son las líneas donde se espera un número (solo número), las cuales son las líneas de 'solución' y la primera que contiene el número de preguntas.
El ejemplo previo, modificado (donde se puede):
Citar
6
Pregunta 1. ¿Cuál, de entre los siguientes, es requisito para la recuperación de la nacionalidad española?
A - Ser residente legal en España durante los tres años anteriores a la petición.
B - Renunciar a la anterior nacionalidad.
C - Tener al menos más de una nacionalidad en la U.E.
D - Inscribir la recuperación en el Registro Civil.
3
Pregunta 2. ¿Qué tipo de leyes no pueden ser aprobadas en Comisión?
A - Todas las leyes pueden aprobarse en Comisión.
B - La reforma Constitucional, las cuestiones internacionales, las leyes Orgánicas y de bases y los Presupuestos Generales del Estado.
C - Todas las leyes pueden aprobarse en comisión, excepto las orgánicas que necesita mayoría absoluta del Pleno.
D - Solo las leyes orgánicas.
1
Pregunta 3. Señale la respuesta correcta respecto a la vecindad civil:
A - El matrimonio no altera la vecindad Civil.
B - La vecindad civil se adquiere por residencia continuada durante un año, siempre que el interesado manifieste ser esa su voluntad.
C - La vecindad civil se adquiere por residencia continuada de siete años, sin declaración en contrario en este plazo.
D - Ninguna respuesta es cierta.
0
Pregunta 4. El domicilio de los diplomáticos residentes en el extranjero por razón de su cargo, que gocen del derecho de extraterritorialidad, será el último que hubieren tenido en territorio español; ¿qué nombre recibe este domicilio?
A - Real o voluntario.
B - Legal o necesario.
C - Electivo o especial.
D - Domicilio diplomaturado.
0
Pregunta 5. Siendo la capacidad de obrar o de ejercicio, la posibilidad que tiene una persona de actuar jurídicamente por sí mismo, señale, entre las siguientes, la que considere limitación de dicha capacidad:
A - La incapacitación.
B - La prodigalidad.
C - Ambas respuestas son ciertas.
D - Ninguna respuesta es cierta.
2
Pregunta 6. ¿Cuándo se concede la nacionalidad española por carta de naturaleza?
A - Te la dan cuando demuestras tener una permanecnia en el país superior a 2 años.
B - Pertenece concederla al Rey en base a su derecho constitucional de gracia.
C - Tiene que dar su consentimiento el ministerio del Interior.
D - Cuando en el interesado concurren circunstancias excepcionales.
3


Al respecto date cuenta que hemos limitado a byte el valor númerico, porque no va ser cierto que una pregunta ofrezca más de 256 respuestas entre las que elegir, ni tampoco va a ser un cuestionario cómodo que tenga más de 255 preguntas... pero si necesitas ampliar ese valor... en vez de byte, defínelo como short (int16), que ofrece hasta 65536 preguntas y 65546 opciones de respuesta por cada pregunta.

En el programa, mejor dicho en TODOS los programas, siempre que puedas (y si no puedes también), haz que funcione con números, siempre, siempre será infinitamente más rápido... el ordenador cuenta bien números, pero cuenta muy mal las letras A+B no es C, porque A=65 y B=66, luego para que fuere C, habría que convertirlo a números, sumarlo y luego el resultado convertirlo a letra otra vez...  66+65-64=67, Mejor si 1+2=3, esto es lo más efectivo.

Bueno, no pasa nada si se cambia el valor de las soluciones de la respuesta, después de todo está previsto al haber dispuesto una función de conversión en la propia estructura, así si quieres que el 'Alumno' en vez de responde 0, 2..1 responda A, C..B
donde pone esto:
Código (vbnet) [Seleccionar]

Public Function Convertir(ByRef Texto As String) As RespuestasPosibles
           Select Case Texto
               Case "0" : Return RespuestasPosibles.RESPUESTA_A
               Case "1" : Return RespuestasPosibles.RESPUESTA_B
               Case "2" : Return RespuestasPosibles.RESPUESTA_C
               Case "3" : Return RespuestasPosibles.RESPUESTA_D
               Case Else : Return RespuestasPosibles.RESPUESTA_A
           End Select
       End Function

Cámbialo por esto otro (observa la escasa diferencia, donde antes ponía 0,1,2,3 ahora ponemos A,B,C,D pero como el usuario podría poner a,b,c,d antes nos aseguramos que la comparación sea en mayuscula fíjate en la línea "Select Case Texto.Toupper", antes era solo "Select Case Texto"), peor sigue dejando el número de solución en el texto, también se puede cambiar, pero requiere retocar más cosas en el código... ya lo harás cuando aprendas lo suficiente:

Código (vbnet) [Seleccionar]
Public Function Convertir(ByRef Texto As String) As RespuestasPosibles
           Select Case Texto.Toupper
               Case "A" : Return RespuestasPosibles.RESPUESTA_A
               Case "B" : Return RespuestasPosibles.RESPUESTA_B
               Case "C" : Return RespuestasPosibles.RESPUESTA_C
               Case "D" : Return RespuestasPosibles.RESPUESTA_D
               Case Else : Return RespuestasPosibles.RESPUESTA_A
           End Select
       End Function


Internamente en ambos casos sigue devolviendo un valor numérico, y externamente en ambos caso sigue recibiendo un texto...

Bien, como estás empezando, déjalo tal cual, no te preocupes sobre lo del inputbox y el formulario... solo señalarte que el inputbox, es un formulario que ofrece un ancho máximo y que por tanto si las preguntas son muy largas, como se han puesto en el título, no se verán enteras... entonces confórmate en tal caso con pasarlas al mismo sitio que las opciones de respuesta y deja una línea en blanco tras la pregunta...

..en fin trata de entender el código, que hace cada cosa y sobretodo, por qué lo hace... pulsando la tecla F11 te moverás paso a paso entre las instrucciones del código (examina el menú 'Depurar' y haz uso de sus ítems, aprendenrás mucho más rápido así), así vas viendo y entiendo como opera (en ese estado posando el ratón sobre el código, el 'intellisense', te da info adicional sobre los valores actuales que tiene un objeto o variable... también podría serte útil, activar desde el menú 'Depurar-->Ventanas-->variables locales', aunque ahí todas esas ventanas son muy útiles (aunque cada una en su momento), la que te he dicho facilita mucho ver el estado actual de cada objeto hasta sus últimos campos... mientras estás en ejecución paso a paso o parado en un punto de interrupción...

Si es preciso mira de buscar en youtube algún vídeo sobr eel manejo dle IDE de VB.
Título: Re: Crear 5 form y que aparezcan en forma aleatoria. con vb 2012
Publicado por: Edierb en 31 Marzo 2017, 17:49 PM
Hey muchas gracias te aseguro que me has enseñado mas que el profesor que me dicto claces, boy a implementar todo y ver que mas puedo hacer para ir mejorando el programa.
Saludos.