• Lunes 12 de Mayo de 2025, 19:40

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Nebire

Páginas: 1 ... 4 5 [6] 7 8 ... 29
126
Diseño de Algoritmos / Re: Calcular camino entre dos coordenadas
« en: Jueves 25 de Febrero de 2010, 11:42 »
Hay varios algoritmos que lo resuelve...
El algoritmo de Bresenham tiene la ventaja de que opera con número enteros.
http://en.wikipedia.org/wiki/Bresenham% ... _algorithm (en inglés)

127
Visual Basic 6.0 e inferiores / Re: VB se me queda bloqueado
« en: Jueves 25 de Febrero de 2010, 11:33 »
Esto no es un problema de VB, esto es un problema de tráfico... Falta saber si tienes o no garantías de acceso a la página.

Si la llamada la hicieras asíncrona, habría más posibilidades, y sobre todo podrías en un momento dado tomar otro tipo de acciones: reintentar, descartar esa y continuar...

128
Visual Basic 6.0 e inferiores / Re: Se puede hacer esto????
« en: Jueves 25 de Febrero de 2010, 11:24 »
Se puede hacer sin problemas.
Basta recorrer la colección controls del formulario, y preguntando por su tipo de objeto recoger los datos que precises de cada control.

Luego puedes guardarlo en un fichero... o puedes enviarlo a una aplicación, pero para esto último se deben utilizar las 'APIs'  y no es recomendable para un principiante.

La cosa se complica más de la cuenta si la aplicación destino no es tuya, resultará más difícil o incluso imposible según lo que trates de hacer.
Básicamente se usa una api para localizar la aplicación de destino y una vez localizada debe usarse la api sendmessage, la cuestión principal es saber que mensaje es el que necesitas enviar para que quien se supone que puede recibirlo sepa que hacer con los datos recibidos. El mensaje depende de lo que quieras hacer y de la aplicación destino.

Si eres novato, deja esto para dentro de 1 año o dos, primero aprende otras cosas más urgentes... Ahora para guardarlo a un fichero si lo puedes hacer sin dificultad, según tus conocimientos del lenguaje vb6 te será asequible con mayor o menos dificultad.

129
Visual Basic 6.0 e inferiores / Re: ¿como puedo hacer esto????
« en: Jueves 25 de Febrero de 2010, 11:10 »
Cita de: "willysistemas"
Hola estoy tratando de implementar un sistema de matricula de estudiantes de un colegio, la idea es que la matricula se haga cada año pero me surge la duda como hacer para selecinar el año de trabajo y que el sistema me cargue unicamente los registross correspondientes a ese año para poder tranajar con ellos. he diseñado un form como el de la imagen[attachment=0:17fdbmrq]Sin título-1.jpg[/attachment:17fdbmrq] no se como seria el codigo si alguien me da una idea lo agradeceria mucho

Usa un control datetimepicker para mostrar un calendario y/o limitar la fecha.
Si haces búsqeudas en el foro por el nombre del control, hallarás ejemplos para manejar las propiedades que precisas...

130
Visual Basic para principiantes / Re: Generar un portable
« en: Jueves 25 de Febrero de 2010, 10:59 »
Detalla, a que llamas portable... ?

131
Visual Basic 6.0 e inferiores / No te enteras....
« en: Domingo 21 de Febrero de 2010, 00:38 »
Estás usando una clase connection no un objeto.

Por ejemplo , tu puedes hacer este código:
Código: Visual Basic
  1.  
  2. dim f as form
  3.  
  4.  
pero no puedes hacer esto:
Código: Visual Basic
  1.  
  2. set f= new form
  3.  
  4.  
puesto que form no es un objeto, es necesario adjudicarle uan referencia de instancia,
lo correcto sería algo como esto:
Código: Visual Basic
  1.  
  2. Set f= new form1
  3.  
  4.  


Ahora bien, tu dices que cuando ejecutas el código (supongo que el proyecto de ejemplo original) el código funciona correctamente, por lo que entiendo que lo que te fallan son las referencias.
Así si tu haces una referencia  a 'DAO' (Microsoft DAO 3'51 Object library), te ocurrirá este error, porque la clase connection es 'PublicNotCreatable' (valor 2) cuando se diseño, lo que implica que no puede usarse New ni CreateObject. Para las clases con la propiedad Instancing que fueron diseñadas con el valor 'PublicNotCretable', significa que la aplicación crea las clases que necesite, externamente sólo podremos utilizarlas pero no crear nuevas instancias, sólo referencias a las que el objeto ActiveX permita.
En DAO primero tienes que crear un objeto  workspace, (luego si se requiere, opcionalmente, un objeto Database con el objeto workspace creado) y finalmente con el objeto workspace creado obtienes un objeto connection al abrir la conexión. ejemplo:
Código: Visual Basic
  1.  
  2. Dim cn As Connection
  3.     Dim ws As Workspace
  4.    
  5.     Set ws = DAO.CreateWorkspace("MiEspacioTrabajo", "nombreUsuario", "contraseña", dbUseJet)
  6.     Set cn = ws.OpenConnection("MiConexion", , , "ODBC:DATAASE=xxx;UID=Usuario;PWD=contraseña;DSN=siseutiliza")
  7.  
  8.  


Por tanto es asumible que tu estás empleando un objeto connection que no es el que utiliza la aplicación original, por ejemplo si usaras una referencia al objeto ADODB (Microsoft ActiveX Data Objects 2.5 Library), si que permitirá crear instancias del objeto connection directamente, porque al crear esta librería en su diseño a las clases en la propiedad instancing se declaró 'MultiUse' (valor 5).

Revisa tu proyecto y muestra una captura de las referencias que tienes en el proyecto y otra captura de las referencias del proyecto original, verás (y nosotros si nos  enseñas la captura) que al menos una referencia (librería) que contiene una clase Connection no coinncide con la otra. Para ser más explícito ya en el proyecto se explica
Citar
I have used dataenvironment
'and Microsoft Jet.OLEDB 3.51 ver in this case.
...

Para otra ocasión explicita que tipos de objetos tienes, no basta a veces con señalar la clase también es necesario señalar la librería, ya que yo puedo crear infinitas librerías con una clase Connection de modo que nada tengan que ver entre sí aparte del nombre.


Te adjunto una imagen para que '''veas''' las diferencias entre ambos objetos connection, cómo pertenecen a diferentes librerías y sobretodo las propiedades que tiene cada uno... fíjate como la clase connection de DAO no tiene el método Open, lo que debería servirte de guía para saber que no es esa referencia la que se está utilizando (en el proyecto original).

132
Visual Basic para principiantes / Re: conservar el valor decimal
« en: Viernes 12 de Febrero de 2010, 21:17 »
El contenido de un textbox es una cadena de texto. Cuando haces un 'val' interpreta la cadena como un valor numérico hasta donde pueda hacerlo.
En este punto vb interpreta un punto dentro de una cadena de texto como no numérico, por eso te toma sólo la parte entera.

Hay 2 opciones:
A ) Remplazar la coma  por un punto
Código: Visual Basic
  1.  
  2. dim var1 as double
  3. Text1.text= "789,56"
  4. text1.text= replace$(text1.text,",",".",1,1)  ' sólo cambiamos la primera coma encontrado
  5. var1=val(text1.text)
  6. msgbox var1
  7.  
  8.  
