Uso De Destructores: _free(), _exit()


Subject: Uso De Destructores: _free(), _exit()
Hola amigos,

Estoy haciendo un pequeño programa con varios formularios tratando de implementar clases e instancias de objetos.

Tengo debian squeeze
con gambas 2.21
y gnome como gestor gráfico

Quisiera saber, bueno si está al alcance de ustedes, como usar destructores en los formularios o en una clase.

por ejemplo:

si quisiera ejecutar una acción cuando un formulario es cerrado como lo haría? He intentado con cosas como:

PUBLIC SUB _free()

sistema.Finalizar()

END

y

STATIC PUBLIC SUB _free()

frmMenuPrincipal.Visible = FALSE
Usuario.Show

END

también he intentado tratando de modificar la funcion close() sin exito alguno.

PUBLIC SUB Close()

frmMenuPrincipal.Visible = FALSE
Usuario.Show

END


Agradecería muchisimo el apoyo que puedan brindarme para solucionar esta duda.

Profile PM  
Subject: Re: Uso De Destructores: _free(), _exit()
En el editor de los controles graficos, dale click secundario al form para desplegar el menú popup y ve a 'Events' -> 'Close'. Con ello pasarás al editor de código con las nuevas líneas:

PUBLIC SUB Form_Close()



END


O simplemente ten en cuenta que el evento es _Close()

Saludos!

Subject: Re: Uso De Destructores: _free(), _exit()
Hola

Te pongo un ejemplo

Pongamos que en un formulario tu tienes un botón enviar que envia algo a alguien. Pongamos que lo que quieres enviar lo envias mediante un socket. El caso es que tu quieres que al darle al botón se envie algo a una IP que tienes escrita en tu formulario en textbox.text y luego la comunicacion se corte porque la conversacion ha terminado.

El código del botón sería
public sub boton_click()
Dim H as NEW ClaseSocket(textbox.text, Mensaje$)
if H.correcto=true then
message.info("la cosa se envió bien")
endif
end

Ese es todo el código del botón. Primero envias a la dirección que esté en textbox.text y luego compruebas si hubo error.

¿Como puede ser tan facil? Pues porque tienes hecha una clase que utilizas para enviar cosas por socket. Esa clase cuando la instancias lo que hace es crear un socket, lo conecta a la IP que le digas, envia el mensaje y corta.

El código de esa clase imaginaria es este
Private S as socket 'definir el socket a crear y llamarlo S

property READ Correcto as boolean 'definir una propiedad correcto de tipo boolean
private $Correcto as boolean (la variable que usaré para dar valor a la propiedad Correcto

Public sub _new(Direccion as string, Mensaje as string)
S=NEW socket 'crear el socket
S.connect(Direccion,5000) 'conecto al puerto 5000 de la direccion que me hayan pasado
do while S.status<>net.connected and S.status>0
wait 0.1
loop
'cuando salgo de este bucle o bien he conectado o bien hay error
if S.status=net.connected
write #S,Mensaje,lof(mensaje) 'enviar el mensaje
$Correcto=true
else
$Correcto=false
endif
end

public sub _free()
S.close
end

private function Corecto_Read() as boolean 'la función que devuelve el resultado de la propiedad true o false.
return $Correcto
end

El método especial _NEW es el constructor. Se ejecuta cuando se instancia la clase. Tú en el botón instanciaste la clase al poner el NEW en la rutina del botón y por tanto se ejecuta.
Lo que allí ocurre es que recibe dos parámetros y los utiliza para crear un socket, conectar a una dirección y enviar algo.

Así es como funciona el constructor. Como ves en ese ejemplo puede recibir parámetros y hace cosas al construir la clase.

Si ahora vuelves a mirar la rutina de boton_click te darás cuenta que allí H es una variable creada en esa rutina. Cuando la rutina se acaba H desaparece. Ese es el momento en que actua el destructor

En este caso lo que hace es destruir el socket que creaste. De esa forma el receptor colgará la comunicación y no seguirá pendiente. El método especial destructor es el método _free que nunca lleva argumentos

Con esa clase cada vez que quieras enviarle algo a alguien en el puerto 5000 basta con que la instancies
Dim F as NEW ClaseSocket(ip,mensaje)

Naturalmente podría haber cerrado el socket en _NEW pero esa clase podría hacer muchas mas cosas y en el ejemplo lo que hace es al empezar mandar el mensaje y al terminar cerrar el socket y dejarlo todo limpio.

Citar:
si quisiera ejecutar una acción cuando un formulario es cerrado como lo haría?

Un formulario es también una clase así que puedes usar el constructur para hacer algo al crearlo y usar el destructor igual que antes para hacer algo al derrarlo, pero en el caso particular del formulario este tiene ha hechos unos eventos (en una clase tu puedes crear tus propios eventos y propiedades). Como ya tienes hecho uno no necestas crear otro para hacer lo mismo.

Tu pregunta se contesta con que utilices el evento close
public sub form_close
...
acciones a realizar
...
end

Profile PM  
Subject: Re: Uso De Destructores: _free(), _exit() - (Solucionado)
Excelente amigos. Entiendo lo que me dicen, resolví como me explicaron con el evento _close del formulario.

Muchisimas gracias por sus respuestas.

Profile PM  

Page 1 of 1


  
You cannot post new topics
You cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events

   

This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Generation Time: 0.1053s (PHP: -22% SQL: 122%)
SQL queries: 22 - Debug Off - GZIP Enabled