|
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 ... 18 19 [20] 21 22 ... 29
476
« en: Martes 2 de Septiembre de 2008, 11:39 »
Declarar variables variant es de mala programacion puesto que son lentas y ocupan memoria innecesariamente. Yo prefiero mi solución porque es más rápida a la hora de ejecutar y ocupa menos memoria. Como regla general, JAMÁS deben usar variables de tipo Variant. Efectivamente como regla general, no para todo caso habido o por haber... esta es una digna excepción. En cuanto a que tu solución es más rápida y ocupa menos no estoy de acuerdo... tu fabricas un registro por el sólo hecho de no tener claro como mediar con un array no inicializado. si montas la solución que te doy en una función del modo que más te convenga (obtener true, false para ver si está declarado o devolviendo un entero indicando su límite a sabiendas de que -1 indica no inicializado) creo que es más rápido y agota menos memoria por la sencilla razón de que si finalmente tu programa hubiera de tener pongamos 300 arrays tu solución crearía 300 variables extras para reconocer su tamaño, aparte 300 descriptores del registro que también ocupa lo suyo. Mi solución no tiene ese problema la función puede recibir cualquier array si lo pones como parámetro, es por tanto una función universal sean cuantas sean los arrays que tengas. Además puedes usar la misma función con parámetros adicionales opcionales para redimensionarlo... Además un problema que suele tener la gente es que una vez que termina de usar un array no lo destruye, porque luego le 'cuesta' volver a construirlo más tarde si lo necesita, mi solución permite además dejar de temer ese caso, con lo que cuando se precise puede eliminarse el array sin contemplaciones y sin tener que hacer un código o vairables extra de comprobación y/io mantenimiento. También he visto gente que usa un registro y en él un buleano para señalar cuando destruye el array y no debe utilizarlo. Lo cual es más de lo mismo y que mi solución hace innecesario. Piénsalo un poco, dale vueltas y exprimenta... post data: adjunto Nota de Mocosoft Nota Lasmatrices de cualquier tipo de datos requieren 20 bytes de memoria más cuatro bytes para cada dimensión de matriz, más el número de bytes que ocupan los propios datos. Puede calcular la memoria que ocupan los datos multiplicando el número de elementos de datos por el tamaño de cada elemento. Por ejemplo, los datos de una matriz unidimensional que consten de cuatro elementos de datos tipo Integer de dos bytes cada uno, ocupan ocho bytes. Los ocho bytes que requieren los datos más los 24 bytes necesarios para la matriz suman un requisito total de memoria de 32 bytes para dicha matriz. Un tipo Variant que contiene una matiz requiere 12 bytes más que la matriz por sí sola.
Resumiendo si tienes 300 arrays en un programa y usas una función como indico sólo usarás 12 bytes más usando los 300 arrays usando un registro con un integer aparte del array usarás 2bytes por cada array dicho sea 600 bytes + el tamaño de los 300 descriptores de cada registro, el tiempo empleado en acceder a un registro siempre requiere calcular la dirección del registro + la de la variable, por lo que usar un registro siempre tendrá un tiempo de acceso mayor para calcular la dirección efectiva, y esto se aplica no sólo a la variable que lleva el contador del tamaño del array sino también para el propio array cada vez que se usa.
477
« en: Lunes 1 de Septiembre de 2008, 18:07 »
Perdón, señor listo Nebire, UBound da error si el array no tiene ningún elemento. Prueba esto:
Dim Lista() as Integer Dim a as Integer a = UBound(Lista)
Gracias por lo de 'listo', no hacía falta, y perdonado estás... ignorar cosas es lo más normal, pero no deberías precipitarte sin investigar un poco al menos, no te parece...?. Crees que lógico hacer una afirmación sin conocer en profundidad lo que se hace y dice ?. Prueba el siguiente código comentado... y fíjate que las 3 primmeras líneas de tu código son casi idénticas a las mías, la diferencia está en lo que ignoras ' a nivel de módulo, en el formulario Dim Lista ' de entrada se define como una variant, no un array... Dim a as Integer Private Sub Form_Click() 'for k= 0 to 15 If Not IsArray(Lista) Then Lista = Array() End If a = UBound(Lista) ' al llegar aquí esto nunca da error, incluso cuando Lista() no ha sido inicializado todavía If UBound(Lista) = -1 Then ' aquí se entrará cuando el array no haya sido inicializado, incluso cuando es nothing, para probar esto activar el bucle for o pulsar más de 10 veces en el formulario... msgbox "El array no ha sidfo inicializado, pero no da error...." ReDim Lista(0 To 0) ' por ejemplo se aprovecha para inicializar el array a 1 elemento... o lo que se quiera Else ReDim Preserve Lista(UBound(Lista) + 1) ' se redimensiona en un elemento más que es lo que quería el que abrió el hilo End If msgbox "La matriz LISTA tiene " & a & " elementos.... palabra de ley." 'eliminar la matriz if ubound(lista)=10 then set Lista=nothing end if ' next end sub
Ahora pruébalo paso a paso y me comentas.... para la próxima si no encuentras la solución, simplemente dí 'No lo veo', queda más propio con la verdad decir no lo veo que decir es falso, cuando es verdadero...
478
« en: Domingo 31 de Agosto de 2008, 20:46 »
Debes basarte en la otra variable (la que suma) la i
public type tArreglo Arreglo() as Tipo1 NElementos as Integer end type
Cada vez que pongas un elemento en Arreglo, sumas uno a NElementos.
Salud y república
Esto es una tontería la función Ubound() es perfecta y lo es por si misma, tampoco hace falta otro contador posterior sino en todo caso anterior que a la vez sirve para la verificación... dim limite as integer limite= ubound(Arreglo) if limite <>-1 then ' la matriz está dimensionada, tiene elementos... redim preserve Arreglo(limite +1) else ' la matriz no está dimensionada end if
479
« en: Domingo 31 de Agosto de 2008, 20:36 »
Ya te he respondido en el mensaje anterior... aquí sólo quría corregirte acerca de la propiedad... En un OCX las propiedades si han cambiado deben anunciarse para que las rutinas Readproperty y writeproperty actualicen correctamente los datos. Si tu propiedad era: Public Property Let A(ByVal vA As String) If IsNumeric(vA) Then If Val(vA) >= 0 And Val(vA) < 1000 Then iA = vA Else iA = 1 End If Else iA = 1 End If End Property
Debe quedar algo así como: private p_ValorMax as integer ' almacena el valor de la propiedad ValorMax Public Property Let ValorMax(ByVal v As integer) if v>=0 and v<1000 then p_ValorMax=v PropertyChanged "ValorMax" else if p_ValorMax<>1 then p_ValorMax=1 PropertyChanged "ValorMax" else ' no cambia nada y por tanto no es necesaro anunciar cambio de valor en la propiedad end if end if End Property
Otra cosa te indico si recibes un valor que ha de ser numérico el parámetro de la propiedad que sea numérico, si usan enteros pues un byte, integer ó long el que cubra el rango tolerado, y si es decimal un single o double, pero no un string, se pierde tiempo en convertir cadenas a valores luego a cadena lyuego otra vez a valores... deben hacerse las menos conversiones posibles... si tomas la propiedad de un control textbox, por ejemplo fíjate que ya la propiedad si su text no es numérico ya devuelve 0 salvo que que hagas un ValorMax=val(textbox1.text) y exista un texto que pueda valorarse numérico, como porejemplo ''299perro'' que tomaría 299... por tanto si te devuelve '0' ya no tienes que evaluar con la función isnumeric, sino sólo si está o no dentro del rango que tu querías mayor o igual a 1 y menor de 1000.
480
« en: Domingo 31 de Agosto de 2008, 20:17 »
en un formulario tengo dos label una llamada lblmsj y otra llamada lblError .... ademas en el formulario tengo una OCX que contine un texto llamado txtNum, como haga para que cada vez que mofique txtNum me muestre ese valor en lblmsj En el OCX tiwenes que incluir un evento tipo 'Change' : public event Change() ' Luego sobre el evento change del txtnum debes provocarlo validarlo private sub TxtNum_Change() raiseEvent Change() end sub
entonces ahora la instancia del OCX ya recibe un evento change, si suponemos que tu ocx se llama MiTextBox1 puedes buscar el evento change para escribir el código pertinente. ...y que cuando en txtNum ingrese cualquier dato que no sea numerrico lblError.Caption me muestre "El valor debe ser numerico"......???? Para esto nuevamente debes crear un evento, por ejemplo : Public event NoNumero En alguno de los eventos del TXTNum, por ejemplo Keypress, validas... Private Sub TXTNum_KeyPress(KeyAscii As Integer) if KeyPress <48 or Keypress >57 then KeyPress=0 ' borramos el carácter introducido RaiseEvent NoNumero end if End Sub ' debes notar que el punto ó la coma forman parte también de un número, por lo que deben validarse también eso sí, nunca van más de 1 en una misma cifra... 'Luego en el formulario trabajando sobre el evento de la instancia del OCX recibes cuando suceda la señal y la tratas como desees en tu caso: private MiTextBox1_NoNumero() lblerror.caption="El valor debe ser numerico" end sub ' aunque es mejor no mostrar ese error en un label, si no se va a borrar tras ser leído, un msgbox sería más correcto... private MiTextBox1_NoNumero() msgbox "El valor debe ser numerico" end sub
481
« en: Lunes 7 de Julio de 2008, 15:33 »
Un programa OCR, todavía no hay tantos y es un campo para mejorar... Partes de una imagen que supuestamente tiene texto...
482
« en: Lunes 7 de Julio de 2008, 15:23 »
Las FARC son un cáncer en Colombia. Si se logra extirpar, la salud se extenderá al resto de la sociedad.
Cuando se tiene cáncer, los que pasan a tu lado (entiéndase países) lo hacen con recelo, por el miedo a que pueda afectarles. Es indicutible que si alguien quiere invertir en un negocio en un país y hay un alto índice de delincuencia y peor aún de terrorismo socual o económico (por que eso es lo que son las FARC hoy día) pasen de largo y vayan y si no hay mas remedio que hacerlo se haga con cautela y escasez.
Yo creo que la liberación de Ingrid B. influirá positivamente para la liberación del resto de personas y especialmente para que haya gente que deje de prestar su apoyo a esas manadas de vagos. Del ideal político que los conducía tantos años atrás, ya no queda nada ni tiene sentido ahora es sólo una mera causa de superviviencia sin trabajar todo se reduce a un motivo económico y auna cuestión sicológica de 'aquí mando yo porque me da la gana'.
Espero que las FARC y otros terroristas se vayan desmantelando sistemáticamente...
483
« en: Domingo 6 de Julio de 2008, 14:18 »
mmmm ok gracias por la ayuda tratare de hacerlo. aunque a mi me hubiera gustado nadamas hacerlo en un solo textbox.  A ver como dice mollense, por hacer se puede hacer, la cuestión es si lo quieres hacer así porque debe ser así, si lo quieres hacer así sólo por cabezonería tuya, o por desconocimiento de como será más adecuado. Para entender que es lo 'correcto' se debe saber que un textbox ha sido diseñado para albergar un 'elemento', por tanto si tu quieres meter más de un elemento en un textbox, entonces diremos que sigues el razonamiento 'cabezón' lo quieres hacer porque te da la gana, si has de meter más de un elemento pero no te emperras en meterlo en un solo textbox entonces te diremos que para eso existe el listbox, para tratar más de un elemento. En cambio si sigue siendo un sólo elemento que necesitas dividir en varias partes trabajar sobre las partes y volverlas a unir (si lo último no se cumple volveríamos al listbox), entonces si sería adecuado el textbox, ya que en origen y en destino son un único elemento. Si es este el caso debes cortar el elemento en sus partes e introducirlas en un array luego quitas, añades, ordenas y finalmente vuelves a unir... por ejemplo: sean 2 textbox uno sólo tiene cifras del 0-9 es decir se consideran cifra a cifra el 2º textbox tiene cualquier cifra, pero las cifras están separadas entre si por un guión(ú otro carácter), en el ejemplo disgregaremos los minielementos, los ordenaremos y los volveremos a reintegrar en sus textbox private sub TrabajarlosTextbox() as textbox1.text= Operar_Texto(textbox1.text,"") ' textbox1 no tiene separador entre sus elementos, se consideran uno a uno textbox2.text= Operar_Texto(textbox2.text,"-") end sub ' distribuye los subelementos de un texto sobre una matriz, los ordena y los vuelve a reunir (sin separador) private function Operar_Texto(texto as string, separador as string) as string dim elementos() as string if separador <>"" then ' cuando hay un separador, este actúa como lo que se ha indicado. elementos= split(texto,separador) else redim elementos(0 to len(texto) -1) for k= 1 to len(texto) elementos(k-1)= mid$(texto,k,1) next k end if array.sort(elementos) return string.concat(elementos) end function
Nota que al volver a reunir el array (concatenar sus elementos) no se incluye separador, eso queda como ejercicio para ti... p.d.: veo raro los colores de visual basic....
484
« en: Sábado 5 de Julio de 2008, 17:08 »
hola, instale visual 2003 .net y me manda un error de compatibilidad con windows vista...sobre un archivo devenv.ee...alguna idea? le puse en buscar solucion pero no pasa nada! Si te manda un error y quieres que alguien te asesore, no crees que deberías indicar íntegramente el mensaje de error ?????. Crees que existe algún mecánico que pueda conocer el problema exacto de un vehículo con sólo que alguien le diga mi vehículo no arranca... sin entrar en detalles ????. No hay adivinos, ni es plan jugar a ser adivinos ' a ver si va a ser que falla esto...????. Sé directo, explica tu razón y pon el mensaje íntegro o no pongas nada. De entrada sólo te diría que te actualices por lo menos al VS2005 y si puedes al VS2008, que es lo mismo que te diría el mecánico sin más, mándalo a la chatarra y cómprate uno nuevo. Es la única respuesta correcta para un mensaje sin detalles.
485
« en: Sábado 5 de Julio de 2008, 16:40 »
He descubierto un fallo bastante desagradable, bueno más que fallo una carencia de característica...
Después de postear uno de esos largos mensajes que a veces te salen, resulta que la sesión ha caducado ( te das cuenta después), con lo que al enviar el mensaje te lleva a la ventana de login, pero el mensaje que has redactado se lo ha comido, que digo comido, devorado... aunque vuelvas atrás no recuperas el mensaje, después del tiempo que te ha llevado lo más desagradable que te pueda ocurrir es algo como esto.
La verdad esto ya estaba superado, al menos en otros tipos de foros y esperaba que a estas alturas el phpBB Group hubiera tomado nota y capture el contenido del mensaje, así si te desloga al menos puedes aún copiar el mensaje al portapapeles, volverte a loguear y volver a publicar el mensaje, pero no ya volver a redactarlo. Cuando vas a decir buenos días te da igual, pero cuando es un mensaje elaborado esto te pone de muy mala leche...
No sé si nuestro jefecillo (IronMan) tiene tiempo y ganas de implementarlo o si existe algún plugin que pueda buscar y añadir fácilmente (supongo que si).
Yo al menos entiendo que mientras en mi ventana siga poniendo mi alias mi sesión no ha caducado, obvimanete el servidor no tiene porqué saber lo que ponga en mi ventana si no ha habido tráfico en dicho plazo, en ese caso está demás poner un alias para desconectarse si no tiene control sobre cuando estás o no conectado, dicho de otro modo no es una referencia válida lo que onga o deje de poner , tampoco estaría de más saber en que tiempo expira la sesión, al menos cuando recibas una llamada de teléfono o pares para comer, podrás saber si existe la posibilidad de que ya esté fuera y oportunamente guardar el mensaje 'por si las moscas...' . Pero vamos que en la época en que estamos esto es algo que debería ser automático, aunque ya se sabe que como dice el refrán: '...en casa del herrero... cuchillo de palo'
486
« en: Viernes 4 de Julio de 2008, 14:54 »
hola que tal,
intente traducir el metodo asi pero manda error
... dice que texbox es un tipo y no puede ser utilizado como exprecion cuando alguien dice 'traducir' nunca quiere decir literalmente, siempre hay que salvar las 'distancias' entre lenguajes. No hace mucho en otro lugar a uno le indiqué una función que usaba VarPTR y el tipo lo tradujo a VB 2005 literalmente, obvimanete no lo funcionó porque esa función no existe, sin embargo es plenamente traducible pués existe AddressOf, que es el equivalente. Veamos, tu caso es similar... traduces literalmente reúne todos los textbox en una misma función y todos los combobox en otra si aún quieres juntar diferentes tipos en una misma función puesdes usar 'id TypeOf(objeto) is 'objeto' luego... elseif typeOf... con lo cual discriminas posibles situaciones por ejemplo la propiedad imagen de un picturebox que no guarda relación con la propiedad text de un textbox o la propiedad item de un combo.... En el código presentado debes poner simplemente (corrige la línea con esto...) if sender.text = "" then throw new exception("El campo de " & sender.name & "no puede quedar vacío")
Nota que todos los textbox que deseas deben estar apuntados a dicho manejador.... al final del sub el 'Handles text1.validating, ....text45.validating, text46.validating ejemplo: Private Sub ValidarVariosTextos_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Textbox1.Validating, Handles Textbox2.Validating, Handles Textbox3.Validating ' el código anterior de verificación End Sub
487
« en: Viernes 4 de Julio de 2008, 14:37 »
Bueno nesesito un programa que recorra toda la computadora y busque una carpeta con un nobre en especifico, se como copiar el directorio, bueno en este caso la carpeta, pero no se como recorrer todos los directorios de la computadora, espero puedan ayudarme, de antemano grasias Usá el buscador del foro. Eso ya se respondió aunque ahora no lo encuentro. Si no lo encontrás mañana lo busco con mas tiempo.
cierto.... usa como criterio de búsqueda FileSystemObject 'FSO' con la collección files y folders de forma recursiva llegas hasta donde quieres si lo precisas también puedes usar la colección drives si no conoces la unidad donde debiera estar.
488
« en: Viernes 4 de Julio de 2008, 14:29 »
quiero es que en un TextBox introduzca varios numeros revueltos... con un boton los ordene Se puede clarificar mucho más... simplemente usa el textbox para introducir datos, y estos los pasas a un listbox mediante un botón de validación. al listbox le estableces su propiedad 'Sorted' a true, entonces cada vez que añadas un elemento automáticamente se introduce ordenadamente. El botón para ordenar por tanto no es necesario, sería en cambio preciso uno para validar y añadir el contenido del textbox al listbox, si se introduce (por ejemplo caso de que no quieras repetidos), luego borras el contenido del textbox. Si lo que indicas lo necesitas tal como dices para algo específico entonces explica ese algo no el reducto de la parte, ya que como se ve resulta absurdo.
489
« en: Domingo 29 de Junio de 2008, 18:54 »
Gracias por la respuesta, pero como lo creo, a ver si alguien tiene un manual o un ejemplo Bueno, al principio yo echaba de menos esa característica y encontré hasta 3 modos de solventarlo. Salvo en arrays muy grandes ya no suelo usarlo, esto es si tengo 4 controles que básicamente van a ejecutar la misma rutina y donde luego cada uno hace algo distinto al resto entonces no uso arrays porque no interesa. Para hacer eso mismo simplemente pon el primer control pulsa dobleclick sobre él y se abre la ventana de código si es el evento deseado donde antes ponías por ejemplo: Select case index case 0 case 1 case 2 end select
Ahora puedes poner: select case sender.tag case 0 case 1 case 2 end select
.... y los nuevos controles que debían ser del array simplemente selecciona en propiedades la ventana de 'eventos' si usaste click elige la misma rutina para ese control, ahora si vas al código verás que pone: private sub Button1_Click(....) handles.Button1.click , Handles.button2.click .... ' cada botón que enganches aparecerá aquí, sólo falta que asignes la propiedad tag a cada uno,
También puedes usar 'sender.name' en vez de usar el tag, o cualquier otra propiedad.... Si a pesar de todo sigues necesitando usar arrays me indicas y te pondría el código de un ejemplo, pero vamos para arrays de pocos controles no interesa esto es más rápido y no resulta más complejo.
490
« en: Domingo 29 de Junio de 2008, 17:33 »
Es difícil entender la forma en que sería posible fabricar bombas de destrucción masiva con el programa iTunes, por lo que Apple al parecer es demasiado optimista respecto de las capacidades de su software. Evidentemente ningún aparato informático fabrica una bomba ni un coche ni nada ya que eso es tarea de los brazos robotizados, pero hasta una simple calculadora puede ser usada como un temporizador de una bomba. Obviamente esos chicos de 'Freakonomics' también lo son de 'Tontonomics' al iTunes se le puede agregar perfectamente un programa para pilotar un avión o para controlar un minilaboratorio de fabricación de bombas, por supuesto que si. Posteriormente, se indica que iTunes no está diseñado para controlar centrales de energía nuclear, navegación aérea ni sistemas de comunicaciones, equipos de seguridad u otros implementos que pueden causar muerte, daños a personas o al medio ambiente o mal funcionamiento de programas informáticos. Cláusulas similares se pueden leer en las condiciones de uso de los sistemas Operativos de Microsoft, yo recuerdo haber leído íntegramente la licnecia de uso de Windows 3.0 (qué lejos en el tiempo  ) ponía cosas similares, ignoro si lo siguen poniendo porque desde entonces jamás he vuelto a leer otra licencia de Microsoft enteramente. Las cláusulas en realidad son para exclusión de responsabilidades, es como decir se te quemó el laboratorio ? ... mi licencia dice que no era adecuado para eso, no me cuentes historias ni me vengas reclamando ahora... Por otro lado cada uno es libre de ponder las condiciones que le salgan de las narices, como si uno quiere poner que su programa no debe usarse entre las 12 de la noche y las 6 de la madrugada o que nadie que se llame Óscar pueda usarlo...
491
« en: Domingo 29 de Junio de 2008, 17:05 »
No tiene mala pinta. El código no es muy clarificador, resulta nebuloso. Acostúmbrate a usar funciones y rutinas para separar el código de manipulación de la interfaz (botones, y demás) de lo que es la lóogica del programa en este caso del juego. No es posible separarlo totalmente pero usando una función puedes darle un nombre coherente y cuando decidas cambiar un botón por otro objeto para realizar la misma acción te quedará más claro. Siempre que puedas nombra tus variables con algo que tenga sentido al menos para ti.  Te mando un ejemplo de un ejecutable gráfico que acabo de realizar...  en otro momento (si a la gente le interesa y lo pide) las fuentes... debajo de la imagen se puede descargar el ejecutable:  debajo de la imagen se puede descargar el ejecutable:
492
« en: Lunes 23 de Junio de 2008, 23:19 »
493
« en: Domingo 22 de Junio de 2008, 21:32 »
Bueno reconozco que de entrada me siento 'algo perdido', pero es normal cuando hay un cambio, la mente dirige a su atención a donde esperas encontrar lo que había antes y que ahora de estar está en otro sitio o con otro nombre... un período de adaptación y listo...
... Que tal si lo llamamos 'Bit-Bit' y para abreviar BB ??. La cuestión es: juega algún papel especial, ó solo es una imagen asignada como logo de 'solocodigo'
494
« en: Sábado 21 de Junio de 2008, 01:37 »
En el mensaje anterior te puse todo el código, las modificaciones a realizar son mínimas. El siguiente código es una copia de una función que te puse en el mensaje anterior. Private Function Examinar_Puertos() puertos = Detectar_Puertos ' contiene la matriz de los 16 puertos con valores true-false (1-0) puertos = filtrar_Puertos ' filtramos para obtener sólo los true If puertos(0) <> 0 Then ' se podrían poner en un listbox para cambiar si un puerto arrojara problemas ' o si eso ocurre se podría volver a ejecutar nuevamente la rutina de detección de puertos MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente MSComm1.PortOpen = True 'MSComm1.Settings= ' establecemos las características que deseemos y qeu sean acorde a nuestro hardware ' otras acciones Else MsgBox "No se encontraron puertos disponibles" End If End Function
Entonces la parte a retocar es lo que hay dentro de la comprobación de la matriz: ' se añade esta línea list1..clear ' vaciamos el contenido previo If puertos(0) <> 0 Then '......... aquí van los cambios Else MsgBox "No se encontraron puertos disponibles" End If '......... se añade esta línea también commandConectar.enabled= false ' de entrada se desactiva hasta que se pulse en el listbox, (si es que hay alguno list1.enabled=list1.listcount<>-1 ' el listbox sólo debe estar activado si tiene contenido.
Lo que hay que hacer es poner un bucle que introduzca los puertos de la matriz en el listbox. for k=0 to ubound(puertos) list1.additem(puertos(k)) ' se añaden al listbox next
El cambio que hemos hecho hasta el momento, es llenar el listbox. El código que antes había donde se ha insertado éste es el código que se debe poner en el evento click del botón 'conectar al puerto seleccionado'. El puerto seleccionado será el que esté seleccionado en el listbox, de entrada quedamos sería más correcto dejar el botón desactivado y sólo activarlo en caso de que se seleccione uno en el listbox, esto implica que si no hubiera puertos disponibles el listbox estaría vacío y por tanto no se podría pulsar el botón de 'conectar usando el puerto seleccionado', porque no hay ninguno disponible. en el evento click del listbox: commandConectar.enabled= (list1.listindex<> -1)
y finalmente en el evento click del botón para conectar, se coloca lo que hemos sacado del condicional anterior alterando para usar el puerto seleccionado en el listbox: ' esta línea es la que era antes, ahora la modificamos para que tome la selección del listbox 'MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente '.....esta línea siguiente se usa sólo para comprobación, quitar cuando verifiques que funciona bien dim usar as vbmsgboxresult usar = msgbox ("Seguro que quiere usar el puerto Nº -" & list1.list(list1.listindex) & "- ? ", vbyesno, "Que puero libre usamos...") if usar= vbno then exit sub ' esta es la línea modificada MSComm1.CommPort = list1.list(list1.listindex) MSComm1.PortOpen = True 'MSComm1.Settings= ' establecemos las características que deseemos y quu sean acorde a nuestro hardware ' otras acciones ' una vez usado el puerto deseado hay que desactivar el listbox y el botón, o no según convenga de acuerdo a lo que vayas a hacer.... Si vas a tal sitio y has decidido usar la carretera norte, las demás deben quedar desactivadas o puede ocurrir que te pierdas.... por la confusión.... list1.enabled=false ' cuando se haga un chequeo de puertos el listbox se activa si hay puertos diponibles. commandConectar.enabled=false
En verdad todo esto es muy sencillo, así no entiendo como puedes entregar un proyecto sin conocer estas simplezas. Si no sabes resolver esto, creo que no mereces lo que sea que esperas obtener al entregar dicho proyecto. Pués que pasará cuando realmente surja algo realmente complejo ???
495
« en: Viernes 20 de Junio de 2008, 22:18 »
Hay algunos detalles que he dejado sueltos...
Por ejemplo es deseable que el color elegido al azar no esté repetido, por lo que tendrás que comprobarlo con cada elección eso es tarea tuya.
En casi todo he usado un índica basado en 0 así 'lineaActiva' también debería ser 0 de entrada ya que hasta que no se llegue a las celda 4 no será la línea 1 de acuerdo a la fórmula usada 'lineaactiva= celda \ 4'.
No incluí una comprobación de final de juego si el jugador completa todas las líneas sin acertar. Tu deberías saber donde debe ponerse, así que queda a tu trabajo.
Fíjate que he dejado abierto la posibilidad de que puedas referirte a la matriz de solución tanto por su color como por el índice que ocupa en la fila de donde el jugador selecciona las 'bolas', en el código esto se 've' mezclado, para forzarte a pensar y descubrir que falla, por tanto antes de empezar si lo piensas bien deberías elegir cual, para hacer la lógica acorde a esa eleccción.
Si te animas pon el resultado final que veamos como te quedó...
496
« en: Jueves 19 de Junio de 2008, 21:49 »
No había vuelto a ver el hilo... O sea, como tienes pereza de leer quieres que yo te haga un tutorial jajaja... no, no me da pereza leer. Sólo me da pereza si es en inglés y son cuestiones técnicas ya que es frecuente que aparezcan términos que uno no sabe traducir (lo que ocurre con una tecnología emergente) y desviar la lectura contínuamente para investigar los términos produce bastante distracción y se avanza poco. porque supones que yo si tengo tiempo y no soy peresozo... Bueno no he supuesto que tengas tiempo ni si eres perezoso o no. Más bien mi supuesto es que hacer un tutorial por alguien que pueda conocer algo con cierto detalle es más asequible que a alguien que sólo tiene ideas dispersas al respecto. Gracias por los links en español, en su momento aún no lo habían traducido, aunque debí seguir mirando cada cierto tiempo...
497
« en: Jueves 19 de Junio de 2008, 01:56 »
Espero que de ahora en adelante tengas 3 o 4 copias y una al menos en un soporte externo exclusivamente para eso.
Intenta con anakrino...
498
« en: Jueves 19 de Junio de 2008, 00:24 »
Son de Raticulín al lado del planeta Ganímedes.... como todo el mundo sabe.
499
« en: Miércoles 18 de Junio de 2008, 11:37 »
Eres tu quien no me ha comprendido a mi.. Te he nombrado portavoz para que dirijas mis palabras al blog de donde sacaste el contenido... reléeme sobretodo al final, que te nombre a ti en vez de al primo avelino es la parte concordante uséase donde pone tu nombre tu debes traducirle el suyo capiscas...???
500
« en: Miércoles 18 de Junio de 2008, 11:06 »
A ver, recuerda que aquí no se hacen tareas. Expones dudas y se te orienta. No se exactamente cual es tu problema, creía que era que no entendías el código anterior, ahora pones el formulario pero no reflejas cuales son las dudas que tienes ... no cnoces las reglas del juego?. En fin más bien creo que no sabes por donde empezar.Entonces te explico someramente como proceder pero el trabajo de programarlo será tuyo. Veamos: De entrada podrías usar colores en vez de números, basta que pintes 10 colores, por ejemplo 10 controles label(label1(0) ... label1(9)) y le das color de fondo distinto y que la 'banca' elija al azar 4 de ellos . Algo así: public function Barajar_JugadaBanca() as integer() dim colores(0 to 3) as integer randomice timer ' activamos aleatorio usando como semilla el timer for k= 0 to 3 colores(k)= int(10 * (rnd +1) 'tomamos una bola al azar, no nos importa el color sólo la posición en la matriz next Barajar_JugadaBanca=colores end function
Luego de tener la jugada guardada, le cedes el turno al jugador 'destapando' las celdillas y activando las bolas. las bolas son controles label (o controles image o picture) . Inicias el contador de oportunidades del jugador (un bucle va bien si tiene 10 jugadas pues eso ). Cuando pulse en el control que contiene un color capturas el color del fondo colorElegido= label1(index).backcolor ' colorelegido es un long luego esperas que pulse en la línea de controles, las celdillas son una matriz de dos dimensiones public type infoCeldas celda as long ' contedrá el color usado as boolean ' para marcar que se ha colocado bola en ella end type ' será 0 to 9, 0 to 3 pero eso cuando se redimensiones el array dim celdas() as infoceldas
Cuando el usuario pulse en la línea activa (para indicar la línea activa ponle un shape rodeando las 4 celdas en que debe depositar sus bolas. Las celdas como controles son tambien label pero con fondo blanco de entrada. necesitarás 40, dim lineaActiva as integer ' indica que línea sería la activa, al iniciar una partida su valor se pone a 1 lineaActiva=1
en el evento click delos 'labelCeldas' compruebas si se pulsó en la línea activa dim lineaJugador as integer dim posicionLinea as integer lineaJugador= index\4 ' por ejemplo si era la 18 = línea 4 if lineaJugador= lineaActiva then ' posicionLinea = index mod 4 ' por ejemplo si pulsó en la celda 18 será la 2ª en la línea if celdas(lineaJugador,posicionlinea).usado=false then ' depositamos el color elegido labelcelda(index).backcolor=colorelegido celdas(lineaJugador,posicionlinea).usado=true ' la marcamos como usada celdas(lineaJugador,posicionlinea).color=colorElegido ' para comprobar color posteriormente for k=0 to 3 ' comprobamos si la línea está completa if celdas(lineaactiva,k).usado=false then exit sub ' si hay alguna sin marcar se sale, a la espera de que esté completo, entonces el bucle finaliza sin salir y se ejecuta el código que le sigue next if comprobar_Linea=true then ' acertó , se notifica al jugador, juego termina else lineaActiva=lineaActiva +1 ' desplazamos el shape a la siguiente línea end if else beep ' esa posición ya está ocupada end if else beep ' la línea no es la activa end if
comprobar_Linea es una función que compara la matriz por pareja de índices en un bucle entre 0 y 3 entre la matriz que contiene los colores ocultos que elegimos aleatoriamente y la matriz celdas(lineaActiva, ...)... esta función a su vez marca cada acierto o fallo al lado con unos form1.line(x1,y1)-(x2,y2), monoColor, BF (monoColor debería ser blanco o negro (vbBlack ó vbWhite) en función de si acertó o falló. Como el que debe pensar es el jugador aquí no hay que diseñar estrategia para resolverlo, te limitas a: crear función Iniciar_Partida donde pones todas las celdas del jugador en blanco haces un form1.cls para borrar los cuadraditos de fallo o acierto sobre las líneas. iniciar partida se invoca desde un botón que se activa cuando la partida termina y cuando se abre el programa, iniciar partida también borra la matriz celdas, redim celdas(0 to 9, 0 to 3), toma la matriz aleatoria de colores (usando índices o el color eso a tu gusto) se deshabilita el botón a sí mismo y antes de salir de dicho evento se le pasa al turno al jugador... Vamos ya lo tienes mascado...
Páginas: 1 ... 18 19 [20] 21 22 ... 29
|
|
|