en este caso habiendo una coma en el texto si no se remplaza haría esto:
text1.text="789,56"
...
msgbox var1  resultado= 789

B ) Eliminar la función  val, forzando a que se realice una conversión implícita .
Código: Visual Basic
  1.  
  2. dim var1 as double
  3. Text1.text= "789,56"
  4. var1= text1.text
  5. msgbox var1
  6.  
  7.  
En este caso si hubiera 1 punto en vez de una coma haría esto:
text1.text="789.56"
...
msgbox var1  resultado= 78956

133
Visual Basic para principiantes / Re: Borra ultima linea del msflexgrid
« en: Sábado 30 de Enero de 2010, 11:30 »
No me he dado cuanta de tu mensaje, aunque ha pasado un tiempo ya... es casi seguro que no hayas resuelto este asunto todavía, anque posiblemente hays cambiado a otra solución o simplemente desistido. Posiblemente la mejor solución que hayas encontrado sea 'vaciarla' de contenido y es normal que no satisfaga la solución.

Siempre se exige que exista una línea no fija, es posible retirarla, pero no de cualquier forma, sino usando el método concreto que se detalla:
Al iniciar la aplicación si sucede que aún no tenemos ninguna línea, es cuando podemos conseguir quitarla, mira que sencillo es el código:
Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3.     Me.Show
  4.     Malla.FixedRows = 1 ' o x, las que tengamos
  5.     Malla.Rows = Malla.FixedRows  ' desaparecen todas las líneas que no son fijas,  
  6. End Sub
  7.  
  8.  

Esto lo podremos hacer siempre que queramos, pero obviamente si tenemos datos, requeriría volver a añadirlos. Por lo que es cuestión de recurrir a un simple 'método'... supongamos que tenemos 1 líneas fijas y 42 líneas no fijas + esa línea que no quieres tener. Más de lo mismo, observa:

Código: Visual Basic
  1.  
  2.  ' desde la rutina llamante podría haber líneas como estas:
  3. ' de hecho una vez que pruebes el código anterior, mete estas 4 líneas al final del form_load para poder probar la rutina LimitarLineas.
  4.    For k = 1 To 43
  5.         Call Malla0.AddItem("", 1)
  6.     Next
  7.     Call LimitarLineas(10)
  8.  
  9.  
  10.  
  11.  
  12. Private Sub LimitarLineas(ByVal n As Long)
  13.     Dim fixed As Long
  14.    
  15.     fixed = Malla.FixedRows  ' 1º guardamos el número actual de líneas fijas
  16.     Malla.FixedRows = fixed + n  ' ahora aumentamos las líneas fijas hasta las que queremos conservar
  17.     Malla.Rows = Malla.FixedRows  ' desaparecen todas las líneas que no son fijas,
  18.     If n > 0 Then    ' si no varió el número de líneas fijas no necesitamos REStablecer este valor, además de no necesario, produciría error.
  19.         Malla.FixedRows = fixed  ' restablecemos el número de líneas fijas previo
  20.     End If
  21. End Sub
  22.  

Por otro lado, es posible eliminar líneas directamente siempre que todavía haya más líneas que las fijas, como no podemos estar siempre seguros de esto, podemos desviar la eliminación de líneas de otro modo.
 
Código: Visual Basic
  1.  
  2. ' n indica la línea índice que se quiere eliminar.
  3. Private Sub EliminarLinea(ByVal n As Long)
  4.      ' quizás nos interese convertirlo en una función , en cuyo caso podríamos y devolver true cuando se elimina y false cuando no... eso queda a tu trabajo.    
  5.  
  6.     if (n < Malla.fixedRows) or (n => Malla.Rows) then exit sub ' para eliminar líneas fijas, mejor usar otra rutina distinta así se es consciente de què se está eliminado
  7.     if Malla.rows = Malla.FixedRows + 1 then
  8.        'If n = Malla.fixedRows then ' con las 2 comprobaciones previas esta resulta innecesaria pero si modificamos aquellas esta podría llegar a ser necesaria.
  9.               Malla.Rows = Malla.FixedRows  ' desaparecen todas las líneas que no son fijas, que siempre que entre aquí será solamente 1 más.
  10.         'End if
  11.     else
  12.          Malla.RemoveItem(n)
  13.     end if
  14. End Sub
  15.  

Nota: Malla es una instancia de un control flexgrid o mshflexgrid....

Queda a tu esfuerzo diseñar una rutina cuando lo que queremos es eliminar unbloque entero de líneas y no sólo una...
Pista: elimina todas, menos 1 (estén salteadas o juntas)  luego deriva la eliminación de ésta, que hemos dejado hacia la rutina anterior, pués allí ya se chequea si la línea a eliminar es o no justo la única que queda junto a las líneas fijas.

134
Visual Basic para principiantes / Re: alguien que me ayude por favor
« en: Domingo 24 de Enero de 2010, 18:17 »
Es bastante sencillo...


Te pongo un código que espero que te resulte fácil de entender
En el formulario hay que añadir 1 SOLO timer que llamamos TimLed
Añadimos un shape que llamamos  ShaLed es una matriz, al primero le pones el índice 0 (en diseño) , los restantes los cargamos por código
Añadimos un frame llamado frame1 y tres controles option llamados option1, forman una matriz tiene índices 0,1 y 2 . Para que coincida con elcódigo al indice 0
le ponemos el caption de 'horario ', al 1 "antihorario" y al 2 "parpadeante"...

Eso es todo copias y pegas el código y le das ejecutar...

