Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: $Edu$ en 23 Octubre 2011, 15:13 pm



Título: "El misterio de la variable indx" jaja
Publicado por: $Edu$ en 23 Octubre 2011, 15:13 pm
Bueno les traigo algo que nadie hasta ahora a encontrado el porque.

El tema es asi, existe una variable declarada en General en el frmTabla llamada "indx" la cual se encarga de indicar la "pagina" de grupos en la que se encuentra el programa, ya que hago como una especie de "libro" de grupos, es decir, muestro Grupo A, Grupo B, Grupo C (esos grupos son controles) y hay botones de Anterior y Siguiente, el boton Siguiente aumenta el valor de indx para asi indicar que estara en la pagina siguiente y mi codigo oculta Grupo A, Grupo B y Grupo C, para mostrar Grupo D, Grupo E y Grupo F. Y si luego hago click en Anterior hara lo inverso.

El bug se encuentra cuando cierro el frmTabla estando en la pagina 2, es decir cierro cuando antes habia puesto Siguiente. Y luego desde el form anterior entro otra vez a frmTabla y este indx queda con el valor de antes, por lo que me genera un bug.


No se preocupen si no entendieron, simplemente hagan esto:

Vayan al frmTabla en formload y pongan un BreakPoint en "indx = 0" que eso es mi "parche" del bug. Pero ustedes fijense porque haciendo lo que dije antes el valor de indx llega con otro valor distinto a 0, y teoricamente tendria que ser 0 siempre, ya que se carga nuevamente el frmTabla.

Si miran el codigo y van hacia donde les digo entenderan.

Aca esta: http://www.mediafire.com/?gzps9610n8iok9s

Suerte :P


Título: Re: "El misterio de la variable indx" jaja
Publicado por: Elemental Code en 24 Octubre 2011, 00:08 am
es el valor residual, la declaraste o la usas directamente al vuelo?  :silbar:


Título: Re: "El misterio de la variable indx" jaja
Publicado por: $Edu$ en 24 Octubre 2011, 00:37 am
Miraste el proyecto? la idea es que lo miren y ver quien logra descubrirlo.


pd: Para Psyke1, mi intencion aca no es beneficiarme ya que como dije, yo "parcheo" ese bug y no tengo problema ninguno, solo quiero dejarles algo para hacer y ver que tan buenos son xD. Te digo esto por las dudas....


Título: Re: "El misterio de la variable indx" jaja
Publicado por: BlackZeroX en 24 Octubre 2011, 00:38 am
Para Psyke1, mi intencion aca no es beneficiarme ya que como dije, yo "parcheo" ese bug y no tengo problema ninguno, solo quiero dejarles algo para hacer y ver que tan buenos son xD. Te digo esto por las dudas....

cuidado...

Dulces Lunas!¡.


Título: Re: "El misterio de la variable indx" jaja
Publicado por: $Edu$ en 24 Octubre 2011, 01:56 am
Que paso? algun problema o algo por el estilo?


Título: Re: "El misterio de la variable indx" jaja
Publicado por: $Edu$ en 25 Octubre 2011, 16:14 pm
109 visitas y nadie ha podido :P Siento que seran cosas del vb6 que cada tanto pasan xD


Título: Re: "El misterio de la variable indx" jaja
Publicado por: seba123neo en 25 Octubre 2011, 17:57 pm
Bueno les traigo algo que nadie hasta ahora a encontrado el porque.

El tema es asi, existe una variable declarada en General en el frmTabla llamada "indx" la cual se encarga de indicar la "pagina" de grupos en la que se encuentra el programa, ya que hago como una especie de "libro" de grupos, es decir, muestro Grupo A, Grupo B, Grupo C (esos grupos son controles) y hay botones de Anterior y Siguiente, el boton Siguiente aumenta el valor de indx para asi indicar que estara en la pagina siguiente y mi codigo oculta Grupo A, Grupo B y Grupo C, para mostrar Grupo D, Grupo E y Grupo F. Y si luego hago click en Anterior hara lo inverso.

El bug se encuentra cuando cierro el frmTabla estando en la pagina 2, es decir cierro cuando antes habia puesto Siguiente. Y luego desde el form anterior entro otra vez a frmTabla y este indx queda con el valor de antes, por lo que me genera un bug.


No se preocupen si no entendieron, simplemente hagan esto:

Vayan al frmTabla en formload y pongan un BreakPoint en "indx = 0" que eso es mi "parche" del bug. Pero ustedes fijense porque haciendo lo que dije antes el valor de indx llega con otro valor distinto a 0, y teoricamente tendria que ser 0 siempre, ya que se carga nuevamente el frmTabla.

Si miran el codigo y van hacia donde les digo entenderan.

