• Viernes 3 de Mayo de 2024, 00:39

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 [4] 5 6 ... 29
76
Pués me alegro, porque iba a decirte que mi tiempo no da para repasar los proyectos de la gente... puedo atender dudas puntuales...

Sobre windows Form2, quizás entendiste mal. Te decía que se deben utilizar si TU INTERFAZ tiene que mostrar caracteres unicode, pero éste no es tu caso, después de leerte...

77
Visual Basic 6.0 e inferiores / Re: Panel control
« en: Martes 25 de Mayo de 2010, 04:43 »
Tienes 2 opciones.

A)))) Puedes crear un 'wrapper' del panel de vb 2005 y entonces podrás usarlo en vb6. Los controles de vb.net no son válidos para vb6 directamente. Crear un wrapper es crear un control en vb.net donde todas sus propiedades y métodos(o solo aquellas que nos interesen) son parcheadas llamándolas internamente.
Esto es, tu pones un control panel sobre el control que vas a crear y le das un nombre, pongamos panel1, entonces tu empiezas a exponer sus propiedades, hay 3 casos para el parcheo
1) la propiedad se aplica a tu control y al control incrustado dentro (el panel). Por ejemplo cuando expongas la propiedad 'Width' tu haces dentro panel1.width =ancho, control.width=ancho ... ancho es el valor recibido y control es el nombre que le des al control que estás creando, panel1, es el panel que tienes colocado sobre el control.
2) La propiedad sólo debe aplicarse al control, por ejemplo Top, con propiedades así simplemente tienes que hacer control.top=top pero no panel1.top=top porque entonces se desplazaría dentro de tu control ... top y left para panel1 serán siempre 0.
3) La propiedad sólo debe aplicarse al control  a parchear no al control en si, por ejemplo la propiedad backcolor, puesto que tu control tiene dentro un control panel de vb.net que rellena por completo el control, no tiene sentido hacer control.Backcolor = 255, basta con hacer panel1.Backcolor = 255

Con las funciones pasa del mismo modo...

B))) O bien puedes usar la api setparent para cambiar a un control de contenedor ( y olvidarte del panel). Si el contenedor esta en la misma ventana, basta con utilizar la propiedad container...

Esto último, desde luego es bastante más sencillo y rápido que crear un wrapper (los contenedores tienen más trabajo que controles que no son contenedores), tú decides.

78
Visual Basic para principiantes / Re: metodo de powell
« en: Lunes 24 de Mayo de 2010, 08:40 »
Búscalo como 'fórmula DFP', o 'solución DFP' o por lo menos en inglés, seguro que te aparecen páginas.

DFP = Davidon, Fletcher y Powell

79
Windows / Re: NO aparece mi Lector de DVD en mi pc
« en: Domingo 23 de Mayo de 2010, 02:35 »
Dale a 'buscar hardware' que ya está conecado al equipo, desde el panel de control... luego reinicia el equipo.

80
Creo que me he explicado bien...

El archivo se te descarga con el nombre original, pero cuando se guarda los caracteres (la grafía) son truncados, tu no verás esos caracteres en tu equipo que está en idioma español, pero el nombre correcto está ahí.

Sea el nombre de un archivo tal que éste: [香港][林正英][经典系列][洪福齐天].mpg
Tu verás algo como esto:

Tu en VB no podrás recibir una cadena de texto, sino una matriz de bytes y como tal puedes tratarla (ten en cuenta que lo más probable es que use 2 bytes por carácter), lo que no podrás hacer NUNCA es que se vea la GRAFIA original si no coincide con la GRAFÍA del idioma que está instalado en tu equipo, sin embargo el nombre es creado...

Un equipo sólo acepta una grafía a la vez, la que corresponde al idioma instalado (panel de control,configuración regional y de idioma)  . Los nombres de archivos y de carpetas se guardan pero los caracteres que te aparecerán será como el dibujo, ilegible excepto para quien tenga dicho idioma puesto en su idioma.

VB opera con Unicode, pero de cada adentro lo 'traduce' a ANSI, lo que resulta en un truncado que puede inutilizar los datos. Por ello hay que actuar sabiendo lo que se hace.

De entrada si tu aplicación debe mostrar una interfaz, por ejemplo en chino, debes cargar un conjunto de controles que en vez de ANSI utilicen realmente Unicode, estos controles son controles comunes, si miras en componentes localiza Microsoft forms2  y márcalo. Los controles que provee si permiten unicode, ahora por ejemplo cuando cargues un textbox, cambia la fuente a un tipo de grafía china, por ejemplo 'Ming Liu'.

Luego tu problema de abrir un fichero lo podemos resolver con la API CreateFile, pero no la normal sino la 'wide', yo te pongo una de ejemplo, con los parámetros, la declaración de los parámetros y un valor de ejemplo:
Código: Visual Basic
  1.  
  2. Private Declare Function CrearFichero Lib "kernel32" Alias "CreateFileW" (ByVal Ruta As String, ByVal ModoAcceso As Long, ByVal ModeCompartido As Long, byref AttributosSeguridad As AtributosDeSeguridad, ByVal Modoapertura As AccionFichero, ByVal AtributosYBanderas As Long, ByVal Plantilla As Long) As Long
  3.  
  4. Private Type AtributosDeSeguridad
  5.     Tamaño As Long       ' tamaño en bytes de la estructura 10
  6.     Descriptor As Long      ' puntero a un descriptor que controla la compartición del uso del fichero. 0 = se asigna por defecto al proceso que lo llama.
  7.     Heredable As Boolean    ' indica si un nuevo proceso (cuando se crea) hereda el manejador (handle)
  8. End Type
  9.  
  10. Dim AtSeg as AtributosDeSeguridad ' declaración para esta opción
  11. AtSeg.Tamaño= 10   ' la estructura puede pasarse vacía sin problemas...
  12.  
  13. Private Enum AccionFichero
  14.     ACCION_CREAR_NUEVO = 1              ' Crea un nuevo fichero, si existe ya, falla
  15.     ACCION_CREAR_SIEMPRE = 2            ' Crea un nuevo fichero, si existe es sobrescrito.
  16.     ACCION_ABRIR_SOLO_SI_EXISTE = 3     ' Abre un fichero, si no existe falla.
  17.     ACCION_ABRIR_SIEMPRE = 4            ' Abre un fichero, si no existe se crea
  18.     ACCION_TRUNCAR_SOLO_SI_EXISTE = 5   '  abre un fichero y lo sobrescribe (borra su contenido), si no existe falla (debe abrirse para escritura obligatoriamente,  para lectura es opcional...
  19. End Enum
  20.  
  21. dim ModoAp as AccionFichero      ' declaración para esta opción
  22. ModoAp  = ACCION_ABRIR_SIEMPRE   ' ejemplo de valor
  23.  
  24.  

 
Es im portante saber que un fichero abierto con CreateFile debe ser cerrado con CloseHandle, de lo contrario el fichero quedará 'pillado'...
Código: Visual Basic
  1.  
  2. dim ff as long
  3.  
  4. ' si falla devuelve -1.
  5. ff = Crearfichero(..., ..., ...)
  6.  
  7. if ff <> -1 then
  8.      ff = CloseHandle(ff) ' si tiene éxito devuelve 1, si falla devuelve 0
  9. end if
  10.  
  11.  

Un ejemplo para crear un fichero...
Código: Visual Basic
  1.  
  2. public function Crear as long
  3.        Dim b() As Byte
  4.        Dim ff As Long
  5.        Dim RutaFichero as string
  6.        Dim fa As VbFileAttribute  ' atributos para el fichero
  7.        Dim AtSeg as AtributosDeSeguridad
  8.        Dim ModoAp as AccionFichero      
  9.    
  10.         Const  ACCESO_MODO_ESCRITURA = 2 ^ 30
  11.         const  COMPARTIR_MODO_ESCRITURA = 2
  12.        const   BANDERA_ACCESO_ALEATORIO = 268435456
  13.  
  14.        ModoAp  = ACCION_ABRIR_SIEMPRE  
  15.        fa = vbNormal  ' atributo normal , ¿ 128 ?
  16.        ReDim b(0 To 19)
  17.        b(0) = &H39: b(1) = &H4E: b(2) = &H39: b(3) = &H4E: b(4) = &H39: b(5) = &H4E: b(6) = &H39: b(7) = &H4E
  18.        b(8) = &H39: b(9) = &H4E: b(10) = &H39: b(11) = &H4E
  19.        b(12) = 0: b(13) = 46: b(14) = 0: b(15) = 84: b(16) = 0: b(17) = 88: b(18) = 0: b(19) = 84
  20.  
  21.        RutaFichero = b
  22.        ff = CrearFichero(RutaFichero, ACCESO_MODO_ESCRITURA , COMPARTIR_MODO_ESCRITURA , AtSeg, ModoAp , fa + BANDERA_ACCESO_ALEATORIO , 0)
  23.      
  24.       Crear = ff
  25.       ' if ff <> -1 then
  26.       '        Msgbox "el fichero ha sido  abierto/creado... verifícalo en la carpeta de tu proyecto"
  27.       '       ff = closeHandle(ff)
  28.       '       if ff = 1 then
  29.       '               msgbox "El fichero ha sido cerrado.."          
  30.       '       end if
  31.       ' end if
  32.  
  33. end function
  34.  
  35.  