una imagen del resultado:


Código: Visual Basic
  1.  
  2. Private Enum ModoIluminado
  3.     LUM_HORARIO = 0
  4.     LUM_ANTI_HORARIO = 1
  5.     LUM_PARAPDEO = 2
  6. End Enum
  7.  
  8. Private Const Encendido = vbRed   ' color del led encendido
  9. Private Const Apagado = &HC0C0FF  ' color del led apagado
  10. Private Ilumina As ModoIluminado  ' modo en que se iluminan los leds
  11. Private LedActual As Byte         ' led que se enciende actualmente
  12.  
  13.  
  14. Private Sub Form_Load()
  15.     Dim k As Single, x As Single, y As Single
  16.     Dim radian As Single
  17.     Dim resp As VbMsgBoxResult
  18.    
  19.     ' mostramos el formulario para ir viendo (si vamos paso a paso) como se realizan estas acciones.
  20.      Me.Show
  21.      
  22.     ' damos forma al shape
  23.     With ShaLed(0)
  24.         .Move .Width, .Height
  25.         .FillStyle = 0  ' sólido
  26.         .FillColor = Apagado
  27.         .Shape = 3 ' círculo
  28.     End With
  29.  
  30.    ' Cramos dinámicamente los otros 11 leds...
  31.     For k = 1 To 11
  32.         Load ShaLed(k)
  33.         ShaLed(k).Move ShaLed(k - 1).Left + ShaLed(k).Width
  34.         ShaLed(k).Visible = True
  35.     Next
  36.    
  37.     ' aseguramos unas medidas y dividimos el form. en 4 cuadrantes de 120 partes cada una
  38.     Me.ScaleMode = vbPixels
  39.     Me.Width = ScaleX(640, vbPixels, vbTwips)
  40.     Me.Height = Me.Width
  41.     Me.Scale (-120, -120)-(120, 120)
  42.    
  43.     ' centramos el frame..
  44.     Frame1.Move -Frame1.Width / 2, -Frame1.Height / 2
  45.    
  46.     ' posicionamos los leds en círculo respecto del centro (cordenada 0,0
  47.     For k = 0 To 11
  48.         radian = 6.28 / 12 * k
  49.         x = Cos(radian) * 60 + Sin(radian) * 60
  50.         y = Cos(radian) * 60 - Sin(radian) * 60
  51.         ShaLed(k).Move x - 15, y - 15
  52.     Next
  53.    
  54.     TimLed.Interval = 100 ' un tiempo que permita apreciar el cambio.
  55.     LedActual = 0
  56.    
  57.    
  58.    
  59.     resp = InputBox("Elija el modo inicial de iluminación:" & vbCrLf & "0 : Iluminación en sentido horario." & vbCrLf & "1 :  Iluminación en sentido antihorario." & vbCrLf & "2 : Iluminación parpadeante alterna." & vbCrLf & "cualquier otra plsación se interpreta como 0", "Iniciamos, la iluminación de los leds...", "0")
  60.     If resp < 1 Or resp > 2 Then resp = 0
  61.    
  62.     ' desactivamos previamente toodas las opciones, para que al activar uno, se invoque la rutina...
  63.     For k = 0 To 2
  64.         Option1(k).Value = False
  65.     Next
  66.     Option1(CInt(resp)).Value = True
  67. End Sub
  68.  
  69. Private Sub Option1_Click(Index As Integer)
  70.     Dim k As Byte
  71.    
  72.     ' 1º apagamos el timer
  73.     TimLed.Enabled = False
  74.     ' 2º marcamos el modo de iluminación
  75.     Ilumina = Index
  76.     ' 3º apagamos todos los leds.
  77.     For k = 0 To 11
  78.         ShaLed(k).FillColor = Apagado
  79.     Next
  80.    
  81.     ' hacemos que el led actual sea el primero, el 0
  82.     LedActual = 0
  83.     ' 4º ponemos en marcha el nuevo modo de iluminación
  84.     TimLed.Enabled = True
  85. End Sub
  86.  
  87. ' aquí se ejecuta todo
  88. Private Sub TimLed_Timer()
  89.     Dim anterior As Byte
  90.    
  91.  
  92.     If Ilumina = LUM_HORARIO Then
  93.         ' 1º marcamos el que ahora está encendido para apagarlo
  94.         If LedActual = 11 Then
  95.             anterior = 0
  96.         Else
  97.             anterior = LedActual + 1
  98.         End If
  99.         ' 2º lo apagamos
  100.         ShaLed(anterior).FillColor = Apagado
  101.         ' 3º marcamos el siguiente para encenderse
  102.         If LedActual > 0 Then
  103.             LedActual = LedActual - 1
  104.         Else
  105.             LedActual = 11
  106.         End If
  107.         ' 4º lo encendemos
  108.         ShaLed(LedActual).FillColor = Encendido
  109.     ElseIf Ilumina = LUM_ANTI_HORARIO Then
  110.         ' 1º marcamos el que ahora está encendido para apagarlo
  111.         If LedActual = 0 Then
  112.             anterior = 11
  113.         Else
  114.             anterior = LedActual - 1
  115.         End If
  116.         ' 2º lo apagamos
  117.         ShaLed(anterior).FillColor = Apagado
  118.         ' 3º marcamos el siguiente para encenderse
  119.         If LedActual < 11 Then
  120.             LedActual = LedActual + 1
  121.         Else
  122.             LedActual = 0
  123.         End If
  124.         ' 4º lo encendemos
  125.         ShaLed(LedActual).FillColor = Encendido
  126.     Else
  127.         anterior = LedActual
  128.         LedActual = (LedActual + 1) Mod 2
  129.         For k = 0 To 10 Step 2
  130.             ShaLed(k + anterior).FillColor = Apagado
  131.             ShaLed(k + LedActual).FillColor = Encendido
  132.         Next
  133.     End If
  134. End Sub
  135.  
  136.  
  137.  

Si tienes problemas o no entiendes algo, pegunta...

135
Citar
23.55 , y redondeo me queda 23,55 y no puedo cambiar la coma por el punto
Qué teimpide cambiar la coma por un punto o por una arroba o por lo que necesites... ?

Código: Visual Basic
  1.  
  2. dim CambiarEsto as string, PorEsto as string
  3. CambiarEsto = ","
  4. Poresto = "."
  5. text1.text = replace(text1.text, CambiarEsto, porEsto)
  6.  
  7.  