Aca esta: http://www.mediafire.com/?gzps9610n8iok9s

Suerte :P

si podes explicar que hay que hacer para que el programa muestre ese formulario.


Título: Re: "El misterio de la variable indx" jaja
Publicado por: $Edu$ en 26 Octubre 2011, 01:11 am
Perdon, es que de tanto repetirlo para que lo miren otros que han intentado me olvide xD

Inicias la app, vas a Campeonato, luego agregas 16 participantes o mas y vas a Sorteo! , luego ingresas los 16 equipos o los que hayas ingresado y Listo! , luego le das a Comenzar! y ahi aparecera el frmTabla.

Ahora le pones un BreakPoint a "indx = 0" en el form load que ese es mi "parche" para el bug y haces lo siguiente:

Presiona los botones de Siguiente y Anterior, veras que es lo que hace; lo dejas en la ultima "pagina de grupo" es decir que no se muestre "Grupo A, Grupo C y Grupo D" ya que eso hara que la variable indx sea distinta a 0 y ahora cierras el form, aceptando la pregunta que te pida.
Volveras al form anterior donde si le das a Comenzar! otra vez, vuelve a aparecer frmTabla pero parara en tu Break Point, y fijate que indx tendria que valer 0, pero vale 1 o 2, depende los Siguientes que hayas puesto.

Si sigues sin entender perdon pero dime que te explico de nuevo sin problemas


Título: Re: "El misterio de la variable indx" jaja
Publicado por: Elemental Code en 26 Octubre 2011, 02:16 am
no lo baje, y no lo voy a bajar.

Usas unload me o me.hide para "cerrar" el form?
Si usas me.hide nunca destruiste las variables y por ende no se crean otra vez.
si usas unload me, nose, seguire pensando


Título: Re: "El misterio de la variable indx" jaja
Publicado por: $Edu$ en 26 Octubre 2011, 02:20 am
Obviamente use unload me, por eso el misterio, pero lastima que no bajes el proyecto, en fin, alguien lo descubrira cuanto antes y seguramente sera alguna estupidez pero nadie ha podido xDD


Título: Re: "El misterio de la variable indx" jaja
Publicado por: Elemental Code en 26 Octubre 2011, 02:24 am
declaras la variable con DIM y en el form en cuestion?
Si la declaras como GLOBAL o en algun modulo o form va a quedar guardada


Título: Re: "El misterio de la variable indx" jaja
Publicado por: $Edu$ en 26 Octubre 2011, 02:34 am
Esta declarada como Dim indx as integer en el form, en general, teoricamente al descargarse el form esa variable se anularia pero no lo hace :/, seguramente es por codigo que tendre en otro lado, pero buscando en Buscar.. no encontre que haga una modificacion a esa variable desde otro lado ni nada :/


Título: Re: "El misterio de la variable indx" jaja
Publicado por: seba123neo en 26 Octubre 2011, 03:05 am
no me da ganas de agregar equipos  :xD, deberias hacer una base de datos como te dije asi ya te va guardando lo que cargas.


Título: Re: "El misterio de la variable indx" jaja
Publicado por: raul338 en 26 Octubre 2011, 03:17 am
Pregunta, seteas la variable indx antes de mostrar el formulario?

no me da ganas de agregar equipos  :xD, deberias hacer una base de datos como te dije asi ya te va guardando lo que cargas.
:xD


Título: Re: "El misterio de la variable indx" jaja
Publicado por: BlackZeroX en 26 Octubre 2011, 07:57 am
no me da ganas de agregar equipos  :xD, deberias hacer una base de datos como te dije asi ya te va guardando lo que cargas.

Pienso lo mismo.

Ya me baje el proyecto (Hace ya tiempo) pero me da un poco de pereza visual... asi que solo te dejo una SOLUCION PARA RASTREAR Y DEPURAR la llamada al seteo de valor a indx para ver detectar el "misterio" de la variable...

Código
  1. Dim indx as integer
  2.  

por:

Código
  1. private mIndexBlackZeroX as integer ' //  puede ser lo que quieras solo le dejo el nombre asi por que es una SOLUCION PARA RASTREAR la linea que le setea el valor y asi coprregirlo.
  2.  

Despues para que no edites nada del codigo y poder poner los BreakPoint JUSTOS agregas esta propiedad:

Código
  1.  
  2. public property let indx(byval lVal as integer)
  3.    mIndexBlackZeroX = lval ' // Aqui pones el BreakPoint o agregar un Debug.print para Depurar...
  4. end property
  5.  
  6. public property get indx() as integer
  7.    indx = mIndexBlackZeroX
  8. end property
  9.  
  10.  

Te dejo esta solucion para que lo hagas... jejeje.