NOTA: Si posas el cursor sobre la variable Rutafichero verás que muestra ????????... porque al volcar al intellisense, traduce a ANSI su contenido, pero en memoria están los bytes correctamente.

Se crea un fichero con este nombre: 㩃停橩浡獡琮瑸 sin embargo la grafía resulta ilegible como ya te he explicado.
No me preguntes el significado, no entiendo el chino, es sólo un ejemplo.

Tendrás que usar Readfile y Writefile para manejar el contendo.

81
Esto depende del idioma instalado en la máquina. Según el idioma instalado en la máquina se utiliza el conjunto de caracteres en ese idioma.

Adicionalmente pudera necesitarse usar en ocasiones la función strconv, por ejemplo para las conversiones de 'Kanji'.

Es indispensable en cualquier caso que la instalación del S.O. tenga activado (cuando se instaló el S.O.)  'escritura compleja', lo que se refleja en ese servicio 'inabortable' llamado 'CtfMon.exe'

Desde luego no vas poder crear carpetas con caracteres cirílicos en ordenador cuya instalación es en caracteres oocidentales, después de todo los caracteres no son más que imágenes, representaciones gráficas de un valor numérico. Toda la info del sistema (nombre de carpetas, botones cerrar, maximizar,etc...) se representan exclusivamente con la grafía instalada. sin embargo nada te impide crear el contenido de un txt con la grafía que quieras, para ello sólo necesitas indicar la fuente requerida.

Cuando se coinstalan 2 idiomas en un equipo, tampoco, la coinstalación suele referirse exclusivamente al reparto de las teclas sobre el teclado y por tanto tener disponibles ciertos caracteres sin usar combinaciones.

Por último te recuerdo que los nombres de archivos y carpetas está delimitado a un conjunto de caracteres específico, para probarlo crea un archivo e intenta meter un asterisco en medio del nombre...

82
Visual Basic para principiantes / Re: Rotar punto sobre un eje
« en: Viernes 21 de Mayo de 2010, 00:09 »
En este hilo : http://foros.solocodigo.com/viewtopic.php?f=143&t=41122 explico esto... repásalo y aplica los cambios convenientes..

Si después de p'pelearte' con el código sigues sin entenderlo, vuelve y expón donde te pierdes.

83
VBA / Re: array de string
« en: Jueves 20 de Mayo de 2010, 04:07 »
Hace tiempo que no entro a este apartado del foro...

La funcion de vb StrConv te permite hacer lo que quieres..
Como es tu primer mensaje (según veo) y no se si vas a volver a mirar no pierdo tiempo poniendo código, si apareces y ''no lo pillas'' avisas y te pongo un sencillo ejemplo.

84
Visual Basic 6.0 e inferiores / Re: hacer tres en raya
« en: Jueves 20 de Mayo de 2010, 03:41 »
Al menos en mi tierra, el juego de las 3 en raya se compone de un tablero de 3x3, luego lo correcto para reflejar el estado del tablero sería una matriz de 3x3

Código: Visual Basic
  1.  
  2. dim Tablero(0 to 2, 0 to 2) as InfoCasillas    ' casillero, donde se pintará cuando se ocupe una casilla.
  3. Dim CasillasLibres as byte  ' indica cuantas casillas hay libres hasta el momento
  4.  
  5.  

Cada casilla del tablero puede tener 3 estados, 0 = no ocupado, 1= ocupada por el jugador A, -1= ocupada por el jugador B
Código: Visual Basic
  1.  
  2. private enum InfoCasillas
  3.       CASILLA_JUGADOR_B = -1
  4.       CASILLA_VACIA = 0
  5.       CASILLA_JUGADOR_A = 1
  6. end enum
  7.  
  8.  

Para dibujar el tablero dado que solo requiere unas pocas líneas podrías usar un control line, de hecho una matriz de line, basta con 4 rayas si el picture que hace de tablero lo delimita perimetralmente.

Luego podrías tener 2 imágenes ocultas, para indicar  casilla ocupada por un jugador u otro, básicamente podría ser una imagen cuadrada roja y otra azul ambas cruzadas por una 'X' blanca (por ejemplo), luego al iniciar el formulario las podrías cargar desde fichero o si lo prefieres mantenerlas ocultas en un par de controles image.
Código: Visual Basic
  1.  
  2. ' a nivel de formulario...
  3. Dim ImgJugador(0 to 1) as IpictureDisp
  4.  
  5.  
  6. private sub Form_Initialize
  7.      set ImgJugador(0)= loadpicture("ruta de la imagen del jugador A")
  8.      set ImgJugador(1)= loadpicture("ruta de la imagen del jugador B")
  9. End Sub
  10.  
  11.  

El tablero puesto que es finito y de tamaño conocido podría ser escalado a las casillas que ha de contener (esto facilita luego su dibujado), entonces en el evento initiiialize del formulario o en el load, podrías poner la siguiente línea:
Código: Visual Basic
  1.  
  2.       picture1.autoredraw=true ' para que no se nos borre el tablero cuando se coloque otra ventana encima...
  3.      call Picture1.Scale(0,0)-(3,3)
  4.  
  5.  
Como ya hemos escalado el tablero entonces podremos referirnos a las casillas como 0,1 y 2, para terminar de hacer cómodo el uso del tablero definimos también la medida de 1 casilla del tablero:
Código: Visual Basic
  1.  
  2. dim Cuadro as single  ' esto a nivel del formulario
  3.  
  4.     cuadro = picture1.scalewidth / 3 ' esto justo debajo de la línea que escala el picture.
  5. ' NOTA: si la picture no es cuadrado convendrá definir otra variable dedicando una para el ancho de las casillas y otra para el alto de las casillas
  6.  
  7.  

Luego convendrá que tengamos una rutina llamada iniciar partida... pero antes definimos nombres para los jugadores...
Código: Visual Basic
  1.  
  2.   Dim turno as byte ' a nivel de formulario
  3.   dim nombreJugador(0 to 1) as string
  4.  
  5.    ' en el load del formulario
  6.    dim nombre as string
  7.       nombre = InputBox("especifique el nombre del jugador A: ", "Nombre de los contendientes...", "Jugador A")
  8.      if nombre ="" then
  9.                  nombrejugador(0)="Jugador A"
  10.       else
  11.             nombrejugador(0)= nombre
  12.       end if
  13.  
  14.      nombre = InputBox("especifique el nombre del jugador B: ", "Nombre de los contendientes...", "Jugador B")
  15.      if nombre ="" then
  16.                  nombrejugador(1)="Jugador B"
  17.       else
  18.             if nombre <> nombrejugador(0) then
  19.                     nombrejugador(1)= nombre
  20.             else
  21.                     nombrejugador(1)="Jugador B"
  22.               end if
  23.       end if
  24.  
  25.  
  26.      Private sub IniciarPartida
  27.             picture1.cls     '  borramos el tablero
  28.             erase tablero  '  la matriz es estática, por tanto erase sólo borra el contenido
  29.             CasillasLibres = 9
  30.            ' si hay algún sistema de puntuación actualizar aquí.
  31.          
  32.           ' echamos a suertes que jugador empieza, basado en un 50% (del 0 al 49 = 0, del 50 al 99 = 1)
  33.          turno= (100 *RND)50
  34.          msgbox "Empieza el Jugador : " & NombreJugador(turno)  
  35.          
  36.          ' ahora AQUÍ se activan todos los controles de la interfaz para jugar la partida.
  37.      End Sub
  38.  
  39.  

También deberíamos tener una rutina que marque la jugada....
Código: Visual Basic
  1.  
  2. private sub Turnar(byval Fila as byte, byval Columna as byte)
  3.          ' se omite la comprobamos de fila y columna fuera de rango, es obvio y si lo haces correctamente debería ser innecesario.
  4.          
  5.          if CasillaLibre(Fila, Columna) = TRUE then
  6.               if CasillasLibres = 0 then
  7.                     call VerificarResultado
  8.                     ' exhibir mensaje de quien ganó, indcar línea ganadora y se prevee actualizar puntuación de los juadores
  9.                     ' desactivar interfaz de jugada excepto los botones nueva partida y salir  ( si se pulsa en nueva partida allí se habilita  de nuevo la interfaz).
  10.              else
  11.                    Picture1.PaintPicture ImgJugador(turno), columna, fila, cuadro, cuadro
  12.                     ' ahora cambiamos el turno del jugador
  13.                    Turno= abs(turno -1)  
  14.                    msgbox "es el turno del jugador: " & nombrejugador(turno)
  15.                end if
  16.         else
  17.                 bepp
  18.                 msgbox "La casilla " & fila & "," & columna & " ya está ocupada. elija otra, jugador " & nombreJugador(turno)
  19.         end if
  20. end sub
  21.  
  22.  
 

Como ya podrás averiguar por el código anterior necesitamos 2 nuevas funciones una que verifique si la casilla indicada está libre:
si está libre la marcamos 'fichada' por el jugador que ostenta elturno y restamos una casilla libre del tablero...
Código: Visual Basic
  1.  
  2.          private function CasillaLibre(byval F as byte, byval C as byte) as boolean
  3.                    if tablero(c,f) = 0 then   ' si tiene un valor 0 estçá libre
  4.                            tablero(c,f)= ((turno * 2) -1)   ' entonces se la apropiamos al jugador que tiene el turno
  5.                            CasillasLibres = Casillaslibres -1  ' restamos una casilla libre
  6.                             CasillaLibre = TRUE   ' y devolvemos el resultado 'estaba libre'
  7.                   end if
  8.          end function
  9.  
  10.  

Como ves está casi todo, te dejo que resuelvas la función "VerificarResultado" para determinar quien ganó o si acabó en tablas... y algunos pequeños detalles... que corren de tu cuenta, como enviar la fila y columna elegida por un jugador a la rutina que evalúa el movimiento de la ficha a la casilla determinada por la fila y columna elegida...

Los controles 'line' para dibujar el resto del tablero 8las 4 rayas divisorias) puedes ubicarlas fácilmente una vez que hemos escalado el picture y obtenido el tamaño de cada casilla en la variable 'cuadro'....

Te invito también a que añadas código al evento resize del formulario para que al agrandarse éste también se agrande el tablero y las fichas ya colocadas...

85
Visual Basic 6.0 e inferiores / Re: Consulta SQL en datagrid
« en: Jueves 20 de Mayo de 2010, 02:30 »
Lo normal es intentar lo que quieres hacer y si luego yerras preguntar... no va a explotar el ratón ni se va a borrar la base de datos si cometes un error de esta naturaleza...

Por lo demás, no existe otra forma de hacerlo, la bd entiende el lenguaje de consulta que le es propio pero las variables necesarias para completar la consulta SIEMPRE deben de proceder de una edición por tanto el origen es lo de menos. Da igual si el origen es un datagrid, un textbox,  una entrada directa por teclado (inputbox) o una conexión remota a un servidor en Singapur... si la consulta es correcta es aceptada.

86
Visual Basic 6.0 e inferiores / Re: Panel control
« en: Jueves 20 de Mayo de 2010, 02:24 »
..y se puede saber para qué quieres un control 'panel' de vb 2005... en vb6 ?

87
Diseño de Algoritmos / Re: algoritmo para series numericas
« en: Sábado 15 de Mayo de 2010, 23:37 »
El algortmo subyacente son 2 simples bucles...
Se resuelve abriendo el bucle externo en un ciclo creciente (recorriendo el vector) y el bucle interno iniiciando el cálculo desde la división más profunda hasta la primera (bucle regresivo)



Código: Text
  1.  
  2. Cantidad = 10  
  3. Matriz(Cantidad-1)  designa una matriz de 10 elementos.
  4. n = 1
  5. Matriz(0)= n
  6. hacer: Mientras n < (Cantidad -1)
  7.      Incrementar n
  8.      Cuenta = n
  9.      div = ( 1 / n )  la priemra división se realiza fuera del bucle para inicializar la división en su valor más 'profundo'
  10.      Hacer  Mientras Cuenta > 1
  11.            Div = (1 / (Cuenta + Div))
  12.            Decrementar Cuenta
  13.      repetir
  14.      Matriz(n) = Div
  15. repertir
  16.  
Nota que 'div' y la propia 'matriz' tendrás que declararlo como double, de lo contrario a partir de cierto índice de la matriz la diferencia entre 2 elementos consecutivos será tan pequeña que puede perderse si se emplea un tipo de datos sin la debida precisión.

La verdad es que el algoritmo no ofrece ninguna cmplejidad y todo el mundo debería ser capaz de resolverlo acaso con un poco más de tiempo invertido...

88
Esto es un problema de matemáticas, no de visual basic ni de ningún otro lenguaje.

Ningún lenguaje utiliza otra forma de cálculo que las matemáticas. Sabes resolver un triángulo rectángulo en matemáticas ?. Si, si esponlo con palabras y trata de programarlo y veremos donde te pierdes... Si no, primero aprende las matemáticas necesarias, luego vuelve.

89
Visual Basic para principiantes / Re: Conventir entero a cadena o.o?
« en: Miércoles 12 de Mayo de 2010, 21:59 »
El asunto es que yo no tengo ningún detalle sobre tu base de datos, preguntabas la manera de convertir variables así no tenía necesidad de mirar tu código.

Si tu afirmas que te funcionaba esa query, no tiene sentido que revisara esa parte del código... ahora, mirándolo bien: lo que veo es que al parecer tienes una tabla llamada sqlies, con unos campos llamados : 'estacion.nombre_estacion' y 'estacion.linea'. Ahora bien, un punto no puede formar parte del nombre de un campo. Por lo que asumo que  'estacion' debe ser el nombre de una tabla pero entonces que es sqlies ?. No tengo modo de saberlo. Quizás sea otra tabla...? . tambien me cabe pensar que

No puedes preguntarle a la bd, dame las bebidas.nevera.casa.Juan  tomando la casa.andres si las bebidas.nevera.cerveza.marca =  'X' . O estamos en casa de Juan o en casa de Andrés o tenemos que relacionar ambas casas.

Si sqlies es una tabla y dicha tabla tiene 2 campos llamados 'nombre_estacion'  y 'linea' la query debería ser:
Código: Visual Basic
  1.  
  2.    "SELECT nombre_estacion FROM sqlies WHERE linea = " & Combo3.Text
  3.  
  4.  
En cambio si la tabla es estacion y dicha tabla tiene 2 campos llamados 'nombre_estacion'  y 'linea' la query debería ser:
Código: Visual Basic
  1.  
  2.    "SELECT nombre_estacion FROM estacion WHERE linea = " & Combo3.Text
  3.  
  4.  

No hay necesidad de relacionar 2 tablas cuando lo que se pregunta (la condición: linea = esto)  y lo que se obtiene ( select estecampo) proceden de la misma tabla.

Yo acostumbro a llamar mis tablas tblNombrequesea y los campos con el tipo de datos, por ejemplo:  strLinea, intLinea, bytLinea. No es obligatorio pero al menos para informar sin escribir muchos datos y rellenar una hoja de detalles ayuda bastante (en el foro al menos, tu luego ten lo que quieras en tu bd). Del mismo modo si Linea es un control adodc podrías llamarlo adoLinea.

El método refresh, sólo debe usarse cuando la query sigue siendo la misma si no, debe reinvocarse el recordset. La query sólo establece el filtro que se usará con la base de datos...

Este es el método correcto de proceder:

Código: Visual Basic
  1.  
  2. Adodc1.RecordSource = "SELECT nombre_estacion FROM estacion WHERE linea = " & Combo3.Text
  3. Adodc1.Recordset.Requery
  4.  

Fíjate: como tienes al parecer un control adodc llamado linea y un campo llamado linea , toma la precaución de de sustituir los nombres adecuadamente donde correponda.

p.d.: se me olvidaba...
Hay otro error, un poco más abajo. Tu en la query solicitas 1 único campo, luego tu recordset contiene sólo datos para el campo 'nombre_estacion' luego la línea de código: Combo2.AddItem linea.Recordset.Fields(2) carece de sentido, no existe el 'fields(2)' existe sólo el fielsd(0). podrías cambiar tu query para seleccionar más de 1 campo... especificando cuales más quieres (SELECT estacion , numero , dia  FROM ...)  o bien todos ( SELECT * FROM .... )

Estos detalles ya no son un problema de vb sino de bases de datos y más específicamente de falta de conocimientos del lenguaje de consulta a bases de datos...

90
Visual Basic 6.0 e inferiores / Re: Problema con un problema
« en: Miércoles 12 de Mayo de 2010, 16:41 »
Resulta conveniente cuando responden a una cuestión planteada, comentar como te fue:  me fue bien. no lo entendí, gracias, o lo que sea.

No por ego, sino por saber si uno simplemente está perdiendo el tiempo o no. Cuando no se responde uno entiende que su mensaje no ha sido mirado y consecuentemente piensa que ha perdido media hora para nada... entonces para la próxima... abstenerse de responder a las cuestiones de quien te parece que no consulta tu mensaje y que por ello piensas que pierdes el tiempo es la solución adecuada.

A falta de otra cosa, una impresión es la que se obtiene de la ausencia de respuestas.

91
Visual Basic para principiantes / Re: Conventir entero a cadena o.o?
« en: Martes 11 de Mayo de 2010, 22:23 »
Código: Visual Basic
  1. if combo3.text <>"" then
  2.       RecordSource = "SELECT estacion.nombre_estacion FROM sqlies WHERE estacion.orden = " & Combo3.text
  3. end if
  4.  
Nota el:  Combo3.text , sin el val, la base de datos espera una cadena de textos, así el valor sea un número. Una query pasada por vb es una cadena de texto, espera TEXTO. si el registro luego resulta almacenar datos numéricos, luego ya lo convertirá a numero...

p.d.: acostúmbrate a dejar espacios en blanco donde vayan, ya que  'orden=' es distinto de 'orden =' lo mismo que 'x + 3' es una operación, 'x+3' se interpreta como una variable, no como una operación.

92
Visual Basic para principiantes / Re: Conventir entero a cadena o.o?
« en: Lunes 10 de Mayo de 2010, 18:57 »
No acabo de entender lo que quieres, asumo que no te explicas con claridad.



Un combobox, puede ser comparado por el texto que aloja o por el índice. En esto es lo mismo que una matriz.

Comparar usando el índice (no nos importa el texto en este caso)
Código: Visual Basic
  1.  
  2. if combo1.listindex = 5 then
  3.  ' el código que se quiera asociar.
  4. end if
  5.  
  6.  
Aquí le hemos preguntado si está seleccionado el elemento 5º en el combobox, no nos importa su contenido. Esto es útil cuando el contenido puede variar pero sabemos de fijo que implica. Por ejemplo imagina un combobox con 7 elementos. El elemento 0 podría ser nombre de país, el elemento1 nombre de ciudad, ................ el elemento 5 nombre de persona, y el elemento 6 número de afiliación a lo que sea. Entonces en el ejemplo, le estaríamos indicando qué interesa saber; si está seleccionado el nombre, sea éste el que sea.

Otro caso, comparando el texto seleccinado (el contenido del índice seleccionado)
Código: Visual Basic
  1.  
  2. if combo1.list(combo1.listindex)= "Pedro" then
  3.     ' el código asociado que queremos ejecutar
  4. end if
  5.  
  6.  
Como puedes observar el acceso al texto es a través de su propiedad list(número), imagina simplemente que tiene una matriz llamada list, así de simple.
Si invocamos como índice de la matriz, el valor: 'combo1.listindex', pués es claro que el índice deseado es el índice seleccionado. Esto es útil para comparar elementos cuya naturaleza son todas del mismo tipo (para esto un listbox suele ser más explícito aunque ocupa más espacio, por el despliegue).

Los combos son útiles para contener diferentes tipos de 'elementos' (nada impide que contengan un único tipo de 'elementos') y las listas son muy útiles para los elementos del mismo tipo. Imagina un combo con 3 elementos: Unidades, carpetas y ficheros e imagina una lista donde tras seleccionar uno de esos 3 elementos se llena con las unidades del sistema, las carpetas de la unidad actual o los ficheros de la carpeta actual.

El uso es totalmente libre, sin embargo es ese uso el que nos indica cuando nuestra selección exige una comparación por índice o por 'texto', en el caso del combo donde hay varios 'elementos' distintos, utilizar el índice es más rápido, cómodo y claro que comparar por el texto, en cambio cuando el combo tiene todos sus ítems de un único 'elemento' la utilidad recáe en el texto.

Otro código... recorrer el combo, es lo mismo que recorrer una matriz.
Código: Visual Basic
  1.  
  2. for k= 0 to combo.listcount -1
  3.      if combo.list(k)= Nombre then
  4.           ' el código asociado.
  5.      end if
  6. next
  7.  
  8.  

Sólo recordar que a diferencia de una lista, un combo actúa exclusivamente como una matriz de options-button, es decir sólo hay 1 elemento seleccionado a la vez (una lista permite múltiple selección, el combo no).

El combo, te indiqué mas arriba tiene ese doble 'comportamiento' (cada elemento puede representar una familia, o todos los elementos pertenecen a la misma familia), que no es un comportamiento íntrínseco del control, sino exclusivamente del diseño (el concepto que tu albergas). Es importante comprender esto explicado, para sacar el mayor provecho posible aun combobox.... Pero precisamente porque existe el listbox, el combobox carece de sentido que tenga múltiple selección.

Entonces, ¿ cómo miramos la múltiple selección...? imagina que tenemos un hotel y se requiere de los clientes que elijan qué días quieren recibir el desayuno a lo largo de la semana... cargamos un listbox con los días de la semana, en el listbox se activa la propiedad multiselect (y si se se requiere utilizar casillas de marca style=checkbox). Este código lo omitimos luego entenderás que es fácilmente deducible de los siguientes...

Luego, para preparar los desayunos ... para saber la lista de hoy 'Jueves' de los clientes a los que hay que preparar el desayuno, tendremos 2 listbox, en uno los nombres de los clientes, cuyo índice es el nº de habitación y en otro listbox se cargará la lista de la semana de ese cliente.(esto último es imprescindible porque usamos una base de datos, tiene un carácter explicativo).
Código: Visual Basic
  1.  
  2.     dim Hoy as byte
  3.     Hoy = 4 ' jueves
  4.     For k = 0 to listHabitaciones.listcount-1
  5.           if listHabitaciones.list(k)<>"" then   ' la habitación no está desocupada, hay un cliente
  6.                 ' 1 cargar la lista desayuno semanal (que eligió el cliente) desde la base de datos al listbox, luego...
  7.                 ' 2 el cliente de la habitación k, tiene encargado desayuno para hoy ?
  8.                if listDesayuno.Selected(Hoy)= TRUE then
  9.                      ' 3 preparar desayuno para la habitación k
  10.                end if
  11.           end if
  12.     next
  13.  
  14.  
Naturalmente si utilizamos una base de datos esto lo haríamos sin necesidad de listbox, pero se trata de explicar la funcionalidad del listbox y del combobox.

Otro modo de recorrer un listbox, pero para comprobar su propiedad múltple selección
Código: Visual Basic
  1.  
  2. for k= 0 to list1.listcount -1
  3.      if list1.selected(k) = true then
  4.            ' lo que vayamos a hacer...
  5.      end if
  6. next
  7.  
  8.  

Por último, cuando usamos un combo, podemos además elegir un comportamiento ligeramente diferente basado en la propiedad style del combobox, por defecto se suele usar la opción 'dropdown combo', con esta opción es posible introducir un texto que no figura en la lista, el evento change se encargade registrar este caso, pero sólo deberíamos marcar que ha existido cambió y validarlo con el evento validate, hay que evento change ocurre con cada carácter pulsado . Pero imagina que tenemos los días de la semana en un combo, evidentemente no nos podemos arriesgar a que alguien ponga 'pepino' como selección, sino que los días deben ser fijos desde lunes hasta domingo, en este caso, en la propiedad style elegimos 'Dropdown list'.

Supongo que dadas las explicaciones debería quedarte claro el tema aunque yo no haya entendido realmente cual es tu problema.

----------------
p.d.: Ahora al volver a leerte lo que preguntas, me parece entender lo que tan farragosamente has liado... de hecho la pregnta está mal planteada y podrías haber omitido todo el código porque ni siquiera tiene que ver con combos ni base de datos.
al parecer tu quieres procesar una variable numérica como string, esto es algo tan elemental, en los lenguajes que debería estar prohibido preguntarlo. Por que es una simple conversión de datos. Después de aprender los tipos de datos básicos que admite un lenguaje lo siguiente a aprender es como convertir uno en otro cuando esto es posible:

Código: Visual Basic
  1.  
  2.   dim Precio as long
  3.   dim Valor as string
  4.      Precio = 1033
  5.  
  6.      Valor= CStr(Precio) & "Euros."  asignamos sobre una variable string, el valor de una variable numérica, para ello lo convertimos (convertString)
  7.  
  8.     msgbox valor
  9.      
  10.  
  11.  

93
Visual Basic 6.0 e inferiores / Re: Problema con un problema
« en: Viernes 7 de Mayo de 2010, 19:12 »
Bueno, la cosa es bastante sencilla.

Cuando hay varias reglas,  hay que verificarlas antes de totalizar y las que se verifican justo al totalizar deben anotarse, para ello pueden establecerse variables que determina  si una regla se usa o no y en consecuencia después tenerlas en cuenta. Otras reglas como esa que permite regalar el 5º artículo si se llevan 4, puede tratarse al instante, o justo antes de totalizar, yo te he puesto un ejemplo donde esta regla se lleva a cabo (el valor que lo determina) sobre la marcha y al totalizar se verifica dicho valor, las otras reglas se verifican justo al totalizar...

Hay cierta ambigüedad en el enunciado de las reglas, por ejemplo 2 o más reglas son acumulables ? yo he supuesto que si, porque nada dice lo contrario y en cuento a la regla de que si comprar 4 artículos se regala 1 adicional yo lo he interpretado como que compras 4 unidades del mismo artículo... estas ambigüedades tu las puedes conocer con exactitud, pero nadie más, de modo que tal vez tengas que corregir parte del código para que se ajuste a lo que quieres. Tampoc has determinado que hacer cuando alguien compra los 5 artículos, yo he optado por regalar 1 unidad (descontar el valor de su precio) de aquel de menor precio_unitario de los 5 artículos

El caso debe servirte como ejemplo para cualquier número de reglas, por complejas que estas sean, basta definirlas correcta y completamente y aplicarlas ordenadamente. No se debe tener prisas en obtener un total, este vendrá al final sólo cuando se hayan verificado todas las reglas...

He cambiado los nombres de los controles, porque en muchos casos ( y este es uno de ellos) meterlos en una matrizo colección simplifica y aclara  elcódigo.

Los artículos forman una matriz de nombre 'CheArticulos(n)' donde n es el índice del artículo de 0 a 4 verticalmente, del mismo modo para el texto de precios se le ha llamado a la matriz de esos textos 'txtPrecioUnidad(n), ídem para los contrles de texto de las cantidades. txtCantidades(n).

Los textos de precios y el de total están bloqueados, se supone que ese valor se modifica por otro lado, aquí son de sólo lectura, para bloquearlos se utiliza la propiedad locked=true de dichos controles, para esclarecer que no cambiables se les cambió el color de fondo a un amarillo tenúe. Las cantidades sempre valen 0, están desactivados, sólo seactivan cuando su checkox de artículo corresopondiente es activado, cuando se desactiva su valor se pone a 0. El frame que contiene todo estos controles de texto se ha renombrado a: 'FraAdquirir'

Se ha añadido un frame, que detalla las promociones que se aplican, yaunque no se ve, cuando se aplica un descuento, aparece un label reflejando cuanto es la cantidad del descuento...
finalmente se han reordenado los contrles para tener mejor presencia.  Este frame está desactivado (es de sólo lectura) .
El aspecto final se puede observar en la imagen.



el código (está comentado, pero...) se describe someramente en los siguientes bloques:

Declaraciones...
Código: Visual Basic
  1.  
  2.        Dim Conexion As New ADODB.Connection
  3.       Dim RsArticulos As New ADODB.Recordset
  4.  
  5. Private Totales As Single
  6. Private ArtiElegidos As Byte                 ' mantiene una cuenta de los diferentes artículos elegidos.
  7.    Private ArtiNocomputar As Boolean        ' al activarse no debe ejecutarse  elcódigo asociado...
  8. Private RegaloVariedad  As Boolean           ' se aplica regalo del 5º ?
  9.    Private RegalarArticuloX As single                  ' señala que artículo se regala gratis (su precio). este valor se descuenta del total a pagar.
  10. Private RegaloFidelidad(0 To 4) As Boolean   ' se aplica regalo 1 adicional del artículo de al menos 4 ?
  11. Private AplicarDescuento As Boolean                 ' se aplica un descuento ?
  12.    Private DescuentoPorcentaje As Single     ' porcentaje de descuento que se aplica, se supone que esto se establece desde un panel de administración, aquí se  especifica en el load.
  13.    Private VolumenParaDescuento As Single   ' cantidad que determina que una vez alcanzada se aplica el descuento.
  14.  
  15.  

Código para los controles checkbox.... debe notarse que forman una matriz, véase el parámetro index, que se usa tanto para los checkbox como para los textos de precio y  cantidad
Cada índice de la matriz  checkbox cocunerda con la matriz de textbox de precios y de cantidades... obviamente.
Código: Visual Basic
  1.  
  2. ' contabiliza cuantos diferentes artículos se adquieren, además
  3. Private Sub CheArticulos_Click(Index As Integer)
  4.     Dim uso As Boolean
  5.    
  6.     ' sólo se ejecuta el código cuando no se está totalizando
  7.     If ArtiNocomputar = False Then
  8.         uso = (CheArticulos(Index).Value = 1)
  9.         txtPrecioUnidad(Index).Enabled = uso
  10.         txtCantidades(Index).Enabled = uso
  11.        
  12.        
  13.         If uso = True Then
  14.             ArtiElegidos = ArtiElegidos + (2 ^ Index) ' se recuerda que: 2 ^0= 1
  15.             txtCantidades(Index).BackColor = vbWhite
  16.         Else
  17.             ArtiElegidos = ArtiElegidos - (2 ^ Index)
  18.             txtCantidades(Index).Text = "0" ' DEBE BORRARSE para no alterar la suma al totalizar, por supuesto podría no borrarse si al totalizarse se verifica si el artículo está activado, pero es hacerlo más complicado y se presta a confusión.
  19.             txtCantidades(Index).BackColor = 14737632 'gris, desactivado
  20.         End If
  21.     End If
  22. End Sub
  23.  
  24.  

Código del botón borrar, el botón se ha renombrado
Código: Visual Basic
  1.  
  2. ' borra todo lo necesario, equivale a resetear
  3. Private Sub cmdBorrar_Click()
  4.     Dim k As Byte
  5.    
  6.     ' borramos cantidades y desactivamos artículos elegidos
  7.     For k = 0 To 4
  8.         CheArticulos(k).Value = 0
  9.         txtCantidades(k).Text = "0"
  10.         txtCantidades(k).Enabled = False  ' desactivado
  11.         txtCantidades(Index).BackColor = 14737632 'gris
  12.     Next
  13.     ArtiElegidos = 0
  14.    
  15.     ' borramos totales y descuento
  16.     TxtTotales.Text = "0.00"
  17.     Totales = 0
  18.     LabDescuento.Caption = ""  ' este lab está en el frame de gratificaciones...
  19.    
  20.     ' borramos todas las promociones
  21.     For k = 0 To 2
  22.         ChePromociones(k).Value = 0
  23.     Next
  24.    For k = 0 To 4
  25.            RegaloFidelidad(k) = False
  26.     Next
  27.  
  28.     RegaloVariedad = False
  29.     AplicarDescuento = False
  30.     RegalarArticuloX = 0
  31.    
  32.     ' se activa de nuevo la seleccion de adquisiciones.
  33.     FraAdquirir.Enabled = True
  34.     ' se activa de nuevo computar cuando se marquen artículos.
  35.     ArtiNocomputar = False
  36. End Sub
  37.  
  38.  

Codigo del boton total...  se ha renombrado el botón
Aquí se realiza casi todo el código de cálculo...
Los controles chePromociones(n) ... están el frame gratiificaciones... junto  con un label (labDescuento)
Código: Visual Basic
  1.  
  2. ' aquí primero se verifican si se cumple alguna de las reglas.
  3. ' hay una 4ª regla deducible que señala si las promociones son adicionales o no. Es decir si puede darse más de 1 a la vez o no.
  4. '    como no se indica nada en contra se supone que sí.
  5. Private Sub CmdTotalizar_Click()
  6.     Dim k As Byte, cantidad As Integer, precio As Single, Descuento As Single
  7.    
  8.     ' desactivamos posibilidades de cambios antes de empezar a calcular... Se activa de nuevo al borrar.
  9.     FraAdquirir.Enabled = False
  10.     ArtiNocomputar = True ' los cambios aplicados ahora al marcar artículos no ejecutan el código asociado en los checkbox...
  11.    
  12.     ' 1º determinar si se aplica regalo del 5º (regalo por variedad).
  13.     '   1 + 2 + 4 + 8 + 16 =31, el regalo se aplica cuando:  ArtiElegidos = 31 - sólo 1 de esos sumandos
  14.     '      Casos posibles para 5 artículos:  31-16=15 ;; 31-8=23 ;; 31-4=27 ;; 31-2=29 ;; 31-1=30
  15.     '   y también si se eligió los 5 en cuyo caso se regala el de menor cuantía ? 31-0=31
  16.     Select Case ArtiElegidos
  17.         Case 0 ' no hay adquisiciones
  18.             Call cmdBorrar_Click
  19.             Exit Sub
  20.         Case 15, 23, 27, 29, 30, 31  ' se eligieron 4 artículos (o 5)
  21.             RegaloVariedad = True
  22.             ChePromociones(1).Value = 1
  23.            
  24.             If ArtiElegidos < 31 Then ' si se eleigieron 4 artículos, regalar el 5º
  25.                 Select Case ArtiElegidos
  26.                     Case 15: k = 4 ' activamos el artículo 4 que es el que falta
  27.                     Case 23: k = 3
  28.                     Case 27: k = 2
  29.                     Case 29: k = 1
  30.                     Case 30: k = 0
  31.                 End Select
  32.                 ' se regala este artículo. el 'K' avo de la matrizde artículos.
  33.                 CheArticulos(k).Value = 1  'lo marcamos,
  34.                 txtCantidades(k) = "1"     ' señalamos en cantidad 1
  35.                 RegalarArticuloX = Val(txtPrecioUnidad(k).Text)  ' tomamos el valor que al totalizar se cuenta, pero al final se debe descontar.
  36.             Else ' el que adquiere compra todos los artículos (al menos 1 cantidad), se regala el de menor cuantía de los existentes...
  37.                 ' buscamos el precio de menor cuantía de los 5 artículos.
  38.                 RegalarArticuloX = Val(txtPrecioUnidad(0).Text)
  39.                 For k = 1 To 4
  40.                     If Val(txtPrecioUnidad(k).Text) < RegalarArticuloX Then
  41.                         RegalarArticuloX = Val(txtPrecioUnidad(k).Text)
  42.                     End If
  43.                 Next
  44.             End If
  45.         Case Else  ' no hay promoción de regalar un 5º por tener 4 artículos.
  46.             RegaloVariedad = False
  47.             ChePromociones(1).Value = 0
  48.             RegalarArticuloX = 0
  49.     End Select
  50.    
  51.     ' 2º Determinar si se puede hacer un regalo por fidelidad
  52.     '  esto se mira revisando la cantidad para cada artículo si tiene al menos 4 se le regala 1 más (se supone que por cada artículo que cumpla dicho requisito)
  53.     For k = 0 To 4
  54.         If Val(txtCantidades(k).Text) > 3 Then
  55.             RegaloFidelidad(k) = True             ' activamos para tenerlo en cuenta al totalizar,
  56.             ChePromociones(2).Value = 1           ' marcamos la promoción
  57.             txtCantidades(k).Text = Val(txtCantidades(k).Text) + 1  ' sumamos 1 para asegurarse que sea entregado...
  58.         End If
  59.     Next
  60.    
  61.     ' 3º Descuento por volumen: (se suponen que las promociones son acumulables), este paso serealiza en 2
  62.     '   en el primero se tiene calcula el total adquirido originalmente por el comprador + el regalo del 5º (si existe se desceunta al final).
  63.     '   en el segundo se comprueba si se aplica el descuento por volummmmen de compra.
  64.    
  65.     ' 3ºA) totaliza las cantidades, descontando regalos_por_Fidelidad (la cantidad ya se sumó pero es gratis).
  66.     For k = 0 To 4
  67.         cantidad = Val(txtCantidades(k).Text)
  68.         precio = Val(txtPrecioUnidad(k).Text)
  69.        
  70.         If RegaloFidelidad(k) = True Then  ' aquí hay un regalo por variedad, se descuenta una unidad.
  71.             cantidad = cantidad - 1
  72.         End If
  73.         If cantidad > 0 Then
  74.             ' total = total + (precio_1 * cantidad_del_Artículo)
  75.             Totales = Totales + (precio * cantidad)
  76.         End If
  77.     Next
  78.    
  79.     ' 1ºB, aplicar el descuento del 5º artículo, sino existe este valor es 0 y por tanto no cambia.
  80.     '   NOTA: este regalo no puede constar como 'factura total', porque es regalado, no entra en factura ni en totales, y por tanto su valor no entra en desceuntos.
  81.     Totales = Totales - RegalarArticuloX
  82.    
  83.     ' se supone que las promociones son acumulables.
  84.     ' 3ºB se verifica si se cumple la 3ª promoción
  85.     If Totales > VolumenParaDescuento Then
  86.         Descuento = ((Totales / 100) * DescuentoPorcentaje)
  87.         Totales = Totales - Descuento
  88.         AplicarDescuento = True
  89.         ChePromociones(0).Value = 1
  90.     Else
  91.         AplicarDescuento = False
  92.         ChePromociones(0).Value = 0
  93.     End If
  94.    
  95.    
  96.     ' marcamos el valor total, las promociones aplicadas quedan reflejadas en el frame gratificaciones...
  97.     TxtTotales.Text = Totales
  98.     LabDescuento.Caption = "Descontado: " & CStr(Descuento)
  99. End Sub
  100.  
  101.  

Finalmente el código de carga y fin del formulario (esta parte está sin terminar, te lo señalo con comentarios).
Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3.     Conexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "DataAlmacen.mdb;Persist Security Info=False;Jet OLEDB:Database;"
  4.     Conexion.Open
  5.     RsArticulos.Open "select * from Artilculos ", Conexion
  6.     Call MostrarPrecios
  7.    
  8.     DescuentoPorcentaje = 8 ' 8% es el valor de descuento.
  9.     VolumenParaDescuento = 150 ' es el valor que si se alcanza al totalizar, determina que se aplica el descuento.
  10. End Sub
  11.  
  12.  
  13. ' los precios de los artículos están bloqueados, porque deben ser de sólo lectura.
  14. '  propiedad locked =true
  15. ' también está bloqueado preciototal
  16. '  los bloqueados se les cambió el color defondo, para expresar su valor no alterable desde interfaz de usuario.
  17. Private Sub MostrarPrecios()
  18.     txtPrecioUnidad(0).Text = RsArticulos.Fields("Zapatillas").Value
  19.     txtPrecioUnidad(1).Text = RsArticulos.Fields("T-Shirts").Value
  20.     txtPrecioUnidad(2).Text = RsArticulos.Fields("Pantalones").Value
  21.     txtPrecioUnidad(3).Text = RsArticulos.Fields("Zapatos").Value
  22.     txtPrecioUnidad(4).Text = RsArticulos.Fields("Gorras").Value
  23. End Sub
  24.  
  25.  
  26. Private Sub cmdSalir_Click()
  27.     ' pedir confirmación
  28.     ' cerrar la base de datos antes de salir
  29.     End  ' end no dispara el evento  queryunload
  30. End Sub
  31. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  32.     ' confirmar si se desea salir...
  33.     ' confirmar si se descartan cambios y cerrar base de datos
  34.    
  35. End Sub
  36.  
  37.  

No hay código para el botón guardar.

Debes revisar el código, ya que sólo lo he probado por encima y quizás necesite algún ajuste o haya tenido algún despiste...
Si algo no te queda claro, pregunta.

94
Visual Basic para principiantes / Re: inconveniente con vb de excel
« en: Lunes 3 de Mayo de 2010, 16:15 »
No has puesto la declaración de la función f, por lo que jugamos a adivinar....
...parece ser que la función espera una matriz y tu le estás asando una variable que no es una matris...

A ver si lo entiendes mejor con un ejemplo:

Creo una función para hacer una suma como la siguiente...
Código: Visual Basic
  1.  
  2.  
  3. public function Suma(byval sumando as integer, byval Sumador as integer) as long
  4.       Suma= sumando + sumador
  5. end function
  6.  
  7.  
Esta función la utilizo así...
Código: Visual Basic
  1.  
  2. Dim Resul  as long
  3.  
  4. Resul= suma(22,37)
  5.  
  6. ' y también así...
  7. Dim x1 as integer, x2 as integer
  8.  
  9. x1= 144: x2=49
  10. Resul= suma(x1,x2)
  11.  
  12.  

Pero claro no   siempre vamos a querer sumar 2 números, también podríamos sumar 3 y 4 y 5, ..y lógicamente no vamos a tener una función para cada posibilidad. entonces vb provee 2 soluciones una es usando un parámetro llamado paramarray y otro es usando una matriz. Nos vamos a ceñir en este que es tu caso.

Fíjate en la diferencia que supone la misma función pero aplicando una matriz:
Código: Visual Basic
  1.  
  2.  
  3. public function Suma(byref Valores() as integer) as long  ' nota el paréntesis detrás de valores que denota una matriz y nota como debo pasarlo como 'byref' nunca byval para una matriz, pero esto ya te lo indicaría vb....
  4.        Dim k as long, R as long
  5.        if (not(valores)) <> -1 then
  6.            for k= lbound(valores) to ubound(valores)
  7.                R= R + Valores(k)
  8.            next
  9.            suma = R
  10.        else
  11.             Call Err.Raise(9, Me.Name, "La matriz no está declarada...")
  12.        end if
  13. end function
  14.  
  15.  
...luego la función se utiliza así...
Código: Visual Basic
  1.  
  2.     Dim Resul As Long
  3.     Dim n() As Integer
  4.    
  5.     Redim n(1 to 7)
  6.     n(0)=5: n(1)=22: n(2)=567: n(3)=1234: n(4)= -456: n(5)= 96: n(5)=11: n(7)= n(2)*3 ' n(6) vale 0
  7.     Resul = Suma(n)
  8.     msgbox resul ' nos muestra el resultado de la suma.
  9.  
  10.  

Espero que puedas entenderlo...

95
Papelera / Re: ¿Juego del gato en visual basic 2005?
« en: Jueves 22 de Abril de 2010, 14:51 »
Este es el foro de VB 6 e inferiores, no de vb 2005...

De todas formas:
a) No se hacen tareas y menos se ofrecen trabajos solucionados.
b) Qué es el juego del gato ?... yo no conozco ningún juego con ese nombre (tal vez con otro)
c) No se envía nada al correo de nadie. Para eso existe preciamente el foro, para tener aquí las comunicaciones que se requiera.

96
Visual Basic no soporta directamente imágenes gif animadas. Lo que no debe interpretarse como que no tiene posibilidad de reproducirse animación.

Hay varios métodos dependiendo de para que se necesite.
Te señalo  6 métodos (1,2,3...6), aunque no explico en profuncdidad en todos.

Por ejemplo si tratas de reproducir un vídeo y/o sonido, puedes optar por un par de soluciones que te propongo...
Ve al formulario y abre la ficha de selección de componentes .... por defecto se abre en controles, ve a 'objetos insertables'... elige los 2 que te indico que es con los que vamos a probar:
* clip multimedia:
* Windowos media player

1)  Clip multimedia no requiere gran cosa, simplemente lo sitúas en el formulario, y por encima de él colocas un label que diga algo como "Pulsa doble click para abrir el archivo a reproducir" (o incluso en la propiedad tooltiptext). Eso es todo, si ejecutas la aplicación ahora verás que  cuando hagas doble click se abre un control con un menú, yendo al menu archivo al pulsar en abrir permite localizar el tipo de archivo deseado para reproducir (vídeo y/o audio) una vez seleccionado, la reproducción comienza en una ventana aparte... es trabajo tuyo si deseas capturar dicha ventana e incorporarla a tu formulario.

2)  Windows Media Player (el otro objeto insertable añadido): Ponemos una instancia en el formulario, el nombre del control queda muy largo, supongamos que lo abreviamos a sólo: Wmp, bien añade 2 botones al formulario , un checkbox y 1 timer, desde uno de estos botones podrás configuras para localizar el archivo multimedia deseado (después que pruebes el código mostrado), tal vez usando el commondialog tal vez sea un archivo a elegir de una lista que ya proporcionas...

Te pongo un sencillo ejemplo de código, donde se da por hecho que ya se conoce el vídeo a mostrar. Fíjate que en realidad bastaría con el código para localizar y asignar el vídeo, luego se podría usar la interfaz que provee el control, que es de todos conocidas, pero para que veas algo de código, he puesto código para manejarlo con esos 2 botones ... play, pausa, stop,  asignar vídeo y pantalla completa.

Código: Visual Basic
  1.  
  2. Private FullScreen As Boolean
  3.  
  4. Private Sub Form_Load()
  5.    Timer1.enabled=false
  6.    Timer1.interval=50
  7.     Wmp.settings.autoStart = False
  8.     Command1.Caption = "Sin medios"
  9.     Command2.Caption = "Elegir medio..."
  10.     Check1.caption= "Pantalla completa"
  11. End Sub
  12.  
  13. Private Sub Command2_Click()
  14.     If Wmp.URL = "" Then
  15.         Wmp.URL = "C:VideossNavidades-2009.avi"
  16.         Command1.Caption = "Reproducir"
  17.         Command2.Caption = "Parar"
  18.     Else
  19.         Timer1.Enabled = False ' nos aseguramos que un problema de carga no se perpetúe...
  20.         Wmp.Controls.stop
  21.         Command2.Caption = "Elegir medio..."
  22.         Command1.Caption = "Sin medios"
  23.         Wmp.URL = ""
  24.     End If
  25. End Sub
  26.  
  27. Private Sub Command1_Click()
  28.     On Local Error GoTo Insiste
  29.  
  30.     If Wmp.playState <> wmppsPlaying Then
  31.         If Wmp.URL = "" Then
  32.             Call Command2_Click
  33.         Else
  34.             Select Case Wmp.playState
  35.                 Case wmppsPaused, wmppsStopped, wmppsReady  ' no tienen porque agruparse en la misma acción, pero para el ejemplo vale.
  36.                     Wmp.Controls.play
  37.                     Command1.Caption = "Pausar"
  38.                     DoEvents
  39.                     If Wmp.FullScreen <> FullScreen Then
  40.                         Wmp.FullScreen = FullScreen
  41.                     End If                Case Else
  42.                     Beep ' otras acciones ante otros estados...
  43.             End Select
  44.         End If
  45.     Else
  46.         If Wmp.URL <> "" Then
  47.             Wmp.Controls.pause
  48.             Command1.Caption = "Reproducir"
  49.         Else
  50.             MsgBox "Primero debe seleccionar un medio, pulse el botón 2."
  51.         End If
  52.     End If
  53.  
  54. Exit Sub
  55. Insiste:
  56.     ' el error se produce porque antes del estado play está en estado de 'transición' hasta haber decodificado lo suficiente... este tiempo depende del vídeo y el códec que emplee
  57.     Err.Clear
  58.     Timer1.Enabled = True  ' lo derivamos a un bucle que espera hasta que se ponga en play.
  59. End Sub
  60.  
  61. Private Sub Check1_Click()
  62.     FullScreen = (Check1.Value = 1)
  63.    
  64.     If Wmp.playState = wmppsPlaying Then ' si está en play la orden se obedece inmediatamente, sino, queda guardada para cuando se haga play.
  65.         Wmp.FullScreen = FullScreen
  66.     End If
  67. End Sub
  68.  
  69. ' le damos tiempo a que 'cargue', cambiando de estado de transición a estado reproduciendo.
  70. Private Sub Timer1_Timer()
  71.     If Wmp.playState = wmppsPlaying Then
  72.         Timer1.Enabled = False
  73.         Wmp.FullScreen = FullScreen
  74.     End If
  75. End Sub
  76.  
  77.  
Luego pinchando sobre el control en tiempo de ejecución el propio control ofrece bastantes cosas, incluído el 'fullscreen' pausa stop y tal, por lo que como te indicaba, bastaría un botón para parar el vídeo actual si está en marcha, seleccionar un nuevo origen y opcionalmente darle a play si autostart está en false.

3)  Tambien puedes usar un control MCI...
4)  El control 'Microsoft directMedia animation control', concretamente una instancia de 'spriteControl'... permite hacer animaciones.

5)  Si lo que quieres es utilizar animaciones del estilo 'moviendo ficheros', entonces resulta muy útil el control 'animation ' que está en la librería de controles 'Microsoft Windows common controls 2.5.0' y 2.6.0 (la 2.6.0 se diferencia en que incluye más controles, la 2.5.0 solo incluye 2 el control animation y un control 'updown').

Este control (animation). Permite usar un AVI que tu (o quien sea) hayas compuesto. tiene algunas limitaciones
* Está limitado a (creo recordar) 64 kb de tamaño como maximo (o quizás 50kb, no recuerdo exactamente). (tamaño del fichero)
* No puede incluir audio el AVI que se utilice, dará error.
* Las imágenes han de ser bmp, por lo que o bien son muy pequeñitas o bien (es lo que yo suelo hacer) comprimirlas en .RLE (siguen siendo bmp).
Luego algunas notas:
* Para las transparencias se ha de usar un color el mismo para todas las imágenes cuando formes el avi.
* Recuerda que el tamaño de los frames son definitivos, el control podrá tener el tamaño que se quiera, pero no rescala la animación.
* Asegúrateque todos los frames tienen el mismo tamaño.
* Cuando tengas todas las imágenes usa un programa para montar el AVI.
* Una vez montado el avi, debes probarlo para ver si no cumple alguna característica.
Código: Visual Basic
  1.  
  2. Animation1.open "C:Mi animacion.avi"  ' carga y ejecuta la animación.
  3.  
  4. Animation1.stop ' pausa la animación.
  5. Animation.Play  ' pone en marcha de nuevo la animación, admite 3 parámetros para señalar como se quiere
  6. Animaton1.Close ' descarga la animación, ahora no se admite ni play ni stop
  7.  
  8.  
Puede ser útil que guardes el avi en un archivo de recursos....

6)  Y por último, a las bravas puedes usar un control picture oculto con una imagen que contiene las diferentes imágenes que forman la animación, ordeenadas en columnas y filas del mismo tamaño, luego con un timer vas tomando cuadros de la imagen original y pegándolos donde necesitas . El control pictureclip, puede ayudarte bastante con esto.

97
Visual Basic 6.0 e inferiores / Re: Solo numeros
« en: Viernes 16 de Abril de 2010, 17:23 »
Claro, el problema está que keypress es un evento que sucede con el cambio...
La solución más óptima es utilizar el evento Validate.

el código dentro de dicho evento será algo como:

Código: Visual Basic
  1.  
  2. Private Sub Text1_Validate(Cancel As Boolean)
  3.     If IsNumeric(Text1.Text) = False Then
  4.         Cancel = True
  5.         ' por ejemplo avisamos
  6.        MsgBox "sólo una expresión numérica.."
  7.         
  8.         '  y por ejemplo borramos
  9.         Text1.Text = ""
  10.     Else
  11.         ' aquí el código que queramos hacer... sabiendo que es un número
  12.    End If
  13. End Sub
  14.  
  15.  
  16.  
  17.  

98
Visual Basic para principiantes / Re: Redondeo Especifico Visual Basic
« en: Viernes 16 de Abril de 2010, 17:03 »
De entrada, el planteamiento del redondeo lo veo incorrecto. Naturalmente esto es relativo y sólo será cierto según para qué lo necesites.

Te razono la afirmación:
Si tenemos dos valores X e Y y sean estos valores los siguientes:
x=  7.5674
Y=  7.56

Tu obtienes que X redondeando será: 7.567, en cambio  Y redondeado será 7.57, usando el criterio que expresaste. Comparemos con el valor original:
para X: 7.5674 - 7.567= 0.0004
para Y: 7.56    - 7.57=  -0.0100

Es decir Y tiene un redondeo 25 veces mayor que X.

¿Esto que quiere decir?, que el redondeo se debe aplicar exclusivamente el eneavo decimal, exclusivamente, por tanto
Y no debe considerarse como 7.56 sino como 7.560

Resumiendo debes ponerte de acuerdo en cuantos decimales quieres apreciar y ese valor tiene que ser el mismo para todas las cifras.

Consideremos que deseas reconocer hasta 4 decimales...
Código: Visual Basic
  1.  
  2. Private Function RedondeoDecimal(ByVal n As Single) As Single
  3.     dim c as long, b as byte
  4.  
  5.     c = n * 10000   ' porque necesitamos 4., 10^4
  6.     b = c Mod 10
  7.    
  8.     If b < 5 Then
  9.         RedondeoDecimal = (c - b) / 10000     ' redondeo a la baja, el último decimal pasa a ser 0
  10.     ElseIf b > 5 Then
  11.         RedondeoDecimal = (c + (10 - b)) / 10000  ' redondeo al alza, el último decimal pasa a ser 0
  12.     Else
  13.         RedondeoDecimal = c / 10000  ' sin cambios, no devolvemos n, porque de este modo eliminamos todos los decimales más allá de 4
  14.     End If
  15. end function
  16.  
  17.  

Ejemplos para probarlo...
Código: Visual Basic
  1.  
  2. Dim x As Single, y As Single, z As Single
  3.    
  4.     x = 3.5674
  5.     y = 8.2637
  6.     z = 12.4445
  7.    
  8.     x = RedondeoDecimal(x)
  9.     y = RedondeoDecimal(y)
  10.     z = RedondeoDecimal(z)
  11.  
  12. ' RESULTADOS:
  13.     x = 03.5670        ' redondeado a la baja
  14.     y = 08.2640        ' redondeado al alza
  15.     z = 12.4445        ' sin cambios
  16.  
  17.  

Ya lo tienes resuelto...
Dejo a tu esfuerzo cómo resolver, cuando un valor es tan grande que al multiplicarlo por 10.000 produce desbordamiento....

p.d.: la paridad se comprueba hayando el resto  de una división entre 2, si sobra 0 es par, si sobra 1 es impar...
Código: Visual Basic
  1.  
  2. if x mod 2=0 then
  3.     msgbox "X es par"
  4. else
  5.    msgbox "X es impar"
  6. end if
  7.  
  8.  

Lo mismo para cualquier base numércia, es múltiplo de 3 ? ( x mod 3)
Es  x múltiplo de n ?  

Código: Visual Basic
  1. if (X mod n) = 0 then msgbox "Es múltiplo..."
  2.  

99
Visual Basic para principiantes / Re: Redondeo Especifico Visual Basic
« en: Jueves 15 de Abril de 2010, 18:18 »
Y dónde está el problema ?...

Si ya tienes claro como ha de funcionar el resto es pura matemática. Supongo que sabes sumar y restar... :devil:  :devil:

Te recuerdo que no se hacen tareas, así que si defines cual es el problema o donde tienes dudas se te podrá orientar.

100
Visual Basic 6.0 e inferiores / Re: Cargar un recordset con una tabla
« en: Martes 13 de Abril de 2010, 09:41 »
La variable hay que pasarla como texto, ya que "str(variable)" entre comillas es un texto pero la bd detecta que ese texto no puede computarse como un VALOR NUMÉRICO.

Para hacerlo hay que componerlo en partes:
Código: Visual Basic
  1.  
  2. "Select *From tabla WHERE campo=" & CStr(variable) & " Order By campo ASC"
  3.  
  4.  
Ahora si variable vale 512, entonces la consulta enviada será ...campo= 512 ...

Como ves hay que concatenar las partes. Ya que Cstr(variable) además de una función, la variable es un puntero a un dato. La BD requiere el valor pasado como texto, ella no puede interpretar que debe tomar variable como un puntero, localizar de la memoria el texto y convertirlo.... si requiere una CADENA de TEXTO, eso es lo que debes pasarle.

Date cuenta donde acaba VB y donde empieza la BD (SQL, Access,etc...)

Páginas: 1 2 3 [4] 5 6 ... 29