Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   que evento usar? (https://www.clubdelphi.com/foros/showthread.php?t=68691)

eltioalex 30-06-2010 17:20:27

que evento usar?
 
hola gente, tengo el siguiente problema: desde un formulario (form1) uso a otro
(form2). Es decir, en la clausula uses de form1 tengo la unidad de form2. Lo que necesito es, cuando se cierra form2, actualizar informacion en form1 usando informacion de form2. El proceso de actualizacion lo realizo correctamente. Lo que no se es que evento de form1 tengo que usar para poder actualizar esos datos cuando se cierra form2. Me vendrian bien comentarios que no incluyan el uso de referencias circulares.

desde ya, muchas gracias!

maeyanes 30-06-2010 17:49:19

Hola...

¿Desde qué evento llamas a Form2 y como llamas a Form2 (Modal, No Modal, es MDIChild)? Si puedes poner el código, mejor...


Saludos...

Neftali [Germán.Estévez] 01-07-2010 10:22:41

Cita:

Empezado por eltioalex (Mensaje 368735)
Lo que no se es que evento de form1 tengo que usar para poder actualizar esos datos cuando se cierra form2. Me vendrian bien comentarios que no incluyan el uso de referencias circulares.

Si usas ShowModal, puedes hacerlo justo después, teniendo en cuenta de no destruir el form2 hasta que no hayas actualizado.
Es decir, Haces el showModal, al cerrar el form2 lo ocultas (Action := caHide en el OnClose), actualizas desde el form1 y luego destruyes el form2.

Si no usas ShowModal el problema se complica. En ese caso lo más sencillo es hacer la actualizacion desde el form2 (lo que incluye referencias circulares). Hay otras opciones, pero como te digo son más complejas.
Por ejemplo desde el form1 puedes capturar en ejecución alguno de los eventos de cierre del form2 (OnClose, OnDestroy) y asignarles un procedimiento propio. De esta forma cuando "salten" esos eventos le llegará el control a ese procedimiento.

ecfisa 01-07-2010 17:30:01

Hola etioalex.

Si los forms involucrados están corriendo en un mismo equipo, otra manera que se me ocurre es usando FindWindow y el mensaje WM_COPYDATA.

Pone esto en el evento OnClose del Form2:
Código:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
var
  HandleReceptor: THandle;
  CopyDataStruct: TCopyDataStruct;
begin
  CopyDataStruct.dwData:= 1; // cualquier valor para evaluar en Form1
  HandleReceptor:= FindWindow(PChar('TForm1'),PChar('Form1'));
  if HandleReceptor <> 0 then
    SendMessage(HandleReceptor,WM_COPYDATA,Integer(Handle),
      Integer(@CopyDataStruct));
  Action:= caFree;
end;

Y este código en el otro form:
Código:

  TForm1 = class(TForm)
  private
    procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;
  public
  end;
  ...
implementation
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
begin
  if  Msg.CopyDataStruct.dwData = 1 then
    ShowMessage('Form2 ha sido cerrado'); // acá hace lo que gustes
end;

Saludos.

eltioalex 03-07-2010 03:53:58

solucionado!
 
muchas gracias por las respuestas a todos! ya pude resolver el problema, al final use la propiedad modal result, con el showmodal y andubo todo bien!
saludos!


La franja horaria es GMT +2. Ahora son las 23:48:32.

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