Dulces Lunas!¡.


Título: Re: "El misterio de la variable indx" jaja
Publicado por: $Edu$ en 26 Octubre 2011, 15:52 pm
Jeje se que esta feo agregar todos los datos para llegar ahi pero bueno, yo los agrego en unos segundos de tantas veces que lo he hecho xD

No me funciono eso BackZeroX, igual gracias, quedara como uno de esos misterios sin resolver jajajaja


Título: Re: "El misterio de la variable indx" jaja
Publicado por: rob1104 en 26 Octubre 2011, 22:42 pm
Ya entendí el problema, la verdad si es algo raro que visual basic no destruya la variable al descargar el form =S

Compruebenlo de esta forma:

  • En un proyecto agregar dos form (form1 y form2)
  • Agregar un command a cada uno

Usar el sig. codigo en form1
Código
  1. Option Explicit
  2.  
  3. Private Sub Command1_Click()
  4.    Form2.Show
  5. End Sub

Y el sig codigo en form2
Código
  1. Option Explicit
  2. Dim i As Integer
  3.  
  4. Private Sub Command1_Click()
  5.    Unload Me
  6. End Sub
  7.  
  8. Private Sub Form_Load()
  9.    MsgBox i
  10.    i = i + 1
  11.    MsgBox i
  12. End Sub
  13.  

Al cerrar el form2 aun con el unload me la variable i conserva su valor. Obviamente esto se puede solucionar de muchas formas, y $Edu$ el método que utilizas de inicializar la variable 0 es muy valido, de hecho se recomienda siempre inicializar la variables para evitar este tipo de cosas. Otro detalle curioso es qui si la variable es declarada dentro de form_load() si se destruye su valor. En fin, visual basic y sus misterios :P




Título: Re: "El misterio de la variable indx" jaja
Publicado por: $Edu$ en 26 Octubre 2011, 23:49 pm
Y yo haciendoles poner miles de cosas para llegar al bug jajajaja, grande rob!

A ver si alguien descubre el porque :P


Título: Re: "El misterio de la variable indx" jaja
Publicado por: burbu_1 en 27 Octubre 2011, 00:12 am
buenas, no se si tendrá que ver.....pero he encontrado esto sobre la "variable global oculta"

Citar
Liberación completa de memoria y recursos

La única manera de liberar toda la memoria y los recursos es descargar el formulario y establecer todas sus referencias a Nothing. La referencia que más se suele pasar por alto al realizar esta tarea es la variable global oculta mencionada anteriormente. Si en algún momento ha hecho referencia al formulario por su nombre de clase (como aparece en la propiedad Name de la ventana Propiedades), ha utilizado la variable global oculta. Para liberar memoria del formulario, tiene que establecer esta variable a Nothing. Por ejemplo:

Set Form1 = Nothing

Citar
http://www.recursosvisualbasic.com.ar/htm/tutoriales/c1-creacion-de-clases.htm#duracion-formularios

es la clase de problema que te da ganas de tirar el pc por la ventana  :laugh: :laugh: :laugh:


Título: Re: "El misterio de la variable indx" jaja
Publicado por: $Edu$ en 27 Octubre 2011, 00:19 am
Entonces obligados estamos a poner en el form_unload() set form = nothing ? que feo eso de vb6.. jaja

En .net por ejemplo existe el recolector de basura que se encarga de eso, por eso sera que no me paso nunca en .net?


Título: Re: "El misterio de la variable indx" jaja
Publicado por: raul338 en 27 Octubre 2011, 00:23 am
Entonces obligados estamos a poner en el form_unload() set form = nothing ? que feo eso de vb6.. jaja

En realidad tiene lógica, porque una vez Llamado al "Unolad Me" tenemos accesos a las variables publicas desde otros formularios. Pero no sabia que tampoco se destruían las variables privadas.

Y si, al menos eso fue siempre que se utilizaba instancias de formularios :)


Título: Re: "El misterio de la variable indx" jaja
Publicado por: DarkMatrix en 27 Octubre 2011, 05:41 am
Interesante tema, no sabia eso O_O


Título: Re: "El misterio de la variable indx" jaja
Publicado por: seba123neo en 28 Octubre 2011, 04:39 am
mas claro que el agua esta cita, yo tampoco lo sabia:

Citar
Form Modules
Form modules, like class modules, require that an instance of the form be created before its code and data can be used. However, VB treats form modules somewhat differently and will automatically create an instance of a form if any propery of the form is referenced in your code. Also remember that module level variables in forms are not destroyed until the reference to the form object is released by setting the form to Nothing. Unloading a form does not clear the value of the form's module level variables.

inicializar las variables en necesario y esta bien que lo hagas, siempre debe ser asi.