Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Mensajes - pkj

#1
ASM / Re: Duda con el modulo en asm
12 Abril 2017, 09:50 AM
Creo que es porque la division se hace usando AX completo.
Pon AH = 0 antes de dividir a ver...
Saludos
#2
.NET (C#, VB.NET, ASP) / Re: Codigo QR
12 Abril 2017, 09:38 AM
Supongo que esos códigos QR son peticiones a bases de datos.
Si es mucho código, pón la direccion donde lo encontraste y ayudarás a otros. Eso de las bases de datos parece ser una locura.
Yo no entiendo de bases de datos, pero sin el código quizás nadie te conteste algo mejor que esto:

Por lo que he entendido y sin conocer ese form que dices, ya sea .NET o VB6, se me ocurre que el modo facil es insertar ese form en tu programa como un form normal (por ejemplo Form2), y cuando quieras generar un código de esos, cargas los valores en las casillas del form2 desde tu programa principal, ejecutas el boton "generar" que traiga el form2 y recoges el resultado de donde te aparezca.
El form2 se cargará en el momento que introduzcas el primer valor en una de sus casillas. Para que no se vea nunca el form2, ya que lo vas a usar desde código, solo tienes que hacerlo invisible en su evento Load y ya esta.

Espero haberme explicado... mas o menos.

Suerte
#3
En primer lugar esto parece ser .NET
Lenght equivale a la longitud.
La variable a puede ser una cadena de texto, una matriz (seguramente esto ultimo), o quien sabe.
Si es una cadena de texto con el bucle for next recorres sus caracteres.
Si es una matriz, recorres sus elementos.
a(i) irá asumiendo el valor adecuado a cada vuelta.
b es otra de lo mismo con la misma cantidad de elementos que a.
#4
.NET (C#, VB.NET, ASP) / Re: PREGUNTA TONTA..
31 Marzo 2017, 11:44 AM
Step indica cuanto aumenta la variable i a cada vuelta.

For i = 0 To a.Length - 1
Hace un bucle desde 0 hasta el valor (a.length-1) de 1 en 1 porque por defecto se asume que step es 1
i vale 0, luego vale 1, luego 2, etc... hasta i=(a.length-1)

For i = 0 To a.Length step 1
Esto hace un bucle desde 0 hasta el valor (a.length) de 1 en 1 porque tu usas el comando step para asignarle valor 1
i vale 0, luego vale 1, luego 2, etc... hasta i=(a.length)

For i = 0 To a.Length step 2
Esto saltaria de 2 en 2
i valdria 0, luego 2, luego 4, etc... hasta el valor mas cercano a a.length sin superarlo.

Si quieres hacer un bucle al reves, donde el valor de i vaya desde a.length hasta 0, pondrias:
For i = a.Length to 0 step -1

For i = 0 To a.Length - 1
For i = 0 To a.Length - 1 step 1
Estas dos lineas hacen lo mismo.
En la primera se asume que step es 1.
En la segunda se obliga a que step sea 1 (algo que no es necesario).

Saludos
#5
Me aburro mucho, así que aquí tienes un ejemplo de tu juego con explicaciones.

Necesitas un command button llamado command1 y una matriz de controles Image de 6 elementos llamado Image1, (osea, pones un control Image en la ventana. lo copias y lo pegas 5 veces mas, y cuando te pregunte si quieres crear una matriz de controles le dices que si.)

Y luego pegas este code en el form:

Código (vb) [Seleccionar]
Option Explicit

Dim Numeros(5) As Long
Dim Imagen(5) As String
Dim Descubiertas(5) As Long
Dim Tachadas(5) As Long
Dim ImagenReverso As String
Dim Seguir As Long
Dim Intentos As Long
Const MaxIntentos = 5

Private Sub Form_Load()
 Dim F As Long
 ' definimos los ficheros de imagenes
 Imagen(0) = "Imagen1.jpg"
 Imagen(1) = "Imagen2.jpg"
 Imagen(2) = "Imagen3.jpg"
 ImagenReverso = "ImagenReverso.jpg"
 Command1.Caption = "Nueva Partida" ' ponemos el titulo del boton
 For F = 0 To 5
   Image1(F).Stretch = True ' esto sirve para que la imagen se adapte al recuadro del control Image
 Next F
 Randomize Timer
 ' comenzamos una nueva partida
 NuevaPartida
End Sub

Private Sub NuevaPartida()
 Dim F As Long
 Dim F2 As Long
 Dim Numero As Long
 ' cargamos los valores aleatorios de alguna manera...
 For F = 0 To 5
   Numeros(F) = 0
 Next F
 For F = 1 To 2
Repite:
   Numero = Int(Rnd * 6)
   If Numeros(Numero) = 0 Then
     Numeros(Numero) = 0
   Else
     GoTo Repite
   End If
 Next F
 For F = 1 To 2
Repite2:
   Numero = Int(Rnd * 6)
   If Numeros(Numero) = 0 Then
     Numeros(Numero) = 1
   Else
     GoTo Repite2
   End If
 Next F
 For F = 1 To 2
Repite3:
   Numero = Int(Rnd * 6)
   If Numeros(Numero) = 0 Then
     Numeros(Numero) = 2
   Else
     GoTo Repite3
   End If
 Next F
 
 ' inicializamos
 Intentos = 0
 Seguir = -1
 For F = 0 To 5
   Image1(F).Enabled = True
   Image1(F).Picture = LoadPicture(ImagenReverso) ' cargamos los reversos de las cartas
   Descubiertas(F) = 0 ' todas estan sin descubrir
   Tachadas(F) = 0 ' no hay parejas tachadas
 Next F
End Sub

Private Sub Image1_Click(Index As Integer)
 ' al hacer click
 Static EnUso As Long
 Dim F As Long
 Dim Contador As Long
 ' si la imagen esta descubierta o tachada por haber encontrado la pareja no hacemos nada y salimos
 If Descubiertas(Index) <> 0 Or Tachadas(Index) <> 0 Then Exit Sub
 
 ' si esta sin descubrir...
 ' si estamos en una pausa le metemos prisa a la sub EsperaMiliseg.
 
 
 ' si esta sub esta en uso o ya hemos vuelto a pinchar otra imagen salimos.
 If EnUso = 1 Then
   If Seguir = -1 Then Seguir = Index
   Exit Sub
 End If
 ' si no estaba en uso avisamos de que ahora si lo esta
 EnUso = 1
 
 ' nos ponemos a la espera de otra pulsacion
 Seguir = -1
 
 ' marcamos la imagen como descubierta
 Descubiertas(Index) = 1
 ' cargamos la imagen que hay que mostrar
 Image1(Index).Picture = LoadPicture(Imagen(Numeros(Index)))
 
 ' hacemos una pausa para que se muestre la imagen
 EsperaMiliseg 1000
 
 ' comprobamos si hay parejas o hemos acabado
 Comprobar
 
 ' y salimos
 EnUso = 0
 
 ' si le metimos prisa a la pausa era porque habiamos pinchado
 ' en una imagen, asi que pinchamos la imagen de nuevo
 If Seguir <> -1 Then
   Image1_Click (Seguir)
   Seguir = -1
 End If
End Sub

Sub EsperaMiliseg(ByVal Tiempo As Double)
 Dim HoraActual As Double
 On Local Error Resume Next
 Seguir = -1
 HoraActual = Timer
 Do Until (Timer >= HoraActual + (Tiempo / 1000)) Or (Seguir = 1)
   DoEvents
 Loop
 On Local Error GoTo 0
End Sub

Private Sub Comprobar()
 Dim F As Long
 Dim Pic1 As Long
 Dim Contador As Long
 Pic1 = -1
 For F = 0 To 5
   ' si una imagen esta descubierta y no esta tachada por haber encontrado ya pareja...
   If Descubiertas(F) <> 0 And Tachadas(F) = 0 Then
     ' la contamos...
     Contador = Contador + 1
     ' y nos guardamos su indice.
     If Pic1 = -1 Then
       Pic1 = F
     Else
       ' si ya tenemos guardado un indice, es que esta es la segunda carta descubierta.
       ' si las 2 cargas son iguales...
       If Numeros(F) = Numeros(Pic1) Then
         ' las tachamos...
         Tachadas(F) = 1
         Tachadas(Pic1) = 1
         ' avisamos del acierto con un beep.
         BeepAcierto
       Else
         ' si son diferentes avisamos del fallo.
         BeepFallo
       End If
       ' y dejamos de buscar porque ya hemos encontrado 2 descubiertas.
       Exit For
     End If
   End If
 Next F
 
 ' comprobamos las descubiertas
 For F = 0 To 5
   If Descubiertas(F) = 0 Then Exit For
 Next F
 ' si hemos descubieto ya todas las cartas hemos ganado
 If F = 6 Then
   MsgBox "Finalizado. Has ganado."
 Else
   ' si no estan todas descubiertas...
   If Contador = 2 Then
     ' contamos los intentos.
     Intentos = Intentos + 1
     ' si ya has llegado al maximo de intentos pierdes
     If Intentos = MaxIntentos Then
       MsgBox "No te quedan intentos. Has perdido."
       ' deshabilitamos los Image para no seguir procesando ordenes.
       For F = 0 To 5
         Image1(F).Enabled = False
       Next F
       ' y salimos.
       GoTo FinSub
     End If
     
     ' si no era el ultimo intento...
     For F = 0 To 5
       ' volteamos las cartas que no estan tachadas y seguimos.
       If Tachadas(F) = 0 Then
         Image1(F) = LoadPicture(ImagenReverso)
         Descubiertas(F) = 0
       End If
     Next F
   End If
 End If

FinSub:

End Sub

Private Sub BeepAcierto()
 Beep
End Sub

Private Sub BeepFallo()
 Beep
End Sub

Private Sub Command1_Click()
 NuevaPartida
End Sub



No es una obra de arte pero funciona.

Saludos




Sorry, la línea 125 (en la sub EsperaMiliseg) debería ser así:

Código (vb) [Seleccionar]
Do Until (Timer >= HoraActual + (Tiempo / 1000)) Or (Seguir <> -1)

Si no, no le metemos prisa al timer :P

Resaludos

MOD EDIT: A estas alturas deberías saber que no debes hacer doble post. Edita tu mensaje.

Pido perdón, el botón Modificar es tan pequeño que creo que no lo había visto nunca.
Siempre busco abajo entre los botones grandes (y me cabreo por no poder editar :) )
#6
El caso es que las pulsaciones automáticas dan muchos problemas.
Ver la tecla pulsada es facil, pero pulsar una tecla en otro programa no suele serlo.

Esto sería la base de tu programa:

Puedes probarlo en un nuevo proyecto con 2 timer y un textbox (que puse para las pruebas).

Después de probarlo anula la línea que pone "Text1.SetFocus" y pruebalo, pero no te va a mandar teclas a otros programas.
Busca por ahí los diferentes modos de enviar pulsaciones que encuentres a ver si te van mejor que SendKeys y nos cuentas.

Código (vb) [Seleccionar]
Option Explicit

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Const constKeyDown = -32767


Private Sub Form_Load()
  'INTERVALO DE PULSACIONES
  Timer2.Enabled = False
  Timer2.Interval = 50
 
  'INTERVALO DE COMPROBACION DE TECLAS
  Timer1.Interval = 50
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
  Dim F8 As Integer
  Dim F9 As Integer
  ' COMPROBAMOS LAS TECLAS
  F8 = GetAsyncKeyState(vbKeyF8)
  F9 = GetAsyncKeyState(vbKeyF9)
  'SI SE HAN PULSADO HACEMOS LO QUE TOQUE
  If F8 <= constKeyDown Then
    'ENFOCAMOS AL TEXTBOX PARA QUE SE PULSEN AHI LAS TECLAS
    Text1.SetFocus
    ' Y ACTIVAMOS EL TIMER
    Timer2.Enabled = True
  End If
  If F9 <= constKeyDown Then
    'DESACTIVAMOS EL TIMER
    Timer2.Enabled = False
  End If
 
 
End Sub

Private Sub Timer2_Timer()
   'PUEDEN PULSARSE LAS 2 TECLAS A CADA VUELTA:
  'SendKeys "QW"
 
  ' O CADA CICLO UNA TECLA:
  ' VARIABLE QUE NO SE BORRA AL SALIR DE LA SUB
  Static Ultimaletra As String
  ' SEGUN LA ULTIMA PULSACION ELEGIMOS LA TECLA A PULSAR
  If Ultimaletra = "Q" Then
    SendKeys "W"
    Ultimaletra = "W"
  Else
    SendKeys "Q"
    Ultimaletra = "Q"
  End If
End Sub


Saludos

#7
El fallo es que miras el listindex pero no dices en que form esta ese list.

Sería así:

MsgBox Form1.List1.List(Form1.List1.ListIndex)

Saludos
#8
Para eso no hacen falta bucles:

If val(TECH.Text) > 74 and val(TECH.Text) < 80 Then TECH.BackColor = RGB(183, 255, 0)

Saludos
#9
Tendras que usar un commondialog para buscar los archivos.
Antes de mostrar los ficheros lo configuras para que solo muestre las extensiones que tu quieras.

Código (vb) [Seleccionar]
  With CommonDialog1
    .DialogTitle = "Elige el fichero"  ' titulo
    .InitDir = App.Path  ' directorio de inicio
    .Filter = "Archivos JPG (*.JPG)|*.JPG|Todos los archivos (*.*)|*.*"  ' tipos de archivo
    .ShowOpen ' muestras el explorador para buscar el fichero
   ' cuando elijas el fichero vuelves aqui
    Fichero = .FileName
  End With


Saludos

#10
Yo tengo el mismo problema con VB6 en Win7.

Mientras depuras, (que tienes que ejecutar el VB6 en modo administrador para que funcione regular), o cuando ya has compilado, (si ejecutas el programa en modo administrador), en ambos casos deja de admitir que arrastres nada sobre el.

No he encontrado solución, y algunos programas que p.ejm. asocian extensiones de archivos, no funcionan si no es en modo administrador.
La única "solución" ha sido añadir un botón "Abrir" (cuando no lo había) y buscar el fichero a mano con un commondialog.
Otra solución para algunos casos es ejecutarlos en modo administrador solo cuando realmente lo necesitas, como cuando quieres asociar extensiones, y cuando no, lo ejecutas normal.

Si alguien sabe como se activa el modo administrador desde el propio ejecutable como hacen algunos programas tal vez se solucione.

Saludos