• Lunes 12 de Mayo de 2025, 19:42

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 ... 23 24 [25] 26 27 ... 29
601
Inteligencia Artificial / Re: Mejorar Algoritmo A*
« en: Miércoles 23 de Abril de 2008, 00:04 »
Evidentemente si no ve las cintas más que aun paso de distancia la cosa no promete.

En ese caso lo que se debe hacer es buscar un algoritmo que garantice el mayor éxito posible para encontrar cintas en el camino. Esto es debes garantizar una trayectoria en línea recta desde el origen hacia el destino, en el caso que presentas, describiría una diagonal y además encontraría la cinta. Si no encuentra una cinta seguirá tardando el mismo costo que el otro camino que te describe, la línea recta lo que verifica es la posibilidad de que en su camino directo esté una cinta.

el algoritmo sería un avance vertical y un avance horizontal mientra no vea cinta así :

Código: Text
  1.  
  2.  
  3. funcion determinar_ruta
  4.     pasosV= (y.destino - Y.origen) 'pasos verticales hacia destino
  5.     pasosH= (X.destino - X.origen) ' pasos horizontales hasta destino.
  6.  
  7.     si pasosV > pasosH luego
  8.        avH=1' avance horizontal= 1
  9.        avV= pasosV / pasosH  ' avance vertical
  10.     en otro caso
  11.        avV=1                       ' avance vertical = 1
  12.        avH= pasosH / pasosV
  13.     fin si
  14. fin determinar_ruta
  15.  
  16. funcion avanzar_ficha
  17.   meta=false
  18.   cinta=false
  19. hacer
  20.     si avH = 1 luego
  21.          iterar  1 hasta avV
  22.              avanzar vertical ' 1 unidad
  23.              cinta= comprobar_Haycinta  ' se hace una llamada a esa función
  24.              meta= comprobar_Meta  ' comprueba si llegó a la meta  
  25.              si (cinta=true)  o (meta = true) salir de iterar
  26.          fin iterar
  27.          si meta= false luego
  28.              avanzar horizontal ' 1 unidad  
  29.              llamada a comprobar_Haycinta  
  30.              meta= comprobar_Meta  ' comprueba si llegó a la meta  
  31.          fin si
  32.     en otro caso
  33.          iterar  1 hasta avH
  34.              avanzar horizontal ' 1 unidad
  35.              cinta= comprobar_Haycinta  ' se hace una llamada a esa función
  36.              meta= comprobar_Meta  ' comprueba si llegó a la meta  
  37.              si (cinta=true)  o (meta = true) salir de iterar
  38.          fin iterar
  39.          si meta= false luego
  40.               avanzar vertical ' 1 unidad  
  41.               llamada a comprobar_Haycinta  
  42.              meta= comprobar_Meta  ' comprueba si llegó a la meta  
  43.          fin si
  44.     fin si
  45.     
  46. repetir mientras meta=false  ' (no encuentre final )
  47.  fin avanzar_ficha
  48.  
  49. funcion comprobar_Haycinta
  50.     si se detecta cinta
  51.            llamada a avanzar_desdeCinta
  52.            llamada a determinar_ruta  ' actualiza según nueva posición
  53.            devolver true
  54.      fin si
  55. fin funcion
  56.  
  57. funcion comprobar_Meta
  58.     si llegó a la meta luego
  59.         devolver true
  60.     fin si
  61. fin funcion
  62.  
  63.  

Naturalmente avanzar horizontal y vertical será si puede avanzar, puesto que es posible que alcance un tope antes de lograr la meta... eso ya lo dejo a tu entretenimiento

Para hacer un algorimo más eficiente sería necesarios saber más detalles ¿ las cintas se colocan aleatoriamente ?, ¿ existen más cintas de solo 1 ?, ¿ se pueden mover ?, también si una cinta retrocede... o te aleja más que donde estabas y como comentas si es posible variar su tamaño.

El algortimo presentado se basa en la estadística del problema matemático si lanzamos una aguja al aire y tenemos 1 línea trazada en el suelo que posiblidad hay que quede atravesando la línea...

602
Inteligencia Artificial / Re: Desarrollo De Un Ajedrez
« en: Martes 22 de Abril de 2008, 23:11 »
Efectivamente dotar de inteligencia artificial a tu juego te va a ser complicado.

Sin enmbargo tu primera meta debe ser más que inteligente, que no sea tonto, te explico un poco por encima...

Después de cada movimiento del adversario debes comprobar que la reina-máquina y el rey-máquina estén protegidos, revisando si a uno, 2 o x movimientos secolocaría el adversario en jaque y no pudieras remediarlo... la x debe primeramente ser un número finito y corto o sería muy muy lento cada movimiento...

Antes de mover, procede ahora a la inversa, sería el mismo algoritmo, pero con 1 diferencia y un añadido. Cambian los adversarios y los atacantes. El añadido sería que después de esa comprobación habría que decidir que ficha mover...

De entrada experimenta con dejarle caer en una trampa y que mueva a la trampa (aprovechar el movimiento hacia la ficha más vulnerable) luego de practicar tu mismo con el juego podrás encontrar mejor como evitar caer en una trampa a base de analizar el movimiento hacia la ficha más vulnerable.

Qué ficha mover ???... No lo pongas aleatorio, sería tonto, no inteligente, tampoco eches una ficha adelante, atrás, adelante.. también sería tonto... al menos practica un algoritmo de confusión que no permita al adeversario cual es la táctica empleada...

Puedes en determinadas situaciones tener una pequeña base de datos de 'jugadas resueltas' especialmente cuando sólo hay pocas fichas en el tablero... esto te ayudará a rematar un juego que ha evolucionado bién. Estos pasos por tanto no serían inteligentes sino pasos fijos porque se conoce que la meta sigue justo ese camino establecido.

Por último examina y crea una base de datos de jugadas que no marcó buenas y salieron mal, para no repetirlas, igualmente con las que salieron bién para repetirlas.

Aparte te sería de gran ayuda para simplificar las reglas, dividir las fichas en 2 grupos, fichas de poder y fichas con escaso poder (peones), y cada uno de esos grupos divídelos aún en 2 están implicadas en la jugada actual y los que no están implicados en la jugada actual. Por ejemplo al inicio de la jugada la torre no tiene acceso a jugadas porque está bloqueado por el peón y el alfil, y mientras no se liberen tales piezas seguirá sin estar implicado en una jugada, siempre que la torre enemiga no tenga otra ficha suya delante, esa torre no entra en el juego... Esto te permitirá restringir el diseño de movimientos al no ser necesario analizar posibilidades con fichas que no entran en la jugada actual... naturalmente esto es relativo ya que si quieres analaizar posibilidades a x movimientos hacia adelante, las posiblidades se multiplican y todas las fichas entrarían en juego, sin embargo para empezar no te compliques por caminos que no sabrías a priori resolver.

Luego podrás ir mejorándolo poco a poco... los de IBM (big-blue) también lo van mejorando poco a poco ...

Saludos...

603
Ingeniería del Software / Re: Herramienta
« en: Martes 22 de Abril de 2008, 22:48 »
Si habías hecho una pregunta antes, porqué no sigues preguntando allí ?. Yo no sé que decías allí y obviamente no voy a perder tiempo buscando...

Se más consecuente, no dando al candidato a responderte más trabajo del necesario.

604
Diseño de Algoritmos / Re: Reduccion De Condicionales Anidados
« en: Martes 22 de Abril de 2008, 22:42 »
El método es un árbol de decisiones.

El dseño del mismo deber ser tal que si el resultado de uno afecta al resto el código ha de ser expuesto en rutinas para no tener un código excesivamente largo y difícil de seguir, cada análisis de un condicionante ogrupo una sóla rutina. Procediendo de este modo puedes ir despejando la maraña.

Debes tener cuidado con un nivel muy profundo de recursividad, podría agotar el tamaño de la pila...

Saludos.

605
Diseño de Algoritmos / Re: Diseno Modular?
« en: Martes 22 de Abril de 2008, 22:12 »
Una programación en 'top-down' es solo una especificación de diseño, es decir de resolución de un problema. a partir de un problema dado se analiza y se va descomponiendo el problema en tareas, luego cada una de esas tareas se subdivide nuevamente en otras más pequeñas.

El diseño con módulos sería parecido pero con un enfoque distinto, tu creas pequeños módulos o rutinas que solucionan un caso particular (o varios) y con ello acabas reuniendo una 'librería' sobre el tema, luego a la hora de programar vas llamando a las rutinas apiladas en los módulos.

La diferencia principal como ves es que en el diseño top-down, vas creando todo el código a medida que surje su necesidad y normalmente todo el código está embebido en el programa, en el diseño modular se trata de generar todas las posibles rutinas necesarias para solucionar todo el rango de posibilidades, antes incluso de crear programas y luego cuando se hace un programa hacer llamadas a dichos rutinas según se necesite. En este caso las rutinas suelen dejarse en ficheros aparte, librerías, que los programas comparten y llaman individualmente.

Pero fíjate que ambos modelos pueden coexistir juntos, en ese caso las llamadas a las rutinas de los módulos se harían en el nivel más bajo alcanzado en el top-down.

Llevando al extremo el modelo modular, las rutinas se diseñan para que unas se llamen a otras más privadas y realizar acciones de 'más alto nivel', por ejemplo supongamos que queremos hacer un mundo 3D... hemos hecho un diseño top-down... en el último detalle nos toca dibujar un punto... por otro lado hemos construído una librería 3D y tenemos una función llamada dibujar_Punto(x,y) , si procedemos con modularidad en ese sentido más purista, no necesitaríamos llamar a esa función dibujar_punto(x,y) sino por ejemplo tendríamos una rutina llamada dibujar_Objeto(objeto) esta rutina toma el objeto y luego examina sus polígonos, los puntos de cada polígono, la rotación ejercida, el desplazamiento, la textura, etc... todas estas rutinas serían más priovadas y no accederíamos a ellas, de ese modo se consigue una mayor velocidad en la programación al no tener que programar hasta el nivel más bajo en el diseño top-down, éste acabaría justo donde empieza nuestro sistema modular...

Si te das cuenta entonces la programación modular va de abajo arriba ... justo al revés que el top-down...
No sé si te habré liado o si logras captar el sentido....

606
VB .NET / Re: Alquien Ha Trabajado Con Gdtwain ?
« en: Martes 22 de Abril de 2008, 21:39 »
Lo que has conseguido es una barbaridad...

Meter imágenes en una base de datos es una pérdida de feciciencia de la base de datos... mete 1000 imágenes en la base de datos y luego haz un backup, comprenderás lo que te digo...

Lo adecuado es guardar las imágenes en una carpeta y luego en sql lo que guardas es el nombre y la ruta, si necsitas que las imágenes sean privadas y el acceso adonde están no es restringido, puedes o codificarlo y guardar en la base de datos la clave o comprimir los archivo (por ejemplo en rar) y asignar una sola clave al rar...

Tal vez si sólo vas a guardar un puñado de iconos tendría un pase....

saludos

607
VB .NET / Re: Detectar Tonos De Los Pixeles
« en: Martes 22 de Abril de 2008, 21:30 »
Es acorde que el que preguna ponga el código que ha conseguido para ver donde falla y guiarle desde ahí, pero no se hacen tareas, las debes hacer tú.

608
Opino como hamdicam, si ya todo estuviera inventado nadie debería programar más, empezando por las grandes empresas...

La competencia de los 'pequeños' programadores frente a las grandes empresas, es claro... yo puedo hacer un programa personalizado a cualquiera que me lo solicite, una empresa multinacional no puede hacer eso... no puede hacer un programa al señor x que tenga las características que el señor x quiere, si lo hacen le pedirán n millones y el señor x les mandará a tomar por el culo.

Ahora es mejor el program de la gran compañía que el programa que ha hecho un pequeño programador al señor x ? pués si y no... seguro que aquel software tiene cientos de opciones y funciones, pero que el señor x jamás va a usar... ni el señor t ni el señor v ni nadie... así de claro, además antes de que arranque el megafassiónprogramazo de la superempresa KaKa nuestro programas ya han terminado la tarea encomendada... ¿ cómo, qué ?, pués eso que los programas comerciales se pierden en cientos de comprobaciones, nuestro programas van al grano arrancan ipso facto y no tiene nada de sobra..

Eso por no hablar los chorrocientos Mb. de memoria que consumen esos programas para luego abrir un fichero ver la primera página y darte cuanta que te equivocaste de documento... pero has esperado 10-20 sg. hasta que el programa se ha abierto y te ha cargado en memoria 100-300Mb.

Un ejemplo, coge la calculadora de windows... (que ya está inventada desde hace muuuuchos años) escribe una cifra larga, supongamos que te has olvidado de meter una cifra en medio, o que la has puesto pero no es la que toca, hay que cambiarla... trata de cambiarla y dime si no es posible hacer una calculadora que permita hacer eso tan fácil como meter una cifra más... pués como ese ejemplo estñan llenos todos los programas de las requeteempresas comerciales.

609
Visual Basic 6.0 e inferiores / Re: Sustituir Un Caracter Por Otro Del Alfabeto
« en: Martes 22 de Abril de 2008, 20:43 »
Cita de: "fantasma_85"

entonces pase parte de esto a Visual...
Código: Text
  1.  
  2. [color=blue]
  3. Dim cadena
  4. Dim X
  5. Private Sub Command1_Click()
  6.    cadena= txt1.text
  7.    X = Len(cadena)
  8.    For I = 1 To X
  9.        if ((I+3) Mod 27) then
  10.          cifra = cifra & Mid(cadena,I,1)
  11.       End If
  12.    Next I
  13.    tct2.text = cifra
  14. End Function[/color]
  15.  
  16.  

Al primcipio leo la cadena y me da cuantos caracteres tengo, meto despues un for, pero al hacer la operacion (sumatle al caracter 3 posiciones mas del alfabeto, y sacarle el mod para saber que letra la sustituira, no la hace) esa es mi duda.
 
Efectivamente como te dice Sagutxo...

Cometes varios errores, por un lado  en considerar que los valores de las teclas van de 0 a 27.... la "A" empiueza en la posición 65, otro error es que no tomas el valor numérico de la letra para luego sumarle 3, y finalmente que lo metes dentro del condicional del 'mod' ... el bucle 'for' que tienes sería algo como:

Código: Text
  1.  
  2.    dim letra as string  ' la letra tomada
  3.    dim p as byte   ' valor numérico de una letra
  4.    dim nCadena as string  'nueva cadena que se va originando
  5.    for I = 1 to X
  6.         letra= mid$(cadena,I,1)
  7.         p=asc(letra)
  8.         if p > 87 then ' 88=X
  9.             p=65 + (p mod 87)
  10.        else
  11.            p= p +3
  12.        end if
  13.       nCadena = nCadena & chr$(p)
  14.    next
  15.  
  16.  

Sustituye tu bucle por este y te valdría .... es una alternativa al código que te expuso Sagutxo...

Saludos.

610
C# / Re: Problemas Con Tamaño De Fuente
« en: Martes 22 de Abril de 2008, 20:22 »
A mi pasaba algo parecido...

al tener la resolución a 1600 * 1200 el texto me aparecía muy pequeño entonces loaumené a 120 también, el caso esque al diseñar los formularios se veían bien, luego al llevarlo al ordenador de otra persona cuyo tamaño de fuente lo tenía en el estilo por defecto los textos se desajustaban.

La solución que yo encontré fue acceder a las propiedades del sistema (desde la API) al arrancar el programa y ver que tamaño tenía por fecto, y en función deso escalar todos los objetos que contienen texto.... yo programo en VB pero el caso es el mismo...

en pseudocódigo sería algo como
Código: Text
  1. si localsetting.fontsize <> miFontSize luego
  2.     factorE= localsetting.fontsize / miFontSize
  3.      por cada control con la propiedad texto en el formulario luego
  4.           control.fontsize= control.fontsize * factorE
  5.      siguiente
  6. fin si
  7.  

611
Visual Basic 6.0 e inferiores / Re: Formulario Pantalla Completa
« en: Martes 22 de Abril de 2008, 20:08 »
Yo tampoco sé nada de 'gambas' pero me temos que esa solución puede no ser la más adecuada, me explico...

Si acedes a un formulario, se accede de una de 2 formas, en VB se llama 'Modal' y quiere decir que si abres un formulario en forma modal hasta que no lo cierres no puedes volver a la siguiente línea de código que abrió éste, es decir espera que lo cierres, esto se usa normalmente en los diálogos con el usuario, por ejemplo cuando esperas que elija el nombre y ruta de un fichero que lñuego vas a abrir, o un color que luego vas a asignar a algo... Si ese es tu caso, el código que opusiste sería correcto, pero..

Hay veces en que necesitas tener 2 o más formularios abiertos a la vez, en ese caso no es válido que tengas que cerrar el otro para acceder al primero sino que debes poder alternar libremente entre ellos. cuando cierra un formulario normalmente (según el lenguaje) su código se descarga de memoria, por tanto las variables pierden sus valores, por eso no es aceptable cerrar un formulario para ver otro. en visual Basic aparte de cerrarlo puede simplemente ocultarse (no aparece gráficamente pero siguen en memoria) en tu código has hecho eso precisamente con finicio, lo has vuelto visible, pero Falumbrado lo has cerrado.

Aunque sea gambas, todos los lenguajes tienen una estructura lógica que suele ser muy similar.

Saludos.

612
Visual Basic 6.0 e inferiores / Re: Error "procedimiento Largo" Vb 6.0
« en: Martes 22 de Abril de 2008, 19:50 »
Habrás solucionado tu problema pero al final nadie te ha explicado otra que has pedido crear subprocedimientos... ya te lo explico yo...

Sea que tienes un código de 40.000 líneas o las que sean ejemplo:
Código: Text
  1.  
  2.   public sub elProcedimiento()
  3.       codigo linea 1
  4.       codigo linea 2
  5.         .
  6.         .
  7.         .
  8.      codigo linea 39999
  9.      codigo linea 40000
  10.   end sub
  11.  
  12.  

pués se trata de añadir un módulo (menú proyecto añadir módulo) o más...
y hacer algo como esto:
Código: Text
  1.  
  2.   public sub elProcedimiento()  'esto sería la función inicial
  3.       call codigo1_10000
  4.       call codigo10001_20000
  5.       call codigo20001_30000
  6.       call codigo30001_40000
  7.   end sub
  8.  
  9. ' este otro código iría en el módulo añadido
  10.   public sub codigo1_10000
  11.       codigo linea 1
  12.       codigo linea 2
  13.         .
  14.         .
  15.         .
  16.      codigo linea 9999
  17.      codigo linea 10000
  18.   end sub
  19.   public sub codigo10001_20000
  20.        codigo linea 10001
  21.        codigo linea 10002
  22.         .
  23.         .
  24.         .
  25.      codigo linea 19999
  26.      codigo linea 20000
  27.   end sub
  28.   public sub codigo20001_30000
  29.         ....
  30.   end sub
  31.   public sub codigo30001_40000
  32.       .... ídem
  33.   end sub
  34.  
  35.  

Como ves hemos dividido el código en 4 rutinas con nombre sin significado alguno, a fin de que te quede más claro...

Lo lógico no es partir el código arbitrariamente por cualquier línea, sino hacerlo por 'tareas'... supongamos que tu código varias veces toma una cadena, busca algo en ella y si lo encuentra lo remplaza por otra, pués esa funcionalidad es una tarea específica que puede ser despejada a un módulo como una función, que por ejemplo podría llamarse remplazar_Cadena  ahora revisando todo tu código cada vez que hagas esa dentro de ella deberías sustituirlo por algo como lo siguiente:
Código: Text
  1.  
  2.     call remplazar_Cadena(cadenaOriginal, CadenaABuscar, ramplazo)
  3.  
  4.  
Naturalmente antes habría que haber trasladado el código  que hace esa tarea al módulo que sería algo como esto:
Código: Text
  1.  
  2.    public sub remplazar_Cadena(byref cadenaOrigen as string, buscar as string, remplazarCon as string)
  3.        código que busca la cadena y lo remplaza...
  4.    end sub
  5.  
  6.  

Cuando trabajas en un módulo se debe tener en cuenta el ámbito de las variables, esto es el 'alcance'. todas las variables de una función son reconocidas dentro de la función, pero una variable que es 'local' a una función no es accesible desde otra función, cuando se necesita disponer de variables accesibles desde diferentes funciones, hay que declaralas públicas en un módulo algo así como
Código: Text
  1.  
  2.    public estaVariable as integer
  3.    public otraVariable as string
  4.    public unaMatriz() as byte
  5.  
  6.  


Estas variables así declaradas en un módulo estarán disponibles en el formulario y por tanto podrás usarlas en todas las funciones..
Cuando sales de una función, todas las variables declaradas dentro de la función son borradas, al acceder nuevamente a la función las variables son nuevamente creadas, con el valor que les des, si no les das valor tomarán el que les es propio por fecto (0 para las numéricas, "" para los strings, etc..). entonces si quieres que una función 'recuerde' una variable entre llamadas, esto es que no la borre al salir de la función hay que declararla como Static, ejemplo:
Código: Text
  1.  
  2.     ' este ejemplo siempre la variable acumulador pierde su valor
  3.     public function Sumar( valor as integer) as long
  4.         dim acumulador as long   ' cada vez que entre acumulador vale 0
  5.       
  6.         acumulador=acumulador  + valor
  7.         sumar=acumulador 'cuando salga acumulador dejará de existir
  8.   end function
  9.  
  10.   ' en este ejemplo la variable acumulador guarda su valor..
  11.    public function Sumar( valor as integer) as long
  12.         static acumulador as long   ' cada vez que entre acumulador vale lo que valía la última vez que se salió
  13.       
  14.         acumulador=acumulador  + valor
  15.         sumar=acumulador 'cuando salga acumulador seguirá existiendo
  16.   end function
  17.  
  18.  

por último indicarte que desde un módulo para acceder a los controles situados en el formulario, deberás indicar además del nombre del control también el nombre del formulario, de otro modo no lo reconocerá, ejemplo: si tenía text1.text="Mi casa" desde un módulo tendrás que indicarlo así: Form1.text1.text="Mi casa" (form1 es el nombre que le hayas dado al formulario). Si tienes que usar muchas veces 'form1' en vez de usarlo cada vez puedes abreviarlo así:
Código: Text
  1.  
  2.     public sub Sumar(valor as integer)
  3.        static acumulador as long
  4.         with form1
  5.               .text1.text= acumulador + valor
  6.               .command1.enabled=true
  7.         end with
  8.     end sub
  9.  
  10.  

