• Sábado 15 de Agosto de 2020, 09:18

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] 2 3 ... 29
1
JavaScript / Re:Asignacion de cuadrantes a coordenadas geograficas ingresadas
« en: Viernes 20 de Enero de 2017, 20:42 »
El método es sencillo...

Imagina un array de cuadrantes 1,2,3,4....X
Tu debes guardar los grados como cuadrantes tanto de Latitud como de Longitud, luego tendrías un array de 360*360 = 129.600 elementos... no son demasiados, pero queda limitado al mapa por donde se mueva la flota...

Imaginemios que el mapa, sin embargo solo ocupa desde la posición 22 hasta la 56.
... entonces... Tendrías estas constantes para definir el inicio y el fin... para la Latitud
Código: [Seleccionar]
constante LatitudMinGrado = 22
constante LatitudMaxGrado = 56
constante Latitudes = (LatitudMaxGrado - LatitudMinGrado)

También tendríamos para el mapa unos límites de cordenadas, para la Longitud:
Código: [Seleccionar]
constante LongitudMinGrado= 131
constante LongitudMaxGrado = 187
constante Longitudes = (LongitudMaxGrado - LongitudMinGrado)


Y por tanto tu array tendría:
Código: [Seleccionar]
constante CuadranteMax = (Longitudes  * Latitudes)
ArrayGrados(desde 0 hasta  CuadranteMax -1)

Ahora queda traducir los grados al cuadrante en el array, que es lo que pides...
Código: [Seleccionar]
Function (in Latitud, in Longitud, out Cuadrante)
    si latitud es menor que LatitudMinGrado salir de la funcion (error, avisar con mensaje, etc...)
    si latitud es mayor que LatitudMaxGrado salir de la funcion (error, avisar con mensaje, etc...)
    LatRelativa = (Latitud - LatitudMinGrado)

    si Longitud es menor que LongitudMinGrado salir de la funcion (error, avisar con mensaje, etc...)
    si Longitud es mayor que LongitudMaxGrado salir de la funcion (error, avisar con mensaje, etc...)
    LonRelativa = (Longitud - LongitudMinGrado)
 
    Cuadrante= ((LonRelativa * Longitudes) + LatRelativa)
Fin Function

Y la función inversa para obtener la latitud y longitud dado un cuadrante sería:
Código: [Seleccionar]
Function( in Cuadrante, out Longitud, out Latitud)
    Longitud = ((Cuadrante \ Longitudes) + LongitudMinGrado)
    Latitud = ((Cuadrante mod Longitudes) + LatitudMinGrado)
Fin Function

2
Visual Basic para principiantes / Re:Alguien sabe porque ....?
« en: Viernes 24 de Octubre de 2014, 14:18 »
Bastante tarde, pero como no se ha puesto una respuesta correcta, lo hago ahora, para quienes vengan a consultar el mism oproblema.

El problema está en el propio control textbox. Este control limita el texto que admite a 64kb. de tamaño como máximo (aunque en longitud se ponga '0' caracteres).

La solución consiste en usar otro control sin este límite, por ejemplo el richtextbox.

Otra solución es usar internamente una matriz de tipo byte y volcar ahí el contenido desde y hacia la BD. el control textbox, sería la 'vitrina', el 'escaparate' donde el usuario puede consultar, editar el texto... pero requiere sincronizar el scroll del control textbox, para rescatar el bloque parcial que deba contener el textbox en cada momento... en resumen, a este caso tiene sentido crear un control de usuario, que resuelva todo esto de forma transparente a su uso, en vez de tener que implementarlo cada vez....

3
Visual Basic 6.0 e inferiores / Re:Pasar a text3, lo que hay en text1 y text2
« en: Viernes 7 de Junio de 2013, 21:31 »
Si quieres concatenar, tiene que contar también con el texto del origen, sino, claro que lo sobrescribes...

Text3.Text = Text3.Text & " " & Text1.Text & " " & Text2.Text

4
Visual Basic 6.0 e inferiores / Re:Clic copiar, clic pegar
« en: Viernes 7 de Junio de 2013, 21:18 »
Tienes que usar los métodos DragDrop dragover y hacer uso de las propiedades Dragicon y Dragmode

Te pongo un poco de código...
- Pon 3 controles image con estos nombres:
  ImageOrigen
  ImageDestino
 ImageMini
Al control imageOrigen en la propiedad Index pole el valor 0, para forzar un array de controles, el resto se hace desde el código.

El código lo divido en 2 partes, lo que sucede cuando se carga el formulario y el trabajo propio de arrastrar y soltar

Aquí el código de carga del formulario:
Código: Visual Basic
  1.  
  2. Private IcoDrag As IPictureDisp
  3.  
  4. Private Sub Form_Load()
  5.     Dim pic As IPictureDisp
  6.     Dim ruta As String, nombre As String
  7.     Dim posLeft As Long, k As Long
  8.    
  9.     Set IcoDrag = LoadPicture("c:\ruta\iconoarrastrar.ico") ' ruta a un icono que sugiera arrastrar la imagen...
  10.    
  11.     With Me
  12.         .Show   ' para poder cómo se carga mientras se realiza la carga del formulario
  13.        .ScaleMode = vbPixels
  14.         .WindowState = 2 ' maximizado
  15.        .AutoRedraw = True
  16.     End With
  17.          
  18.    
  19. ' damos propiedades a la imagen de origen, los demás controles que creemos se basan en este y  copiarán casi todas sus propiedades (visible siempre es false de entrada)
  20.    posLeft = 6
  21.     With ImageOrigen(0)
  22.         Call .Move(posLeft, 10, 64, 64)
  23.         .Stretch = True
  24.         .DragMode = 1 ' automático
  25.        .BorderStyle = 1 ' con borde
  26.        Set .DragIcon = IcoDrag
  27.     End With
  28.    
  29.     ruta = VBA.Environ$("windir") & "\web\wallpaper\"   ' en esta ruta suele encontrarse imágenes, para probar... el ejmplo enteramente
  30.    nombre = Dir(ruta)
  31.     Do While nombre <> ""
  32.         Set pic = LoadPicture(ruta & nombre)
  33.        
  34.         If pic <> 0 Then ' si se cargó la imagen... pic tendrá un valor distinto de 0.
  35.            With ImageOrigen(k)
  36.                 Call .Move(posLeft, 10)   ' posicionamos el control image
  37.                Set .Picture = pic          ' asignamos el picture
  38.                .Visible = True               ' es obligatorio, porque al cargarlo siempre está invisible
  39.                'Me.Refresh                   ' retira el comentario, para ir viendo la carga una a una.
  40.            End With
  41.             posLeft = posLeft + 70 ' 64px. de la imagen + 6 de espacio libre entre ellos
  42.            If posLeft > Me.ScaleWidth Then Exit Do  ' solo cargamos las que quepan en el ancho de la ventana.
  43.            k = k + 1
  44.             Load ImageOrigen(k) ' crear un nuevo control Image copia del ImageOrigen(0) , un array
  45.        End If
  46.         nombre = Dir  'tomamos siguiente nombre en la misma ruta...
  47.    Loop
  48.    
  49. ' posicionamos la imagen destino, debajo de la fila de imágenes de origen y le damos un tamaño de 300x400
  50.    With ImageDestino
  51.         Call .Move(10, 80, 300, 400)
  52.         .Stretch = True
  53.         .DragMode = 0 ' manual (no lo usaremos como origen)
  54.        Me.Line (10, 80)-(310, 480), vbBlack, BF ' dejamos un recuadro donde está la imagen destino, porque no tiene propiedad backcolor.
  55.    End With
  56.    
  57.     ' Posicionamos el otro control de imagen, centrada de 81x108 (mucho más pequeña), se usará para indicar que admite desde el origen o no la imagen...
  58.    With ImageMini
  59.         Call .Move(0, 0, 81, 108) ' dimensiones
  60.        Call .Move(ImageDestino.Left + ((ImageDestino.Width - .Width) \ 2), ImageDestino.Top + ((ImageDestino.Height - .Height) \ 2))   ' centrado en la imagen receptora.
  61.        .Stretch = True
  62.         .ZOrder 1 ' la enviamos al fondo, debajo de ImageDestino
  63.    End With
  64.    
  65.     ' Esta imagen es para simular otro objeto de arrastrar y soltar, pero que en teoría no debería tener como destino ImageDestino y así ver como lo rechazamos.
  66.    With ImageOtro
  67.         Call .Move(600, 80, 80, 128)
  68.         .Stretch = True
  69.         .DragMode = 1
  70.         .BorderStyle = 1
  71.         Set .Picture = ImageOrigen(0).Picture
  72.         Set .DragIcon = IcoDrag
  73.     End With
  74. End Sub
  75.  

Ahora sólo nos falta el código de las operaciones...
Código: Visual Basic
  1. ' El arrastre lo marcamos manual, luego podemos aprovechar este evento, para indicarlo
  2. '    Nota como el valor del parámetro de DRAG, podría ser una variable cuyo valor se basara en condciones del programa.
  3. Private Sub ImageOrigen_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  4.     ImageOrigen(Index).Drag (1) ' comienza el arrastre 'manual'
  5. End Sub
  6.  
  7. ' Destino detecta una señal de enfoque o pérdida de foco, en un arrastre procedente de un objeto image.
  8. '   Nota, como 'filtramos' para aceptar solo del origen deseado,
  9. Private Sub ImageDestino_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
  10.     If Source.Name = "ImageOrigen" Then
  11.     'If TypeName(Source) = "Image" Then
  12.        If State = 0 Then  ' destino detecta origen invadiendo su 'zona'
  13.            'ImageDestino.BorderStyle = 1 ' se señala
  14.            ImageMini.ZOrder 0
  15.             ImageMini.Picture = Source.Picture
  16.         ElseIf State = 1 Then
  17.             'ImageDestino.BorderStyle = 0 ' se retira
  18.            ImageMini.ZOrder 1
  19.             ImageMini.Picture = Nothing
  20.         End If
  21.     Else
  22.         'ImageDestino.BorderStyle = 0
  23.        If (State Mod 2) = 0 Then
  24.            ImageMini.ZOrder 1  ' escondemos la imagen debajo de ImageDestino
  25.           'Beep ' no admitimos otro origen...
  26.        Else
  27.             '
  28.        End If
  29.     End If
  30.  
  31. '  Se suelta en destino, primero comprobamos si el origen era el control del que se espera recibir, no otro.
  32. '   Nota como el control de typename, podríamos usarlo para filtrar el resto de tipos de controles de un plumazo y en la 2ª comprobación lo hacemos específico al control del que se acepta el origen.
  33. Private Sub ImageDestino_DragDrop(Source As Control, X As Single, Y As Single)
  34.     'If TypeName(Source) = "Image" Then
  35.        If Source.Name = "ImageOrigen" Then
  36.             'ImageDestino.BorderStyle = 0
  37.            Set ImageDestino.Picture = Source.Picture
  38.             ImageMini.ZOrder 1
  39.         'Else
  40.            ' Beep  
  41.        End If
  42.     'End If
  43. End Sub
  44.  

Acomodarlo a tus necesidades ya es trabajo tuyo...

5
Visual Basic 6.0 e inferiores / Re:Memorización de movimientos
« en: Viernes 7 de Junio de 2013, 21:17 »

Lo mejor es crear una clase... metes estas 2 variables

Código: Visual Basic
  1. public X as long
  2. public Y as long

Luego desde el módulo que lo usa... hacemos todo el trabajo

1º creas una coleccion
Código: Visual Basic
  1. dim ColPos as new Collection
  2.  

2º Crea una variable de entrada de datos...
3º Cuando se va moviendo, desde donde sea que tomes los datos, lo rellenas y lo guardas...
Código: Visual Basic
  1. Dim pos as new clsPosiciones  ' éste sería el nombre de la clase
  2.  
  3. pos.x= shape1.left
  4. pos.y= shape1.top
  5. call colpos.add(pos)
  6.  

4º Cuando necesites ver el recorrido que ha seguido el shape, basta que recorras la colección.
Código: Visual Basic
  1. dim p as clsPosiciones
  2.  
  3. for each p in colpos
  4.     msgbox cstr(p.x) & vbcrlf & cstr(p.y)
  5. next

5º Cuando ya no necesites los datos, libera memoria vaciando la colección entera o los ítems requeridos:
Código: Visual Basic
  1. do while colpos.count > 0
  2.     colPos.Remove(1)
  3. loop

6
Visual Basic 6.0 e inferiores / Re:Arrastrar un picture dentro de otro picture
« en: Viernes 7 de Junio de 2013, 21:03 »
No me queda claro, que es lo que quieres...

1 - Copiar la imagen de un control picture en otra (varios casos)
Ten en cuenta el modo de escala...
Código: Visual Basic
  1. set pic2.pictue= pic1.picture  ' copia la imagen entera del pic1 al pic2
  2. set pic2.picture= pic1.image  ' copia 'lo que se ve' del pic1 al pic2
  3. call pic2.paintpicture(pic1, x,y, ancho, alto, dx, dy, dancho, dalto, modo) ' copia parte del pic1 en las posiciones y medias deseadas del pic2, modo son valores que expresan como ha de ser la copia, busca en la ayuda de VB, "Raster Operations" para ver los valores exactos, por defecto es copiar (VBCopy)
  4. ' También puedes usar la  API, BitBlt, en vez de paintpicture...
  5.  

