|
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 ... 15 16 [17] 18 19 ... 29
401
« en: Lunes 27 de Octubre de 2008, 12:26 »
Antes de responder, te quiero reprender...  (con buen rollo, claro). Me obligas a dedicarle más tiempo del necesario a leer tu código, porque usa variables impersonales. Para i que hace de contador va bien, pero no para el resto. Si tus variables tienen el cometido de 'b'= mayor entonces es mejor que llames a la variable mayor o al menos max (si quieres abreviar y que a la vez se entioenda) a la variable 'c' por la misma razón podrías llamarle menor o min y por último a la matriz a podrías llamarle 'mat()', entonces es fácil de leer pués en todo momento estás leyendo el significante y el valor que se expresa en la 'fórmula'. Se dejó atrás los tiempos del VIC-20 donde la memoria eran poco más de 3kb. así que por favor no piensas que llamar a una variable max es derrochar memoria, en estos días derrochar tiempo humano es más 'pecado'  , que es lo que sucede al tener que trabajar con variables inexpresivas de su contenido... No he mirado completamente tu código (sólo por encima), me he parado donde he visto el primer sobresalto  , tu quieres recorrer un vector para obtener el mayor y el menor, según se deduce de tu pregunta. El problema lo tienes en donde le asignas al (espera que mire quien es la variable) ya, ...donde le asignas al menor incondicionalmente que 'c= a(i)', con lo que se destruye el valor del menor que estaba almacenado fruto de los condicionales. La solución consiste en eliminar esa línea... que es a grosso modo como que se ha metido una avispa en medio del mecanismo (iba a decir mosquito, pero dado que tenemos un usuario con ese nombre, quien sabe si pudiera sentirse atacado de alguna manera)... como ha ido a parar ahí ????, supondremos eso, ... que revoloteando... chocó con un cristal y al perder el vuelo fue a caer justo ahí... nota: el primer 'c= a(i)' que aparece antes de 'TextBox2.Text = TextBox2.Text & " " & c', no el que está condicionado, más abajo.
402
« en: Domingo 26 de Octubre de 2008, 03:49 »
NOTA IMPORTANTE: Lamentablemente, después de escribir muchos mas información de la k sale en esta respuesta, el Foro me indicaba error y ya no podía recuperar lo escrito. X lo k pido disculpas y por tanto mejor crearé una Página personal en algún sitio, en la k iré poniendo todo lo k falta. Cuando tenga lista la página, se las daré a conocer en este mismo foro. Mil disculpas. Es más sencillo que tener una página... en tu ordenador puedes crear las páginas html o del tipo de documento que quieras, luego lo único que tienes que hacer es escribir un comentario breve del contenido del archivo y subir aquí mismo el archivo comprimido... En dicho fichero puedes desarrollar todo tu trabajo extensamente sin el problema de espacio. También hay páginas donde puedes subir los archivos y luego publicar el enlace... Aquí no se requiere ser un 'prestigioso investigador' ... basta tener ganas y decir cosas coherentes.
403
« en: Domingo 26 de Octubre de 2008, 03:20 »
Hola, mira no he leído todo tu post... sólo me he quedado al final con lo de... " //y la multiplico por la matriz acumulada de su padre". Veamos si obtienes una matriz absoluta, la nueva matriz será la matriz base multiplicada por las transformaciones que se hagan al origen (la matriz absoluta) y por supuesto las multiplicaciones en el orden correcto, de otro modo sale cualquier cosa...
404
« en: Domingo 26 de Octubre de 2008, 02:54 »
[Disculpando mi Injerencia , pero esta mal numerado el archivo_15 ya que seria el 3 , el archivo_16 el 5 y el ultimo pasaria a ser 6 , un errorcillo leve en los comentario Saludos Hola F_Tanori, no importa la injerencia, de hecho no lo es y no , no es ningún errorcillo, los comentarios son correctos (en cuanto al número indicado al menos  ) si te fijas bién CERRÉ todos los archivos abiertos con 'close', por tanto freefile después de 'close' simepre volverá a ser 1 otra cosa es que le dijera 'close # x' De hecho la idea era ilustrar que abriendo y cerrando ficheros FreeFile va variando... por eso abro, ciero, abro... para que se vea como fluye...
405
« en: Domingo 26 de Octubre de 2008, 02:14 »
WOW Nebire simplemente Genial, gracias, el codigo esta bastante entendible, aunque hay partes que nunca escuche antes hasta hoy, pero me esta jalando bien, solo que al poner el segundo "-" me repite el caracter anterior, osea: saludos
Jorge Castellanos DGAM Esto, no había terminado de editar el código y se me escapo el 'enter', y ya has respondido ahora que lo he vuelto a editar... vuelve a repasar el último fragmento del código...que es donde tenía que añadir...
406
« en: Domingo 26 de Octubre de 2008, 02:11 »
Gracias Nebire, funcina a la perfeccion, pero pasa algo curioso si intento borrar una parte o todo el textbox, no me deja eliminar... que podra ser?
saludos cierto... esperaba hacerte pensar... pero bueno.. te explico. Dado que el código está en el evento change, cuando añadimos el carácter "-" el texto ha cambiado por tanto el evento se vuelve a disparar (por eso necesitamos aquello de selectionstart). Del mismo modo al borrar un carácter (pongamos que tenemos 12 caracteres) lo que sucede es que ahora son 11, el código del evento le dice que cuando haya 11 caracteres añada un guión y eso es lo que hace. En el código siguiente lo que hacemos es filtrar, ahora sólo se ejecuta el código de comprobar y si es preciso añadir el guión cuando haya un carácter más que la vez anterior, es decir que si elimino un carácter el código no se ejecuta, o dicho de otro manera, sólo se ejecuta el código cuando añadamos caracteres y no cuando 'eliminemos caracteres... Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged Static tam As Integer ' necesitamos 'memorizar' entre eventos el tamaño del texto para comprobar si la variación consiste en añadir o quitar... If TextBox1.TextLength > tam Then If TextBox1.TextLength = 4 Or TextBox1.TextLength = 11 Then TextBox1.Text += "-" TextBox1.SelectionStart = TextBox1.TextLength ' si eliminas esta línea el cursor se irá al inicio... End If End If tam = TextBox1.TextLength End Sub
Aún hay otro problema... qué pasa si el usuario en vez de teclear pega un código ???... bueno eso se resuelve con el siguiente código... si no lo entiendes pregunta de nuevo ... Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged Static tam As Integer Static noChange As Boolean If noChange = False Then If TextBox1.TextLength > tam Then If TextBox1.TextLength - tam = 1 Then ' el texto se introdujo por teclado o sólo se pegó un carácter... If TextBox1.TextLength = 4 Or TextBox1.TextLength = 11 Then tam = TextBox1.TextLength + 1 ' aquí podrías poner también el nochange=true y después de la siguiente línea el =false TextBox1.Text += "-" TextBox1.SelectionStart = TextBox1.TextLength ' si eliminas esta línea el cursor se irá al inicio... End If Else ' se ha pegado texto.. ya que el teclado dispara el evento carácter a carácter...y se han añadido más de 1 de golpe. If TextBox1.TextLength > 3 Then Dim txt As String ' para valores temporales txt = TextBox1.Text.Replace("-", "") ' elimina guiones (por si no existieran en el lugar adecuado) Select Case txt.Length Case 3 txt &= "-" Case 4 To 9 txt = txt.Substring(0, 4) & "-" & txt.Substring(4, txt.Length - 4) Case 10 txt = txt.Substring(0, 4) & "-" & txt.Substring(4, 6) & "-" Case Is > 10 txt = txt.Substring(0, 4) & "-" & txt.Substring(4, 6) & "-" & txt.Substring(10, txt.Length - 10) End Select noChange = True TextBox1.Text = txt TextBox1.SelectionStart = TextBox1.TextLength ' olvidé meter esta línea.... para que el cursor se vaya al final de la edición. noChange = False End If End If End If tam = TextBox1.TextLength End If End Sub
p.d: olvidé añadir la línea que manda el cursor al final del texto al pegar un texto directamente en el textbox...
407
« en: Domingo 26 de Octubre de 2008, 00:48 »
FreeFile es una constante de Visual Basic para asignar un numero de archivo al archivo creado (para este caso) FreeFile no es una constante, sino una instrucción que devuelve el siguiente número de fichero libre... y conviene asignarlo a una variable y usar esa durante todas las referencias a ese fichero ya que si se usa directamente puede llevar a error por ejemplo en el siguiente caso: Open "C:archivo_12.txt" For Output As #FreeFile ' es el fichero 1 MsgBox FreeFile Open "C:archivo_13.txt" For Output As #FreeFile ' es el 2 MsgBox FreeFile ' el siguiente apuntaría al 3 Close MsgBox FreeFile ' como se cerraron todos ahora el fichero libre sería el 1 Open "C:archivo_14.txt" For Output As #FreeFile ' es el fichero 1 MsgBox FreeFile Open "C:archivo_15.txt" For Output As #FreeFile ' es el fichero 2 MsgBox FreeFile Open "C:archivo_16.txt" For Output As #FreeFile ' es el fichero 3 MsgBox FreeFile ' el siguiente libre es el 4 aunque no lo usamos
Cualquier instrucción para operar después con un fichero abierto como sabremos cual es ???, si necesitamos hacer algo en el fichero_14.txt que número tiene ? hay alguna forma de saberlo ahora ???. Simplemente no. De hecho el código que diste más arriba fallará... Open RutaArchivo For Output As #FreeFile Print #FreeFile, Dato_A_Escribir
ya que la apertura se refiere aun fichero y luego su uso se referencia a otro...
408
« en: Domingo 26 de Octubre de 2008, 00:16 »
Programa el evento change, si hay x letras al texto actual añade al final del mismo el carácter deseado, x letras sería por ejemplo: 4 y 11..., tal que así: Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If TextBox1.TextLength = 4 Or TextBox1.TextLength = 11 Then TextBox1.Text += "-" TextBox1.SelectionStart = TextBox1.TextLength ' si eliminas esta línea el cursor se irá al inicio... End If End Sub
409
« en: Domingo 26 de Octubre de 2008, 00:00 »
Tienes un cacao impresionante convirtiendo cadenas a valor y valor a texto... esto en VB6 era completamente normal, pero vb2005 no le gusta...
cuando vayas a pasar el contenido de una cadena a una variable numérica acostúmbrate a usarla en la forma
numero= Cint(cadena) : numero= Cint("texto") ' si es un valor entero lo esperado, si fuera byte Cbyte(...), etc...
y cuando vayas a convertir de número a texto usa:
cadena= Cstr(numero)
El error posiblemente te aparezca en 'TextBox2.Text = TextBox2.Text & c' si es u7na concatenación de caracteres hazlo así: TextBox2.Text = TextBox2.Text & Cstr(c) y ya de paso cambia también... la línea 'a(i) = InputBox("Ingrese Datos")' por: a(i) =cint( InputBox("Ingrese Datos"))
410
« en: Viernes 24 de Octubre de 2008, 19:00 »
El siguiente tema es una noticia que versa de julio, pero posiblemente haya pasado desapercibido, como suele ocurrir con la mayoría de noticias en otros idiomas.. pero que a nosotros nos atañe.. Se trata de un diseño inteligente de una interfaz para adaptarse al usuario en vez de ser el usuario el que tenga que adaptarse a la interfaz. El tema es especialmente útil para personas con discapacidades. Y al mismo tiempo a nosotros nos sugiere que tipo de elementos de interfaz deberíamos dejar de usar en favor de otras o al menos con ciertas modificaciones. El enlace a la página (incluye un vídeo) http://uwnews.org/article.asp?articleID=42817
411
« en: Viernes 24 de Octubre de 2008, 16:53 »
412
« en: Viernes 24 de Octubre de 2008, 16:36 »
si te dan dinero sin trabajar... alguien trabajaría... ? Aunque para mí no se trata de que me moleste su dinero o trabajo, sino de una manera de entender las cosas, de saber compartir.
Por supuesto... el ejemplo de dinero es una metáfora, que quiere indicar que si algo se consigue sin esfuerzo para qué esforzarse...
413
« en: Viernes 24 de Octubre de 2008, 01:48 »
Os aconsejo que si copiáis funciones, por lo menos os toméis el tiemp de entenderlas Las funciones que publico son creadas por mi... (aun que no todas las funciones que publico son creaciones mias, pero si todas estan, por lo menos personalizadas por mi, de tal manera que solo sea necesario copiar y pegar, (recuerda que estamos en un foro de Visual Basic para principiantes y lo mas seguro es que las personas que preguntan saben muy poco de viasual basic)
Hey, Moskito, me caes bien,... please, no discutamos ... la finalidad es ayudar a una persona...
Nota: Yo quiero mucho a Toph
Mosquito tiene razón... si le das el código masticado a alguien lo que hace es copiarlo y no se molesta en entenderlo, y así no se ayuda a nadie. Lo que hay que hacer es indicarle el camino y que lo recorra él a su manera, a su ritmo y si tiene dudas que vuelva a preguntar. Yo ví esta pregunta ayer y no me molesté en resonder porque aunque el nivel de alguien sea de principiante esto se encuentra en la ayuda. Pulsando F1 y leyendo un poco sobre el control List y la instrucción Open. El código completo no se debe ofrecer... si te dan dinero sin trabajar... alguien trabajaría... ?
414
« en: Viernes 24 de Octubre de 2008, 01:35 »
Bueno ante todo gracias por la debida atencion
Pero = el cliente perderia tiempo esperando a que en cualquiera de los puntos le digan que justo en ese momento ya se acabo de vender el producto a otra persona.... esto es lo que me preocupa mas que todo
Esto suele arreglarse con mayor o menor comodidad creando un trigger ( create trigger ), debes indicar el límite cuando el trigger entrará en funcionamiento, por ejemplo si hay 10.000 artículos en stock de un producto está demás, pero si quedan 20 en las 4 tiendas de una ciudad, (por ejemplo) sería bastante útil. El trigger lo que debería hacer es que una vez que de un producto (o de una lista de productos) queden menos de x cantidades (al caso tener una tabla especificando qué producto y cual es su límite mínimo) en una tabla (tbl_StockMin) añadir (serían los campos de la tabla) el nombre del producto los artículos que restan, los que están reservados, el período de reserva ( por ejemplo 40 minutos) y hora de reserva ... ahora cuando un cliente pregunte por un producto y demuestre ese interés el 'vendedor' hace la reserva, el trigger se dispara automáticamente (a través de un procedimiento almacenado que en cada llamada consulta y luego compara el stock del artículo con la tabla tbl_StockMin articulo=el_preguntado y valor <= tbl_Stockmin.min, si se da el caso el trigger comprueba si el artículo consta en la tabla, si no consta lo añade, fija la hora de reserva, y previamente si hubiera una reserva sobre ese artículo comprueba si la hora de reserva + el tiempo máximo de reserva es mayor que la hora actual, si es que sí, ese artículo libera una unidad de reserva (si las unidades en reserva llegan a cero el artículo se retira de la tabla) , existe por tanto la posibilidad de decirle al cliente que hay una reserva que caducará en x minutos, que si lo desea se pase después de ese tiempo porque o se ha vendido o se ha retirado la reserva. Por supuesto cuando se vende definitivamente esa reserva se retira de la tabla tbl_stockmin y además decrece el stock en una unidad, si las unidades alcanzan definitivamente cero se retira de la tabla y la referencia se pasa a la tabla de artículos agotados para peticiones al almacén o lo que se quiera...).. Si se cuelga el ordenador, no pasa nada ya que la próxima petición a ese producto actualiza automáticamente el estado actual del producto y de las reservas. No es necesario programar otro trigger para comprobar la vigencia de una reserva sino que se actualiza justo cuando surja otra petición y compruebe que el stock. Ten en cuenta que utilizar triggers sin ton ni son hace trabajar muy pesado a una base de datos, por tanto úsalos con cautela... Hablamos de 2 tablas: Una retiene que artículos serán 'vigilados' y a partir de que límite de stock un trigger controla las reservas de ventas y el tiempo máximo de reserva para dicho artículo (por ejemplo un TV puede reservarse 60 minutos, pero una moto 4días y una vivienda 1mes, según el valor el período puede variar e incluso para los de gran valor sólo se admite reserva previo pago anticipado de una cuantía, en dicho caso esa tabla también debería tener ese campo . La otra tabla, la 2ª de la que hablo, mantiene los datos de reserva, producto, stock actual disponible, reservas hora de reserva hora de final de reserva y adicionalmente algún dato del cliente que lo reserva. La primera tabla puede o no crearse o añadir esos campos a las tablas de artículos, lo cual irá en función de que sería más rentable en función de la cantidad de artículos del alamcén, la cantidad de stock de cada artículo, la cantidad de clientes y ventas-reservas, etc... si tienes 10000 artículos pero son 20 los artículos que se venden como rosquillas quizás interese una tabla y sólo sobrecargar cada consulta con una comprobación de procedimiento alamacenado cuando sean alguno de esos 20 artículos los solicitados por el cliente, en los otros 9980 no.
415
« en: Miércoles 22 de Octubre de 2008, 02:14 »
Hola, estoy de nuevo por aquí xD En la imagen se ve para cada punto, su orden de dibujo. Si uniese ordenadamente las líneas, como en un juego de niños, no saldría la figura correcta, como me pasaba en casos anteriores. ¿Tienes alguna idea para solucionar esto?
Te contesto rápidamente y mañana con más tranquilidad reviso el archivo y le dedico un poco más de tiempo: Dada una secuencia como la que tienes ahora, para que no se desvirtúe si se sigue el 'orden', hay que proceder de una manera similar a la siguiente: a ) empezamos por un extremo (localizar un punto tal que al norte no tenga más o si es por abajo al sur no tenga más, o si es a los costados ídem...) en el caso que están todos dispuestos casi verticalmente es relativamente fácil, otra cosa es cuando ýa describen un área cerrada.) igualmente encontrar el otro extremo... b ) desde dicho punto medir la distancia hasta el otro extremo P0(x,y) - Pn(x,y) y dividirlo entre el total de puntos. a este valor lo llamaremos algo así como paso. será una constante a la que recurrimos al inicio de cada elemento del bucle dentro del bucle otra variable con este valor inicial podrá irr variando, no es un valor fijo, sólo es una aproximación de entrada... c )Iniciar un bucle encontrar siguiente elemento : iniciar bucle localiz_puntos_enradio mientras_no_se_encuentren_puntos_ aumentar el área: intentoslocalizar +=1: distancia= paso * intentoslocalizar; Con la distancia distancia averiguar que puntos caen dentro de ese círculo con respecto al punto actual (ahora en este justo instante sería el punto P0,) y descartar de esta matriz de posibles los que ya con anterioridad se hubieran encontrado y admitidos en la secuencia (más adelante se explica esto), el área a barrer podría ser circular o cuadrada, cuadrada es más cómoda de recorrer pero también menos exacta, si el área es cuadrada, convendría que fuera impar para que el punto de referencia esté justo en el centro y eliminar dudas). c1 ) si no se encontró pntos en ese espacio aumentar distancia por un factor a discreción (paso se obtuvo como una referencia de densidad, pero evidentemente si hubiera una distribución ampliamente lateral aparte de vertical la posibilidad de no hallar puntos a una distancia dada aumentaría), el factor puedes decidirlo de entrada como acumulativo (1,2,3,4,5,6.. sea de radio o de área) una vez cierta experiencia quizás si hay un patrón decidas ajustarlo. c2 ) se encuentran puntos: se totalizan y se obtiene el punto más cercano. Finaliza este bucle, distancia volverá a ser= a paso, repetimos bucle global hasta alcanzar el último punto (que debería ser otro extremo ). Pueden darse casos de equidistancia típicos de un triángulo,( es harto difícil que hubiera más de 2 equidistantes si el trazado es correcto) en dicho caso se debería tomar el más 'extraño' . El más extraño sería una especie de componente, que se las trae, pero que te explico, sobre la línea imaginaria entre el extremo inferior y superior el más extraño es el que: c2a ) si el punto actual está más cerca que los puntos de la línea, el que más se aparta a dicha línea. c2b ) si el punto actual está más lejos que ambos, igual que el paso anterior, c2c ) si el punto actual está aun lado de la línea y los puntos al otro lado el más cercano a la línea, por fin c2d ) si el punto actual está a un lado y los otrs puntos uno a cada lado de la línea, el que está al mismo lado de la línea. (haciendo unos pequeños dibujos a manos se ve menos lioso que tanta palabra). Trataré de hacer mañana un dibujito sencillo mostrando los 4 casos. Es harto difícil demostrar que el más extraño sea la mejor opción, digamos que abre la posibilidad a no perder nodos teniendo que volver hacia atrás (a veces esto no sólo no es indeseable sino necesario, según el digujo). d ) Paso retomar el estado inicial (cuando lo calculamos por primera vez) vaciamos la matriz de puntos cercanos, los puntos ya marcados se van indicando en la matriz encontrados, ahora cuando busquemos puntos para un radio cuando se encuentren todos, la matriz de posibles serán esos menos los ya encontrados, es decir rechazaremos los que consten en la matriz encontrados... el ciclo se repite hasta llegar al último punto. e ) tras alcanzar el último punto hay que verificar si el tamaño de la matriz encontrados es igual al tamaño total de puntos, ya que puede darse un caso extremo (o menos). Por ejemplo supongamos que en ese trazado (el último dibujo que tienes) hubiera un punto en 407... debemos considerarlo un error en el algoritmo o debemos considerarlo un punto erróneo (ruido) durante el marcado ???. En ese momento tu debes interpretar ( no coonozco claramente el objetivo final) si es un fallo en el algoritmo o una detección de ruido que el algoritmo consigue filtrar... y si en el punto 407 hay varios puntos formando una isla (redundando) aislada a cierta distancia del resto ???. Para solucionar casos así es necesario saber como se debe interpretar, como yo desconozco ese punto, si te sucede y te quedas atascado me das alguna razón del porqué esos puntos para buscar una opción válida al caso que necesites. Nota que está todo un poco desordenado ya que es una respuesta rápida... con un lápiz y un trozo de papel entresaca en seudocódigo el algoritmo que subyace. Para facilitar todas las tareas de localización en vez de buscar en el mapa del dibujo es mejor (supongo que así lo llevas) usar una matriz con una estructura de 3 datos, las cordenadas de cada punto 'x','y' y el 'valor' ( la vas completando cuando lo vas trazando). Así no buscas en superficies vacías del mapa sino en la matriz. al encontrar un punto pasa al índice alto. El primer punto se envía al final de la matriz y se fija un puntero_tope= tamaño_matriz -1, el próximo punto localizado se intercambia con esa posición y se actualiza el puntero puntero_tope= puntero_tope -1, es claro que el bucle finalizará cuando puntero_tope=1. p.d.: cuando el trazado describe, un área cerrada , se puede empezar arbitrariamente por cualquiera, el otro extremo será el mismo, pero con la consideración que una vez completo el camino, debe examinarse tota la matriz y (si es lo que se desea) romper la cadena justo por los 2 puntos que mas equidisten entre sí dentro de la secuencia. Esto lógicamente será opcional dependiendo de a qué vaya destinado problema. La línea imaginaria que señalamos más arriba, puede no ser muy correcta si está muy desviada, por ejemplo si la línea de trazos describen una 'C', para estos casos puede usarse una línea imaginaria más inteligente, sumando los valores máximos y mínimos de x, la línea sería el punto proporcional entre esos límites, por ejemplo si el valor x mínimo es 40 y el máximo 120, parecería que debiera ser 80, pero no, 80 es ahora un divisor, repasamos y sumamos todos los valores que sobrepasan 80 y todos los que no llegan por ejemplo valores 100,110,107 y al otro lado 50,55 . entonces (100-80) + (110-80) + (107-80)= 77 y al otro lado (80-55) + (80-50)= 55: 77 - 55= 22 : 22/2=11: linea va en 80 +11 (11 sería la ponderacón). Este ejemplo es referido a un caso donde los extremos tomados fueron verticalmente sea límite superior e inferior si es un camino abierto, si es un camino cerrado debería seguirse una línea redonde o una curva si forma una línea muy curva sin cerrar. Para casos más complejos hay que hacer una detección bordes y usarla como guía respecto del punto actual... trataré de ponerte un ejemplo de este tipo, pués son más útiles de lo que pueda parecer..
416
« en: Miércoles 22 de Octubre de 2008, 01:21 »
Hola soy nuevo en este foro y quiero saber si alguien me puede ayudar lo que necesito es hacer que un text box me muestre un numero aleatorio y que cada 2 minutos me cambie
Bien mas que nada lo que tengo que hacer es como un token asi como lo usan los de banco para poder ver el estado de cuenta por internet y que sea mas seguro
gracias de antemano
Tienes que usar la funcion RND conjunto con un Timer.
417
« en: Viernes 17 de Octubre de 2008, 22:38 »
Para no estar dando palos de ciego....  prueba los cambios en tu algorimo con una función muy útil para estos casos llamada 'función de Rosembrock'... posiblemente encuentres más info en inglés que en español...
418
« en: Viernes 17 de Octubre de 2008, 11:06 »
Te paso algunos enlaces: Isolínea http://es.wikipedia.org/wiki/Isol%C3%ADneaConjunto de nivel: http://es.wikipedia.org/wiki/Conjunto_de_nivelA tu algoritmo le puede añadir un conjunto de reglas para hacerlo más efectivo. Te iré enumerando ideas y si necesitas profundizar me lo dices. Para empezar Deberías marcar un 'centro' es decir deberías definir el valor máximo de luminancia y el mínimo y localizarlos dentro del mapa. Ahora con ese área se marca con un único punto, este ya no podrá ser usado, salvo que haya varios adhyacentes (que no sea el único). Si hay más de uno, trata de rodearlos con una línea de puntos (más abaj se irán describiendo alguna reglas). Ahora como ves en vez de partir desde abajo-izquierda, partimos del punto más brillante. Una vez rodeado esos pocos puntos centrales sus casillas se marcan en una matriz. Ahora buscamos el siguiente punto inferior en intensidad, cuando rodeemos con este seguiremos igualmente bajando el nivel de brillo buscando por ellos. Mientras queden áreas libres o no se alcance un nivel mínimo de brillo previamente fijado, repetiremos en forma de bucle ese paso. Para hacer esos pasos falta definir un conjunto de reglas... las 2 primeras las hemos definido precipitadamente, hallar el punto/s central/es y desde ellos ir trazando areras externas... La primera regla es al buscar el siguiente punto, no podrá ser candidato un punto interno a un área ya cerrada. Los cuadrantes de las áreas ya cerradas se pasan a una matriz para chequear esta regla. La segunda regla es un punto nunca podrá avanzar directamente a una distancia superor a un 'cuadrante' , hay por tanto una relación de vecindad que se define más adelante. La tercera regla, el área de exploración de un punto son sus 8 puntos circundantes, excepto 2 de ellos, el previo del que este viene y el 'abuelo' previo. Cuarta regla cuando haya 2 o más puntos elegibles, se elegirá aquel que más se aproxime al centro (al píxel que definimos como centro del mapa, para ello si es preciso se hace en cálculo de distancia euclidiana. Si hay más de 1 punto elegible con la misma distancia se elegirá con preferencia aquel que avance en la dirección actual de avance (avance general respecto del cuadrante, el cuadrante no es partir el mapa por el centro sino dividirlo por el punto más brillante, vertical y horizontalmente, estar en un cuadrante implica la dirección de subir, bajar, derecha o izquierda. Al caso un área en forma de rombo define más claramente una dirección pero su cálculo resulta más costoso). Un punto que sale del mapa por un lateral debe intentar continuar por el siguiente cuadrante en el primer área libre. Si en el cuadrante por el que sale aún hubiera en su dirección de avance áreas libres haría a entrar y si se precisa volver a salir, pero avanzando en la dirección de giro. Si un punto no encuentra avance próximo a su dirección de avance puede cambiar su avance '90º' con preferencia a '180º', es decir debe elegir el punto más favorable a seguir su dirección hasta que salga del cuadrante, una vez salido del cuadrante la norma que prevalece es la norma del nuevo cuadrante. a efectos de 'tramas' complejas, resultará más útil marcar 6,8 o más cuadrantes, de hecho para una aproximación más realista usar 360 cuadrantes basados en grados respecto de lo que definimos como centro sería muy efectivo manteniendo a la vez uno de 4 cuadrantes y operando buleanamente sobre ambos. Habria que dar ponderación mayor al de grados a medida que el 'radio' aumenta. Un punto debería intentar buscar al primero como meta tras completar el cuadrante 3º, al hacerlo se considera área cerrada la interna a dichas líneas, se marcan en la matriz y se procede a por otro nivel inferior en el bucle de brillo. ----------- En vez de hacer una interpolación de los puntos yo te sugeriría una intercalación, subdiviiiidiendo cada área en 5 a lo largo y 5 a lo ancho, así un área actual puede ser 'pisada por bastantes más puntos y trazar líneas más fielmente. La diferencia con el sistema que tienes ahora es que el sistema actual es más analógico y menos digital, aunque es más preciso el punto exacto es un área muy grande para ser retirada modularlo te permite ir retirando a una matriz los ya visitados. En la práctica un punto podría ser pisado por tantas líneas como se quiera, pero nunca interior al nivel anterior ya cerrado. Muchas líneas muy prósimas indicarán una caída abrupta del nivel, de ahí que las líneas tiendan a juntarse. El sistema de oclusión y definición de un centro (0 varios) te permite ir descartando áreas libres y definir reglas. Piensa en el mapa con el siguiente ejemplo. Imaginemos que hay una nube sobre una población, que esa nube no se moverá en cierto tiempo y que deseamos recorrrer perimetralmente la sombra proyectada sobre el suelo, pero en forma de espiral empezando por un centro de 50 metros hasta el radio externo de 1km.... hechamos a andar y todo va bien es fácil seguir el terreno liso, de repende hay que saltar colina abajo en terrazas, no nos está permitido saltar x terrazas a la vez si no una a una. Ahora imagina que llegamos a un precipicio, no resulta posible pasar, hay que bordear, pero alejándose lo menos posible, finalmente encontramos un pequeño puente que atraviesa un estrecho desfiladero... auqneue rodeemos varias veces (como dijimos en espiral), al llegar a este punto siempre deberemos cruzar por este puente, excepto que alejándonos más exista otro puente u otro accidente que facilite su acceso. Básicamente en ese ejemplo se dan las mismas circunstancias que al caso que tienes, por tanto cuando te atranques puedes pensar en ello de un modo no abstracto, marcando la similitud entre los casos. Luego otro método, dependiendo de lo fidedigno que tengas o deses hacer el trazado, yo equivaldría los valores de los voltajes con más variedad de colores y como te digo seccionado cada área en otras mucho más pequeñas. Ya que entonces podrías filtrar la imagen resultante, podrías hacer un histograma y ecualizarlo después... Al trabajar con imágenes se habla de segmentación, que es el primer paso para su análisis, por tanto aplicando un filtro de detección de bordes, tu algoritmo sería finalmente más sencillo de que funcionara, igualmente un filtro direccional sería muy eficaz. Un filtro de este tipo (3*3) aplicado a una imagen de pongamos 800*600 píxeles se aplica en unos pocos segundos en VB...incluso. Según lo que necesites y por tanto por el método que te decidas podría darte otras indicaciones, para no extenderme vanamente. ----- p.d.: Se me pasó una regla importante... Dado qu parece que obtienes el siguiente valor a localcizar en el mapa de una forma directa (quizás basado en una variable temporal (elativa al tiempo)), tu problema puede simplificarse ya que las reglas irían condicionadas a buscar el camino desde el punto a hasta el punto a +1 (el nuevo) y mediar que si la distancia es superior a unárea entonces buscar el camino de puntos intermedios hasta alcanzar aquél. La estrategia es algo distinta en cuanto se conoceel destino y se trata de buscar el camino más propicio siguiendo las reglas. como indiqué no es correcto saltar de un área a otra que no sea contigua sino 'bordeando', como hicimos en el ejemplo al llegar al precipicio... al caso la regla para bordear es que el área elegida debe tener un brillo comprendido entre el punto actual y el punto objetico, pero ni mayor ni menor y por supuesto manteniendo las otras reglas de no visitar áreas internas a otras regiones, aunque sí el mismo borde de la última. En la práctica esto supone que a partir de que el siguiente punto sea distante (por ejemplo en el primer gráfico malo el punto a-6 con respecto a c-6), debe crearse un árbol para definir la ruta a trazar, siendo el punto actual el nodo padre, cada nodo debería tener al menos 3 valores, el siguiente punto que elegimos para seguir después de éste, si descendenciendo por aquella rama resultare ineficaz, necesitamos un valor para especificar que fue recorrido y descartado y otro valor más que indique que desde ese nodo había x nodos (puntos) que perfectamente erán accesibles, esos x nodos se colocaron como hijos de aquel pero se empezó a recorrer el primero de ellos (se supone que al añadirlos como hijos se hizo en orden de preferencia de acuerdo alas reglas implicadas: lleva la misma dirección la diferencia de brillo es la menor con respecto a él, etc... si después de seguir un camino nos 'pierde' , vamos ascendiendo en el árbol hasta encontrar un nodo que marque tener más de un hijo posible, entonces marcamod como rechazado el visitado y avazamos por el hermano de éste... Hay algoritmos eficaces para encontrar un camino dadas unas condiciones, sin embargo debes adaptarlo a tus necesidades. Una vez hallada la ruta debes colocar llos puntos que por el árbol llevan desde el objetivo subiendo hasta el actual. Te adjunto un pequeña imagen de este paso que debería hacer tu algoritmo... estos pasos no están fijados por tu 'generador' de valores y puedes considerarlos al caso como una pérdida de resolución que debes suplir.
419
« en: Viernes 17 de Octubre de 2008, 02:40 »
En vez de dar a editar a este le di sin darme cuenta a responder, el mensaje sea ha repetido y no deja eleiminarlo, por tanto vacío este... y lo traslado a aquel.
420
« en: Miércoles 15 de Octubre de 2008, 15:09 »
Tengo la impresión de que tu array parte de una imagen y que de alguna manera tratas de analizarla, traspasando los resultados al array que muestras.
Según veo el array no está ordenado. Supongo que los valores de cada casilla corresponden a una tabla inamovible y fija para un determinado array. Lo que no alcanzo a comprender es que quieres decir exactamente con 'para figuras mas complejas no es capaz de seguir el orden natural de las figuras' porque según veo si el array tiene valores en las casillas y no están ordenados de mayor a menor, obviamente al unir puntos saltará entre casillas distantes entre sí en vez de a una adhyacente o a otro punto sobre sí misma (que creo que es lo que finalmente pretendes) Si el array estuviera ordenado te sugeriría una búsqueda binaria mejor sobre un array unidmensional y luego estraer fila y columna de la posición absoluta en aquel array. fila= index 10 : columna= index mod 10. ganarías velocidad de cálculo pero ignoro si estás limitado al mapa tal cual sin ordenar.
Si especificas claramente esto: seguir el orden natural de las figuras es posible que pueda indicarte un algoritmo..
p.d.: Puedes mostrar los números que aparecen en el 2º gráfico sin las líneas....ese que indicas como malo ???? de repente intuyo que pretendes trazar 'líneas de nivel' basados en la intensidad de la luminancia del mapa...
421
« en: Miércoles 15 de Octubre de 2008, 12:28 »
Indistintamente de tus intenciones... Saber sobre seguridad es algo no sólo curiosos sino necesario y por tanto algo que todo aspirante a programador tiene que tratar.
Yo te recomiendo que dejes la red... e intentes primeramente resolver el tema de la clave, imagina simplemente que no hay limitaciones en cuanto a bloqueos y para el caso por ejemplo crea un archivo RAR con contraseña he intenta con tu programa localizar la clave por fuerza bruta. Será un ejercicio excelente.
Algunoas cosas más... Las contraseñas de la gente 'corriente' suelen ser del tipo 'nombre de mi mascota' , nombre de un amigo o mote de niño', fecha de nacimiento, nombre de una población donde estudió, etc... porque no son conscientes de lo que implica e ignoran que quien intente acceder a sus 'cuentas' no lo va a hacer teclaeando al azar precisamente. En cambio las contraseñas de gente más informada ya son del tipo 4rf_ds6x9jk22l327. La diferencia entre los 1ºs y los 2ºs es que el ataque de diccionario sólo sirve para los 1ºs ejemplo: "varsovia2001" , para los 2ºs el ataque deberá ser por combinatoria, otra característica a señalar es que los 1ºs a veces por la molestia de recordar tantas contraseñas de la vida, crean contraseñas muy cortas, por eso ciertos sistemas obligan a que como mínimo sea de 6 caracteres (ú otra cifra), en cambio los 2ºs rara vez usarán menos de 12 caracteres. Hay técnicas para recordar contrseñas como '4rf_ds6x9jk22l327', aunque la gente no suele molestarse...
El acceso a un fichero no tiene porqué ser pesado no importa el tamaño que tenga, salvo que tu ordenador sea viejo y tengas cietrtas limitaciones. Lo ideal es que el archivo sea de acceso aleatorio no secuencial, así las escrituras para generar diccionarios deben apuntar al final del fichero y las lecturas a la siguiente línea según el lenguaje que emplees busca si tiene una instrucción ReadLine'...
La ventaja de usar diccionarios (incluso por combinatoria) es el tiempo que puedas tardar en generar la siguiente combinación a leerla de fichero. Si los cálculos que hagas son complejos y tardes más en generar la siguiente clave que en leerla de disco, entonces interesa fabricarse varios archivos , la limitación de usar archivos es precisamente el tamaño del mismo, o lo que es lo mismo la cantidad de combinaciones posibles.
Si a ciencia cierta sabes que por ejemplo se usan 6 caracteres y que estos están limitados de alguna manera, pudiera interesar crear ese archivo.... para 6 guarismos son 720 permutaciones, luego habría que multiplicarlo por las sustituciones posibles de cada guarismo, así que habría 2 bucles uno externo para seleccionar que caracteres entran en juego y otro interno para alterar su orden, si no tuviéramos un tamaño fijo, deberíamos colocar otro bucle externo a estos que fuera fijando y pasando por los distintos tamaños de claves (al caso no lo hagas en orden correlativo creciente o decreciente, es más efectivo recorrer los pares y luego los impares o algo similar que dé más oportunidad a chequear por diferentes tamaños).
Te comento que yo por ejemplo en mis códigos cuando se falla una clave origino un retraso de 10 sg. antes de permitir un nuevo intento de clave, cuando uno se equivoca ese retraso pequeño no importa es despreciable, pero para un rastreador de claves implica que sólo podrá mirar 360 claves por hora, lo cual pierde toda su efectividad, especialmente si fuerzas a los usuarios a que cambien su clave cada cierto tiempo.
Busca descarga y observa este programa, te servirá de guía: "Advanced password Rar recovery" chequea aproximadamente 3000 palabras por sg. Nota que tu proyecto debería ser capaz de salvar el estado de análisis, para parar y comenzar en otro momento desde donde lo dejó, sino quieres perder todo el tiempo empleado anteriormente volviendo a empezar desde cero.
Una vez que hayas hecho el generador de claves y funcione bien, ya pasarás a estudiar la cuestión de la web u otras cosas, ten en cuenta que son aspectos diferenciables que deben realizarse independientemente.
422
« en: Miércoles 15 de Octubre de 2008, 11:13 »
Léelo todo o no te enterarás de la solución... y los psoibles problemas que pueden aparecer... No es recomendable que añadas código en dicho evento, ten en cuenta que ciertos eventos son asíncronos para ganar en velocidad y no tener 'colgada' la aplicación mientras se rellenan los datos (imagina una base de datos con millones de registros y una consulta de búsqueda compleja, si tarda pongamos un minuto en procesarla no podrías hacer nada más hasta terminar). Que sea asíncrono implica que no se va a a parar en cada evento a esperar que tu cóodigo sea totalmente resuelto... El resultado final sería pongamos que se vuelcan 1000 filas, se vuelca la fila 1ª notifica al evento de ello, tu código llama a ejecutarse, mientras sale, es leído y el usuario pulsa para cerrar ya se han volcado (pongamos para el ejemplo) 500 filas más.. como es asíncrono, si no recibió de vuelta la señal de un evento y se produce el siguiente caso de lanzar el evento, lo ignora y continúa. Simplificando, ciertos eventos no son hechos para lo que te dé la gana sino sólo para un procesado simple, por ejemplo si la fila añadida tiene el valor tal poner su celda de color x. Pero no están hechos para hacer código pesado.... Si el caso es que las filas se añaden de forma síncrona, tu código pueda susbsistir (como en el ejemplo añadido), pero repito si es asíncrono, en cuanto no se cierre de vuelta el evento no se disparará el siguiente evento pero la fila si será añadida por lo que tus notificaciones irán falseando los sucesos (inadvertidamente claro). Esto fue programado así debido a ciertas malas prácticas si se vuelcan 3000 filas en pocos sg. si el usuario ha de pulsar 3000 veces tardará 1 ó 2 horas en responder a la 'genialidad' del programador a la hora de 'ayudar' al usuario. Por eso se añadieron características para añadidos síncronos o asíncronos. Mi recomendación es que tu código sea tan simple como mostrar un contador de filas... y en el evento del datagridview lo que haces es leer la propiedad rowcount. Opcionalmente activas un timer con un intervalo pequeño que cambie una 'señal' a color rojo y a su vez ese timer dispare otro con intervalo pongamos a 300 msg. que lo vuelva gris al salir de ambos timers en caa uno se desactivan a sí mismos, así cuando se van añadiendo registros al datagridview, aparte de indicarlo en el contador que podría no ser muy visible hay un pequeño parapadeo del 'semáforo', si se añaden muchos registros seguidos el parpadeo será muy contínuo... el semáforo ponlo justo justo debajo de la etiqueta del contador así la atención cae a la vez sobre lo mismo.... Ahora bien lo anterior sólo se aplica cuando el origen es a su vez asíncrono, como una base de datos, si es el usuario quien añade la fila (o como en el ejemplo que te pongo al final) el caso es ditinto. Existen los eventos : RowsAdded y UsersAddedRow recuerda tambien que tienes RowsRemoved y (UserDeleteRow y UserDeletingRow esta para validar si el borrado se efectua o simplemente para copiar la fila antes de eliminarla y pasarla por ejemplo a otro datagridview oculto para acciones de deshacer, etc...) nota: para conocer los eventos de un objeto, mira en el panel de propiedades del objeto, verás en su cabecera varos iconos: el 1º ordena por categorías el 2º por orden alfabético, pero el 3º y el 4º son selectores para: ver propiedades del objeto o ver eventos... Cuando hagas dobleclcick sobre un evento te lleva a la ventana de código cargando ya la llamada del evento. nota2: cuando se dispara el evento userAddedRow también se dispara RowsAdded, tenlo en cuenta para no duplicar código y tener 'efectos' indeseados... Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load call Rellenar_DataGridV() End Sub Private Sub Rellenar_DataGridView() ' lo rellenamos con datos tomados del foro... DataGridView1.ColumnCount = 3 DataGridView1.ColumnHeadersVisible = True Dim miEstiloCabecera As New DataGridViewCellStyle() miEstiloCabecera.BackColor = Color.Orange miEstiloCabecera.ForeColor = Color.BlueViolet miEstiloCabecera.Alignment = DataGridViewContentAlignment.MiddleCenter miEstiloCabecera.Font = New Font("Arial", 20, FontStyle.Underline + Font.Bold, GraphicsUnit.Pixel) DataGridView1.ColumnHeadersDefaultCellStyle = miEstiloCabecera ' nota si hemos creado diferentes perfiles de estilo de cabecera se usan desde la siguiente línea DataGridView1.ColumnHeadersDefaultCellStyle.ApplyStyle(miEstiloCabecera) DataGridView1.EnableHeadersVisualStyles = True DataGridView1.Columns(0).Name = "Nombre Usuario" DataGridView1.Columns(1).Name = "Ubicación" DataGridView1.Columns(2).Name = "nº Mensajes" DataGridView1.Columns(3).Name = "Rango" Dim fila1() As String = {"Iron Man", "Barcelona", "1005", "Administrador"} Dim fila2() As String = {"Avalon", "Avalon", "447", "Usuario muy activo"} Dim fila3() As String = {"ibito", "Méjico", "519", "Miembro HIPER activo"} Dim fila4() As String = {"Robert.29", "Valladolid", "421", "Usuario muy activo"} Dim fila5() As String = {"Marlon", "?????", "152", "Miembro muy activo"} Dim fila6() As String = {"r3dsk1", "La tierra de los conocimientos...", "291", "Miembro muy activo"} Dim fila7() As String = {"Jimbenit", "Colombia", "70", "Miembro activo"} Dim filas() As Object = {fila1, fila2, fila3, fila4, fila5, fila6, fila7} Dim Fila As String() For Each Fila In filas DataGridView1.Rows.Add(Fila) Next Fila End Sub Private Sub DataGridView1_RowsAdded(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded MsgBox("La fila nº: " & DataGridView1.RowCount & " ha sido cargada...") End Sub end class
423
« en: Domingo 12 de Octubre de 2008, 12:04 »
Bueno pues si no hay una api para eso pues ni modo lo que pasa es que si se ponerle un icono a la aplicación pero lo que quería hacer era que apareciera la carpeta del sistema por defecto sea que si metiera mi aplicación en Windows XP saliera la carpeta de ese sistema y si metiera a Windows vista pues saliera en la aplicación la carpeta de Windows vista , pero pues ni modo. Sobre limpiar cadenas de texto utilice RtlZeroMemory y también funciono bien, y pues muchas gracias por las respuestas.  si que hay API para eso... 'ExtractAssociatedIcon ' extrae el icono asociado a un fichero.. recibe 3 parámetros instancia= la aplicación que hace la llamada... ruta= ruta del fichero o aplicación del que se quiere tomar el icono. indexIcon =índice del icono a obtener, cuando es una aplicación retiene el identificador del icono. Creo recordar que se encontraba en la librería shell32.dll Haz un export de las funciones de shell32.dll o 'guglea' un poco para obtener más info... Luego puedes usar loadIcon, DestroyIcon, GetIconInfo, DrawIcon , etc ... para operar sobre él. No obstante si lo vas a emplear para lo que señalas lo adecuado es que captures el icono una única vez y lo añadas como recurso en tu aplicación de instalación según detectes que sea XP o VISTA y no capturar en ese momento el icono... Yo he usado ExtractAssociatedIcon en alguna ocasión para precisamente obtener los iconos de aplicación para generar un treeview de asociación de extensiones... lo hacía más vistoso..
424
« en: Jueves 9 de Octubre de 2008, 02:05 »
Mis apariencias de Visual Basic 6 son como estas, pero me gustaria saber cuales usan ustedes??? (sé que utilizan cosas muy impactantes)
Existe un programa que desarolla estos skin, se llama SkinBuilder ... tienen mas skin??? Yo me fui cansando poco a poco de las limitaciones de los controles de MS y los fuí sustituyendo por los que he ido haciendo y modificando con el paso del tiempo. No obstante no me preocupa tanto la interfaz 'bonita' sino la capacidad de poder manejarlo a mi antojo... por ejemplo el 'forecolor' de los botones no se cambian (salvo que interceptes los mensajes), entonces para el caso es preferible hacer tu propio botón y listo, si le pones una imagen cambiando el 'estilo' a grafico la imagen no se ajusta al botón, lo que te fuerza necesariamente a crear una imagen justo de ese tamaño, lo cual es bastante absurdo salvo que toda la vida y todos los botones vayan a ser siempre del mismo tamaño, porque hacer una imagen a medida para cada botón es una idiotez.... y así pasa con todo... p.d.: precisamente vengo concibiendo desde hace unos días para acá hacer un nuevo 'control de fichas' (un tabulador de fichas)... el sstab por ejemplo si le cambias el color de fondo verás que lo que cambia es el 'usercontrol' de debajo del todo, pero el color no cambia y siempre tiene ese feo color grisáceo...
425
« en: Jueves 9 de Octubre de 2008, 01:36 »
A lo largo de la conversación ya se ha debatido acerca de los Variant, no resulta necesario darle más vueltas. Si has leído el post entero verás que no hace falta añadir nada más. Los variant deben usarse para casos especiales donde su uso tenga significado, si no es así se está desaprovechando capacidades de proceso. En cuanto a los tiempos de cálculo, te señalo nuevamente que lo más rápido es usar la API si se va a hacer un uso intensivo preguntando si un array está declarado, si no se va a hacer un uso intensivo prácticamente da igual el método que se use, ya que sólo es significativo cuando se va a hacer varios millones de consultas para 4 ó 5 consultas en un minuto -no i m p o r t a- . si has leído el post verás que 300.000 ejecuciones de un bucle en el peor caso de los 3 que presenté más arriba tardaba poco más de 1sg. por tanto no merece la pena ni discutirlo. De todos modos si quieres el más rápido te doy un código para que lo pruebes... y dejemos esta conversación ya, no hay nada más que añadir, a lo sumo si a alguien le cuesta entender algo, y end icho caso que pregunte... Este código será el doble o el triple (al menos) de rápido que cualquier otro que hayas usado en VB Colcar un boton y un textbox en el formulario. Private Declare Sub ArrayDeclarado Lib "msvbvm60.dll" Alias "GetMem4" (elArray() As Any, devol As Long) Private Sub Command1_Click() dim n as long, t as single, tamaño as long dim apiArray() as integer t = Timer For j = 0 To 10 for k= 0 to 30000 Call ArrayDeclarado(apiArray, n) If n > 0 Then ReDim Preserve apiArray(0 To UBound(apiArray)) apiArray(UBound(apiArray)) = k Else ReDim apiArray(0 To 0) apiArray(0) = 0 End If Next Erase apiArray Next j Text1.Text = Timer - t Tamaño = 300000 * Len(apiArray(0)) msgbox "Tardó: " & Text1.Text & "sg. y el tamaño de la matriz era: " & Tamaño end sub ' NOTA: el código se ha embutido de las mismas características que se dieron algunos mensajes más arriba para compararlo en idénticas condiciones.
p. d.: fíjate en la declaración de la API como se declara el parámetro 'elArray' como as 'any' (cualquier tipo) precisamente para relajar la comprobación de tipos... si no fuera así, esa función requeriría una copia específica por cada tipo de datos y sucedería igual con muchísimas funciones...
Páginas: 1 ... 15 16 [17] 18 19 ... 29
|
|
|