FTP | CCD | Buscar | Trucos | Trabajo | Foros |
#1
|
|||
|
|||
Como se llama?
El tema es el siguiente tengo dos formularios form1 y form2 (no de la forma mdi), es decir cuando se inicia la aplicacion aparece el form1 y en un boton de este al hacer click aparece el form2 encima del form1,el form1 ahora tiene el borde decolorado(por que no esta activo), cuando cierro el form2 se activa el form1, ¿como se llama la accion en donde el form2 pierde el control y lo toma el form1? Por que quiero que al cerrar el form2 se cambien algunos caption en el form1.
Se que es una soncera pero no puedo descubrir el evento. |
#2
|
|||
|
|||
Showmodal.
Form2.ShowModal;
Form1.Close; O puedes poner en el evento ONClose del Form1 el SHowmodal del form2. Bueno espero que esto te sirva.
__________________
"La perseverancia es el camino del éxito" |
#3
|
|||
|
|||
Eso ya lo se
Lo que yo quiero es que cuando cierro el form2, se ejecute un procedimiento por EJ arreglos(nombre del procedimiento) y este realise varias operaciones en el form1 por EJ active o deactive un edit o le cambie el nombre a un caption he probado en el onclose del form2 pero lo ejecuta en algunas ocaciones, no siempre.
En el onclose del form2 puse action:=cafree; y form2=nil;digamos que seria algo parecido a cuando el form1 toma el foco nuevamente. |
#4
|
||||
|
||||
Hola jam888!
Te pongo el siguiente código de ejemplo para manejar eventos, espero que resuelva el problema. Este código corresponde al Form2 esta forma es invocada desde Form1.
Este código corresponde al Form1 desde aquí vas a invocar al Form2
Espero que te sea útil, un saludo. |
#5
|
||||
|
||||
Corrección
Hola nuevamente!
Después de leer el código que coloqué anteriormente me doy cuenta que es más simple de este otra forma. Esto lo colocas en el Form1 para capturar el evento OnClose del Form2.
Las dos formas son válidas pero esta es más simple. Un saludo. |
#6
|
|||
|
|||
Cita:
Por otra parte pienso que este método es necesario únicamente cuando se usa Show, pues con ShowModal se sabe con toda precisión en qué momento se cierra Form2: en la línea que sigue a ShowModal. Bye |
#7
|
||||
|
||||
Hola keyboy!
Tienes razón, la segunda opción fallaría si dentro del Form2 se asigna un procedimiento al evento OnClose. De hecho desde el principio no entiendí bien cual es la necesidad de capturar el evento OnClose si como bien lo dices puedes colocar el código en la línea que le sigue al ShowModal. Tal vez exista una razón y en ese caso esta podría ser una solución. Seguimos en contacto, un saludo |
#8
|
|||
|
|||
La verdad un lujo
Pero me podrian explicar brevemente que es lo que hace?Lo he probado y anda pero no me gusta hacer cosas y no entenderlas Por EJ que significa self yo estoy acostumbrado a trabajar de otra forma ¿Cual es mas conveniente?
procedure TForm1.Button1Click(Sender: TObject); begin with TForm2.Create(Self) do // ¿Este self? no lo entiendo try OnClose:=Miprocedimiento; //¿Que hace aca? ShowModal finally Free; ¿que es este free? end; end; procedure TForm1.Miprocedimiento(Sender: TObject; var Action: TCloseAction); begin {Aquí capturas el evento OnClose del Form2} ShowMessage('Este mensaje aparecerá justo al momento de cerrar el Form2'); end; por que este es declarado privado? |
#9
|
|||
|
|||
Cita:
Todo método de una clase, es decir todo procedimiento o función dentro de la definición de una clase: Código:
type TMiClase = class procedure MiMetodo(Parametro: Integer); end; MiObjeto.MiMetodo(MiObjeto, 84) De esta manera es que dentro del código del método puedes hacer referencia al objeto que se está usando. Por otra parte, las componentes (descendientes de TComponent como es el caso de un formulario) tienen una forma especial de manejar la creación y destrucción de objetos. Toda componente tiene una propiedad Owner que indica cuál es la componente que se encarga de destruirla. En el constructor Create de una componente es donde indicas cuál va a ser el Owner (dueño). Cuando una componente se destruye, repasa la lista de componentes que 'le pertenecen' destruyendo a su vez cada una de ellas. En el caso de TForm2.Create(Self) Self es Form1 y por tanto será el dueño (Owner) de la componente TForm2 creada. Por tanto, cuando Form1 se destruya automáticamente se destruirá la instancia de TForm2 que creaste por lo cual no es necesario destruirla explícitamente. Un objeto se destruye explícitamente llamando a su método Free, que es lo que haces en Código:
finally Free; end; En estos casos yo usaría: TForm2.Create(nil) indicando que nil será el dueño de la componente creada. Como nil no es nada, realmente lo que estás indicando es que nadie será el dueño del objeto y que por tanto nadie se va a ocupar de destruirlo sino que lo harás tú explícitamente- como en efecto lo haces con Free. Cuando haces OnClose := MiProcedimiento; estás asignado el procedimiento MiProcedimiento a OnClose. Esto parece una explicación algo boba pero el punto aquí es que los eventos en Delphi, tales como OnClose, son realmente propiedades del objeto, cuyos valores son procedimientos (más correctamente, métodos), así quela setencia anterior no es más que la asignación de un valor a una propiedad. Cuando en el inspector de objetos das doble click a un evento como OnClose, te aparece el cuerpo del evento: Código:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin end; Form2.Onlose := FormClose Pero en ocasiones, como en el ejemplo de Héctor, en lugar de dejar que Delphi lo haga automáticamente lo hacemos nosotros mismos. En este caso es necesario porque se está asignando un método que no pertenece a TForm2 sino a TForm1. ¿Que por qué se declara como privado? Pues es un poco cuestión de gustos, pero dado que MiProcedimiento no tiene por objeto ser usado desde fuera de Form1, es natural ponerlo como privado. bye |
#10
|
|||
|
|||
Muchas Gracias
Muchas Gracias KEYBOY Y A TODOS por sus respuestas , eh aprendido algo nuevo que para Mi es de muchisima utilidad, Un Abrazo y hasta pronto.
|
|
|
|