observa que se escribe with nombreDelFormulario y se cierra con un 'end nombredelformulario' y nota que cada control referenciado lleva delante de su nombre un punto.

Saludos.

613
Visual Basic 6.0 e inferiores / Re: Tengo Un Programa Y No Logro Descifralo
« en: Martes 22 de Abril de 2008, 19:06 »
Cita de: "Jamaicol"
A ver que no me explicado bien, si ejecutais el programa, vereis que tiene una letra predeterminada y un tamaño de fuente tambien predeterminado, pero el ancho de cada una de las lineas que se va escribiendo, es decir que las lineas tienen un ancho que viene determinado por una variable o bucle que no localizo lo unico que se es que es en cm y que son aproximandamente 7 con algo aunque no estoy muy seguro, o sea que no hay contador de letras ni palabras que haga saltar de una linea a otra cuando llega a un determinado punto, lo que quiero saber es, en el codigo donde hace referencia a esa variable o que bucle gestiona que me salte de linea a la siguiente. Esa es mi pregunta.
Un poco tarde, pero seguro que alguien más necesita saber lo que preguntas...

Veamos, el largo de una línea de texto viene limitado por visual basic, en la versión 6.0 creo recordar que era de 65536 caracteres...

Entonces para saber la longitud de un línea hacen falta dos cosas saber el número de caracteres que lo componen con la instrucción Len(cadenaDeTexto) y multiplicándolo por el factor de tamaño de letra, esto lo controla la propiedad textHeight(caracter), ahora bién esto sólo funciona correctamente si la fuente es 'monoespaciada'  esto es, si todos los caracteres tienen el mismo ancho. Si no es el caso (que es lo normal) entonces, efectivamente hay que hacer un bucle para determinar el largo total de la cadena, tomando uno a uno los caracteres... Se pone el código para ambos casos.

Caso 1: fuente monoespaciada:
Código: Text
  1.  
  2.  public function largo_Cadena(cadena as string) as long
  3.        largo_Cadena= len(cadena) * textwidth("W")
  4.  end function
  5.  
  6.  

Caso 2: fuentes no monoespaciadas
Código: Text
  1.  
  2.  public function largo_Cadena(cadena as string) as long
  3.       dim tam as long
  4.       for n=1 to len(cadena)
  5.           tam=tam + textwidth(mid$(cadena,n,1))
  6.       next n
  7.       largo_Cadena= tam
  8.  end function
  9.  
  10.  
  11.  

Por tanto si quieres dar formato de tamaño a una línea, puedes usar la 2ª función como base y modificarla. Por ejemplo sea que quieres que el largo de las líneas no superen un tamaño específico de unidades...  entonces se envía la 'cadena' desde la que se tomarán los caracteres, se proporciona un puntero de avance que varía a medida que se va leyendo la cadena, cuando entremos una cadena nueva deberíamos poner el puntero a -1 desde nPosicion, largo indica el tamaño que queremos que no sobrepase, la función nos devuelve una cadena emepezando por el carácter que indica puntero con tantos caracteres como de largo no superen el 'largo' indicado.

Código: Text
  1.  
  2.   public function setLargo_Cadena(cadena as string, largo as long, optional nPosicion as long=-1) as string
  3.       dim tam as long
  4.       static puntero as long
  5.  
  6.       if nPosicion=-1 then
  7.             puntero=1
  8.       else
  9.            if puntero=len(cadena) then
  10.                 setLargo_Cadena= vbcrlf
  11.                 puntero=1
  12.                 exit function
  13.            end if
  14.       end if
  15.       for n=puntero to len(cadena)
  16.           tam=tam + textwidth(mid$(cadena,n,1))
  17.           if tam>largo then exit for
  18.       next n
  19.       largo_Cadena= mid$(cadena,n-1,puntero)
  20.       puntero=n
  21.  end function
  22.  
  23.  

Para apoyar a esta función se debería usar otra que haría las veces de iterador que iría despedazando la cadena original en trozos de cadenas del tamaño que hemos ido especificando. El código podría ser más o menos así:

Código: Text
  1.  
  2.   public function dividir_CadenasSegunTamaño(cadena as string) as string()
  3.       dim s as string
  4.       dim cad() as string
  5.      dim t as long
  6.       dim largos(0 to 9)
  7.       largos=set_Largos
  8.       redim cad(0 to 65535) as string
  9.       do  while s<>vbcrlf
  10.            s= setLargo_Cadena(cadena,largos(t mod 9))
  11.            cad(t)=s
  12.            t=t +1
  13.       loop
  14.       redim preserve cad(0 to t)
  15.       dividir_CadenasSegunTamaño=cad
  16.   end function
  17.   
  18. ' entrega una matriz de tamaños...
  19.   private function set_Largos() as long
  20.       dim lg(0 to 8)
  21.       lg(0)= 120 : lg(1)= 140 : lg(2)= 160
  22.       lg(3)= 180 : lg(4)= 200 : lg(5)= 220
  23.       lg(6)= 240 : lg(7)= 260 : lg(8)= 280
  24.       Largos=lg
  25.   end function
  26.  
  27.  

Si se le pasa una cadena suficientemente larga irá creando cadenas de diferentes largos (como se especificó en 'lg'.

Otra cosa a tener en cuenta es que el tamaño deberá ser consecuente con el tamaño de la fuente, es decir si tomamos un tamaño de fuente muy grande y el largo solicitado es menor que el de un carácter nos devolvería una cadena vacía, y entraríamos en un bucle infinito (en el código expuesto no entraría en bucle infinito sino que al llegar daría error al llegar al límite superior de un long de la variable 't'). Remediar esta situación así como proveer palabras enteras en cada línea se deja como ejercicio para el interesado.

Por último decir que el control richtextbox, provee mucha funcionalidad de modo que ahorrará mucho trabajo si os acostumbrais a usarlo y a conocerlo en profundidad.

Saludos.

614
Visual Basic 6.0 e inferiores / Re: Tipos De Archivo
« en: Miércoles 12 de Diciembre de 2007, 03:25 »
En Visual Basic hay instrucciones para manejar estructuras, como no...
Pero no en la forma que indicas, sino prefijándolas tú en el código.
En teoría hacer lo que deseas lo más parecido que se puede hacer en VB6 es usando recursos de usuario en dicho caso cuando tus programas cambiaran sólo tendrías que editar el fichero de recursos, pero se me antoja que es un modo un poco engorroso. Siempre podrás usar el objeto collection para mantener estructuras dinámicas.

Para estructuras estáticas se usa el 'type' como definición de structuras ayudado por las 'enum' eraciones, para limitar valores... te describo con ejemplos su declaración y utilización.

En un módulo describes tu estructura (ver el code 1 de ejemplo) y luego con ella puedes usarla para leer o escribir en ficheros así como usarla internamente en el programa.

Declarar una estructura: un ejemplo que ilustra la diversidad y el anidado de estructuras...
Código: Text
  1.  
  2. public enum enumCategoria     ' defino contantes fijas para usar como un tipo de datos.
  3.     especial=0
  4.     primera =1
  5.     segunda=2
  6.     tercera=3
  7. end enum
  8.  
  9. public type infoCoordenadas  ' ó private, si no se indica nada se entiende pública.
  10.     latitud as single
  11.     longitud as single
  12. end type
  13.  
  14. public type infoLocalidad
  15.     población as string * 20
  16.     provincia as string * 20
  17.     coordenadas as infoCoordenadas
  18. end type
  19.  
  20. public type infoEstrucutura   ' se puede usar cualquier tipo de datos...
  21.     jamones as integer
  22.     chorizos as integer
  23.     paletas as integer
  24.     categoria as enumCategoria   ' debe declararse previamente un tipo de usuario.
  25.     telefono as string * 9
  26.     origen as string * 16
  27.     localidad as infoLocalidad
  28. end type
  29.  
  30. public type infoAño
  31.     estructura as infoEstructura
  32.     año as integer
  33. end type
  34.  
  35. dim miEstructura as infoEstructura  ' en el código se usará esta variable como una herencia de dicho tipo.
  36. dim anuarioEstructura(0 to 99) as infoAño  ' puede también ser creada una variable de estructura como una matriz de una o varias dimensiones....
  37.  
  38. ' en este ejemplo puede verse la estructura final en infoaño,  luego se ha creado una variable para utilizar sólo una estructura completa, típicamente para manejar estructuras sueltas y con carácter temporal, y luego la diemnsionada para llevar una cuenta basada en los años....
  39.  
  40. ' Nota: las estructuras no precisan llamarse empezando por info... sólo es capricho mío, (que me permite recordar con mayor facilidad luego al usar una variable con el mismo nombre sin el 'info') puede usarse un nombre cualquiera de acuerdo a las reglas convenicionales de nombres de variables (no ser palabras reservadas, no empezar por números, etc...)
  41.  
  42.  
  43.  

Luego de ser declaradas las estructuras y de ccrearse una variable que permita manejarla, ya podremos usarla, empezaremos por un ejemplo que toma los datos de controles de un formulario... que suponemos han sido rellenados por el usuario...

Código: Text
  1.  
  2. ' nota: se omiten las supuestas líneas de control para claridad en el uso de las estructuras (que tendrían por objeto comprobar que los datos introducidos son correctos y dentro de los límites esperados, por ejemplo si se usara un campo para fecha se debería controlar que efectivamente es una fecha y que no refiere al año 3077... se entiende no ? )
  3.  
  4. public function recogeEstructuraDelFormulario() as infoEstructura ' debe devolver por tanto una estructura de infoEstructura, si en vez de una función usáramos una subrutina (sub), podríamos usar una variable global para la asignación de datos, usando la función aseguramos cierta encapsulación.
  5. dim cerditos as infoEstructura
  6.     cerditos .jamones= sliderJamones.value
  7.     cerditos .chorizos=sliderChorizos.value
  8.     cerditos .paletas=sliderPaletas.value
  9.     with cerditos ' también puede usarse el 'with' para no teclear tanto.
  10.          .paletas=sliderPaletas.value  ' esta línea es equivalente a la anterior (usando with)
  11.         .categoria = sliderCategoria.value
  12.         .telefono = textTelefono.text
  13.         .origen = textOrigen.text
  14.         .localidad.poblacion = textPoblacion.text
  15.     end with
  16.     with cerditos .localidad  ' puedes usar with para ahondar en más niveles
  17.         .poblacion = textPoblacion.text  ' esta línea es equivalente a la última
  18.         .provincia = textProvincia.text
  19.         .coordenadas.latitud = sliderLatitud.value /100 ' hemos supuesto un rango de 1-36000 de modo que al diviidir entre 100 tendremos 2 decimales
  20.         .coordenadas.longitud = sliderLongitud.value /100
  21.     end with
  22.     recogeEstructuraDelFormulario=cerditos  ' es el valor de retorno...
  23. end sub
  24.  
  25.  

este ha sido un ejemplo sencillo de recogida de datos de la misma estructura usada en la declaracion. Ahora simulamos que ha sido llamada para ser introducida en un año concreto... y guardar a un fichero.. eso sería otra función..

Código: Text
  1.  
  2. public sub buttonAñadirAño_click()
  3.     static añosCompletados as integer
  4.     dim añoActual as infoEstructura
  5.     dim guardado as boolean
  6.  
  7.     if añosCompletados <> ubound(anuarioEstrucutra) then
  8.         añoActual = recogeEstructuraDelFormulario   ' recogemos los datos del form
  9.         añoscompletados = añosCompletados +1
  10.         anuarioEstructura(añoscompletados ).estructura=añoActual     ' se los asignamos
  11.         anuarioEstructura(añosCompletados ).año=añosCompletados
  12.       
  13.         guardado = guardarEstructuraEnFichero(anuarioEstructura(añosCompletados),añosCompletados, "c:\cerdoIbericoSA.dat")
  14.         if guardado= true then
  15.             call resetEstructuraDelFormulario  ' tomado los datos y verificados y metidos en la estructura final y guardado en fichero, se resetea el formulario
  16.         else
  17.             msgbox "No se pudo guardar la estrucutra del año correspondiente: " & añosCompletados & " en el fichero ocurrió algún tipo de error...", vbcritical, "Error al guardar en fichero..."  
  18.         end if  
  19.     end if
  20.  
  21.  

Código: Text
  1.  
  2.     public function guardarEstructuraEnFichero(j as infoEstructura,año as integer, ruta as string) as boolean
  3.         dim n as integer
  4.         dim puntero as long
  5.  
  6.         n=freefile
  7.         puntero= (len(j) * año) - len(j) +1  ' apunta al final del fichero o no, esto es, si queremos añadir al final deberá ser el último año metido y el puntero sería la longitud del fichero, pero siqueremos modificar un año concreto habrá que sobrescribir exactamente esa zona y no otra..esa pequeña fórmula lo permite.
  8.         on local error goto errorGuardar
  9.         open ruta for binary as #n
  10.             put #n, puntero, j  ' pegar en: fichero, en posición, la estructura dada
  11.         close #n
  12.         guardarEstructuraEnFichero = true
  13.         exit function
  14. errorGuardar:  
  15.     end function
  16.  
  17.  


leer desde un fichero es similar a escribir... y podríamos usarlo para rellenar un reporte de un año cualquiera....
Código: Text
  1.  
  2.     public function leerEstructuraDesdeFichero(año as integer) as boolean
  3.         dim n as integer
  4.         dim puntero as long
  5.  
  6.         if año> ubound(anuarioEstructura then
  7.             call errorLeer(añoNoexiste) ' control de error de año, igaulmente debería usarse similar para valores fuera del rango inferior... se supone hecha la función errorLeer que devuelve un mensaje de acuerdo al error producido
  8.             exit function
  9.         end if
  10.         n=freefile
  11.         puntero= (len(infoEstructura) * año) - len(infoEstructura) +1
  12.  
  13.         on local error goto errorLectura
  14.             open ruta for binary as #n
  15.                 get #n, puntero, miEstructura ' usamos la estructura pública, para almacenar los datos, ya que la función la usamos para devolver si correcto o error, también podríamos usar un byref para devolverlo como parámetro desde la llamada...
  16.         close #n
  17.         leerEstructuraDesdeFichero= true
  18.         
  19.         exit function
  20. errorLectura:  ' será si hay problemas al abrir el archivo o al leerlo
  21.     end function
  22.  
  23.  

evidentemente es posible leer o escribir cualquier parte de la estructura no es necesario que sea entera, en ese caso se debe calcular la posición absoluta de comienzo de la estructura y luego la posición relativa del campo ó campos...
Calcular la posición relativa es algo que resulta conveniente hacerlo como comentario directamente en la estructura (en su declaración), siguiendo la convención del tamaño de los datos... single= 4 bytes, integer=2 bytes, etc... de hecho quizás resulte más cómodo escribir o leer semiestructuras completas en vez de sólo un campo, así se simplifica el uso de cálculo de punteros relativos. Por ejemplo podemos crear una variable para contener datos de la localidad y actualizar sólo ese dato cuando cambie o haya error

dim direccion as infolocalidad
const punteroLocalidad =34

Ahora ya puede usarse funciones similares a las usadas hasta aquí para actualizar solo el registro de localidad (población provincia,etc...)  al puntero del registro del año, habrá que sumarle entonces siempre el desplazamiento relativo hasta localidad que hemos acordado que es 34 (usando ANSI).

615
Visual Basic para principiantes / Re: Teclado Con Vb
« en: Lunes 10 de Diciembre de 2007, 04:09 »
Con mayor razón para ponerla.

Recuerda que las letras tienen constantes asignadas en Vb por ejemplo la X : vbKeyX  la tecla 3 vbKey3 la tecla control vbKeyCTRL el signo + vbKeyADD
y cuando algo no sabes usa asc(código ASCII del carácter) la tilde: ~ es asc(126) si no recuerdo mal... experimenta... con un bucle por ejemplo, o consulta la ayuda.

616
Visual Basic para principiantes / Re: Graficar Puntos En Visual Basic
« en: Lunes 10 de Diciembre de 2007, 03:49 »
Puedes usar la función 'pset' (set point) es una propiedad vinculada al formulario y a los controles picturebox.

Su uso es el siguiente objeto.pset [step  opcional] (x,y), color
si pones el step los valores de x e y son relativos a las coordenadas actuales, si no se indica step, las coordenadas x e son absolutas. en color debes definir un color de varias formas: usando constantes de quickbasic antiguo (sólo 16 colores), usando un valor de tipo long (trango  0-16.777...) o usando la función rgb que es bastante cómoda donde defines valores para el rojo, verde y azul individualmente con valores de byte (0-255)

Un ejemplo; haz un nuevo proyecto coloca un picturebox sin cambiar su nombre, en el código pega lo siguiente y pulsa la tecla f5  para ejecutarlo, luego pulsa dentro del picture, o mueve el ratón... :

Código: Text
  1.  
  2. Private Sub Picture1_Click()
  3.     For i = 1 To 1000
  4.         Picture1.PSet (i, 20 + i), RGB(22, 44, 210)
  5.     Next
  6. End Sub
  7.  
  8. Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  9.     Picture1.PSet (X, Y), RGB((X Mod 256), 80, (Y Mod 256))
  10. End Sub
  11.  
  12.  

nota que si pones encima una ventana, luego el dibujo ha desaparecido, el gráfico no es persistente, para evitar esto debes activar la propiedad 'autoredraw'=true del control picturebox.

Cuando quieras salvar el dibujo a un fichero de imagen añade un botón y coloca el siguiente código:
Código: Text
  1.  
  2. Private Sub Command1_Click()
  3.     Dim ruta As String
  4.    
  5.     On Local Error GoTo falloGuardar
  6.     ruta = "c:\midibujo.bmp"
  7.     SavePicture Picture1.Image, ruta
  8.    
  9.     MsgBox "La imagen se guardó en la ruta: " & ruta, vbInformation, "Imagen guardada..."
  10.     Exit Sub
  11.    
  12. falloGuardar:
  13.         MsgBox "Falló el intento de guardar la imagen en la ruta: " & ruta, vbCritical, "Imagen no guardada..."
  14. End Sub
  15.  
  16.  

También puedes usar los métodos 'line y 'circle' ... para leer puntos usa 'point'.

617
VB .NET / Re: Problema Con Un Algoritmo
« en: Domingo 9 de Diciembre de 2007, 02:51 »
Es bueno que documentes el texto, de otro modo me obligas a estudiar TODO el código en vez de sólo la parte donde se supone que tienes dudas. Esto hace a menudo que los que puedan ayudarte pasen de hacerlo, ya que les fuerzas a realizar mucho más trabajo del que en principio parece.

Por ejemplo tu planteas que te da error al borrar, pero deberías plantearlo de modo distinto.

Resumo tu código:

1 pides un valor para tomarlo como límite superior de una matriz
2 redimensionas la matriz y la llenas con valores aleatorios.
3 muestras el contenido que 'salió'.
4a inicia el recorrido de la matriz en un bucle
--- 5a inicias un bucle en un índice mayor que el anterior recorriendo la misma matriz
------ 6 si el valor en el índice del bucle 5 es igual que el valor en el índice en el bucle 4 luego ...
--------- 7a inicias un bucle de igual índice que 5 (para la misma matriz)
------------ 8 preguntas: si el índice no es el límite del bucle entonces el valor del índice del bucle 7 toma el valor del índice inmediatamente superior.
------------ 9 reduces la matriz en un índice preservando lo que contenga
--------- 7b cierras el bucle 7
------ 6b cierras el condicional de igualdad
--- 5b cierras el bucle 5
4b cierras el priemr bucle

10 muestras de nuevo el contenido actual de la matriz.

a ) Bien, para empezar tu código falla en varias partes, no queda claro lo que quieres hacer y lo haces lento.

b ) deduzco que tu intención inicial es la de crear una matriz aleatoria y luego eliminar los repetidos. Para observar si todo va bien, primero exhibes la lista y la comparas al final con otra exhibición.