2 - si lo que quieres es meter todo el pic2 en el pic1, tienes que usar la api "SetParent", busca en la ayuda de VB y desde complementos\Api (si está cargada, podrás tomar la declaración de la api)

7
ASM (Ensamblador) / Re:Operaciones Aritmeticas
« en: Domingo 23 de Diciembre de 2012, 14:26 »
antes de:
 mov AL, x

añade esta línea:
 xor AX, AX

Para borrar su contenido, estás trabajando sobre al, pero n has borrado el contenido de ah, fíjate que al pasarlo por la pantalla, muestra el registro AX...

8
Diseño de Algoritmos / Re:Formula de N° aleatorios
« en: Viernes 21 de Diciembre de 2012, 08:56 »
No te voy a dar un trabajo que debes hacer tú,, pero si te voy a orientar, para que seas capaz de lograr algo decente, será más trabajo del que probablemente habíais previsto, pero el resultado merecerá el esfuerzo.

De entrada vuestro planteamiento falla porque es demasiado simple, le pedís mucho a una simple ecuación.

Los números nunca serán aleatorios, sino pseudoaleatroios, pero pueden serlo tanto que no resulten predecibles.

El algoritmo debe estar separado en 2 partes, IniciarTablas y GenerarNumero

IniciarTablas: podría constar en un preparativo de tablas que se calculan (y varían) cada vez que se reinicia el sistema. Y podría constar de los siguientes pasos

IniciarTablas:
Código: [Seleccionar]
1 - De entrada una buena semilla (sobretodo para iniciar el sistema generador) es tomar el
timer del sistema (una función que nos devuleve los milisegundos que han transcurrido desde
medianoche). Es bueno, porque no puedes programar al milisegundo cuando vas a llamar a una
función y que efectvamente suceda así.
      Semilla= timer //la llamada exacta depende del lenguaje pero todos tiene una función similar

2 - Vuestra ecuación ofrece números pero son muy dependientes entre sí. Es preferible partir de
números primos, por tanto, partiendo de una tabla de 1000 primos previamente ya conocida, fijate
que puedes usar como, semilla el timer para elegir un número primo dentro de dicha tabla de
primos. Por ejemplo si el timer marcara 34.567.637 (el día tiene 86.400sg. * 1000 msg.) , y tu
tabla consta de 1000 primos, podría usar el:
     primo = Tablaprimos( semilla modulo 1000 ) //es decir el primo guardado en la posición 637 de
la tabla.


3 - Ahora generar una buena dosis de números. El uso de los primos sería con cosas como, tomar
 los 100 decimales de la raíz cuadrada del número primo elegido de la tabla. Tampoco tiene por
qué ser los 100 primeros decimales, pueden ser del 325 al 425... un poco de imaginación. Incluso
 una vez obtenidos se pueden invertir su orden en la tabla de decimales 'T0', basandonos en si el
msg, del timer es par o impar.
Yo te digo raíz cuadrada, pero nada te impide que sea raíz cúbica, o 5ª... o que dicho valor se
tome de la semilla del timer. La raíz cuadrada siempre será más rápido...

El sistema no te da 100 decimales, los tipos de datos lo limitan. Tienes que preparar un algoritmo
para obtenerlo de forma similar a como lo hacemos manualmente cifra a cifra. Eso queda a vuestro
esfuerzo.


4 - Como verás las series de decimales que van ofreciendo los primos, es muy probable que no
den una buena entropia, habrá series donde unos números aparecerán con bastante más
frecuencia que otros. Esto se arregla si en vez de tomar 1 sola serie tomamos varias y sumamos
índice a índice cada valor de los 100 en la tabla y tomamos la unidad; un ejemplo:

 Sean 5 tablas con 100 valores ( los 100 decimales calculados de 5 primos distintos), generamos un bucle:
    Para 'n' desde 0 hasta 99  / recorremos todos los índices de la tabla
         t0(n) = (t1(n) + t2(n) + t3(n) + t4(n) + t5(n) ) modulo 10
    continuar bucle


5 - Ahora ya cuentas con una tabla cuya entropía desconoces, pero que probablemente sea
buena... conviene usar una serie más para obtener una tabla adicional puede ser otra partiendo
de los números primos o incluso una tabla tomando los decimales de pi, supongamos que es esta,
nuestra tabla ahora la calcularemos así:
    Para 'n' desde 0 hasta 99  // recorremos todos los índices de la tabla
         t0(n) =  t0(n) XOR pi(n)
    continuar bucle

IniciarTablas, ya está listo ahora podremos ceñirnos a GenerarNumero, que constaría de los
siguientes pasos:

GenerarNumero:
Código: [Seleccionar]
1 - Conviene tener 2 semillas, para la 1ª utilizaremos siempre el timer, la 2ª será uno de los
valores calculados en la fase, de entrada, es decir siendo la 1ª llamada valdra 0.

A la semilla del timer llamémosla 'SemT' y la otra 'Sem2'. Tendremos también un 'desplazador'
llamémosle 'Desp', luego verás para qué lo usamos....
      SemT = (timer modulo 100) //esto es nos quedamos sólo con 2 cifras, porque la  tabla 't0'
tiene sólo 100 elementos.
      //*Sem2 = 0 // al iniciarse el sistema, vale 0, en lo sucesivo retiene el valor internamente
      //*Desp  = 0 // al inicarse el sistema, vale 0, en lo sucesivo retiene el valor internamente

2 - El número a generar  (x) seguirá este camino:
  A - Calcular Sem2:
       Sem2 = (semT XOR Sem2)
  B - Hallar el número a devolver:
       x = t0((Sem2 + Desp) modulo 100)
  C - Actualizar el desplazador:
       Desp = ((Desp + 1) modulo 100)

Cada vez que se genera un número, actualizamos este valor, es como si la matriz entera se
rotase una posición. Pero como rotarla es costoso en tiempo, el desplazador consigue el mismo
efecto, con un coste de tiempo despreciable.

El desplazador consigue que tras cada petición, los números en la tabla ocupen una posición más
atrás. Esto hace que una semilla del timer igual que en otra ocasión y otra semilla secundaria igual
 que en otra ocasión, no genere el mismo número que la vez previa a causa del desplazador (salvo
 que en esa posición exista el mismo número que en la anterior).

Finalmente hay una tercera funcionalidad, que sería probar la entropía que ofrece nuestro
generador de números aleatorios. Esto no forma parte del algoritmo, pero si para estudiar su comportamiento.

ProbarEntropia:
Código: [Seleccionar]
1 - Para ello sería adecuado poner un bucle que genere pongamos 100.000 números y los
guarde en una matriz.

2 - Contar apariciones de cada número: Recorremos dicha tabla y contamos las veces que
aparece cada número, será buen generador siempre que la aparición de cada número se aproxime
a los 10.0000

3 - Contar repeticiones seguidas: como mínimo le pediríamos otra prueba a nuestro generador,
que nos diga cuantas veces seguidas aparece cada número.

Dado que si pidiéramos 10 números la probabilidad sería 1/10, para 100 números la probabilidad de
que saliera por ejemplo 6 y luego otra vez 6 sería 1/100, luego para 100.000 sería 5 veces
seguidas... es decir iniciaremos otro bucle que recorra los 100.000 números y contaremos cuantas
veces para cada número aparece seguido 5 o más veces.

Lo daremos por excelente si para cada número ocurre un máximo de 3 veces, (ojo 6 veces
seguidas un número(333333) no se ha de tomar como que 2 veces aparecen 5 veces seguidas un
número (33333x y x33333) o en total la media entre todos no supera 1'5 veces.


Bueno, como ves, tienes por donde guiarte para hacer algo decente... aunque más complejo que la simple ecuación de la que partíais.

La semilla se toma del timer, pero luego se combina (mediante XOR) con el resultado obtenido la vez anterior, a su vez se va rotando la tabla (virtualmente), en pasos de 1. y cada vez que el sistema se reinicia (por ejemplo cada vez que se enciende el ordenador) se eligen nuevas tablas, que son válidas hasta que de nuevo se apague el equipo.

p.d.: Olvidaba decirte, que los números generados serán en el rango 0-9, que imagino es lo que necesitais, no en el rango 0-10, como decías, creo que por error.

9
Visual Basic para principiantes / Re:VB 6.0 eliminar item de listview con texbox
« en: Martes 23 de Octubre de 2012, 09:11 »
Para eliminar items de un control listview debe hacerse a través de la colección donde se guardan... La colección consta en la propiedad ListItems que tiene su método remove.

Código: Visual Basic
  1. listview1.ListItems.Remove(indice)
En tu caso puesto que consta en una cadena de texto, debes convertir el texto a número:
Código: Visual Basic
  1. listview1.ListItems.Remove(clng(text1.text))
Indice representa el índice dentro del listview, no un texto que aparezca en un ítem.

Si tal valor es un texto de una columna de un ítem deberás encontrar el nº del item, he aquí un ejemplo, suponiendo que ekl dato a buscar consta en la columna 2:

 
Código: Visual Basic
  1.    With ListView1.ListItems
  2.         For k = 0 To .Count - 1
  3.             If .Item(k).SubItems(2) = Text1.Text Then
  4.                 .Remove (k)
  5.                 Exit For
  6.             End If
  7.         Next
  8.     End With  

Cada Item tiene una colección subitem, para acceder al 'x' elemento de columna.
Recuerda que también puedes acceder a cada item por su key (no solo por su índice) si quedó establecida...

Además ten en cuenta que si tienes el listview, conectado a datos, esta operación no elimina el registro de la base de datos, sólo el ítem de la lista y probablemente el índice usado sea el id de registro en la BD. Si fuera este el caso, lo que tienes que hacer es eliminar el registro de la base de datos y luego simplemente actualizar el listview con el contenido al que está enlazado...

Si no te has explicado bien, qizás debas probar hasta conseguir exactamente lo que pretendes.

10
Visual Basic para principiantes / Re:como hacer un scramble para windows aplication
« en: Domingo 21 de Octubre de 2012, 22:17 »
Si tu profesor te ha pedido, que realices ese código, entiendo que es porque considera que estás capacitado para hacerlo, en cualquier caso si te damos el código, qué sentido tendría que te lo pidiera tu profesor?. si te lo pide es porque quiere que te esfuerces. es decir, es norma del foro, no darte la pieza asada, si no enseñarte donde se caza y cómo, pero cazar es cosa tuya.

Por scramble, entiendo que te refieres al típico videojuego, donde tienes una nave que se mueve de lado a lado y va disparando a diestro y siniestro matando naves enemigas. si esto es así, aunque el juego es realmente sencillo exige por parte del alumno, ciertos conocimientos ya adquiridos sobre el lenguaje donde pretende implementarlo.

De entrada lo mejor es situar tu nave en la parte inferiro de la pantalla, dibujarla es suficiente con con una elipse de tamaño x, una línea que represente el cañón y otra elipse o círculo de x/2 o menor tamaño encima de los anteriores, esto se puede dibujar drectamente con line y circle o bien con los controles shape (las elipses) y el control line (el cañon). Una vez tenga la rutina de dibujado tendrías que hacer una rutina de moviento de tu nave, esto implica 2 movimientos, el desplazamiento horizontal y el movimiento del cañón. Para el 1º basta con mover los shape y el line x pixels a derecha o izquierda conforme a un evento de teclado al pulsar 2 teclas prefijadas.
El movimiento del cañón requiere ás trabajo, pués es un giro, y debes saber trasladar las cordenada del extremo del cañón, a base de grados coincidiendo con eventos de pulsación de 2 teclas (una que gire a derecha y otra a izquierda), además tanto el movimiento de la nave como del cañón deben tener comprobación de límites para no superarlos (la nave no salga fuera de la pantalla), por tanto antes de mover hay que verificar que el incremento solicitado no lo mueve fuera de la pantalla si es así, se puede mover,si no, ignorar...

Un tercer movimiento es el de la bala del cañón o láser (eso al gusto). Este movimeinto puede estar refleajada en una clase y contener unos datos simples: cordenada actual, originalmente el final del cañón, luego donde se vaya actualizando), el radio, inicialmente la distancia del cañón, el ángulo de disparo (para definir la trayectoria de avance) y la velocidad de avance (si es constante se puede obviar y ser controlado por el timer). Cada disparo retiene sus valores en una instancia de esa clase, y son añadidos a una colección. Luego un timer se encarga de ir actualizando las balas, cada x milisegundos, Esto implica que recorre la colección, extrayendo cada vez una y que dada la cordanada actual se incrementa el radio actual en una unidad (o el valor que determines), luego se borra la bala de su posición actual (por eso hayq ue retener su posición y se dibuja en la nueva y así por cada bala que haya en la clección.

Para no ralentizar el dibujado sería acertado limitar el número de balas que es posible disparar, es decir cuando se alcance x números de balas (en la colección no se permitirá disparar otra), y cuando una bala salga de pantalla o alcance un blanco se elimina de la colección, para no comprobar que está fuera de la pantalla puesto que el ancho y alto son distintos, considera un radio máximo, el cual una vez superado se elimine la bala.

Por supuesto antes de dibujar la bala en su nueva posición, debes verificar que no ha alcanzado a una nave enemiga, esto se hace recorriendo una matriz o colección que contiene las cordenadas de todas las naves enemigas. Por cuestiones de velocidad, puedes plantearlo de tal forma que no necesites recorrer toda la colección si no sólo los que estén (por lo menos)a la derecha o izquierda (según en que dirección avance la bala) de la cordenada original desde la que se disparó la bala.

Las naves enemigas para facilitar su programación podrían inicialmente ser un número finito, estar dispuestas en filas y columnas  y tener todas un movimiento uniforme, de ese modo mover todas a un lado, sería tan sencillo como mover solo la de la más a la derecha hacia la izquierda (cuando se mueven a izquierda) y viceversa... pero esto, con ser un buen recurso, sólo vale si toda la fila está completa...

Para terminar, tu juego inicialmente podría tener un enemigo que no dispare, simplemente tus enemigos deberían ocupar sólo medio ancho de pantalla y cuando alcancen un extremo moviéndose hacia el lado, descienden uno de alto...

Tu ganas cuando has destruído todas las naves (cada vez que destruyes una, sumas 1 nave destruída cuando naves destruidas=naves totales, has ganado la partida). en cambio si la naves enemigas alcanzan la línea de tu nave tu pierdes la partida. Los movimientos de las naves no los hagas de 1pixel en uno, si no en jmúltiplos de por ejemplo 4 u 8 (debes probar hasta que veas que el juego resulta fluído y jugable).


Como ves se necesitan ciertos conocimientos de programación y un algo de matemáticas para mover el cañón adecuadamente y calcular las posiciones actualizadas de las balas... Y eso que un juego extremadamente simple. Ya depende de tus conocimientos de programación, pon el código que seas capaz de hacer y donde te pierdas pregunta puntualmente y se te orienta, pero recuerda que no se hacen tareas, sólo auda spuntuales donde uno se queda atascado...

11
Visual Basic 6.0 e inferiores / Re:Obtener licencia y software
« en: Jueves 4 de Octubre de 2012, 16:19 »
No hay manera de obtener el software 'oficialmente'. Bueno si, una... Se puede buscar por internet de adquirir un paquete de Visual Studio 6.0, que incluya todo, el software y la licencia.

Si no dispones del software de vs 6.0, no tendrás más remedio que localizarlo a través de la red, 'como sea' para poder usarlo. Al caso es preferible que si alguien que tenga licencia y el paquete de software, te permita hacer una copia, de ese modo garantizas que la copia es fidedigna y sin modificaciones no permitidas. Por alguien entiende un amigo o empresa que resida cerca de ti, donde exista confianza mutua...

Ahora bien, haciendo un downgrade, tienes que tener en cuenta ciertos aspectos:
- ¿Te compensa?. Es decir, si necesitas seguir usando tu vs2005, al hacer el downgrade, a vs6.0, no podrás seguir usando vs2005, para tal caso deberías adquirir otro paquete vs2005. Si crees que en un futuro, seguirás necesitando hacer proyectos en vb2005, entonces evalúa que te sale más rentable económicamente, si adquirir una nueva licencia y paquete de vs 2005 o adquirir una licencia de vs6.0, por internet...
- Debes ceñirte a una cuestión... el downgrade, es bis a bis (o menor), esto es: versión estándar a versión estándar, versión profesional a versión profesional(o menor), versión empresarial a versión empresarial(o menor). Si tu producto licenciado de vs2005 es licencia profesional, no te valdría hacer downgrade a licencia empresarial de vs6.0, toda vez que la versión empresarial es la más elevada. Naturalmente la versión empresarial de VS2005, si cubre a la versión profesional de vs6.0 (de ahí la coletilla 'o menor')...


Por tanto antes de hacer el downgrade debe quedarte claro que versión de vs 6.0 necesitas utilizar (para hacer las modificaciones a ese y/o otros proyectos futuros), si tu versión desde la que hacer downgrade de vs 2005, no es la más elevada(empresarial).

12
hola a todos ..!
Para encontrar un metodo de simplificar ya sea:

(6 / 8)  ambos dividiendo entre 2 para poder simplificar a una minima expresion
calculos
(6 / 2) = 3
(8 / 2) = 4

dando resultado como 3/4

Como seria el codigo en visual basic

Aunque no te hayas expresado muy correctamente, yo te he entendido...
Lo que pides, es lo que se conoce como hallar el 'Máximo común divisor', que te enseñaron seguramente de niño, y que por lo visto has olvidado...

Yo te muestro un método 'lento de cálculo', pero rápido de programar, puede ser optimizado de varias maneras, la 1ª mirando si el bucle debe ser creciente o decreciente y la más óptima es usando una tabla de primos (para recorrer sólo esos valores, no el resto).
El código es susceptible de ser optimizado. Una vez comprendas lo que hace, puedes modificar el cómo lo hace... eso ya queda a tu esfuerzo....

Al final del bucle se obtiene el MCD que devuelve la función y las fracciones reducidas que se devuelven por referencia a través de los parámetros.

Para ejecutar el proyecto, añade al formulario 1 botón 1 dos controles de texto, luego copia el código (está comentado) y pégalo en la ventana de código:

Código: Visual Basic
  1. Private Sub Command1_Click()
  2.     Dim d As Long, n As Long, m As Long
  3.     Dim v() As String
  4.    
  5.     v = Split(Text1.Text, "/")
  6.     d = Val(v(0)) 'Val(Right$(Text1.Text, 1))
  7.    n = Val(v(1)) 'val(Left$(Text1.Text, 1))
  8.    
  9.     m = MCD(d, n)
  10.     Text2.Text = "MCD= " & CStr(m) & "; Reducción de la fracción: " & CStr(d) & "/" & CStr(n)
  11. End Sub
  12.  
  13.  
  14. ' Den= Denominador
  15. ' Num= Numerador
  16. ' Halla el máximo común divisor de los valores fraccionarios dados...
  17. Public Function MCD(ByRef Den As Long, ByRef Num As Long) As Long
  18.     Dim v As Long   ' contendrá temporalmente el valor MCD calculado
  19.    Dim Ix As Long  ' índice usado en el bucle.
  20.    Dim max As Long ' valor máximo que debe cabría esperar que fuera divisor, así 'a lo bruto'.
  21.        
  22.     ' Comprobamos que es menor si el denominador o el numerador.
  23.    '  para luego hallar su mitad, que entregamos en max
  24.    '   como max es un long, el valor devuelto es entero.
  25.    ' El objetivo de esto (max) es conocer el mayor valor tras el cual
  26.    '   es imposible que haya otro que divida a dichos números.
  27.    '   Si el valor es 20, es absurdo usar un número mayor de 20
  28.    '     pero incluso basta con la mitad (ya que el primo menor es 2).
  29.    If Den < Num Then
  30.         max = (Den \ 2) + 1
  31.     Else
  32.         max = (Num \ 2) + 1
  33.     End If
  34.    
  35.        
  36.     v = 1
  37.     For Ix = max To 2 Step -1       ' este  bucle recorre los números.
  38.        Do                          ' este bucle permite recoger cuantas veces esté un número...
  39.            If Den Mod Ix <> 0 Then Exit Do   ' si no es múltiplo, no lo divide
  40.            If Num Mod Ix <> 0 Then Exit Do   ' si es múltiplo del den, pero no del num, no vale.
  41.            v = v * Ix              ' calculando sobre la marcha el MCD...
  42.            Den = Den \ Ix          ' lo dividimos
  43.            Num = Num \ Ix          ' lo dividimos
  44.        Loop
  45.     Next
  46.    
  47.     MCD = v
  48. End Function
  49.  

13
Visual Basic 6.0 e inferiores / Re:Crear libreria
« en: Viernes 28 de Septiembre de 2012, 20:47 »
Este tema daa de hace tiempo, pero es posible que aún no hubieres logrado resolver tu problema y en cualquier caso como es un tema 'desierto', es preferible que tenga respuestas para futuros usuarios que necesiten una solución con el mismo problema.

Reinstala VB6, y no olvides instalar también el último servicepacks de VB6 (sp6), que se puede buscar y descargar desde la página de microsoft.

Trata de ver qué dependencias utiliza tu librería y asegúrate que utilices, lás más actuales (por ejemplo descarta las que fueren de 16 bits, en favor de las de 32 bits, si fuera el caso).
Realmente no deberías tener más problemas. COM es COM aunque una vez más microsoft migre de tecnología.


14
Perdonad que no haya terminado... pero he estado bastante ocupado.

En las próximas semanas espero encontrar el tiempo suficiente para terminar las partes que quedan...

15
Visual Basic 6.0 e inferiores / Re: Duda for Next
« en: Lunes 6 de Junio de 2011, 00:55 »
Claro que puedes hacerlo.

Pero para hacerlo más eficiente, conviene que los textbox formen una colección...
Para hacer esto elimina todos los textbox excepto el 1º. Luego copia ese y pégalo en el formulario tantas veces como necesites, la 1ª vez te dirá que si quieres crear una matriz de controles, di que si (en realidad es una colección no una matriz, pero es un detalle sin importancia).

Luego podrás recorrer el bucle porque pueden ser accedidos a través del índice que los relacciona todos juntos.

Código: Visual Basic
  1.  
  2.  
  3. dim k as long
  4.  
  5. for k= 0 to 14
  6.     text1(k).maxlenght=10
  7. next
  8.  
  9.  
Fíjate que al crear una matriz, existe una propiedad índice que entonces toma un valor que identifica univocamente a cada control en la matriz.

Si tienes que asignar más propiedades que sólo maxlenght, podrás hacerlo cuando lo necesites. Ten en cuenta que al copiar un control y pegarlo permitiendo la matriz, la copia mantiene el valor actual de las propiedades que tenía el copiado, luego en diseño antes de copiar controles introduce las propiedades que quieres que tengan todos en común, te ahorrará tener que introducirlo manualmente uno a uno luego...

Si no crear la matriz de controles, todavía podrás usar un bucle for, pero para ello tendrá que ser del tipo 'For Each', preguntando al contenedor por los controles textbox y descartando a los que no deba aplicarse. Pero esto supone recorrer todos los controles que tiene el formulario cada vez, por lo que es menos eficiente... Aparte de cambiar la propiedad tienes que verificar que ese control es un textbox y que además es uno sobre los que quieres  operar...

16
Visual Basic para principiantes / Re: GUARDAR DATOS DE UN CONTADOR
« en: Martes 8 de Marzo de 2011, 23:14 »
Como te dice chiquilla, puedes usar un simple fichero de texto.
Si el fichero está localizado en un ordenador que no es seguro, podrías cifrar el contenido, o simplemente compimirlo con contraseña (usando por ejemplo winrar) después de usarlo y descomprimirlo antes de  volverlo a usar...
Si la duda acerca de la seguridad sea no sólo su manipulación sino también su extravío, una vez guardado el fichero al final del día y comprimido, puedes hacer varias copias y entregar 1 copia a cada representante que vela por la justa votación (quizás algunos profesores), justo al día siguiente antes de continuar la votación, cada uno porta su copia  y se verifica que el contenido de ellos es el mismo (usando cualquier sistema de hashing, por ejemplo MD5, busca por la red un programa gratuito llamado MD5Summer muy sencillo de usar). Cuando se verifica que el contenido del fichero no fue alterado se carga al programa y se continúa con la votación... al final del día se repite el procedimiento...

Si lo necesitas, usa la búsqueda del foro para ver ejemplos de código (de VB6) de como leer de fichero y escribir a fichero, hay muchos... y recuerdo haber puesto código de alguno muy, muy, muy simple...

17
Visual Basic para principiantes / Re: form hijo que vuelva mdiform principal
« en: Viernes 24 de Diciembre de 2010, 02:21 »
No queda claro que es lo que requieres...

Si tienes un formulario MDI, puedes tener otros formularios que podrían ser hijos de éste, activando la propiedad MDIChild a true.
si es este tu caso, los formularios mdichild (formularios hijos del MDI, se abren dentro del MDI, por tanto cuando se cierran todos  se está sobre el formulario MDI y sin cerrar, el formulario MDI es totalmente accesible.

Si tienes un formulario MDI y otros que no son 'hijos' de éste, al formularo MDI, se accede del mismo modo que si no fuera MDI.
Es decir un formulario MDI, sólo se diferencia de uno que no lo es, eque éste puede contener dentro de sí otros formularios llamados 'hijos' respecto de él, además el menú del formulario hijo puede ser agregado al formulario MDI...

Si tu pregunta no está contestada, por favor se más clara en tu exposición.

18
Visual Basic 6.0 e inferiores / Re: Problema con objeto MSCOMM
« en: Viernes 24 de Diciembre de 2010, 02:12 »
Tienes que filtrar la cadena recibida...

Código: Visual Basic
  1.  
  2.    dim txt as string
  3.  
  4.    txt= "98.33 g || 96.33 g ||"
  5.    msgbox "cadena original: " & txt    
  6.    txt= replace(txt,"||"," ") ' cadena sobre la que se opera, carácter o cadena a remplazar (la que se busca), carácter o cadena que remplaza cada hallazgo. Replace tiene aún 3 parámetros más por si los necesitas...
  7.    msgbox "cadena filtrada: " & txt    
  8.  
  9.  

19
Visual Basic 6.0 e inferiores / Re: Manejo de los Objetos en un formulario
« en: Sábado 11 de Diciembre de 2010, 03:10 »
Cada formulario mantiene una colección de los controles que en él contiene, esto es accesible a través de la propiedad 'controls'.
Adicionalmente podemos filtrar para operar sólo sobre determinados contenedores. Te incluyo en el código de ejmplo una forma de operar de esta manera....


En un nuevo proyecto:
1 Coloca varios textbox en un formulario,
2  coloca 2 picturebox en el formulario y mete en ellos también algunos textbox
3 coloca 1 botón
4 añade otros diferentes controles entre ellos un  Timer... (lo usamos en el ejemplo).
5 cambia a los textbox, el fondo de diferentes colores
6 luego copia y pega esté código y ejecútalo...
Código: Visual Basic
  1.  
  2. Public Enum DondeSeaplica
  3.     APLICAR_SOLO_AL_CONTENEDOR_PASADO = 1
  4.     APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO = 2
  5.     APLICAR_A_TODOS = APLICAR_SOLO_AL_CONTENEDOR_PASADO + APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO ' 3
  6. End Enum
  7.  
  8. Private Sub Command1_Click()
  9.     Call CambiarFondoControl(135790, "TextBox", APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO, Picture1)
  10.     MsgBox "deben haberse pintado todos los textbox EXCEPTO los contenidos en el picture1 de color rojo pardo"
  11.    
  12.     Call CambiarFondoControl(246802, "TextBox", APLICAR_SOLO_AL_CONTENEDOR_PASADO, Picture2)
  13.     MsgBox "deben haberse pintado SOLO los textbox contenidos en el picture2 de color verde fuerte"
  14.  
  15.     Call CambiarFondoControl(7654321, "TextBox", APLICAR_A_TODOS)
  16.     MsgBox "deben haberse pintado TODOS los textbox contenidos en el picture2 de color verde macilento"
  17.  
  18.    Call CambiarFondoTextBox(7654321, "Timer", APLICAR_A_TODOS) ' <------- OJO: aquí debe dar error
  19. End Sub
  20.  
  21. ' Nota: se da por supuesto que operamos con un formulario llamado  form1...
  22. Private Sub CambiarFondoControl(ByVal nuevoColor As Long, ByVal Tipo As String, ByVal Aplicar As DondeSeaplica, Optional ByRef Contenedor As Object)
  23.     Dim ct As Control
  24.  
  25.     If Tipo <> "" Then
  26.         On Local Error GoTo NoContenedor
  27.        
  28.         If Contenedor Is Nothing Then Set Contenedor = Form1  ' <-------- OJO: hemos puesto Form1
  29.        
  30.         Select Case Aplicar
  31.             Case DondeSeaplica.APLICAR_SOLO_AL_CONTENEDOR_PASADO
  32.                 For Each ct In Form1.Controls  ' nótese que debe ser un formulario...
  33.                     If TypeName(ct) = Tipo Then
  34.                         If ct.Container.Name = Contenedor.Name Then
  35.                             ct.BackColor = nuevoColor
  36.                         End If
  37.                     End If
  38.                 Next
  39.             Case DondeSeaplica.APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO
  40.                 For Each ct In Form1.Controls  ' nótese que debe ser un formulario...
  41.                     If TypeName(ct) = Tipo Then
  42.                         If ct.Container.Name <> Contenedor.Name Then
  43.                             ct.BackColor = nuevoColor
  44.                         End If
  45.                     End If
  46.                 Next
  47.             Case DondeSeaplica.APLICAR_A_TODOS
  48.                 For Each ct In Form1.Controls  ' nótese que debe ser un formulario...
  49.                     If TypeName(ct) = Tipo Then
  50.                         ct.BackColor = nuevoColor
  51.                     End If
  52.                 Next
  53.             Case Else
  54.                 MsgBox "No existe una correspondencia con el valor: " & CStr(Aplicar) & " para la variable 'Aplicar'"
  55.         End Select
  56.     End If
  57.     Exit Sub
  58. NoContenedor:
  59.    If Err.Number = 438 Then
  60.         MsgBox "Ocurrió un error. El control " & Tipo & " no tiene una propiedad 'backcolor'", vbCritical, "Error al CambiarFondoControl"
  61.     Else
  62.         MsgBox "Ocurrió un error." & vbCrLf & Err.Description, vbCritical, "Error al CambiarFondoControl"
  63.     End If
  64. End Sub
  65.  
  66.  

Recuerda meter correctamente el nombre del tipo de control y para el caso de mayúsuclas minúsculas...
Si un control no tiene la propiedad del ejemplo (backcolor) se indica expresamente, por ejemplo la última llamada trata de cambiar el backcolor a un timer, pero este no tiene tal propiedad.

El ejemplo sirve tanto para seleccionar todos los controles de un determinado tipo como para seleccionar todos los controles que pertenecen/no pertenecen a un mismo  contenedor...

20
Visual Basic para principiantes / Re: Separar path de fichero sin instrrev
« en: Domingo 5 de Diciembre de 2010, 20:43 »
Puedes usar el 'filesystemobject' contiene clases que permiten manipular ficheros...

un ejemplo de código:
Código: Visual Basic
  1.  
  2. Dim fso As New FileSystemObject
  3. Dim Dr As Drive
  4. Dim Fi As File
  5. Dim Fo As Folder
  6.  
  7. Private Sub Command1_Click()
  8.     Dim ruta As String
  9.    
  10.     ruta = "C:autoexec.bat"
  11.     Set Fi = fso.GetFile(ruta)
  12.    
  13.     If Not (Fi  Is Nothing) Then
  14.         MsgBox "Ruta completa : " & Fi.Path & vbCrLf & _
  15.          " en la carpeta: " & Fi.ParentFolder & vbCrLf & _
  16.          " de nombre: " & Fi.Name
  17.     Else
  18.         MsgBox "error, ocurrió un error con el fichero " & ruta
  19.     End If
  20. End Sub
  21.  
  22.  
  23.  

21
Usa el evento validate del textbox. Esto ocurre cuando el textbox pierde el foco, ahí chequeas si tiene más de un punto o letras y por tanto cancelas.... al cancelar, el foco no sale  del textbox.

Código: Visual Basic
  1.  
  2. Private Sub Text1_Validate(Cancel As Boolean)
  3.     Dim n() As Byte
  4.     Dim HayPunto As Boolean
  5.    
  6.     If Text1.Text = "" Then
  7.         MsgBox "La caja de texto no puede quedar vacía, escriba al menos un 0."
  8.         Cancel = True
  9.     Else
  10.  
  11.         n = Text1.Text
  12.         For k = 0 To UBound(n) Step 2
  13.             If n(k) > 47 Then
  14.                 If n(k) > 58 Then
  15.                     MsgBox "No se permiten caracteres, sólo números."
  16.                     Cancel = True
  17.                     Exit Sub
  18.                 End If
  19.             Else
  20.                 If n(k) = 46 Then
  21.                     If HayPunto = False Then
  22.                         HayPunto = True
  23.                     Else
  24.                         MsgBox "Sólo se permite un punto para el número, como separador decimal."
  25.                         Cancel = True
  26.                         Exit Sub
  27.                     End If
  28.                 Else
  29.                     MsgBox "No se permiten caracteres, sólo números."
  30.                     Cancel = True
  31.                     Exit Sub
  32.                 End If
  33.             End If
  34.         Next
  35.     End If
  36. End Sub
  37.  
  38.  

22
Puede que tengas una versión diferente...

Veamos si ya tienes registrado el control:
1 - crea un nuevo proyecto,
2 - desde el cuadro de herramientas (conde estánlos controles estándar de vb) pincha con el otro botón en una zona libre, y elige la opción, 'componentes' ... localiza el control.
3 - Y coloca una instancia del mismo en el formulario.
4 - Guarda el proyecto y luego lo cierras.
5 - Ahora abre 2 ventanas de exploración de archivos.
6 - Localiza éste proyecto que acabamos de crear y el proyecto donde tienes que te falla el control..
7 - Abre ambos proyectos(los archos .vbp) pero con el worpad, no con vb6... localiza una línea parecida a esto en ambos archivos:
Object={D3C7AE26-4CB2-4123-BF58-53AA65967D71}#1.0#0; ctrlNSDataCombo.ocx
Fíjate en el numeraco que yo he puesto, entre las llaves en corchetes (obviamente te aparecerá un número diferente) ... pués bien deben coincidir en ambos proyectos, sino coinciden,  significa que se trata de versiones diferentes, pero que tienen el mismo nombre. Si registraste el control y te sigue apareciendo dicho error es por esto, son 2 versiones diferentes.

Si por tanto se trata de versiones diferentes, puesto que tienes una versión del control y ya lo has registrado, podemos por tanto suponer que éste es el archivo 'correcto', lo que quiere decir es que debes tomar la línea del proyecto recién creado (que  tiene la copia de la versión 'buena ') copiarla y remplazar la línea por la que aparece en el proyecto con errores. Luego  guarda el archivo desde el menú archivo.  cierra ambos archivos, ahora abre el form del proyecto que creaste nuevo, también con el worpad y copia la línea:
Object = "{D3C7AE26-4CB2-4123-BF58-53AA65967D71}#1.0#0"; "ctrlNSDataCombo.ocx" (es casi idéntica a la anterior sólo que está encerrada entre comillas las 2 partes) y ahora vas a cada uno de los formularios donde aparezca una instancia del control, lo  abres con el worpad y remplazas la línea que refiere al control con la de la versión que tienes... la que has copiado de este proyecto nuevo que hemos creado sólo para esto... No olvides guardar cada fichero modificado.

Ahora cuando abras el proyecto ya no deberías tener problemas con la localización de la librería... la tienes registrada y en tu proyecto apuntas a la versión que tienes instalada.

Todavía podrías tener algún error si existen diferencias entre las versiones, es decir, si los cambios entre ambas versiones modificaron nombres de propiedades, funciones o constantes que usas. Además del nombre debe coincidir la cantidad, tipos y orden de parámetros o si simplemente se eliminaron. En dicho caso tendrías que modificar las firmas de las propiedades, funciones, etc... de acuerdo a la versión que tienes. si ya no existen en la nueva versión no podrás utilizarlas...
No tendrás problemas si cambió el código dentro de los procedimientos ellos (lo que importa es la firma de los procedimientos ). Tampoco afecta si se añadieron nuevas propiedades y funciones...

23
Visual Basic 6.0 e inferiores / Re: Foco loco con DataGrid
« en: Viernes 5 de Noviembre de 2010, 21:31 »
El foco sólo se puede pasar si el control está activo y visible. Si la propiedad enabled es false, es normal que no pueda recibir el foco.
Además el datagrid tiene varias propiedades relacionadas con la tabulación que afectan al foco, estudia como se relacionan entre si.

Por ejemplo si la propiedad Tabstop del datagrid es false, cuando le envíes el foco al datagrid desde el textbox, el datagrid recibe el foco e inmediatamente lo pierde...

Puedes comprobarlo, crea un nuevo proyecto, añade un textbox y un datagrid, pon este código ejecuta el proyecto y escribe en el textbox:
Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3.     DataGrid1.TabStop = False
  4. End Sub
  5.  
  6.  
  7.  
  8. Private Sub Text1_Change()
  9.     DataGrid1.SetFocus
  10. End Sub
  11.  
  12. Private Sub Text1_GotFocus()
  13.     MsgBox "el textbox tiene el foco"
  14. End Sub
  15.  
  16. Private Sub DataGrid1_GotFocus()
  17.     MsgBox "datagrid obtiene el fco"
  18. End Sub
  19.  
  20.  

24
Poco lejos vas a llegar si no sabes a que se debe el error.

Te está diciendo que el proyecto utiliza un objeto llamado 'NSDataCombo' que pertenece al componente llamado 'ctrlNSDataCombo' que se localiza (probablemente) en un archivo llamado clase ctrlNSDataCombo.ocx

Dicho archivo no está registrado. Necesitas primero conseguir dicho archivo, luego o bien lo situas en la carpeta de tu proyecto o bien lo situás en otra parte (por ejemplo en ...systems32) y lo registras.

Cualquier invocación de sus propiedades evidentemente dará error porque el proyecto no consigue localizar el componente.

25
Visual Basic para principiantes / Re: Consulta!
« en: Miércoles 3 de Noviembre de 2010, 08:17 »
3 pistas a cada plabra... te obliga a elegir muy bien las palabras, vamos que no es igual que tomar un diccionario y elegir una palabra al azar...

Es sólo una cuestión de imaginación... imagina que la plabara a buscar fuera Japón... podrías poner como:
La 1ª pista una imagen de una pastilla de jabón.
La 2ª pista podría ser un luchador de sumo o karateca o un samurai y..
La 3ª podría ser una imagen del monte Fuji.

Si es impoortante que cada pista sea más próxima que la anterior... entre jabón y Japón sólo un parecido fonético que no resulta evidente, hasta que se conozca el resultado. Entre el luchador y Japón hay una conexión más directa, ya se intuye que es sobre Japón, pero no queda claro sobre qué, podría ser sobre personas y la suspicacia de alguien podría asimilar jabón= ducha, luchador = lucha, que no es la palabra a buscar, después con el monte Fuji por fin se reunen 2 elementos que tiene en común a Japón...

Las pistas no sólo pueden ser imágenes, podrían ser también una frase:
La 1ª podría ser: 'Se llega allí en barco'.  (Lo que deja claro que es un lugar, y lo recluye a lugares bañados por agua)
La 2ª podría ser: 'Tiene varios volcanes'. (Lo que reduce la cantidad de lugares, al tener que reunir tener costa y volcanes).
La 3ª podría ser: 'En su bandera hay un Sol'.  (Lo que ya inequívocamente refiere a Japón).


En fin, no hay más orientación que la imaginación, las pistas dependen del término elegido, por lo que no existe un algoritmo que resuelva el asunto, no es cuestión de programar, sino de imaginar...

En el foro hay una sección de libros... localízala y allí se habla de manuales...

Páginas: [1] 2 3 ... 29