136
Visual Basic 6.0 e inferiores / Re: Validar formato hora
« en: Viernes 18 de Diciembre de 2009, 13:35 »
Cita de: "borisoto"
Function esHora(ByVal txt As String) As Boolean
        Dim arr() As String = txt.Split(":")
        If arr.GetLength(0) < 2 Then
            Return False
        ElseIf Not IsNumeric(arr(0)) Then
            Return False
        ElseIf Not IsNumeric(arr(1)) Then
            Return False
        ElseIf Not IsNumeric(arr(2)) Then
            Return False
        ElseIf arr(0) < 0 Or arr(0) > 23 Then
            Return False
        ElseIf arr(1) < 0 Or arr(0) > 59 Then
            Return False
        ElseIf arr(2) < 0 Or arr(0) > 59 Then
            Return False
        End If
        Return True
    End Function
2 cosas, que no has tenido en cuenta:
A - Este es un post del 2003 es decir de hace 6 años... mala cosa si el autor aún estuviera esperando respuesta. No resucites post muertos
B - Éste foro es de VB6, el código que expones no se aplica aquí.


Para la fecha, (si no se refiere concretamente a la hora)... Hay soluciones bastante mejores que cualquiera de las expuestas en este hilo, en los foros de vb6 ( a día de hoy) sólo es cuestión de buscar. Concretamente usar un control DTPicker (Date Time Picker). Permite opciones de formato y no requiere complejidades de validación ya que puede fijar el rango de fechas admitidas (propiedades maxDate y minDate) y permite al usuario (por torpe que sea) elegir una fecha siempre válida.

Para la hora VBA.DateTime tiene funciones específicas para tratar adecuadamente la hora...

137
Antes que nada tienes que registrar la librería en el sistema:
...desde la línea de comando...
Código: Text
  1.  
  2. regsvr32 "ruta del archivoel archivo.dll"
  3.  
  4.  

Luego cuando arranques el proyecto de prueba, tienes que ir al menú proyecto referencias localiza el archivo dll... y ya está. Recuerda guardar el proyecto antes de nada más...

El proyecto de la dll, se abre sin más...

138
Visual Basic 6.0 e inferiores / Re: Error de Automatización
« en: Sábado 12 de Diciembre de 2009, 08:36 »
Bueno eso de sin 'fundamento lógico', querrás decir 'sin que sepas por qué'... pasa.

Un error de automatización puede suceder cuando el objeto no admite automatización. Si antes lograste acceder y luego no, debes pensar en que has cambiado algo directa o indirectamente.

Por ejemplo si estableciste un tipo de bloqueo determinado, o si intentas crear un recordset que no es aduseclient determinadas acciones no están disponibles. Recuerda que un servidor remoto no admite determinada funcionalidad que si admite un servidor local.
A veces ocurre simplemente porque la cadena de conexión la has cambiado  y no es correcta. Hay muchísimas razones, pero básicamente todas indican que un método o propiedad no está disponible en base a las circunstancias actuales.

139
Cuéntame como te va... al ser novata no se si serás capaz de entender las clases de vb6...

140
Te mando un sencillo proyecto, si algo no lo comprendes pregunta y te detallo. Nota especialmente la diferencia entre rotar a través del mundo y rotar sobre el propio eje.

En el proyecto, cada línea se ha tomado como eje de giro dela línea un punto extremo  del mismo (el inicial), puede elegirse cualquier punto intermedio de la línea o incluso un punto ajeno a la propia línea como centro de la línea...

El ejemplo se compone de 2 proyectos, el primero construye un objeto 'Rota' con capacidad para retener líneas en una colección y manipularlas, asímismo dibuja sobre un formulario, las líneas añadidas.
El 2 proyecto es la aplicación que prueba y manipula el objeto.

Lo que te recomiendo es que primero ejecutes el exe dentro de´la carpeta Aplicación (puede que necesites registrar la librería, previamente). Luego abre cualquiera delos 2 proyectos para ver el código.

Nota que posiblemente tendrás que actualizar, la referencia del objeto 'Rota.Dll' dentro del proyecto que prueba la aplicación.

141
No puedes rotar una línea si no conoces sus cordenadas, del mismo modo que no puedes pegar una patada a un balón si no sabes donde está ni puedes cambiar de cadena la tele con el mando a distancia si lo has perdido.

A las bravas se podría hacer un programa de reconocimiento de patrones, pero sería costoso y no podrías estar segura de si esa la línea que te interesa y si se ha reconocido 'fielmente', como esperabas.

Lo correcto es no dibujar líneas sin control, sino supervisado, es decir puedes crear una estructura de tipo 'Lineas' donde recoges los 2 puntos que son a su vez una estructura de tipo cordenadas, luego puedes crear líneas y mediante una colección,  las vas metiendo en ella, estando ya 'controladas' podrás dibujarlas, rotarlas, eliminarlas,... lo que necesites...

Dame un tiempo, para que encuentre un momento de deshaogo y te hago un sencillo ejemplo que te sirva de orientación...

142
Cita de: "Noemii85"
Cita de: "Nebire"
Mañana te atiendo al tema que hoy se me ha hecho tarde... este mensaje es para que no pienses que lo dejo pasar...
Si te parece bien haremos una especie de motor 3d sencillo...

No tranquilo, si cada uno tiene sus cosas, para nada me corre prisa jeje ;)  Solo una cosa, no se a que te refieres exactamente a motor 3D, pero lo que tengo que hacer tiene k ser solo en plano 2D, para nada me tengo que complicar la vida, aunque quizas me equivoco y te refieres a otra cosa... :P
Bien, si sólo necesitas rotación 2D, pués lo haremos más simple...

Al considerar rotación, es necesario pensar en 3D aunque luego sólo apliquemos en 2D. Yo te dy el mínimo de teoría necesaria para que en un futuro no equivoques las cosas que es lo que le ocurre a la mayoría.

Imáginate de pie en medio del salón de tu casa y enfrente de ti una ventana. Bien toma una naranja en tu mano con la otra mano clava un tenedor sobre la naranja, deja el tenedor mirando hacia la ventana. Estiende la mano que tiene la naranja, con la mano libre toca el tenedor y gíralo hasta que quede mirando hacia ti. Bien esto se llama rotación sobre su propio eje.