c ) te daré un ejemplo de lo que debe ser un planteamiento antes de ponerte a escribir líneas de código sin ton ni son:
Se pueden usar varios planteamientos, te pongo uno que es muy efectivo y fácil de programar aunque puede que no interese lo que hace previamente, en ese caso luego te propongo otro método adicional...
0 Lo primero sería ordenar la lista de menor a mayor ( usa matriz.sort )
1 creo una matriz alterna de mismo tamaño 'matrizTmp' : puntero=0: i=0: k=1
2a hacer lo siguiente
3a --- mientras m(i) <> m(k) luego matrizTmp(puntero)=matrizAlea(i)
-------- i= k : k=k +1 : puntero=puntero +1
-------- si k > limite superior de m luego exit mientras 3
----- fin mientras 3
4a --- mientras m(i)=m(k) luego
-------- k=k +1
-------- si k > limite superior de m luego exit mientras 4
----- fin mientras 4
2b hasta que k = limite superior de m

5 redim preserve matrizTmp(0 to puntero)          
6 compara ambas matrices exhibiendo m() y matrizTmp()

Como puedes ver al estar ordenado un elemento sólo debes compararlo con el siguiente mientras sea distinto (y no se alcance el final) se añade, si es igual se compara con el siguiente hasta que sea distinto o se alcance el final. Por tanto la matriz sólo se recorre una vez. Cierto que penaliza un poco el ordenar la lista. pero fíjate que tu recorres la matriz 3 veces de forma anidada por tanto para eliminar elementos repetidos de una matriz de 1000 elementos recorrerías 1000 millones de elementos, es decir 1000 al cubo es decir eterno... el método propuesto para 1000 elementos sólo recorre 999 elementos.

Usar un método similar al tuyo optimizándolo en el mejor de los casos produce un tiempo de cálculo de m elementos al cuadrado, es decir para 1000 elementos sería recorrer 1000 x 1000 ya que exige 2 bucles anidados. Esto a fin de cuentas supone el equivalente al tiempo de cálculo para un algoritmo de burbuja. Se puede optimizar bastante más pero al final será a lo sumo equivalente a la velocidad de cálculo que ordenando primero la matriz. Por tanto es lógico no añadir más código ni comerte la cabeza teneiendo en cuenta que el método sort ya provee toda esa lógica.

Este método puede no interesar si se da el caso de que NO deseamos modificar el orden de los elementos en la matriz. Entonces podemos hacer una de 2 cosas, o bien añadir unos pasos para tomar sólo: los elementos de la matriz m() (en el orden de esta matriz) que aparecen en la matrizTmp() (porque aún tenemos las 2 matrices) o directamente usar otro método distinto sin tener la lista ordenada.

En cualquier caso en tu código se registran varios fallos:
1 El primer bucle de los 3 anidados no debe ser completo si no desde 0 hasta el penúltimo elemento de la matriz que no se repite, como a priori no sabemos cual es se olvida el for y se usa un bucle Do --- loop (en su forma until o while)
2 el segundo bucle de los 3 anidados sólo es correcto en el principio, el final si debe ser el final de la matriz, sólo la primera vez, por tanto o usamos un puntero para el final que debe actualizarse o usamos nuevamente un bucle Do ... loop
3 el tercer bucle inicia correctamente (con el puntero actual del 2ª) pero como está mal el final de segundo, el tercero debe tener otro final que el que tiene actualmente. concretamente el mismo -1 que tenga el 2ª bucle, pero fíjate que si actualizáramos el puntero después del bucle debería ser una unidad menos, en cambio si lo actualizamos antes del bucle el puntero ya está fijado a un valor menos que en el 2º bucle.
4 el condicional dentro del segundo bucle que compara los elementos es correcto, pretendes entonces acercar el resto hasta el final una posición abajo; 2 cosas: a ) el condicional dentro del 3 bucle sobra, simplemente se hace la asignación. b ) se debe usar un puntero que antes del primer bucle debe valer lo mismo ubound (m)...éste puntero debe usarse como final para el segundo y tercer bucle, El puntero debe reducirse en uno cada vez que la condición del segundo bucle se da.
5 el redim preserve es una pérdida de tiempo si se hace demasiado contínuo, es muy útil pero debe limitarse lo más posible (para eso usamos el puntero).

Entonces usando tu mismo código quedaría algo como:

Código: Text
  1.  
  2. p= ubound(v)       ' pes un puntero para los bucles 2ª y 3ª
  3. i=0
  4. do until i=p      ' si hemos hallado 5 repes sobre 30 elementos, no deberemos ir más allá del elemento 25... se entioende ???
  5.       For j = i + 1 To p        ' se usa p, porque irá reduciéndose a medida que se hallen repes.
  6.             If v(j) = v(i) Then '' ok...
  7.                   p=p -1      ' si se halló un repe se reduce el puntero.
  8.                   For z = j To p           ' no debe compararse con los que ya sabemos repestidos, por eso usamos p
  9.                         v(z) = v(z + 1) '' ok...
  10.                   Next z                  
  11.             End If
  12.       Next j
  13.      i=i +1     ' aumentamos el contador del primer bucle.
  14. loop
  15.  
  16. ReDim Preserve v(0 to p)
  17.  
  18. ' no uses este algoritmo para matrices grandes será eterno... para -de 200-300 elementos todavía es lento pero sopotable... Te aconsejo que implementes el que te describo al principio.
  19.  
  20.  
  21.  

Por último,  si el bucle primero se recorre en sentido inverso se propiciará mover menos elementos que si los 2 lo recorren en el mismo sentido. (hará que sea más rápido). Al hacer esto se deben cambiar algunos punteros del interior de los otros bucles. Esto te lo dejo como ejercicio para ti...

618
Visual Basic 6.0 e inferiores / Re: Ocx Visual Basic
« en: Viernes 5 de Octubre de 2007, 06:42 »
Cita de: "Brroz"
Hola riciar.

La forma que se me ocurre para resolver esto puede hacerse lenta y consumidora de recursos, pero...

En principio dices que tienes cierta imagen que debes usar como patrón para localizarla posteriormente. Ok, yo almacenaría esa imagen en una matriz de 'Ancho , Alto dimensiones' (o si lo prefieres de una dimensión Ancho x Alto) de tipo Long. A continuación mediante un bucle recorrería la imagen patrón 'escaneando' el valor de cada punto y asignando su color al respectivo punto de la matriz. Para averiguar el color de cada punto usa la función Point.

A continuación recorre la imagen que quieres comparar buscando la coincidencia con los correspondientes elementos de la matriz. Una vez que encuentres coincidencia con el primer elemento, continua comprobando puntos hasta el ancho del patrón. Si en algun momento deja de haber coincidencia, continúa con el escaneo, si no, al llegar al ancho del patrón, comprueba una nueva línea comenzando en la fila que coincidió de primera.

No sé si no me habré embrollado un poco explicando esto último, pero seguro que tomas la idea rápidamente. Ánimo que implementar esto no debe ser complicado (otra cosa es que el resultado pueda ser exasperantemente lento).

Te pondría un código de ejemplo, pero es que ahora en breve me voy a casa. Si tal y tienes dificultades en otro momento hablamos.

Chau.
aunque es eficaz es una forma lenta, demasiado lenta, por de pronto se me ocurre como ganarle velocidad usando el mismo algoritmo que describes. Lo comento:

Se supone que la coincidencia de patrón es igual, ya que si no es preciso usar otro algoritmo.
Lo 1º indicar que la API getPixel es más rápida... que point.

 Cuando encuentras una coincidencia del primer punto de la 1ª línea, lo que debes hacer no es buscar el siguiente, sino x siguientes más allá si también aparece, ahora busca x líneas más abajo, es decir hallnado 1 coincidencia marcas buscar dos coincidencias más en un área cuadrada (los 3 puntos deben formar un triángulo), si hay éxito comprueba nuevamente otros 3 puntos en distancias aleatorias , la probabilidad de que sean exactos es muy baja (salvo que haya pocos colores, es decir un patrón con poco contraste, mucho brillo, etc...), si el nuevo triángulo coincide, entonces examínalo desde principio a fin de corrido como indicas, si falla el 2º triángulo, el primero o tan sólo el 2º punto, fíjate que con sólo 2,3 ó 6 puntos puedes descartar un área cuadrada... sin necesidad de recorrerla punto a punto. entonces una imagen de pongamos 800x600 la puedes recorrer en apenas unos miliSg, frente a los varios segundos (10-30) que podría suponer revisar una imagen completa píxel a píxel con point.

619
Visual Basic 6.0 e inferiores / Re: Inquietud Matematica Vb6
« en: Viernes 5 de Octubre de 2007, 02:45 »
Hola... Hace tiempo contribuí a realizar el siguiente articulo en Wikipedia: Cuadrado Mágico

Allí se detalla como realizar cuadrados mágicos de cualquier tamaño. Al pie de la página hay enlaces adicionales a páginas web que detallan aspectos como la realización de diferentes formas.´También puedes consultar el mismo artículo en las wikipedias de otros países ya que en unos se profundiza más que otros. en la inglesa por ejemplo profundizan mucho más hasta entrar en otros aspectos que ya se alejan del artículo original...

En general te diré que para entenderlos hay que mirarlos en 'rombo' y 'aplastalos' hasta que queden cuadrados...

Si tienes dudas más específicas comenta...

620
Visual Basic 6.0 e inferiores / Re: Nombre Del Sistema
« en: Miércoles 26 de Septiembre de 2007, 04:42 »
Ya te han contestado...

Esto es un foro de programación para programadores, no se hacen tareas, se ayuda a entender o conocer desde el punto es que te quedas estancado, pero aquí no nos dedicamos a hacer programas a nadie... si como te señalan más arriba usas un buscador posiblemente con ligeras variaciones podrás adaptar algún código de ejemplo a tus intenciones, pero desde luego serás tú quien deba realizarlo... no pedirlo.

621
Visual Basic 6.0 e inferiores / Re: Codigo Para Ocultar Carpetas
« en: Miércoles 26 de Septiembre de 2007, 04:37 »
Cita de: "boluart"
haber si esto te sirve

SetAttr "file",vbHidden
No es muy rentable, si se accede a las propiedades de carpetas y se activa 'mostrar todos los archivos ocultos y de sistema' se mostrará.

Si precisas ocultar un archivo es más recomendable una de dos:
1º encriptarlo... si lo codificas nadie puede ver su contenido.
2º comprimirlo y añadir una contraseña. Si lo comprimes por ejemplo en rar, y le asignas una contraseña, nadie puede ver su contenido sin conocer la contraseña. El rar te permite 2 opciones no descomprimir el archivo si no se facilita la contraseña y más restricitivo no permitir ver el nombre del/los archivos comprimidos.

Comprimiendo tendrás la ventaja de que podrás meter varios en un mismo archivo, y por tanto no tener que hacerlo uno a uno. Cuando quieras ver un archivo en concreto, simplemente 'abres' dicho archivo y descomprimes el que necesitas, al terminar eliminas el archivo extraído (el rar sigue teniendo su copia comprimida).

Se supone que lo que quieres es ocultar el contendi o de ficheros de la vista..

622
VB .NET / Re: Saber Si Esta Asigando El Focus
« en: Miércoles 26 de Septiembre de 2007, 04:29 »
Pero es una propiedad, no un evento.  Eso significa que si deseas saber en un momento dado quien tiene el foco tendrías que recorrer toda la colección de controles para localizar a quien lo tiene. Por otro lado, no hay reacción, es decir si quieres lanzar un cóodigo al ganar el foco un objeto concreto, tendrás un problema de sincronización, suponiendo que lo captures con la propiedad, será a destiempo y consumiendo demasiados recursos...

Es raro que en el net.2003 olvidaran añadir dichos eventos... pásate cuando puedas al 2005... te lo recomiendo.

623
Retos / Reto Del Formato Bmp
« en: Domingo 23 de Septiembre de 2007, 22:12 »
Hola compañeros, me gustaría echar un vistazo a algunos de los proyectos del reto llamado formatos bmp, pero sucede que los enlaces ya no van al parecer ya no se alojan los ficheros rar en el link al que apuntan. Agradecería a quien pudiera pasármelos.... o bien si sus autores aún lo conservan...

Puesto que el hilo ya está cerrado no puedo postear allí...

Citar
ok, todos los proyectos cumplieron con lo requerido.

Queria inicialmente hacer un analisis muy detallado de cada uno, pero por lo visto por estos dias el tiempo no esta a mi favor, asi que he hecho este resumen.


Puntos Favorables de cada proyecto:
Nagisa : Brevedad del codigo
Diodo : Uso de tabs
Geo : Salida mixta por consola y GUI
Enko : Informe de excepciones
Danielo: Informacion adicional del mapa de bits
Senzao18: Sencilles, muy user friendly
JuanK : N/A

Puntos DesFavorables de cada proyecto:

Nagisa: Demasiado Lento ( me habias dicho que lo habias corregido? es que no tengo mas copias  )
Diodo : En algunos casos muestra la imagen de forma irregular( me habias dicho que lo habias corregido? es que no tengo mas copias  )
Geo : WxWidgets es muy engorroso de usar, pero no es culpa tuya ( no sabia que mas escribir  )
Enko : Demasiado lento
Danielo:Se revienta con bitmaps grandes
Senzao18: Demasiado lento
JuanK :N/A

Clasificacion por tecnologia

.NET

Diodo(C#)
JuanK(C#)
Senzao18( VB.NET)

Delphi (pascal)
Enko

C/C++
Geo(WxWidGets)
Danielo (WinApi)

Java
Nagisa

About Me
No puedo ser juez y parte por eso no hice comentarios acerca de mi reto.

Otros Comentarios

En general creo que todos hemos sacado provecho del ejercicio, y valio la pena invertir el tiempo  .

Como notas adicionales , de los ejercicios de Geo puedo decir que me gusto su idea de usar WxWidgets ya que pude probar el programa en Windows y Linux ( mi aplicativo extra en C#.net tambien corrio en ambos), y es interesante explorar esas posibilidades en C++. En cuanto a rendimiento esta muy bien y pese a que no eres informatico tienes buenos habitos de programacion.

El ejercicio de Danielo fue con la Win32Api, creo que esto le ha ayudado mucho a él ya que con este tipo de ejercicios y usando la tecnologia que usó podra desarrollar mas rapidamente sus habilidades como programador, creo que el crecioo enormemente con el ejercicio. El problema de la memoria debes revisarlo, me ocurrio con un bitmap grandecito.

Respecto al proyecto de Enko, creo que ha demostrado que tiene buenos conocimientos y manejo de delphi, asi como buenos habitos de programacion.,y que bueno que haya decidido a aventurarce en .NET.  . Aprendi que Delphi ( o pascal , como sea) es como un C++ pero con algo de la sintaxis de basic  . Yo le mejoraria la interfaz y el rendimiento ya que esta lento pero se nota mucho con bmps grandes.
Muy bueno y saber quie tampoco eres informatico.

El proyecto de Nagisa se destaca principalmente por ser el de mas poco codigo, una implementacion realmente practica lo cual se le debe reconocer, adicionalmente es el unico proyecto que se hizo e java.  Gracias a él muchos vimos lo del corrimiento de una manera muy eficiente, yo por lo menos lo hacia de otra manera pero me gusta mas la tuya.

Diodo utilizo C# .NET , la interfaz grafica que uso me ha gustado bastante, en especial el uso de tab pages me parece ideal.. solo falto poder cerrar los tab, pero bueno nada es perfecto  El codigo es breve pese a la complejidad que le agregaste con lo de los tab . A mi me gusto tu propuesta sobre todo a nivel grafico.

Senzao18 Utilizó VB.NET, me gusta del proyeco que ofrece una interfaz sencilla y que facilita su uso directo, en general me parecio bien estructurado pero debo confesar que no me fueron del todo claro unas partes en cuanto al orden que le quiciste dar, el problema de la lentitud es por la tecnica que usaste para el dibujo, al igual que a los demas que se les llego a presentar ese problema, veraz que un cambio muy sencillo te produce una mejora considerable en los resultados.

JuanK...

Agradezco de verdad a todos su participacion, creo que todos son los mejores ganadores, por que todos asumieron y finalizaron el reto!!!

FELICITACIONES     

Links de los proyectos:

JuanK

Nagisa

Diodo

Geo

Danielo

Senzao18

Enko



La discucion no se cierra, cualquier duda, o comentario favor no duden en compartirlo. 

Mensaje modificado por JuanK el Agosto 23, 2006 03:11 pm

624
Diseño de Algoritmos / Re: Algoritmo Que Muestre Las Combinaciones
« en: Domingo 23 de Septiembre de 2007, 20:18 »
Este hilo está de sobra, ya se le contestó a este mismo mensaje en otro hilo.

Puede borrarse este.

625
Diseño de Algoritmos / Re: Ayuda Por Favor Con Este PequeÑo
« en: Domingo 23 de Septiembre de 2007, 20:13 »
Exacto, es como te indica Lencho...

se supone un registro compuesto por campos, donde al menos 2 campos son los que debes recoger...

Código: Text
  1.  
  2. Structure miRegistro 'registro de personal
  3.      nombre as string
  4.      apellido1 as string
  5.      apellido2 as string
  6.         ....
  7.         ....
  8.       edad as byte
  9.         ...
  10. end Structure
  11.  
  12. public regis as miRegistro
  13.  
  14.  

...se abre un fichero que contiene los datos, se localiza el puntero al registro actual y se lee la estructura completa... o sólo el nombre y edad con los punteros relativos dentro de la estructura...

Páginas: 1 ... 23 24 [25] 26 27 ... 29