Visual Basic - Aplicación nº aleatorios se hace fantasma.

Life is soft - evento anual de software empresarial
   
Vista:

Aplicación nº aleatorios se hace fantasma.

Publicado por latisfundo (12 intervenciones) el 17/01/2009 17:59:42
Hola.
Quiero construir una cadena con los números 1 a 12 de forma aleatoria.
En un formulario he puesto un textbox (Text1) y un botón (Command1) y les he dado este
código:
------------------------------------------------------
Option Explicit
Dim CadenaTot As String, Num As Long

Private Sub Command1_Click()
Do Until Len(CadenaTot) = 26 '(26 caracteres=longitud de los 12 números y las comas)
If CadenaTot = "" Then
CadenaTot = Trim(Str(Aleatorio))
Else
Num = Aleatorio
If InStr(CadenaTot, Trim(Str(Num))) = 0 Then 'Num no está en CadenaTot
CadenaTot = CadenaTot & "," & Trim(Str(Num))
End If
End If
DoEvents
Loop
Text1.Text = CadenaTot
End Sub

Private Function Aleatorio() As Long 'Da un nº aleatorio entre 1 y 12
Randomize ' inicializar la semilla
Aleatorio = CLng((1 - 12) * Rnd + 12)
End Function

Private Sub Form_Load()
CadenaTot = ""
End Sub
-------------------------------------------------------

El problema es el siguiente: A veces funciona perfectamente. Doy al botón y me aparecen los 12 números separados por comas en el textbox. Pero otras veces no funciona, no aparece nada en el textbox.
He probado a generar el ejecutable (proyecto1.exe) y pasa lo mismo. Además, cuando el ejecutable no funciona, si lo cierro y miro en el Administrador de tareas de Windows, sigue allí: "proyecto1 Activo" en la pestaña Aplicaciones.

Si alguien sabe que es lo que ocurre que me lo diga, por favor.

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Aplicación nº aleatorios se hace fantasma.

Publicado por P3L30N2009 (701 intervenciones) el 17/01/2009 18:46:15
El problema está en esta instrucción:

If InStr(CadenaTot, Trim(Str(Num))) = 0 Then

¿Porqué unas veces funciona y otras no?. El código solo funciona cuando el aleatorio genere el número 1 antes que el 10, 11 o 12.

Ten en cuenta que la función InStr compara caráter a carácter y si genera el 10 antes que el 1, cuando genere el 1 lo va a encontrar en la cadena y la instrucción no devolverá 0, con lo cual se convierte en un bucle sin fin.

Basándonos en un ejemplo que puse mas abajo, lo podrías hacer así:

Private Sub Command1_Click()
Dim a() As Integer, i As Integer
Text1.Text = ""
a = Aleatorio
For i = 0 To UBound(a)
Text1.Text = Text1.Text & a(i) & ","
Next i
Text1.Text = Left(Text1.Text, Len(Text1.Text) - 1)
End Sub

Private Function Aleatorio() As Integer()
Dim a() As Integer, i As Integer, x As Integer, j As Integer
ReDim a(11)
Randomize
For i = 0 To 11
repetir:
x = Int((12) * Rnd + 1)
For j = 0 To i
If x = a(j) Then GoTo repetir
Next j
a(i) = x
Next i
Aleatorio = a
Erase a
End Function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Aplicación nº aleatorios se hace fantasma.

Publicado por latisfundo (12 intervenciones) el 18/01/2009 14:19:32
Hola P3L30N2009.

En efecto era eso. Es un error tonto que se me había pasado.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

¿un extraterrestre?

Publicado por P3L30N2009 (701 intervenciones) el 18/01/2009 19:56:26
¿Cómo es posible que des las gracias?

Aquí eso no se estila. Lo normal en este foro es que solamente se haga la segunda, tercera, cuarta, etc.. pregunta si no has entendido las respuestas.

Si te responden con un ejemplo chupao que te soluciona lo que necesitas, lo copias (aunque no lo entiendas) y ¡si te he visto, ni me acuerdo! y hasta la próxima pregunta.

Eso de dar las gracias en este foro está mal visto. ( no sé si alguien se dará por aludid@)

Saludos latisfundo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar