|
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
« en: Martes 25 de Mayo de 2010, 04:51 »
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
« 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...  )) 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
« 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
« 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
« en: Domingo 23 de Mayo de 2010, 01:13 »
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: 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 Private Type AtributosDeSeguridad Tamaño As Long ' tamaño en bytes de la estructura 10 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. Heredable As Boolean ' indica si un nuevo proceso (cuando se crea) hereda el manejador (handle) End Type Dim AtSeg as AtributosDeSeguridad ' declaración para esta opción AtSeg.Tamaño= 10 ' la estructura puede pasarse vacía sin problemas... Private Enum AccionFichero ACCION_CREAR_NUEVO = 1 ' Crea un nuevo fichero, si existe ya, falla ACCION_CREAR_SIEMPRE = 2 ' Crea un nuevo fichero, si existe es sobrescrito. ACCION_ABRIR_SOLO_SI_EXISTE = 3 ' Abre un fichero, si no existe falla. ACCION_ABRIR_SIEMPRE = 4 ' Abre un fichero, si no existe se crea 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... End Enum dim ModoAp as AccionFichero ' declaración para esta opción ModoAp = ACCION_ABRIR_SIEMPRE ' ejemplo de valor
Es im portante saber que un fichero abierto con CreateFile debe ser cerrado con CloseHandle, de lo contrario el fichero quedará 'pillado'... dim ff as long ' si falla devuelve -1. ff = Crearfichero(..., ..., ...) if ff <> -1 then ff = CloseHandle(ff) ' si tiene éxito devuelve 1, si falla devuelve 0 end if
Un ejemplo para crear un fichero... public function Crear as long Dim b() As Byte Dim ff As Long Dim RutaFichero as string Dim fa As VbFileAttribute ' atributos para el fichero Dim AtSeg as AtributosDeSeguridad Dim ModoAp as AccionFichero Const ACCESO_MODO_ESCRITURA = 2 ^ 30 const COMPARTIR_MODO_ESCRITURA = 2 const BANDERA_ACCESO_ALEATORIO = 268435456 ModoAp = ACCION_ABRIR_SIEMPRE fa = vbNormal ' atributo normal , ¿ 128 ? ReDim b(0 To 19) b(0) = &H39: b(1) = &H4E: b(2) = &H39: b(3) = &H4E: b(4) = &H39: b(5) = &H4E: b(6) = &H39: b(7) = &H4E b(8) = &H39: b(9) = &H4E: b(10) = &H39: b(11) = &H4E b(12) = 0: b(13) = 46: b(14) = 0: b(15) = 84: b(16) = 0: b(17) = 88: b(18) = 0: b(19) = 84 RutaFichero = b ff = CrearFichero(RutaFichero, ACCESO_MODO_ESCRITURA , COMPARTIR_MODO_ESCRITURA , AtSeg, ModoAp , fa + BANDERA_ACCESO_ALEATORIO , 0) Crear = ff ' if ff <> -1 then ' Msgbox "el fichero ha sido abierto/creado... verifícalo en la carpeta de tu proyecto" ' ff = closeHandle(ff) ' if ff = 1 then ' msgbox "El fichero ha sido cerrado.." ' end if ' end if end function
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
« en: Viernes 21 de Mayo de 2010, 18:50 »
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...
83
« 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
« 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 dim Tablero(0 to 2, 0 to 2) as InfoCasillas ' casillero, donde se pintará cuando se ocupe una casilla. Dim CasillasLibres as byte ' indica cuantas casillas hay libres hasta el momento
Cada casilla del tablero puede tener 3 estados, 0 = no ocupado, 1= ocupada por el jugador A, -1= ocupada por el jugador B private enum InfoCasillas CASILLA_JUGADOR_B = -1 CASILLA_VACIA = 0 CASILLA_JUGADOR_A = 1 end enum
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. ' a nivel de formulario... Dim ImgJugador(0 to 1) as IpictureDisp private sub Form_Initialize set ImgJugador(0)= loadpicture("ruta de la imagen del jugador A") set ImgJugador(1)= loadpicture("ruta de la imagen del jugador B") End Sub
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: picture1.autoredraw=true ' para que no se nos borre el tablero cuando se coloque otra ventana encima... call Picture1.Scale(0,0)-(3,3)
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: dim Cuadro as single ' esto a nivel del formulario cuadro = picture1.scalewidth / 3 ' esto justo debajo de la línea que escala el picture. ' 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
Luego convendrá que tengamos una rutina llamada iniciar partida... pero antes definimos nombres para los jugadores... Dim turno as byte ' a nivel de formulario dim nombreJugador(0 to 1) as string ' en el load del formulario dim nombre as string nombre = InputBox("especifique el nombre del jugador A: ", "Nombre de los contendientes...", "Jugador A") if nombre ="" then nombrejugador(0)="Jugador A" else nombrejugador(0)= nombre end if nombre = InputBox("especifique el nombre del jugador B: ", "Nombre de los contendientes...", "Jugador B") if nombre ="" then nombrejugador(1)="Jugador B" else if nombre <> nombrejugador(0) then nombrejugador(1)= nombre else nombrejugador(1)="Jugador B" end if end if Private sub IniciarPartida picture1.cls ' borramos el tablero erase tablero ' la matriz es estática, por tanto erase sólo borra el contenido CasillasLibres = 9 ' si hay algún sistema de puntuación actualizar aquí. ' echamos a suertes que jugador empieza, basado en un 50% (del 0 al 49 = 0, del 50 al 99 = 1) turno= (100 *RND)50 msgbox "Empieza el Jugador : " & NombreJugador(turno) ' ahora AQUÍ se activan todos los controles de la interfaz para jugar la partida. End Sub
También deberíamos tener una rutina que marque la jugada.... private sub Turnar(byval Fila as byte, byval Columna as byte) ' se omite la comprobamos de fila y columna fuera de rango, es obvio y si lo haces correctamente debería ser innecesario. if CasillaLibre(Fila, Columna) = TRUE then if CasillasLibres = 0 then call VerificarResultado ' exhibir mensaje de quien ganó, indcar línea ganadora y se prevee actualizar puntuación de los juadores ' desactivar interfaz de jugada excepto los botones nueva partida y salir ( si se pulsa en nueva partida allí se habilita de nuevo la interfaz). else Picture1.PaintPicture ImgJugador(turno), columna, fila, cuadro, cuadro ' ahora cambiamos el turno del jugador Turno= abs(turno -1) msgbox "es el turno del jugador: " & nombrejugador(turno) end if else bepp msgbox "La casilla " & fila & "," & columna & " ya está ocupada. elija otra, jugador " & nombreJugador(turno) end if end sub
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... private function CasillaLibre(byval F as byte, byval C as byte) as boolean if tablero(c,f) = 0 then ' si tiene un valor 0 estçá libre tablero(c,f)= ((turno * 2) -1) ' entonces se la apropiamos al jugador que tiene el turno CasillasLibres = Casillaslibres -1 ' restamos una casilla libre CasillaLibre = TRUE ' y devolvemos el resultado 'estaba libre' end if end function
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
« 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
« 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
« 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) Cantidad = 10 Matriz(Cantidad-1) designa una matriz de 10 elementos. n = 1 Matriz(0)= n hacer: Mientras n < (Cantidad -1) Incrementar n Cuenta = n div = ( 1 / n ) la priemra división se realiza fuera del bucle para inicializar la división en su valor más 'profundo' Hacer Mientras Cuenta > 1 Div = (1 / (Cuenta + Div)) Decrementar Cuenta repetir Matriz(n) = Div repertir
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
« en: Sábado 15 de Mayo de 2010, 14:50 »
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
« 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: "SELECT nombre_estacion FROM sqlies WHERE linea = " & Combo3.Text
En cambio si la tabla es estacion y dicha tabla tiene 2 campos llamados 'nombre_estacion' y 'linea' la query debería ser: "SELECT nombre_estacion FROM estacion WHERE linea = " & Combo3.Text
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: Adodc1.RecordSource = "SELECT nombre_estacion FROM estacion WHERE linea = " & Combo3.Text Adodc1.Recordset.Requery
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
« 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
« en: Martes 11 de Mayo de 2010, 22:23 »
if combo3.text <>"" then RecordSource = "SELECT estacion.nombre_estacion FROM sqlies WHERE estacion.orden = " & Combo3.text end if
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
« 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) if combo1.listindex = 5 then ' el código que se quiera asociar. end if
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) if combo1.list(combo1.listindex)= "Pedro" then ' el código asociado que queremos ejecutar end if
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. for k= 0 to combo.listcount -1 if combo.list(k)= Nombre then ' el código asociado. end if next
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). dim Hoy as byte Hoy = 4 ' jueves For k = 0 to listHabitaciones.listcount-1 if listHabitaciones.list(k)<>"" then ' la habitación no está desocupada, hay un cliente ' 1 cargar la lista desayuno semanal (que eligió el cliente) desde la base de datos al listbox, luego... ' 2 el cliente de la habitación k, tiene encargado desayuno para hoy ? if listDesayuno.Selected(Hoy)= TRUE then ' 3 preparar desayuno para la habitación k end if end if next
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 for k= 0 to list1.listcount -1 if list1.selected(k) = true then ' lo que vayamos a hacer... end if next
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: dim Precio as long dim Valor as string Precio = 1033 Valor= CStr(Precio) & "Euros." asignamos sobre una variable string, el valor de una variable numérica, para ello lo convertimos (convertString) msgbox valor
93
« 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... Dim Conexion As New ADODB.Connection Dim RsArticulos As New ADODB.Recordset Private Totales As Single Private ArtiElegidos As Byte ' mantiene una cuenta de los diferentes artículos elegidos. Private ArtiNocomputar As Boolean ' al activarse no debe ejecutarse elcódigo asociado... Private RegaloVariedad As Boolean ' se aplica regalo del 5º ? Private RegalarArticuloX As single ' señala que artículo se regala gratis (su precio). este valor se descuenta del total a pagar. Private RegaloFidelidad(0 To 4) As Boolean ' se aplica regalo 1 adicional del artículo de al menos 4 ? Private AplicarDescuento As Boolean ' se aplica un descuento ? 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. Private VolumenParaDescuento As Single ' cantidad que determina que una vez alcanzada se aplica el descuento.
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. ' contabiliza cuantos diferentes artículos se adquieren, además Private Sub CheArticulos_Click(Index As Integer) Dim uso As Boolean ' sólo se ejecuta el código cuando no se está totalizando If ArtiNocomputar = False Then uso = (CheArticulos(Index).Value = 1) txtPrecioUnidad(Index).Enabled = uso txtCantidades(Index).Enabled = uso If uso = True Then ArtiElegidos = ArtiElegidos + (2 ^ Index) ' se recuerda que: 2 ^0= 1 txtCantidades(Index).BackColor = vbWhite Else ArtiElegidos = ArtiElegidos - (2 ^ Index) 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. txtCantidades(Index).BackColor = 14737632 'gris, desactivado End If End If End Sub
Código del botón borrar, el botón se ha renombrado ' borra todo lo necesario, equivale a resetear Private Sub cmdBorrar_Click() Dim k As Byte ' borramos cantidades y desactivamos artículos elegidos For k = 0 To 4 CheArticulos(k).Value = 0 txtCantidades(k).Text = "0" txtCantidades(k).Enabled = False ' desactivado txtCantidades(Index).BackColor = 14737632 'gris Next ArtiElegidos = 0 ' borramos totales y descuento TxtTotales.Text = "0.00" Totales = 0 LabDescuento.Caption = "" ' este lab está en el frame de gratificaciones... ' borramos todas las promociones For k = 0 To 2 ChePromociones(k).Value = 0 Next For k = 0 To 4 RegaloFidelidad(k) = False Next RegaloVariedad = False AplicarDescuento = False RegalarArticuloX = 0 ' se activa de nuevo la seleccion de adquisiciones. FraAdquirir.Enabled = True ' se activa de nuevo computar cuando se marquen artículos. ArtiNocomputar = False End Sub
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) ' aquí primero se verifican si se cumple alguna de las reglas. ' 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. ' como no se indica nada en contra se supone que sí. Private Sub CmdTotalizar_Click() Dim k As Byte, cantidad As Integer, precio As Single, Descuento As Single ' desactivamos posibilidades de cambios antes de empezar a calcular... Se activa de nuevo al borrar. FraAdquirir.Enabled = False ArtiNocomputar = True ' los cambios aplicados ahora al marcar artículos no ejecutan el código asociado en los checkbox... ' 1º determinar si se aplica regalo del 5º (regalo por variedad). ' 1 + 2 + 4 + 8 + 16 =31, el regalo se aplica cuando: ArtiElegidos = 31 - sólo 1 de esos sumandos ' Casos posibles para 5 artículos: 31-16=15 ;; 31-8=23 ;; 31-4=27 ;; 31-2=29 ;; 31-1=30 ' y también si se eligió los 5 en cuyo caso se regala el de menor cuantía ? 31-0=31 Select Case ArtiElegidos Case 0 ' no hay adquisiciones Call cmdBorrar_Click Exit Sub Case 15, 23, 27, 29, 30, 31 ' se eligieron 4 artículos (o 5) RegaloVariedad = True ChePromociones(1).Value = 1 If ArtiElegidos < 31 Then ' si se eleigieron 4 artículos, regalar el 5º Select Case ArtiElegidos Case 15: k = 4 ' activamos el artículo 4 que es el que falta Case 23: k = 3 Case 27: k = 2 Case 29: k = 1 Case 30: k = 0 End Select ' se regala este artículo. el 'K' avo de la matrizde artículos. CheArticulos(k).Value = 1 'lo marcamos, txtCantidades(k) = "1" ' señalamos en cantidad 1 RegalarArticuloX = Val(txtPrecioUnidad(k).Text) ' tomamos el valor que al totalizar se cuenta, pero al final se debe descontar. Else ' el que adquiere compra todos los artículos (al menos 1 cantidad), se regala el de menor cuantía de los existentes... ' buscamos el precio de menor cuantía de los 5 artículos. RegalarArticuloX = Val(txtPrecioUnidad(0).Text) For k = 1 To 4 If Val(txtPrecioUnidad(k).Text) < RegalarArticuloX Then RegalarArticuloX = Val(txtPrecioUnidad(k).Text) End If Next End If Case Else ' no hay promoción de regalar un 5º por tener 4 artículos. RegaloVariedad = False ChePromociones(1).Value = 0 RegalarArticuloX = 0 End Select ' 2º Determinar si se puede hacer un regalo por fidelidad ' 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) For k = 0 To 4 If Val(txtCantidades(k).Text) > 3 Then RegaloFidelidad(k) = True ' activamos para tenerlo en cuenta al totalizar, ChePromociones(2).Value = 1 ' marcamos la promoción txtCantidades(k).Text = Val(txtCantidades(k).Text) + 1 ' sumamos 1 para asegurarse que sea entregado... End If Next ' 3º Descuento por volumen: (se suponen que las promociones son acumulables), este paso serealiza en 2 ' en el primero se tiene calcula el total adquirido originalmente por el comprador + el regalo del 5º (si existe se desceunta al final). ' en el segundo se comprueba si se aplica el descuento por volummmmen de compra. ' 3ºA) totaliza las cantidades, descontando regalos_por_Fidelidad (la cantidad ya se sumó pero es gratis). For k = 0 To 4 cantidad = Val(txtCantidades(k).Text) precio = Val(txtPrecioUnidad(k).Text) If RegaloFidelidad(k) = True Then ' aquí hay un regalo por variedad, se descuenta una unidad. cantidad = cantidad - 1 End If If cantidad > 0 Then ' total = total + (precio_1 * cantidad_del_Artículo) Totales = Totales + (precio * cantidad) End If Next ' 1ºB, aplicar el descuento del 5º artículo, sino existe este valor es 0 y por tanto no cambia. ' 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. Totales = Totales - RegalarArticuloX ' se supone que las promociones son acumulables. ' 3ºB se verifica si se cumple la 3ª promoción If Totales > VolumenParaDescuento Then Descuento = ((Totales / 100) * DescuentoPorcentaje) Totales = Totales - Descuento AplicarDescuento = True ChePromociones(0).Value = 1 Else AplicarDescuento = False ChePromociones(0).Value = 0 End If ' marcamos el valor total, las promociones aplicadas quedan reflejadas en el frame gratificaciones... TxtTotales.Text = Totales LabDescuento.Caption = "Descontado: " & CStr(Descuento) End Sub
Finalmente el código de carga y fin del formulario (esta parte está sin terminar, te lo señalo con comentarios). Private Sub Form_Load() Conexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "DataAlmacen.mdb;Persist Security Info=False;Jet OLEDB:Database;" Conexion.Open RsArticulos.Open "select * from Artilculos ", Conexion Call MostrarPrecios DescuentoPorcentaje = 8 ' 8% es el valor de descuento. VolumenParaDescuento = 150 ' es el valor que si se alcanza al totalizar, determina que se aplica el descuento. End Sub ' los precios de los artículos están bloqueados, porque deben ser de sólo lectura. ' propiedad locked =true ' también está bloqueado preciototal ' los bloqueados se les cambió el color defondo, para expresar su valor no alterable desde interfaz de usuario. Private Sub MostrarPrecios() txtPrecioUnidad(0).Text = RsArticulos.Fields("Zapatillas").Value txtPrecioUnidad(1).Text = RsArticulos.Fields("T-Shirts").Value txtPrecioUnidad(2).Text = RsArticulos.Fields("Pantalones").Value txtPrecioUnidad(3).Text = RsArticulos.Fields("Zapatos").Value txtPrecioUnidad(4).Text = RsArticulos.Fields("Gorras").Value End Sub Private Sub cmdSalir_Click() ' pedir confirmación ' cerrar la base de datos antes de salir End ' end no dispara el evento queryunload End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) ' confirmar si se desea salir... ' confirmar si se descartan cambios y cerrar base de datos End Sub
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
« 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... public function Suma(byval sumando as integer, byval Sumador as integer) as long Suma= sumando + sumador end function
Esta función la utilizo así... Dim Resul as long Resul= suma(22,37) ' y también así... Dim x1 as integer, x2 as integer x1= 144: x2=49 Resul= suma(x1,x2)
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: 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.... Dim k as long, R as long if (not(valores)) <> -1 then for k= lbound(valores) to ubound(valores) R= R + Valores(k) next suma = R else Call Err.Raise(9, Me.Name, "La matriz no está declarada...") end if end function
...luego la función se utiliza así... Dim Resul As Long Dim n() As Integer Redim n(1 to 7) 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 Resul = Suma(n) msgbox resul ' nos muestra el resultado de la suma.
Espero que puedas entenderlo...
95
« 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
« en: Jueves 22 de Abril de 2010, 13:57 »
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. Private FullScreen As Boolean Private Sub Form_Load() Timer1.enabled=false Timer1.interval=50 Wmp.settings.autoStart = False Command1.Caption = "Sin medios" Command2.Caption = "Elegir medio..." Check1.caption= "Pantalla completa" End Sub Private Sub Command2_Click() If Wmp.URL = "" Then Wmp.URL = "C:VideossNavidades-2009.avi" Command1.Caption = "Reproducir" Command2.Caption = "Parar" Else Timer1.Enabled = False ' nos aseguramos que un problema de carga no se perpetúe... Wmp.Controls.stop Command2.Caption = "Elegir medio..." Command1.Caption = "Sin medios" Wmp.URL = "" End If End Sub Private Sub Command1_Click() On Local Error GoTo Insiste If Wmp.playState <> wmppsPlaying Then If Wmp.URL = "" Then Call Command2_Click Else Select Case Wmp.playState Case wmppsPaused, wmppsStopped, wmppsReady ' no tienen porque agruparse en la misma acción, pero para el ejemplo vale. Wmp.Controls.play Command1.Caption = "Pausar" DoEvents If Wmp.FullScreen <> FullScreen Then Wmp.FullScreen = FullScreen End If Case Else Beep ' otras acciones ante otros estados... End Select End If Else If Wmp.URL <> "" Then Wmp.Controls.pause Command1.Caption = "Reproducir" Else MsgBox "Primero debe seleccionar un medio, pulse el botón 2." End If End If Exit Sub Insiste: ' 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 Err.Clear Timer1.Enabled = True ' lo derivamos a un bucle que espera hasta que se ponga en play. End Sub Private Sub Check1_Click() FullScreen = (Check1.Value = 1) If Wmp.playState = wmppsPlaying Then ' si está en play la orden se obedece inmediatamente, sino, queda guardada para cuando se haga play. Wmp.FullScreen = FullScreen End If End Sub ' le damos tiempo a que 'cargue', cambiando de estado de transición a estado reproduciendo. Private Sub Timer1_Timer() If Wmp.playState = wmppsPlaying Then Timer1.Enabled = False Wmp.FullScreen = FullScreen End If End Sub
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. Animation1.open "C:Mi animacion.avi" ' carga y ejecuta la animación. Animation1.stop ' pausa la animación. Animation.Play ' pone en marcha de nuevo la animación, admite 3 parámetros para señalar como se quiere Animaton1.Close ' descarga la animación, ahora no se admite ni play ni stop
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
« 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: Private Sub Text1_Validate(Cancel As Boolean) If IsNumeric(Text1.Text) = False Then Cancel = True ' por ejemplo avisamos MsgBox "sólo una expresión numérica.." ' y por ejemplo borramos Text1.Text = "" Else ' aquí el código que queramos hacer... sabiendo que es un número End If End Sub
98
« 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... Private Function RedondeoDecimal(ByVal n As Single) As Single dim c as long, b as byte c = n * 10000 ' porque necesitamos 4., 10^4 b = c Mod 10 If b < 5 Then RedondeoDecimal = (c - b) / 10000 ' redondeo a la baja, el último decimal pasa a ser 0 ElseIf b > 5 Then RedondeoDecimal = (c + (10 - b)) / 10000 ' redondeo al alza, el último decimal pasa a ser 0 Else RedondeoDecimal = c / 10000 ' sin cambios, no devolvemos n, porque de este modo eliminamos todos los decimales más allá de 4 End If end function
Ejemplos para probarlo... Dim x As Single, y As Single, z As Single x = 3.5674 y = 8.2637 z = 12.4445 x = RedondeoDecimal(x) y = RedondeoDecimal(y) z = RedondeoDecimal(z) ' RESULTADOS: x = 03.5670 ' redondeado a la baja y = 08.2640 ' redondeado al alza z = 12.4445 ' sin cambios
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... if x mod 2=0 then msgbox "X es par" else msgbox "X es impar" end if
Lo mismo para cualquier base numércia, es múltiplo de 3 ? ( x mod 3) Es x múltiplo de n ? if (X mod n) = 0 then msgbox "Es múltiplo..."
99
« 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... Te recuerdo que no se hacen tareas, así que si defines cual es el problema o donde tienes dudas se te podrá orientar.
100
« 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: "Select *From tabla WHERE campo=" & CStr(variable) & " Order By campo ASC"
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
|
|
|