Ahora veamos otra rotación... sigue con tu mano extendida, el tenedor estaba al principio mirando a la ventana ahora mira a ti, bueno, pués ahora gira tú, media vuelta.... verás que el tenedor ahora vuelve a mirar hacia la ventana sin embargo tu no has tocado la naranja... esta rotación se llama rotación sobre el eje del 'mundo' (en este caso el mundo eres tú).

Cuando se desea hacer una rotación es necesario tener claro cual de las 2 es a la que te refieres. La 2ª es equivalente a hacer realmente 2 movimientos, uno de desplazamiento y otro de rotación, si considremos moverla sin algo que gira arrastrando de si lo que tiene (como sucede cuando tú tehas dado media vuelta.
Entonces si tienes la naranja en tu mano extendida, y realizas rotación (te das medida vuelta), lo que ocurre es la 2º rotación la que se refiere al propio mundo. Para girarla sobre su propio eje hay que hacer lo que ya hemos dicho antes,,,,
Mover la naranja al centro del mundo (si las cordenadas en el mundo son x=120, y=60, tenemos que hacer x=0, y=0, ya movido al centro del mundo, ahí rotamos, y luego la volvemos a desplazar donde estaba, así es como giramos sobre su propio eje algo que no está en el centro del 'mundo'.

Como ves si me has seguido hasta aquí, el resultado es un poco contradictorio con respecto a lo que hemos hecho sobre la mano, sobre la mano no hemos llevado nada al centro, porque la hemos arrastrado en nuestro movimiento... en los programas nada se hace sólo tenemos que mover uno a uno cada punto.

Bien, esa es la primera parte de la teoría de la rotación, la 2º parte versa sobre como calcular las cordenadas correspondientes.
Básicamente lo que se hace es calcular cada punto, que compone un objeto, es decir reducimos su complejidad sean objetos, figuras o líneas a meramente puntos, luego reubicando los puntos se redibuja todo de nuevo, ...líneas, figuras, objetos...
El cáclulo es el siguiente, sea 'Xo' é 'Yo' las cordenadas de origen (se conservan siempre por lo general) y sean 'Xd' e 'Yd' las cordenas de destino, estas se calculan con la siguiente fórmula:

Código: Visual Basic
  1. radian= 6'28 /360 * giro
  2. Xd = Cos(Radian) * Xo + Sin(Radian) * Yo
  3. Yd = Cos(Radian) * Yo - Sin(Radian) * Xo
  4.  

giro son los grados que aplicamos en este momento. 6'28 es 2 * PI (el número pitagórico). 360 son las particiones que queremos considerar, si fuera un círculo muy grande a lo mejor querríamos considerar subdivisiones de grado... es decir indica en cuantas pasos queremos dividr una vuelta completa. Giro tiene que ser consonante con este valor....

Para ilustrar todo esto ponemos un simple ejemplode código.... fíjate que la rotación que hacemos es alrededor del 'centro del mundo'.
Cra un proyecto nuevo, en el formulario añade un picturebos, un checkbox, un timer y un vscrollbar (o hscrollbar)... copia el código siguiente y pégalo en la ventana de código del formulario.

Código: Visual Basic
  1.  
  2.  
  3. ' nuestras variables
  4. Dim Xo As Long      '  x origen
  5. Dim Yo As Long      '  Y origen
  6. Dim Xd As Long      '  X destino
  7. Dim Yd As Long      '  Y destion
  8. Dim giro As Integer ' un valor entre 0 y 359, pero podría ser entre 0 y 100 o 0 y 150000... especifica las subdivisiones para completar una vuelta completa
  9.  
  10. Const naranja = &H80FF&  ' es el color para dibujar nuestra 'naranja'.
  11.  
  12. ' el chackbox activa y desactiva el timer, que es donde se eejcuta la rutina de calculo y dibujado
  13. Private Sub Check1_Click()
  14.     If Check1.Value = 0 Then
  15.         Check1.Caption = "Rotar"
  16.     Else
  17.         Check1.Caption = "Parar"
  18.     End If
  19.     Timer1.Enabled = Not Timer1.Enabled
  20. End Sub
  21.  
  22. '  al crear el formulario establecemos los valores iniciales
  23. Private Sub Form_Load()
  24.     Timer1.Enabled = False ' paramos el timer y le damos un valor rápido al intérvalo...
  25.     Timer1.Interval = 1
  26.  
  27.     VScroll1.max=359        '  limitamos nuestro scroll con la misma cantidad de pasos que queremos que gire de una vez nuestra naranaja
  28.    VScroll1.largechange=10
  29.    
  30.     '  dividimos el picturebox en 400 partes de ancho y  alto, si el picturebox no es cuadrado del todo, los giros tendrán forma de elipse.... prueba a modificar el tamaño para verificarlo..
  31.     Picture1.Scale (-200, -200)-(400, 400)
  32.     Picture1.DrawWidth = 10                       ' dibujaremos un punto, lo hacemos grande para que sea perceptible a la vista
  33.    
  34.     Xo = 80             ' nuestra naranja no está en el centro del mundo. por tanto nuestra rotación es alrededor del mundo, no sobre su propio eje. (con un punto tampoco lo notaríamos, si girara sobre su eje)
  35.     Yo = 80
  36.    
  37.    Me.Show          ' antes que nada diibujamos nuestra naranjua para que se vea donde está colocada inicialmente
  38.    Call Timer1_Timer
  39. End Sub
  40.  
  41. ' cuando no actúa el timer, podemos rotar manualmente, paso a paso nuestra naranja
  42. Private Sub VScroll1_Change()
  43.     giro = VScroll1.Value
  44.     Call Timer1_Timer
  45. End Sub
  46.  
  47. ' pot fin nuestra rutina de cálculo y dibujado
  48. Private Sub Timer1_Timer()
  49.     Dim Radian As Double ' o single, para no despreciar decimales, aunque aquí nuestro 'mundo' (el picturebox) es entero
  50.    
  51.     Radian = 6.28 / 360 * giro          ' calculamos el ángulo
  52.     Xd = Cos(Radian) * Xo + Sin(Radian) * Yo   ' calculamos la cordenada x de destino
  53.     Yd = Cos(Radian) * Yo - Sin(Radian) * Xo    ' calculamos la cordenada y de destino
  54.  
  55.     Picture1.Cls       ' borramos el picturebox
  56.     Picture1.Circle (40, 40), 80, vbBlue    ' dibujamos un círculo, como referencia visual
  57.     Picture1.PSet (Xd + 40, Yd + 40), naranja    ' dibujamos nuestra naranja, le hemos añadido a 'X' e 'Y' 40, porque es la mitad de 80 , la distancia a la que se encuentra del centro, para que sea una rotación concéntrica, sino sería describiría el círculo desplazado respecto delcentro del mundo... prueba quitando los valores...
  58.    
  59.     giro = (giro + 1) Mod 360    ' aumentamos el giro para el próximo ciclo, nota como truncamos el valor para que nunca exceda, y regrese al origen después del final...
  60. End Sub
  61.  
  62.  
  63.  
Nota que en todo momento x e y son siempre el mismo valor, los conservamos sin cambio, esdecir los cálculos son siempre absolutos respecto del origen... si se quieren usar valores relativos,  origen de  ahora es el destino del cálculo anterior, es decir 'Xo' é 'Xd' , serían ambos siempre 'x' (sustituiríamos'xo' por 'x' y 'xd' por x), y lo mismo para los 'y..'

Ahora te dejo un ejercicio, imagina ahora no quremos un punto sino una línea.... dibújala (una pista: para dibujar una línea necesitamos 2 puntos).

143
Mañana te atiendo al tema que hoy se me ha hecho tarde... este mensaje es para que no pienses que lo dejo pasar...
Si te parece bien haremos una especie de motor 3d sencillo...

144
Visual Basic para principiantes / Re: qbasic
« en: Jueves 26 de Noviembre de 2009, 00:06 »
puedes poner unos datos del fichero: c:qbasicfinalcuenta.txt ?

De entrada lo que veo es que en el interior del bucle for...next no deja opciones.. Miremos los condicionales dentro del bucle

Código: Visual Basic
  1.  
  2. IF pflia = flia THEN
  3.     'PRINT "codigo exitente"
  4.     'SLEEP 2
  5.     'CLS
  6.     IF ppadres = padres THEN
  7.         IF phijo = hijo THEN
  8.             PRINT "codigo existente"
  9.             SLEEP 2
  10.             CLS
  11.             INPUT "ingrese cod cuenta: ", pccuenta$
  12.         END IF
  13.     END IF
  14. ELSE
  15.   'EXIT DO
  16. END IF
  17.  
  18.  
El 'exit do' está comentado, y los otros if anidados no ofrecen alternativas, por lo que los 3 if podrían suplirse como un 'if1 and if 2 and if3 luego'.
Otra cosa que veo, es que señalas que quieres comparar cadenas, pero parece ser que Pflia, flia, Ppadres, padres, Phijos e hijos son variables numéricas ( pués hiciste asignación sobre ellas Val(..)).

Por lo demás, los bucles do..loop puedes condicionarlos con un while, no realizar luego dentro una instrucción a propósito para salir del bucle.

Para hacerte una corrección exhaustiva conviene que detalles cual es el propósito del programa para ver qué, no corresponde con ello.

...Básicamente es correcto, quizás en vez de field, yo usaría una estructura.. así, resulta más intuitivo qué son esas variables...

Código: Visual Basic
  1. Type Registro
  2.      Cuenta as string  * 8
  3.      dCuenta as string * 20
  4.      pIni as string * 4
  5.      pFin as string * 4
  6. end type
  7. dim elReg as registro
  8. const LargoReg= 36 ' 8+20+4+4
  9. ' utilizando una estructura en vez de field, al hacer get debes indicar el destino (o el origen al hacer put)
  10. get #1, h,elReg
  11.  

También te recomiendo usar  la instrucción freefile para referirte a los ficheros:

Código: Visual Basic
  1. dim ff as integer
  2. ff= freefile
  3.  
  4. open ruta for random as #ff len=largoReg
  5. get #ff,1,elReg
  6. ...
  7. close #ff
  8.  
Usando freefile, puedes abrir varios archivos sin tener que recordar qué número le toca, resulta más dinámico, puedes abrir y cerrar, volver a abrir, etc... como usas una variable, no tienes que preocuparte del número de canal...

Si el tamaño del archivo es dependiente del tamaño de registro tus bucles pueden basarse en eof en vez de calcular el número de registros

Código: Visual Basic
  1. ' en vez de esto:
  2. x = LOF(1) / 36
  3. for k= 1 to x
  4.     get #1,k
  5.     if pFin$="Hola" then ...
  6.    ' acciones
  7. next
  8.  
  9. puedes usarlo así:
  10. do while not EOF(ff)
  11.     get #ff,,elReg
  12.     if elReg.pFin= "Hola" then ....
  13.    ' acciones
  14. Loop
  15.  

145
Visual Basic 6.0 e inferiores / Re: Hacer ActiveX base datos
« en: Jueves 19 de Noviembre de 2009, 20:52 »
Te he mandado un par de mensajes privados, deberás ir a tu panel de control para leerlos. Al panel se accede pulsando en el botón de enlace: 'Panel de control de usuario' situado   justo debajo de la ruta (por niveles) del foro (que a su vez está debajo del logo del foro).

Posiblemente te envíe algún otro más adelante, según vaya ordenando las ideas... lo ideal es que me vayas respondiendo cada mensaje según te lo envío, para que quede todo perfectamente detallado antes de hacer nada...

146
Visual Basic 6.0 e inferiores / Re: Hacer ActiveX base datos
« en: Jueves 19 de Noviembre de 2009, 19:30 »
Hay que concretar bastantes detalles más... como sería largo solicitar las especificaciones de los mismos aquí, la conversación acabaría por no interesar al común del foro, por lo que te respondo por mensaje privado y al final para terminar aquí la conversación con lo que haga pondré unas capturas de imagen y una somera explicación de los detalles y el resultado, suponiendo que al final lo haga.

147
Visual Basic 6.0 e inferiores / Re: Hacer ActiveX base datos
« en: Jueves 19 de Noviembre de 2009, 16:33 »
Es necesario que detalles las especificaciones claramente, de otra forma es imposible ayudarte.
Por ejemplo: las alarmas, las debe crear el control (supongo que si) ? ... al indicar que debes introducir datos sobre la alarma te refieres a que contenga propiedades que puedas escribir, leer ?... si es así de que tipo deberían ser (cadenas de texto, numéricos, buleanos) y que nombres convendría que tuvieran (si son una cantidad fija y concreta) ...?.

Qué es lo que quieres almacenar en la base de datos, los datos introducidos en la alarma... ? ... y ... quien debe introducir los datos en la bd tú o el control ?

...y finalmente con alarmas te refieres a estados de alguna variable que utilizas en tu programa o a temporizadores que finalizan su ciclo. ?

Dependiendo de lo que respondas te lo podría hacer (sin recompensa), el tiempo necesario para hacerlo es relativamente breve si las especificaciones están suficientemente claras... en el fin de semana siempre suelo tener un par de horas disponibles para el foro... que podría ser suficiente si lo que solicitas es claro y no resulta demasiado complejo...

148
Visual Basic para principiantes / Re: Numeros perfecto
« en: Lunes 16 de Noviembre de 2009, 15:11 »
El algoritmo es totalmente correcto. Adolece simplemente de que es lento.
Es lento porque le pides que calcule todos los divisores posibles para un número contando desde 1 hasta la mitad del número a calcular...

Ejecutando el código obtengo estos valores:

Código: Text
  1.  
  2. Nº Perfecto ______Timer_______iteraciones (valor absoluto)
  3. 6             48265.89           3
  4. 28            48265.89           190
  5. 496           48266          61498
  6. 8128          48401.82       16516090
  7.  
Como ves a cada hallazgo el número de iteraciones crece exponencialmente. El siguiente número es  33550336, si en mi ordenador quickbasic ha tardado 35 segundos para hallar el 8128, para hallar el 33.550.336 a 'grosso modo' podría tardar 6 días.

Este ejercicio te lo ponen no para probar que eres capaz de encontrar una solución, sino para probar cuan eficaz eres en encontrar una solución. Es un ejercicio excelente para demostrar que la 'fuerza bruta' resulta ineficaz o por lo menos te cuestiona sobre si debe o no buscarse un método alternativo más eficaz.

La solución de este algoritmo ya la expliqué más arriba. La eficacia del mismo se reduce a con qué velocidad podemos hallar números primos. sin embargo para qué hallar números primos cuando ya se conocen tablas ?.

Ahora bien si parte del problema lo escalcular los primos, no te dejarán usar una tabla de primos desde fichero. Por tanto, lo ideal será dividir el algoritmo en 2 partes.

En la 1ª parte (que más adelante lo sugerimos como la 3ºfunción) se debería calcular una tabla de primos lo suficientemente grande como para 'alcanzar' al 5º número  buscado. Como a priori no  sabríamos cual es ese valor, lo adecuado sería calcular primos en rondas condicionales según se vayan necesitando, los primos hallados se deberían meter en una matriz. por ejemplo calculamos los primos existentes hasta el número solicitado, luego localizamos si el 5º número perfecto se puede hallar en ese rango, si no se encuentra buscamos primos hasta la siguiente tanda, se añaden a una matriz, nuevamente verificamos si el 5º númeroperfecto se sencuentra en la matriz ... repetimos el cilcoo hasta que se encuentre. Por supuesto puedes alterar el código sugerido para que por ejemplo busque cada 1000 primos ú otro sistema que prefieras... yo en ese sentido sólo te ofrezco una sugerencia de solución.

en seudocódigo sería algo como...
Previamente decidimos dividir la búsqueda de primos 'sobre la marcha', para ello necesitamos algunas variables que nos permitan controlar estos condicionantes:

Código: Text
  1. Primos() ' Matriz de alojamiento de los primos hallados
  2. Primos(0 to 999) ' Redimensionar la matriz cada 1000 hallados, la matriz es dinámica y acabamos de darle 1000 elementos
  3. NPrimos ' contiene números primos hallados, aunque la matriz tenga 1000 elementos nPrimos indica cuantos elementos realmente están ocupados
  4.  
  5. BuscarnumerosPerfectos(Cuantos) no devuelve nada
  6.     Primos(0)=1
  7.     Primos(1)=2
  8.     NPrimos =2
  9.     iniciar bucle BuscarPerfectos 2, cuantos
  10.          candidato= (2^BuscarPerfectos ) -1
  11.         si EsPrimoBuscarEnMatriz(candidato)=true luego
  12.                 NumPerfecto= (2^ (BuscarPerfectos -1)) * candidato
  13.                 print NumPerfecto,
  14.         fin si
  15.     fin Bucle
  16. fin BuscarnumerosPerfectos
  17.  
  18.  
  19. EsPrimoBuscarEnMatriz(Candidato) tipo buleano
  20.    PrimoMayorEnMatriz  =  matriz( NPrimos-1)
  21.    hacer mientras PrimoMayorEnMatriz < candidato
  22.         llamar a la función BuscarPrimos(LimiteMayorActualDeLaMatriz, int(SQR(candidato)))
  23.         PrimoMayorEnMatriz  =  matriz( NPrimos-1)
  24.    repetir  
  25.    
  26.     iniciar bucle LocalizarPrimoEnMatriz 2, LimiteMayorActualDeLaMatriz
  27.            si candidato= primos(LocalizarPrimoEnMatriz) luego
  28.                     devolver EsPrimoBuscarEnMatriz=true
  29.                     salir de la función
  30.            fin si
  31.     fin bucle
  32.      ' si llega aquí devolver false
  33. fin función EsPrimoBuscarEnMatriz
  34.  
  35.  
  36. BuscarPrimos(desde, hasta)
  37.    si desde es par, le añadimos 1, porque excepto el 2 el resto de primos es impar.
  38.    iniciar bucle Recorrido desde, hasta en pasos de 2
  39.          n=Recorrido
  40.         EsPrimo = true  '
  41.         ' buscar divisores, un búmero no es primos si tiene divisores diferentes de 1 y sí mismo
  42.         iniciar bucle CalcularSiNEsPrimo:  2, int(sqr(n))
  43.              si n mod CalcularSiNEsPrimo = 0 es divisor luego EsPrimo=false, salir del bucle  
  44.         siguiente en el bucle
  45.  
  46.        si EsPrimo = true luego meterlo en la matriz  
  47.            nPrimos= nPrimos +1
  48.            Primos(nPrimos)= n
  49.        fin si
  50.        
  51.       si matriz esta llena redimensionamos conservando contenido, en otros 1000 elementos más
  52.    fin bucle recorrido
  53. fin función BuscarPrimos
  54.  

Comentando el código...

1 - entramos en una función, o sub, (si no sabes tratar funciones y subs en QuickBasic (o QBasic) trátalo gono una etiqueta... al final te aclaro esto) que va a localizar los números perfectos deseados. Para ello invoca a una función que determina si un número candidato a número perfecto es primo, si dicho número es primo, hay un número que se deduce como número perfecto partiendo de dicho candidato.

2 - La función es primo, primero verifica si la matriz de primos tiene contenido (de entrada sólo fijamos 2 primos en la rutina anterior (1 y 2)) si el último primo es menor que el candidato significa que puede no bastarnos con los primos que tenemos en la matriz actual para determinar si el candidato es primo, por tanto llamamos a la función que comentaremos después para localizar más primos y meterlos en la matriz. Después lo único que hacemos es recorrer la matriz y ver si el candidato está en la matriz, si está es primo si no no. Este resultado es lo que devuelve esta función.

3 - La 3ª función localiza primos, a partir del valor indicado (el último que tenemos almacenado en la matriz) hasta la raíz  cuadrada del  candidato actual, cada vez que se halla uno se añade a la matriz y se totaliza la cantidadde primos hallados. Si la matriz  se llena se redimensiona con otros 1000 elementos más (preservando su contenido), esto se hace 1 vez con 1000 elementos no tras cada primo hallado que sería muy lento.

Finalmente, si no sabes manejar funciones y rutinas en QuickBasic-QBasic siempre se puede 'simular' con etiquetas y saltos entre ellas. He aquí un ejemplo sencillo:
Código: Visual Basic
  1.  
  2.  
  3. Perfectos:   ' esto es una etiqueta
  4. ' se coloca aquí el código de la 1ª función
  5.  
  6. ' donde se señala: si EsPrimoBuscarEnMatriz(candidato)=true luego , hacemos previamente un salto
  7. gosub EsPrimoBuscarEnMatriz ' y luego cambiamos dicha línea por:
  8. si EsPrimo=true luego
  9. ' resto del código
  10.  
  11. End  ' el programa termina al llegar aquí
  12.  
  13. ' esto es otra etiqueta, se puede saltar aquí con gosub nombreetiqueta
  14. EsPrimoBuscarEnMatriz :
  15.      ' aquí se coloca el código de la 2ª función
  16.  
  17.      ' donde pone: llamar a la función BuscarPrimos(....) ' previamente ponemos estas líneas
  18.     Desde = LimiteMayorActualDeLaMatriz
  19.     Hasta = int(SQR(candidato)))
  20.      ' luego sustituímos dicha línea de llamada por esta otra
  21.      gosub  BuscarPrimos
  22.      'resto del código
  23. Return
  24.  
  25. BuscarPrimos :
  26.    ' código de la 3ª función
  27. Return
  28.  
  29.  
Una etiqueta, es como un punto de entrada a una función, y 'Return' es como el punto de salida que devuelve el control a la línea siguiente a la que invocó la etiqueta, para tratarse como una rutina debe usarse gosub, goto produce un salto incondicional sin esperar retorno, porlo que aparecería un error si se salta a una etiqueta usando goto y se encuentra un return diciendo algo como (Return sin Gosub ???)...

Ya depende de tu pericia del lenguaje que estimo no va muy allá... pero bueno progresa y ya nos contarás donde te estancas...

p.d.: en quickbasic para trabajar con matrices dinámicas (que superen los 64Kb), es necesario arrancarlo con los siguientes parámetros en la línea de comando: Unidad:qb45QB.EXE /ah
Donde unidad es la letra del disco donde está la carpeta qb45 , nota el parámetro "/ah"

149
Seguridad y Criptografía / Re: Configurar Firewall para SSH
« en: Jueves 12 de Noviembre de 2009, 10:14 »
Antes de nada quería indicarte que este tema (como el post anterior que tienes) deberían ir en el foro de ''Servidores'', no en el de seguridad y criptografía... Seguridad y criptografía básicamente se refiere a diseñar, programar, entender sobre dichos temas, lo tuyo es meramente configuración de un servidor (seguro pero servidor).

...dicho lo cual paso a responderte someramente algunos temas.

Cita de: "diego.martinez"
si no me equivoco, la finalidad del tunelado de ssh hace que:
las conexiones que se hacen en el equipo local (ftp:\localhost) son redirigidas a traves del puerto del SSH (port:22) hasta el puerto del servidor de SSH (port:22)
luego, el servidor, redirige la comunicación al puerto adecuado (ftp 21,53,20) , es asi?
Casi. El puerto destino y origen no tienen porqué ser el 22, de hecho yo lo cambiaría... es habitaul encontrarse el puerto 443 . Aunque puedas usar ftp://127.0.0.1 mira si te interesa más usar http://127.0.0.1 .

Si usas el ftp pasivo, le estás diciendo que no va a usar ni puerto 22 ni leches, sino que que le estás diciendo que elija uno aleatorio entre 1024 y 5000 (creo recordar), luego de elegirlo informa al cliente.

Respecto del firewall a veces falla porque puede darse el caso que el ruter utilice el pueto 21 para actualizar el firmware del mismo, por tanto en dicho caso habría que entrar en el router, buscar y desactivar dicha opción.. A mi me ha ocurrido en más de una ocasión.

Respecto de sygate debes mirar que no estén bloqueadas la dirección de localhost. Si no recuerdo mal esto se encuentra en 'tools -> advanced rules' o algo similar... tampoco está de más que piches en add (si está vacío, y si alguna regla definida, en editar) y verifiques las opciones en las diversas fichas...

Cuando configures el servidor compruébalo haciendo un ping.

Te recomiendo que localices gugleando algún manual de configuración de un servidor ssh y lo sigas paso a paso, algunas respuestas puedes deducirlas tu mismo después de probar diferentes 'recetas' de manuales... Yo hace tiempo que no toco este tema y tengo los detalles algo oxidados...

Te propongo por ejemplo este pequeño y sencillo manual... deberás hacer unas pequeñas adaptaciones, pero se ajusta bastante a los programas y configuración que usas.:  http://sozter.net/post/49922632/proxy-tunel-ssh

150
VB .NET / Re: juego del ahorcado en VB.NET
« en: Sábado 7 de Noviembre de 2009, 15:09 »
Quedaría más elegante si en vez de 4 líneas mal puestas, crearas 2 imágenes, un muñeco vestidito y otro en esqueleto y  las 'descuartizaras' (igual tamaño, iguales medidas de trozos)   y luego la fueras poniendo a medida que acierte o falle si falla pones el trozo de esqueleto... en fin algo más vistoso, usa un poco de imaginación...

Páginas: 1 ... 4 5 [6] 7 8 ... 29