Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-03-2005
jam888 jam888 is offline
Miembro
 
Registrado: sep 2004
Posts: 115
Poder: 20
jam888 Va por buen camino
Question 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.
Responder Con Cita
  #2  
Antiguo 12-03-2005
alfredosg19 alfredosg19 is offline
Miembro
 
Registrado: ene 2005
Ubicación: Barcelona
Posts: 91
Poder: 20
alfredosg19 Va por buen camino
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"
Responder Con Cita
  #3  
Antiguo 12-03-2005
jam888 jam888 is offline
Miembro
 
Registrado: sep 2004
Posts: 115
Poder: 20
jam888 Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 13-03-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
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.

Código Delphi [-]
type
  TForm2 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FMiEvento:TNotifyEvent;
  public
     {Declaras un evento como propiedad del Form2}
     property MiEvento:TNotifyEvent read FMievento write FMiEvento;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //Si se asignó el evento, entonces se invoca
  if Assigned(FMiEvento) then FMiEvento(Self);
end;

Este código corresponde al Form1 desde aquí vas a invocar al Form2

Código Delphi [-]
implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 with TForm2.Create(Self) do
 try
  {Asignas un procedimiento a la propiedad MiEvento en Form2}
  MiEvento:=EventoEnForm1;
  ShowModal;
 finally
   Free;
 end;
end;

procedure TForm1.EventoEnForm1(Sender: TObject);
begin
  ShowMessage('Este evento ocurre cuando cierras el Form2,'+#10#13+
              'Pero lo manejas en el Form1'+#10#13#13+
              'Ejemplo: este es el caption de la forma '+Caption);
end;




Espero que te sea útil, un saludo.
Responder Con Cita
  #5  
Antiguo 15-03-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
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.

Código Delphi [-]

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure Miprocedimiento(Sender: TObject; var Action :TCloseAction);
  public
  end;

var

  Form1: TForm1;

implementation

uses
 Unit2;

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm2.Create(Self) do
  try
    OnClose:=Miprocedimiento;
    ShowModal
  finally
    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;

Las dos formas son válidas pero esta es más simple.

Un saludo.
Responder Con Cita
  #6  
Antiguo 15-03-2005
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
Cita:
Empezado por HECTOR RANDOLPH
Las dos formas son válidas pero esta es más simple.
Sí, pero la primera es mejor. Con la segunda inhabilitas lo que el propio Form2 haya podido implementar en el evento OnClose.

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
Responder Con Cita
  #7  
Antiguo 15-03-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 15-03-2005
jam888 jam888 is offline
Miembro
 
Registrado: sep 2004
Posts: 115
Poder: 20
jam888 Va por buen camino
Question 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?
Responder Con Cita
  #9  
Antiguo 16-03-2005
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
Cita:
Empezado por jam888
no me gusta hacer cosas y no entenderlas
¡Excelente actitud! Pero no estaría de más que te leyeras algún libro básico de Delphi. Mientras tanto te aclaro algunas cosas:

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;
pasa un parámetro oculto Self que corresponde al objeto con el cual se hace la llamada. Es decir, si MiObjeto es una variable de tipo TMiClase, cuando llamas a MiObjeto.MiMetodo(84); es como si hubieras puesto:

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 el ejemplo en particular yo no pondría Self como parámetro de TForm2.Create ya que justamente usas Free al término del ShowModal y el uso de finally garantiza que el Free se va a ejecutar.

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;
Y Delphi se encarga automáticamente de hacer la asignación:

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
Responder Con Cita
  #10  
Antiguo 16-03-2005
jam888 jam888 is offline
Miembro
 
Registrado: sep 2004
Posts: 115
Poder: 20
jam888 Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:24:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi