|
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 ... 7 8 [9] 10 11 ... 29
201
« en: Viernes 28 de Agosto de 2009, 15:52 »
Te voy a responder de un modo un poco abstracto, ya que lo que dices que realmente quieres es ser más óptimo.... no manifiestas claramente si tienes un problema y cual es... Cuando tienes que manejar variables que deban cumplir ciertos requisitos hay dos formas de controlarlas adecuadamente con VB6. 1 - Si los valores proceden de entrada del usuario (pior ejemplo un textbox), es útil usar el evento validate de los controles (la propiedad causesvalidation debe estar establecida a True). 2 - Utilizar propiedades: al utilizar propiedades tienes la oportunidad de dar formato espécifico y controlar el contendio de un valor. Esto es más útil que usar el evento validate, en muchos casos, por ejemplo imagina que utilizas un único textbox para las entradas del usuario y es un botón distinto el que se encarga de indicar que dato es el que se modifica... Sobre el evento validate y dar formato se ha hablado bastante en los foros, puedes hacer una búsqueda, yo te señalo por ejemplo este hilo: viewtopic.php?f=143&t=39214&p=142589&hilit=Format#p142589Y para comentar sobre las propiedades un pequeño ejemplo de código.... coloca 4 botones, un textbox y un datetimepicker, renómbralos así: el textbox: txtDato ; boton1 : ComNombre ; boton2 ComSocio; boton3: ComFecha; boton4: ComAceptar ; el datetimepicker: DTPicker1, los caption para poner a los botones se deducen de sus nombres.... Private Enum DatoFoco foco_Nombre = 0 foco_Fecha = 1 foco_Socio = 2 End Enum Private p_Fecha As Date Private p_Nombre As String Private p_NumeroSocio As Long Private s_Cambio As Boolean ' lo usamos para que el botón aceptar sepa adónde dirigirse Private s_Foco As DatoFoco Private Property Get Nombre() As String Nombre = p_Nombre End Property Private Property Let Nombre(ByVal n As String) If n <> "" Then ' fuerzo formato, por ejemplo mínimo 6 caracteres If Len(n) > 5 Then p_Nombre = n s_Cambio = True Else MsgBox "El nombre debe tener mínimo 6 caracteres" End If Else MsgBox "El nombre no puede quedar vacío..." End If End Property Private Property Get NumeroSocio() As Long NumeroSocio = p_NumeroSocio End Property Private Property Let NumeroSocio(ByVal n As Long) ' limito a un valor comprendido entre 900 y 4233 If (n > 899) And (n < 4234) Then p_NumeroSocio = n s_Cambio = True Else ' no se acepta el cambio MsgBox "el número de socio debe estar entre 900 y 4233." End If End Property Private Property Get Fecha() As Date Fecha = p_Fecha End Property Private Property Let Fecha(ByVal f As Date) ' limito a un valor a partir de hoy (para probar) If DateDiff("d", Now, f) >= 1 Then p_Fecha = f s_Cambio = True Else ' no se acepta el cambio MsgBox "La fecha tiene que ser posterior a hoy." End If End Property ' asignamos valores iniciales al cargar elformulario Private Sub Form_Load() p_Nombre = "Nombre" ' no queda vacío... With TxtDato ' nos aseguramos que el ancho del textbox lo es tanto como será el datetimepicker ' botón del datetimepicker .Width = TextWidth(" fechaelegida: domingo 31 de diciembre de 0000 hora: 00:00:00 zzzz") .Alignment = vbCenter .Text = p_Nombre Call DTPicker1.Move(.Left, .Top, .Width, .Height) End With With DTPicker1 ' 1 día menos que hoy, lo hacemos a propósito para poder elegir una fecha menor y ver como la propiedad no deja cambiarlo... .MinDate = DateAdd("d", -1, Now) .MaxDate = "31 diciembre " & Year(Now) .Format = dtpCustom ' personalizado ' HH formato 24 horas, hh formato 12 horas... .CustomFormat = "'Fecha elegida: ' dddd dd MMMM yyy ' Hora: 'HH:mmtt" 'cadena personalizada dentro del formato entre comillas simples ' otro ejemplo de formato personalizado... campos de fecha separada por _-_ y hora entre corchetes, mostrando segundos. '.CustomFormat = "'sólo éste año: ' dd'_-_'mm'_-_'yyy ' ['hh:mm:sstt']'" End With Me.Show p_Fecha = Now p_NumeroSocio = 1200 ' por ejemplo s_Foco = foco_Nombre CambiarVisibles ' oculta el timepicker y muesta el textbox ComNombre.SetFocus End Sub Private Sub ComNombre_Click() TxtDato.Text = Nombre s_Foco = foco_Nombre CambiarVisibles End Sub Private Sub ComNumSocio_Click() TxtDato.Text = NumeroSocio s_Foco = foco_Socio CambiarVisibles End Sub Private Sub ComFecha_Click() DTPicker1.Value = p_Fecha s_Foco = foco_Fecha CambiarVisibles End Sub Private Sub ComAceptar_Click() Select Case s_Foco Case DatoFoco.foco_Nombre Nombre = TxtDato.Text ' valida la entrada del dato TxtDato.Text = Nombre ' devuelve el valor validado Case DatoFoco.foco_Socio NumeroSocio = TxtDato.Text ' valida la entrada del dato TxtDato.Text = NumeroSocio ' devuelve el valor validado Case DatoFoco.foco_Fecha Fecha = DTPicker1.Value ' valida la entrada del dato DTPicker1.Value = Fecha ' devuelve el valor validado End Select End Sub ' cuando elegimos un botón traemos al frente o debajo el timepicker sobre el textbox.... es decir ocultamos el que no se va a utilizar, debajo del otro(los hicimos del mismo tamaño ubicados en la misma posición) Private Sub CambiarVisibles() 'TxtDato.Visible = (s_Foco <> foco_Fecha) DTPicker1.ZOrder (1 And (s_Foco <> foco_Fecha)) 'TxtDato.Visible) ' sube a primer plano o lo manda debajo del textbox End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If s_Cambio = True Then ' han cambiado los valores de al menos una propiedad... ' si se usa una base de datos sería indicativo de guardar cambios antes de salir If MsgBox("Han cambiado datos de algunos campos, desea guardarlos a la base de datos?.", vbInformation + vbYesNo, "Guardar cambios....?") = vbYes Then ' guardar cambios en la base de datos ' ......... Else MsgBox "Los cambios realizados han sido desestimados..." End If End If End Sub
Si alguna parte no la entiendes avisa...
202
« en: Sábado 22 de Agosto de 2009, 18:09 »
... se me olvidaba ... si ves que parpadea mucho la imagen activa la propiedad autoredraw del formulario, irá más un pelín más lento, pero también más suave....
203
« en: Sábado 22 de Agosto de 2009, 18:06 »
Hay 4 formas de solucionarlo, pero mejor te lo explico... El formulario, es un contenedor y como casi todos los contenedores implementa una funcionalidad para recibir el foco (la propiedad causesvalidation y por tanto el evento validate, pertenecen también a esta interfaz). Ahora bien cuando un contenedor no implementa dicha funcionalidad, no puede retener el foco pero si uno de sus controles contenidos si se 'gana' el foco. Éste es precisamente el caso del frame, el frame es un contenedor que no implementa la funcionalidad de foco (en realidad no es exactamente así, si implementa funcionalidad de foco, pero la enmascara, lo que para el caso es casi lo mismo que si no la tuviera) , porque está concebido como un contenedor ligero con la única finalidad de agrupar y mantener ordenados los controles, por eso tampoco incluye otras propiedades como picture ni eventos de teclado (aunque si los de ratón).... el frame lo que hace es repartir el foco entre los controles, sin salirse del contenedor si usamos las teclas... No es todo, luego vamos más a ello. Te ha dado la curiosa e infrecuente coincidencia de que sólo tienes un control más que precisamente tiene la propiedad tabindex a 0. cuando se carga un formulario el control que tiene el foco es aquel que tiene la propiedad tabindex más baja, además mediante la propiedad tabindex podemos pasar el foco de un control a otro, usando precisamente la tecla 'Tab' (tabulador) que va pasando de índice a indice. Dentro de cada contenedor, siempre hay un control que es el que recibe el foco por defecto, esto complica un poco la forma en que el tabulador se mueve... el caso es, que si el contenedor puede recibir el foco (el frame ya hemos dicho que no, pero un picture, si) y éste tiene controles, el tabulador irá primero al control que tiene seleccionado por defecto si tiene el tabindex menor que el contenedor y luego al contenedor y luego se irá a otro contenedor, es decir el contenedor actúa como 1 sólo control si no puede recibir el foco o como 2 si puede recibir el foco... como tu pregunta no va por aquí, no me extiendo más sobre el tema salvo que alguien quiera saber más sobre ello... Dadas esas coincidencias paso a explicarte las 4 soluciones: antes que nada si el formulario tiene controles, y queremos usar teclas sobre el propio contenedor (el formulario) debemos establecer la propiedad KeyPreview a true, esto le dice al formulari oque los eventos de teclado primero los envíe al formulario para procesarlos y luego a los controles, si no se hace esto se manda la pulsación de tecla como un evento de teclado del control que tiene el foco... digamos que esta es la manera que tiene el formulario de ganar el foco a través del teclado... Bien habiendo activado esa propiedad... Solución 1: mantén pulsada la tecla CTRL y/o ALT y/o Mayúsculas (1 de las 3 o cualquier combinación de ellas a la vez) y sin soltar mientras pulsas las teclas de dirección que has fijado para el cubo. Si sólo pulsas las teclas no hace caso... Solución 2: añade un picture al formulario, mándale el foco al picture ... ahora ya te 'obedece', sin tener que pulsar combinaciones de teclas.(si no le mandas el foco directamente por código, al pulsar una vez tecla de dirección le estás enviando el foco desde el botón (Cerrar) al picture, por tanto la próxima pulsación es ya efectiva para 'mover el cubo'. Solución 3: Esta es la más acertada... en vez de 'dibujar' el cubo sobre el formulario dibújalo dentro de un picture, dedícalo exclusivamente para dibujar, no le metas controles... así el foco no se 'pierde' entre los controles Solución 4: funciona incluso sin tener activada la propiedad keypreview del formulario... el dibujo sigue sobre el formulario pero quien atiende al evento no es el formulario sino un picture... por tanto añade un picture al formulario, pincha sobre él (mándale el foco de la forma que prefieras, utiliza las teclas... todo el código que tienes dentro del evento: Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) .... 'el código que tienes aquí... End Sub
lo cortas y lo pegas al evento del picture Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer) .... 'páslo aquí... End Sub
Convendría que no metieras entonces nada en ese picture y éste podría tener un tamaño muy pequeño, de tal modo que pareciera más un botón y haciéndose a la idea tal que para poder dibujar hubiera que activar el dibujado, para fomentar esta sensación podrías ayudarlo con algo como el siguiente código... Private Sub Picture1_GotFocus() Picture1.BorderStyle = 0 Picture1.BackColor = vbGreen End Sub Private Sub Picture1_LostFocus() Picture1.BorderStyle = 1 Picture1.BackColor = vbRed Timer1.Enabled = False End Sub
Si algo te ha resultado confuso, das un aviso, aunque como estoy de vacaciones, posiblemente pasen varios días hasta que vuelva a ojear el foro... y en todo caso será un vistazo rápido...
204
« en: Sábado 15 de Agosto de 2009, 06:08 »
Trazas una línea diagonal. como el modo de escala lo has puesto en milímetros, un valor de 10 es 1 cm. No veo ningún error... luego deduzco que el problema deriva de otras propiedades que tienes activadas... Puede aparecer algún error de visionado, pero si es este caso, éste debe ser por otras propiedades que tienes en el picture que le pasas a la función... me refiero a propiedades tales como Drawmode, drawwidth, como es una línea y no una caja en este caso no se considera fillstyle y como le indicas el color blanco, tampoco importa fillcolor... El otro posible error es del tipo 480, de Autoredraw.... suele deberse al tamaño del control y estar relacionado con el modo de escala del contenedor ... trato de explicártelo... al establecer el ancho al picture de las medidas del formulario, utilizas la propiedad width y height, si por ejemplo hay tablecido una escala en el form de pixels, y este tiene 1000 pixels de ancho, al pedirle el 'Width' VB te da los twips que es (1000 * screen.TwipsperpixelX) (por ejemplo yo que tengo una resolución de 1600x1200 esta constante (screen.TwipsperpixelX es de 15 , de hecho un vistazo rápido da 15120 twips, los 120 twips restantes son del borde del form (4 píxeles a cada lado: 4*2 * 15= 120 twips)... ...Esto origina entonces que el width de tu picture sea 15120 milimetros (ya que toma el valor que le das ) un ancho así por un alto también grande (15120 milimetros es 15'12 metros) precisa una gran cantidad de memoria para administrar el contenido gráfico, al activar autoredraw por tanto se desborda el tamaño que Mocosft tiene limitado ... En la práctica esto sreporta un error de Autoredraw, con el número 480. Esto tiene 3 soluciones: 1 - El modo más sencillo (no es el más eficaz y también puede darte problemas si no conoces a fondo como interactúan las escalas) es tener el formulario con la misma escala que el picture. Ahora bien el cambio de escala del formulario debe tenerse en cuenta el tamaño, puede dar también el error 480, si por ejemplo estableces esclas como milimetros o cm. si tu pantalla es de 15 cm de ancho, por ejemplo, y le pasas el ancho en pixels (pongamos 640) interpreta que son 640cm (6'4 metros). Si notienes claro como actúa VB, es mejor que lo modifiques en diseño y veas como afecta a las medidas... 2- Si necesitas mantener el tipo de escala en el formulario por ejemplo en vbpixels (3), entonces puedes usar las propiedades scalewiidth y scaleheight para tomar sus datos, scalewidth y scaleheight mantiene los valores de la medidas de ancho y alto del objeto de acuerdo al modo de escala que tiene el control. ( Mucho ojo, cuando la escala está en VbUser (0), ya que en este caso puedes definir cualquier unidad como medidas para el control, en este caso la constante de escala es libre queda definida por el usuario respecto de los twips ... Para pedir las medidas que tiene la escala debes usar scalewidth y scaleheight en vez de width y height, tal como te indico en el código siguiente... nota que esto no establece el picture del mismo tamaño que el formulario que es lo que intuyo que quieres hacer... 3 - Éste modo es el correcto, con él controlas perfectamente las medidas entre diferentes escalas. No necesitas cambiar la escala del formulario, puede estar en la que precise estar y además logramos que el picture tenga las mismas medidas que el formulario, que es lo que tú (creo) que quieres... te pongo el código, que además creo (recordar vagamente) ya habertelo explicado en alguna ocasión anterior a propósito de otro código donde modificabas propiedades del cliente... .Width= scaleX(me.Width, me.scalemode, .ScaleMode) ' ...etc...
Como ves, toma la medida origen y cambia su valor desde la escala en la que está a la escala a donde se destina, podemos poner directamente la escala si la conocemos o bien dado que pasar controles por referencia y cada control podría tener una escala distinta, solicitar la escala del control (es lo que hacemos en el código de ejemplo) donde se va apllicar (la del picture). Esto lo hace tomando las constantes que mantiene entre escalas... y las constantes de la pantalla (que dependen de la resolución a la que esté el monitor)... como usas en destino escalas decimales, lo que dibujes se verá del mismo tamaño independientemente de la resolución del monitor... y del monitor en que se vea. Espero haberte aclarado tus dudas... ya que no identificas el tipo de error que te resulta. Eso sí, cuando un control debas establecerle varias propiedades piensa en usar mejor el método move, como en el ejemplo, ya que establece las 4 propiedades de una sola vez (no fuerza a repintar la ventana con cada propiedad modificada sino que se hace de una vez, esto es las comprobaciones pertienentes se hacen una sola vez y se redibuja al final, por tanto una sola vez y no 4. ' usa esto....: call .Move ( 0,0,me.width, me.height) ' O bien esto, si una propiedad no varía: call .Move( .left, .Top, me.width, me.height) ' si no quieres usar el call debes quitar los paréntesis... ' ....cuando quieras usar esto. Esto fuerza a redibujar el formulario 4 veces, el modo de arriba sólo 1: .Top = 0 .Left = 0 .Width = Me.Width .Height = Me.Height
205
« en: Viernes 31 de Julio de 2009, 14:08 »
yo utilizo un codigo para recojer el serial del disco duro (esto esta en una aplicacion aparte) luego lo encripto y despues la cadena de datos lo guardo en la base de datos, y con eso solo la plaicacion abre cuando este instalada en el disco duro que tenga el serial que esta guardado en la base de datos.
Julio, aunque la medida pueda ser efectiva no deja de ser conflictiva, ya que lo estás supeditando a que sólo funcione en un disco duro... que pasa en casos típico y nada infrecuentes en que un usuario decida comprarse un disco nuevo porque el que tiene le queda pequeño o simplemente porque le falla mucho, o aún más normal, una redistribución de las particionesy los discos duros tras un formateo, el que antes era el master, ahora es el esclavo y por tanto la aplicación va a otro disco duro, distinto del anterior. ?. qué pasa si lo tengo instalado en un ordenador de sobremesa, pero necesito tenerlo también instalado en un portátil, por cuestiones de movilidad ?. Después que un usuario ha adquirido un programa tuyo no puedes molestarle con cada cambio que un usuario decida o tenga que hacer, además si tienes muchos usuarios significa que perderás mucho tiempo en explicaciones para resolver la situación y si cobras el tiempo, pensarán que es injusto pués ya te compraron el producto y el problema presente no es achacable a otra cosa que un funcionamiento inadecuado del software, por lo que considerarán injusto que paguen por ello. Por cuestiones éticas no me parece adecuado que un software quede ligado a un determinado hardware. Quien adquiere el producto es el usuario no la máquina, por tanto es el usuario quien debe decidir donde lo instala y si quiere o no (cuando lo desee o necesite) portarlo a otro ordenador.
206
« en: Domingo 26 de Julio de 2009, 01:59 »
Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Or KeyAscii = vbKeyExecute Then DataGrid1.Col = x DataGrid1.Row = y DataGrid1.SetFocus DataGrid1.Text = Text1.Text End If End Sub
'X' e 'Y' serán las cordenadas en las que quieras enviar el foco. No es absolutamente necesario escribir el texto de la celda seleccionada... es sólo ilustrativo. Una cosa más... aquí nadie tiene obligación de nada, cada uno ofrece su tiempo libre (cuando lo tiene) en ayudar. Tu pregunta como otras tantas (al menos a mi) no gusta contestar porque es algo que se encuentra en cualquier parte, casi incluso en cualquier manual por elemental que sea. En cualquier caso insultar a la gente es el modo más seguro de que nadie te haga caso, así que te pediría que quites eso de 'changos'... en caso contrario (al menos yo) no me molestaré siquiera en leer posteriores mensajes tuyos.
207
« en: Sábado 25 de Julio de 2009, 00:13 »
Yo lo he probado y funcionaba perfectamente.
Por qué no pones el código que estás utilizando ahora ?. Así podría ver donde está el problema...
208
« en: Martes 21 de Julio de 2009, 10:49 »
el código que tienes tiene algún pequeño error... Private Sub Form_Load() Randomize Timer ' si no hacemos esto RND siempre producira la misma secuencia de resultados, cada vez que ejecutemos el programa End Sub Private Sub Command1_Click() Dim vector() As String Dim palabra As String Dim i As Integer Dim aleatorio As Integer Dim temp As String ' nos aseguramos que la palabra no queda vacía, y que al menos tiene 3 letras... esto es al gusto... Do palabra = InputBox("Ingrese una palabra") If Len(palabra) < 3 Then MsgBox "debe introducir al menos 3 caracteres" Loop While Len(palabra) < 3 ReDim vector(0 To Len(palabra) - 1) For i = 1 To Len(palabra) vector(i - 1) = Right(Left(palabra, i), 1) Next i For i = 0 To Len(palabra) - 1 temp = vector(i) aleatorio = Rnd * (Len(palabra)) vector(i) = vector(aleatorio) vector(aleatorio) = temp Next i ' quitamos el bucle de 'anagrama' hay una función para eso en vb MsgBox Join(vector, ""), vbInformation End Sub
A qué llamas 'ejemplos de anagramas' ?????????. Un anagrama es trasliterar el orden de las letras de las palabras....
209
« en: Martes 21 de Julio de 2009, 10:23 »
Esto lo puedes hacer tu fácilmente.
Crea un fichero con frases o citas célebres... Luego desde vb, al iniciarse el programa lees el fichero para tomar las entradas que tiene, utilizando un timer eliges al azar un número entre 1 y el máximo de citas del fichero, acto seguido cargas del fichero la línea que indica el número seleccionado al azar.
Si el fichero no es mjy grande interesa leer el mismo al cargar el programa y guardar las citas en una matriz. Si el fichero es muy grande, es mejor que al cargar sólo recojamos la información necesaria para utilizar el fichero y leer la cita concreta cuando el timer se lance.
210
« en: Martes 21 de Julio de 2009, 10:17 »
Ser posible, es posible... Sólo tienes que crear en un listbox las entradas que tu quieras. Luego al pulsar en un ítem del listado invocas la url asociada al ítem, algo así como la lista de favoritos de internet explorer.
Si lo quieres más llamativo utiliza iconos, la descripción sobre el tag de la imagen y al pulsar en la imagen invocas la url... Sería ideal si además pudieras actualizar la lista, se entiende que hay a una sección fija en una página, pero siempre puede haber una sección de actualidad... Esto lo podrías programar con un timer que cada x horas accediera a una página en principio no viisible al usuario donde tu ya colocarías los 'accesos directos' a esas secciones de actualidad que van variando. Básicamente se trataría de comparar la lista de la sección de actualidad que tiene el usuario y la que has puesto en la página, del usuario eliminarás los que ya no existan en la lista de tu página y descargarías al usuario los que él no tiene todavía. O bien más drásticamente, eliminas todos los que tiene el usuario y le desacargas los nuevos que has puesto... vamos una típica actualización.
Podrías hacerlo más efectivo dejando al usuario que elija un límite de noticias máximas (que fije al gusto) y que él decida el intérvalo de actualización.
Yo me crearía un control activex, pero en función de tud conocimientos tendrás que conformarte con algo más sencillo y asequible en simplicidad a tus conocimientos de programación.
Seguro que hay multitud de cachivaches para hacer eso que quieres pero con pequeñas o grandes diferencias, no obstante yo te recomiendo que lo hagas tú mismo. Tiene varias ventajas, siempre puedes hacer añadidos y cambios no estás forzado a hacer determinadas cosas que algún programa pueda exigir. si optas por buscar un programa de terceros asegúrate al menos que hace cosas que el usuario no quiere, como espiar, recabar datos de su máquina o del usuario,etc...
211
« en: Martes 21 de Julio de 2009, 09:55 »
Hacerse, se puede hacer, pero no seré yo quien te diga como... tu mensaje tiene toda la pinta de un espía.
Tu me cuentas que es para 'traducir' y yo entiendo que es para ejecutar código intermedio, que efectivamente podrías utilizar para traducir, pero que no me creo nada.
Como espías y troyanos son programas y programadores que deberían desaparecer (en mi opinión), no voy a alimentar a un troll de este tipo.
Si realmente lo quieres para traducir y no para interponerte entre un programa y el usuario, entonces no tendrás ninguna objección a traducir enteramente el menú y a un lado de la pantalla mostrar un listado de equivalencias ingles-español:
File = Archivo Copy = Copiar Open = Abrir
Tiene una gran ventaja además sobre lo que propones, y es que no se pierde tiempo 40 veces en traducir si 40 veces pulso el menú copy, con traducirlo 1 única vez es suficiente. Todavía más útil, si mandas una traducción al programador de dicho programa seguro que hasta te agradece la traducción al español de su programa, cuya ventaja es que sólo se ejecuta el código de traducción 1 vez, cuando se carga el programa... es más rápido que buscar la traducción contínuamente a cada pulsación del menú o de un botón ...
Bien ya no te quedan argumentos, para querer traducir entre el programa y el usuario escepto claro está espiar... Por tanto si tu intención primitiva era traducir ves que te he ahorrado el trabajo de escribir un programa bastante inútil, y si tu intención es sumarte a la comunidad de trolls que hacen de este planeta un sitio cada vez más incómodo entenderás que no vas a tener ni una línea de código.
212
« en: Martes 21 de Julio de 2009, 09:40 »
Bueno, veamos, varias cosas que decir... empezaré por la raíz, y terminaré por tu problema. En el código evita utilizar nombres de variables inexpresivas, es decir variables como: i,12,sf,sc no significan nada, tú las entiendes hoy, si guardas el código un mes y luego lo relees es probable que recuerdes que se esperaba del programa pero si llevas la atención a una línea cualquiera y ves sc=0 no sabrás que está haciendo... por ejemplo sf podrías llamarlo Total1 y sc podrías llamarlo total2 a c lo podrías llamar Entrada1 y a f entrada2 o bien a c 'columna y a f Fila que imagino era la idea, la única excepción honrosa para esto suelen ser las variables de bucles si no tiene un propósito anterior, sin embargo en en bucles anidados usa variables consecutivas i,j,k,l,m además si te acostumbras a usar siempre un punto inicial y mantienes esa regla si ves k y siempre empiezas por i sea donde sea en tu código sabrás que k es el 3º bucle anidado... para corregir errores o despistes un simple conjunto de reglas para establecer nombres o mejor para no cometer errores es primordial... A lo que veníamos... El código es totalmente correcto en su ejecución, la razón porque tu no ves nada es porque no has elegido la rutina adecuada para presentarlo, si el código lo ejecutaras desde un botón verías que funciona correctamente. Es que no se puede usar el load ?. Si, claro que se puede, pero hay que saber que significa el evento load... imagina que te digo me voy de viaje a Méjico, dicho así parece que eso es todo, pero previamente hay una cascada de sucesos... está la función comprar billetes para méjico, esperar la fecha del viaje, hacer las maletas, tomar el bus hasta el aeropuerto, facturar el equipaje y esperar el embarque, embarcar, despegar y viajar, finalmente llego a méjico.. El load del formulario es una aventura similar... cuando se abre un formulario por primera vez hay una cascada de eventos, primero hay uno que se llama initialize en él se deben poner el código de asignación de valores que se establecen una vez para toda la vida del formulario, luego viene otro que se llama activate recibe el enfoque lo que significa que el control que previamente lo tenía lo pierde, luego viene el load que es donde se debe poner el código que se debe ejecutar cada vez que se carga el formulario, initialize sólo se ejecuta 1 vez sería como si lo llamáramos construir, load sería como si lo llamáramos abrir las puertas, después del load viene el evento show este se encarga de dibujar todo el contenido por ejemplo los controles dentro del formulario se cargan en esta fase y finalmente viene el evento paint que es hacerlo visible, show lo carga gráficamente en memoria y paint lo vuelca al monitor. Ahí está tu error, tu dibujas en el formulario con print, pero no son gráficos persistentes, cuando se ejecuta el evento paint, por tanto queda borrado. Puedes hacer una de 2 cosas, o bien previamente estableces la propiedad autoredraw = true, tal como se muestra en el código... Private Sub Form_Load() Dim c As Integer, f As Integer, i As Integer, i2 As Integer, sc As Integer, sf As Integer, a As Integer AutoRedraw = True ' <====================== mirar aquí ================================================ c = InputBox("ingrese el numero de columnas :") f = InputBox("ingrese el numero de filas :") ReDim mama(1 To c, 1 To f) ..... end sub
Que lo convierte en un fráfico persistente, o bien precipitamos que el formulario se exhiba y luego dibujamos en él... dentro del propio evento load, esto se haría como se indica en el código de ejemplo: Private Sub Form_Load() Dim c As Integer, f As Integer, i As Integer, i2 As Integer, sc As Integer, sf As Integer, a As Integer me.show ' <====================== mirar aquí ================================================ c = InputBox("ingrese el numero de columnas :") f = InputBox("ingrese el numero de filas :") ReDim mama(1 To c, 1 To f) ..... end sub
El me.show fuerza a que se ejecuten los otros eventos restantes shoe y paint antes de continuar con la carga. Pero vamos dado que el código que pones no es imprescindible durante la carga lo ideal es que lo ejecutaras desde un botón....
213
« en: Martes 21 de Julio de 2009, 08:55 »
de diez, solo que no se como hacer para utilizar la fucnion RGB, es decir, tengo la imagen en el picturebox pero no tengo ni idea como hacer para leer un tipo de dato RGB, analizar toda la imagen y luego sacar el color promedio, es decir es como si tuviera un archivo pero no se como leerlo, lo abri pero no se como accederlo, no se si me explico. Lo que vos me pones seria si yo pudiera idear una funcion que recorra la imagen byte por byte y realizar ese trabajo, el tema es que no se commo hacer leer la imagen y determinar cada pixel en el formato bmp RGB24. Me podrias indicar algo asi, no se si es muy complicado porque deconozco totalmente el tema de tratamiento de imagenes. Gracias igual No entiendo que quieres decir con eso de que n0 sabes como utilizar la función RGB... Como no lo entiendo 'hablo' y espero que con ello captes las dudas que tengas al respecto. Los colores van desde el 0 hasta el 16777215 o lo que es lo mismo se usan 256 intensidades para cada uno de los 3 colores base Rojo, Verde y Azul. Veamos si tenemos 3 colores base y 256 tonalidades por cada uno color máximo 256^3, una forma de expresar esto mismo sería decirlo todo en una sola cifra o expresarlo con sus componentes, así para el negro será rojo=0 Verde=0 Azul=0. Ahora avanzando hasta el color 250, será Rojo=250 V=0, A=0 qué pasa cuando sobrepaso al valor 280, 280-256= 24 280/256=1'algo entonces Rojo=24, V01,A=0 Si te fijas bien matemáticamente estamos usando una base decimal cuyo valor es 256, la base decimal se basa en valores de 10 con un rango del 0-9, El primer dígito expresa unidades, el 2º decenas y el tercero centenas, si cambiamos a la base 256, es exactamente igual: unidades= rojo, decenas= verde, centenas=azul imagina, que los colores fueran en decimal 3 colores, pero sólo con 10 tonos, entonces los números irían desde el 0 al 999, como en este caso cada color se expresa con una cifra posicional sería muy fácil descubrir sus componentes: si dijéramos color 628, sabríamos que tendría 6 de azul, 2 de verde y 8 de rojo, esto lo hemos calculado así: rojoAb= (10^0) * 8= 1* rojo verdeAb= (10^1) * 2 = 10 * verde AzulAb= (10^2) * 6 = 100 * azul Ab sería indicador de absoluto... Color= azulAb + verdeAb + rojoAb = 600 + 20 + 8 Bueno esto mismo hacemos con los colores en base 256 vamos a suponer que tenemos 230 de rojo, intensidad de verde= 42, intensidad de azul= 100 IntensidadAbsolutaDelColor= (base^(orden-1)) * intensidad RojoAb= (256 ^0) * rojo= 1* 230 = 230 VerdeAb=(256^1) * verde = 256 * 42 = 10752 AzulAb= (256^2) * azul= 65536 * 100 = 6553600 Color= azulAb + verdeAb + rojoAb = 6553600 + 10752 + 230 = 6564582 Si hiceramos una funcion equivalente a la RGB sería así: ' para componer un color (long) desde sus componentes Public Function MiRGB(byval Rojo as byte,byval Verde as byte, byval Azul as byte) as long mirgb= (rojo + (verde * 256) + (azul *65536)) end function ' para extraer los componentes de un color: public type RVA ' iniciales de: Rojo Verde, Azul, que es lo mismo que RGB pero en español Rojo as byte Verde as byte Azul as byte end type friend function LongaRGB(byval Color as long) as ColRGB colrgb.Rojo = color mod 256 ' imagina en decimal 628, cuantas unidades tenemos? hacemos un mod de 2 cifras es decir 628 mod 100=8 colrgb.Azul= color 65536 ' imagina en decimal 628 cuantas centenas tenemos, dividimos (entera) entre 100; 628 100= 6 . Es una división entera, byte y long también son enteros... colrgb.Verde = (color 256) mod 256 ' imagina como aíslo las decenas en base decimal ?: hay 2 formas según el orden, deshacerse de las unidades, deshacerse de las centenas: 628 10= 62, ahora tomo las unidades que antes eran las centenas 62 mod 10 = 2 end function
No sé si necesitas más aclaraciones sobre la función RGB... yo te acabo de explicar el 'padrenuestro' de los colores, cuando algo te resulte complejo en base 256 piénsalo en decimal y luego cambia el valor de las bases base^0=1, base^1=base , base^2= base*base en decimal (base 10): 10^0=1; 10^1=10; 10^2=100 en base 256: 256^0=1; 256^1=256; 256^2=65536 ____________________________ La siguiente cuestión que creo entender, como tomar colores del picture y ponerlos.. Los formularios y picture tiene 2 funciones para ese cometido : point, interroga por el color en unas cordenadas que se deben especificar, y pSet (pointSet) especifica que el color debe asignarse a unas cordenadas determinadas dim color as long ' tomar un color color= picture1.point(200,180) ' esto es: color= color del picturebox en las cordenadas 200,180 ' poner un color picture1.pset(200,180)= color ' valor que tiene esta variable picture1.pset(200,180)= 1234567 ' valor inmediato picture1.pset(200,180)= RGB(230,42,100) ' le pasa el valor que se calcula dim Rojo as byte, Verde as byte, Azul as byte Rojo=230, Verde=40, Azul=110 picture1.pset(200,180)= RGB(Rojo ,Verde +2 ,Azul -10)
Estas funciones son lentas, si se va a hacer un uso intensivo para tomar o asignar colores, es mejor usar las API SetPixel y GetPixel... Para analizar toda la imagen tienes que barrer sus cordenadas, como las cordenadas son una malla, una cuadrícula, necesitas 2 bucles anidados entre sí recorrer verticales a lo alto desde 0 hasta el alto de la imagen (o del picturebox, según el tipo de ajuste de la imagen) recorrer horizontales a lo ancho desde 0 hasta el ancho de la imagen (o del picturebox, según el tipo de ajuste de la imagen) tomarcolor del punto en horizontales, verticales total= total + valordelpuntoactual ' como esto suma y suma, total deberás declararlo como double si no quieres tener desbordamiento fin recorrer horizontal fin recorrer vertical ' ojo, entiendo que quieres buscar el promedio de toda la imagen promedio= total (horizontales* verticales)
Todo esto se puede acelerar mucho, pero conociendo a fondo las API para trabajar directamente con las imágenes, pero como estás muy verde y qque para ti lo importante es aprender VB (cupongo) y no tanto resolver el problema, creo que esto debería serte más que suficiente.... Practica para obtener colores de una imagen y modificarlos con point y pset, por ejemplo usando point lee un picturebox y con pset escribe en otro picturebox. Importante: Al trabajar con imágenes acuérdate de poner scalemode=vbpixels (3) para los picturebox ..... cuando domines y entiendas los colores y la función RGB, etc, podrás hacer cualquier cosa, como intercambiar los verdes por los rojos (intercambiar canales), variar luminosidad, umbralizar, etc.... nota: cuando en alguna parte pongo 'tono' referido a un color base en realidad debería poner intensidad referido a ese color, ya que tono en realidad siempre se aplica a un color compuesto por los 3 base... es un pequeño vicio que cualquiera podría entender, pero que a un neófito o novato puede confundir...
214
« en: Viernes 17 de Julio de 2009, 20:33 »
Hola compañero a lo mejor ya te contestaron pero solo quiero decir ,que yo tengo un juego que hice en visual.net 2003 del horcado si toda bia lo quieres ps deja buscarlo y espero tu respuesta ok para hacerlo nuevamente Después de 5 años, aunque no lo resolviera creo que YA le dará igual... Dado que eres nuevo... Por favor no respondas a mensajes cuya antigüedad supere un par de meses, no tiene sentido.
215
« en: Viernes 17 de Julio de 2009, 20:14 »
Ya que quieres usarlo para proveer una contraseña la exactitud del caso no tiene relevancia. public const Negro=0 public const Blanco= (256^3) -1 public const PuntoMedio= blanco 2 private function DeterminarColor(byval Color as long) as long DeterminarColor= iif( color<= puntomedio,negro,blanco) end function
El sistema no es definitivo, pués es una reducción, pero para lo que quieres es suficiente así... Todavía podrías decidir blanco si es impar y negro si es par. private function DeterminarColor(byval Color as long) as long DeterminarColor= iif( (color mod 2)=0,negro,blanco) end function
216
« en: Viernes 10 de Julio de 2009, 02:37 »
En vb6 un formulario MDI no tiene propiedades maxbutton ni borderstyle, por tanto no puedes hacerlo.
Podrías crearte tu prototipo de formulario MDI y manejarlo desde un addin también diseñado por ti.
217
« en: Sábado 4 de Julio de 2009, 20:48 »
Sí, señor, tienes toda la razón. Vi lo de "Explicit" y no le presté atención. Quitaré esa línea y espero funcione. Muchas gracias. A la vista de tu respuesta, me pregunto si realmente has entendido lo que te he dicho y no me refiero a quitar esa línea de código... Imagina que vb fuera un amigo, entonces Option explicit quiere decir exactamente: Oye 'vb', avísame cuando se me olvide declarar el tipo más adecuado para una variable, porque si no lo hago, como 'tú, vb' asumes que es un variant y como el variant es más lento y utiliza más recursos pues mi programa sería más lento innecesariamente, entonces estaría bien que me lo recordaras cada vez que se me olvide, para que así yo (el programador) ponga el tipo de datos más correcto para las variables que utilizo. Como soy tan olvidadizo... me serías de ayuda... Resumiendo , a tí te vendría bien dejar activado option explicit y el error lo debes corregir consecuentemente poniendo la línea 'dim confirma as vbmsgboxresult' . Sólo se debe quitar option explicit cuando eres una persona cuidadosa que nunca, nunca olvida declarar TODAS las variables que utiliza con el tipo adecuado que precisa. Yo ya no puedo hacer más por ti. Lo que hagas es cosa tuya.
218
« en: Sábado 4 de Julio de 2009, 20:31 »
Solo he mirado el cóodigo por encima, lo que quiere decir que he parado de mirar más cuando he detectado un error, es decir la corrección que te voy a indicar no implica que no tengas otros errores en el código... El error se produce porque el objeto oDataAd y el objeto oDataTable tienen una referencia nothing. esto sucede porque estás enmascarando dichas variables... te lo explico con un ejemplo: Public Class GrdProyecto Private oDataAd As SqlDataAdapter Private Sub GrdProyecto_Load .... Dim oDataAd = New SqlDataAdapter("SELECT * FROM proyecto", conexion) end sub end class
Como ves hay 2 declaraciones de variable y tienen el mismo nombre, cuando esto sucede y entro en la sub... odataad se refiere a la que está dentro de la sub si no indico otra cosa, por otro lado la variable que se crea dentro de la sub se destruye cuando se sale de la sub... lo que implica que nuevamente las referencias a oDataAd se refieren a la que está declarada a nivel de la clase... pero que no le ha sido asignada ningún valor ... En teoría he de suponer (que tu intención) que ambas variables deberían ser las misma y sólo una variable. La declaras a nivel de clase y en el load le asignas el valor: La solución es como sigue.. compara este código y el anterior y 'descubre' la diferencia, que por otro lado está comentada. Public Class GrdProyecto Private oDataAd As SqlDataAdapter Private Sub GrdProyecto_Load .... 'Dim si ponemos dim estamos creando una NUEVA variable, que en este caso es local a esta sub y que es distinta de otras variables del mismo nombre cuyo ámbito sea distinto. oDataAd = New SqlDataAdapter("SELECT * FROM proyecto", conexion) end sub end class
Corrige todos los errores de este tipo que cometes... No he mirado más cosas en detalle pero por encima veo también varios 'dim oDataSet As New DataSet' y tienes declarado un oDataSet a nivel de clase...¿¿¿¿¿ ... ?????. Seguro que sabes lo que estás haciendo ?. Un despiste lo tiene cualquiera y puede pasarle inadvertido y volverse loco buscando, pero lo que veo me indica que no tienes claro el concepto de objeto.
219
« en: Sábado 4 de Julio de 2009, 19:54 »
Seguramente has reinstalado recientemente VB6 y a consecuencia de ello, has activado la opción 'Option Explicit', cuando se activa dicha opción, te obliga a declarar todas las variables utilizadas, en caso contrario te marca el error señalado, en cada variable que uses y que no hayas declarado previamente.
Puedes desactivarlo si quieres desde el menú: Herramientas -> opciones -> ficha editor -> Requerir declaración de variables (lo desactivas) entra en vigor la próxima vez que inicies vb pero los proyectos en los que YA esté dicha intrucción responderá igual, en dicho caso puedes eliminar la línea 'Option Explicit' del proyecto y guardarlo.
Por otro lado, cuando no declaras explícitamente las variables, ésta, por defecto asume el tipo variant. El tipo variant es muy útil, para los casos donde se necesita pero supone una pérdida de rendimiento cuando no es realmente necesario. En tu caso la variable 'confirma' no necesita ser un variant, por tanto cuando no la declaras produces pérdida de rendimiento.
Tampoco debes declararla como string (aunque te funcionará perfectamente) como mínimo deberías declarala numérica, aunque mejor el tipo propio que al caso es parte de una enumeración: dim confirma as vbmsgboxresult , que además te provee las opciones disponibles para dicha enum con el intellisense cada vez que pongas un operador...
220
« en: Viernes 3 de Julio de 2009, 20:54 »
221
« en: Viernes 3 de Julio de 2009, 20:48 »
Un detalle jimbenit... Cuando invocas una función, lo primero que se hace es reservar memoria para todas las variables definidas explícitamente... por tanto esto que haces: Public Function LeerTexto(ArchivoTXT As String) As String If ArchivoTXT = "" Then Exit Function Dim NroLibre As Integer Dim Ruta As String Dim Linea As String Dim Texto As String ...........
No evita que se reserve memoria. supongo que la razón por que pones la línea 'if...then ...exit..'' la 1ª es que crees que ahorras tiempo si primero se ejecuta esa línea y asó no 'pierde' tiempo en reservar memoria para variables que al final no se van a usar. Sin embargo esto no sucede así... Incluso aunque pongas al final de la función un 'dim x as byte' lo 1º será reservar memoria para las variables luego se procesa el resto, por tanto, ya que no se tiene control sobre esto, es preferible al menos ganar en claridad y orden... Por tanto será más adecuado poner el código así, dado que el tiempo en procesarse y los recursos empleados son idénticos.: Public Function LeerTexto(ArchivoTXT As String) As String Dim NroLibre As Integer Dim Ruta As String Dim Linea As String Dim Texto As String If ArchivoTXT = "" Then Exit Function ..............
222
« en: Jueves 2 de Julio de 2009, 16:53 »
Hola, buenas a todos. un ejemplo de como entrenar esto es q tu rimas y te van soltando palabras y cuando mejor las rimes y mejor esten en el contexto pues mejor,
pense en un programa sencillo, lo mas sencillo posible en el que fueran cada cierto tiempo apareciendo palabras.. si alguno me podeis ayudar a hacerlo o decirme que es lo q tengo q utilizar, Básicamente para lo que quieres necesitas 2 cosas: un 'diccionario' de palabras: esto es un archivo cada palabra va en una línea. siempre podrás modificarlo quitando o añadiendo palabras Un temporizador: en vb6 se llama Timer, es un 'control' que permite ejecutar 'algo' a intérvalor determinados. El programa necesitaría hacer los suiguientes pasos: 1 Al cargarse el programa debería leer el fichero que contiene las palabras (nuestro diccionario), y lo guarda en una matriz. Una matriz es como un armario donde cada cajón del armario tiene un dato en este caso 1 palabra. 2 Después de cargarse el programa el temporizador se pone en marcha (se activa durante la carga o se deja activado durante el diseño) Lo que hace el temporizador es llamar a una funcionalidad cuyo cometido es elegir al azar un 'cajón del armario' y obtener su contenido, y lo muestra sobre el formulario (la ventana). Para completar el programa debería haber 2 botones que permitan poner en marcha el temporizador y pararlo y un 'variador de frecuencia' para modificar el tiempo que transcurre entre cada acción del temporizador... Si no sabes absolutamente nada de programación, es probable que incluso habiendo hablado de modo simple no entiendas parte de lo que te he explicado y bastante más probable que no seas capaz de llevarlo a cabo. El programa apenas son unas líneas de código y no lleva más de 10 minutos, por lo que si encuentro un momento de aquí al sábado te lo hago. Ahora sería el caso tuyo crear los ficheros que contienen las palabras. Yo lo diseñaría para que pudiera cargar diferentes archivos de modo que un archivo pueda contener palabras sencillas y otro palabras más complicadas, en eso tú decidirías que palabras meterías a que archivo. p.d.: aquí te dejo una copia del mismo...
223
« en: Lunes 29 de Junio de 2009, 23:20 »
el primer programa es uno en el cual se pueden crear instaladores con opciones ilimitadas, desde lo básico, hasta poder darle las características que quiera al instalador y que haga diferentes opciones. El tema seria que al intentar instalar el programa me saltaría el antivirus, lo cual la mayoría de la gente pensaría que es un virus. Un instalador puede crearse con todas las opciones que quieras, durante su ejecución dispondrás de opciones para que el usuario elija las características que permites al instalador. Pero esto lo puedes hacer con total normalidad sin tener que solapar un programa detrás de otro... El 2do. programa sirve para bloquear *.exe... La idea es que tenga una lista donde se agreguen los *.exe y cada ves que se abre uno verifica que no este en la lista y lo ejecuta. Este es mas de uso personal, ya que si fuera para distribuir tendría 10mil fallos o formas de anularlo. Pero para esto no necesitas tener un ejecutable endosado a otro y a otro y a otro... puesdes simplemente tener una lista de los nombres de los programas : Explorer.exe,Svchost.exe,Taskman.exe... Si consideras que el fichero puede ser falsificado y por tanto la lista no será muy útil, puedes recurrir a utilizar el CRC del archivo, por ejemplo el MD5 o cualquier hash más sencillo ideado por ti. Cuando como tú dices se ejecute una aplicación tu creas su hash y lo compruebas con los hash que tienes almacenados y en base a que exista o no, haces lo que tengas pensado. La ventaja es que no necesitarás copiar todo el tamaño del archivo , porque al cabo de una semana podrías haber ejecutado 500 exe a 2 Mb. por aplicación habrías generado un archivo de 1Gb. totalmente inútil, alamcenando el hash (por ejemplo de sólo 64 caracteres) pués 500 * 64 más o menos 32Kb... 32 kb comparado con 1Gb. .... Mi mayor problema es en cortar los archivos, no se como o con que cortar un archivo en VB... La cosa es sencilla: los archivos no se cortan, si tienes 0123456789 copias por un lado 01234 y por otro lado copias 56789, el archivo 0123456789 luego lo borras y listo.
224
« en: Lunes 29 de Junio de 2009, 22:54 »
Como programador deberías saber que el supuesto problema según los síntomas de fallo de un programa y el problema real pueden ser cosas distintas.
Es decir, no hay nada confirmado mientras no se le practique la autopsia, y está a fecha de ahoy y ahora no ha sido practicada y/o publicada. Al momento en que publiqué mi respuesta, tenía entendido que el deceso era un rumor, o sea, todavía no había confirmado que había muerto. La razón por la que le dio el paro es desconocida en el momento. Una gran pérdida, la verdad.
De acuerdo... Pero tal como lo pusiste dabas a entender que lo que decías confirmado era la causa de la muerte, no hace entender que lo que confirmabas era que había muerto, que no era un rumor. Vamos que te expresaste incorrectamente al tratar de decir una cosa, pués al leerlo se entiende otra distinta de tu intención. Obviamente no vamos a adivinar la razón que confirmas si no queda expuesta en ninguna parte del mensaje. Tampoco tiene más importancia el equívoco... La verdad, no entiendo como tenía previsto dar una gira de 50 conciertos si al parecer pesaba 51kg. tenía según indican algunos medios una costilla rota (para hablar es muy molesto, cantar sería casi imposible). Su fragilidad tenía que ser patente para cualquiera lo viera, si le forzaron a firmar, yo me atrevería a indicar si entonces no ha sido un suicidio, pués lejos de recaudar para pagar sus deudas se acrecentaría su deuda por incumplimineto de contrato, a no ser que pusiera playback y algún doble a su puesto...
225
« en: Lunes 29 de Junio de 2009, 22:43 »
No existe ninguna razón para hacer eso, excepto como ya has mencionado virus... ¿ si puedes explícame donde radica la necesidad o la ventaja de tener que hacer algo así, aparte de crear virus. ?. En cualquier caso el problema es radicalmente sencillo, si tengo un programa llamado 'A' cuyo contenido fuera por ejemplo. 'HHRRTTXX77AAZZ33BB' y tuviera otro programa llamado 'B' y cuyo contenido fuera por ejemplo: 'DSIYWP82NAGJE'. Entonces todo lo que hay que hacer es añadir el contenido de B al final del contenido de A, el resultado sería: 'HHRRTTXX77AAZZ33BBDSIYWP82NAGJE', naturalmente de momento no se donde acaba uno y donde empieza otro por tanto resolver esto sería tan sencillo como añadir al final x bytes que determinen el tamaño del primero (o del segundo archivo). En nuestro contenido de ejemplo vamos a suponer que el tamaño mayor fuera de 99 caracteres, por tanto utilizaríamos 2 cifras para indicar el tamaño, por ejemplo del primero, si el primero tiene 18 caracteres, el resultado final será: 'HHRRTTXX77AAZZ33BBDSIYWP82NAGJE18'.
El programa primero (u otro aparte) lo que deberá hacer será leer los 2 últimos caracteres para conocer la longitud del primer archivo, conociendo eso y sabiendo que los 2 últimos caracteres son añadidos extra, se calcula el tamaño del 2º, por tanto ya se puede partiendo de esos datos copiar los bytes de cada programa.
Los antivirus detectan esto como sospechoso, especialmente cuando son ejecutables. Como eres novato no tiene sentido exponer código, cuando seas capaza de manejar ficheros verás por tí mismo que esto es muy sencillo.
Se podrían añadir más cuestiones, pero como tiene toda la pinta de virus y el foro no se llama 'programe su virus' pués sobran...
Páginas: 1 ... 7 8 [9] 10 11 ... 29
|
|
|