Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Algún evento que trabaje con showmodal? (https://www.clubdelphi.com/foros/showthread.php?t=77578)

study 08-02-2012 20:21:25

Algún evento que trabaje con showmodal?
 
Hola gente, tengo el siguiente problema que me tiene hace varias horas dando vueltas, tal vez puedan ayudarme. Tengo un Form A y tengo un Form B. Con el Form A abierto, abro el Form B con Showmodal para que no puedan usar el Form A, ni ningun otro hasta cerrar el Form B. Hasta ahí justo lo que necesitaba. Mi duda es, el Form A, ¿ejecuta algún evento cuando el Form B se cierra?. onActivate no hace nada, y las soluciones que encontré son bastante feas (un timer que revisa desde el Form A que el Form B este abierto, o el evento onPaint). Puedo aceder al Form B desde el Form A, al revés no por una cuestión del diseño de la aplicación. Muy agradecido a cualquiera que lea.

Caral 08-02-2012 20:33:23

Hola
No entiendo.
Saludos

kapcomx 08-02-2012 20:49:15

cerrar form
 
puedes programar el evento onclose del formulario B para que ejecute cambios en el formulario A.

Código Delphi [-]
 
procedure TformB.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
 
 
formA.labelx.caption:='Algo';
 
end;

Saludos...:cool:

TiammatMX 08-02-2012 20:53:30

Como decía Jack el Destripador, vayamos por partes...
Cita:

Empezado por study (Mensaje 424564)
....Mi duda es, el Form A, ¿ejecuta algún evento cuando el Form B se cierra?...

No, no ejecuta NINGÚN evento, por que el control NO lo tiene la forma A, sino la forma B.

Cita:

Empezado por study (Mensaje 424564)
...Puedo aceder al Form B desde el Form A, al revés no por una cuestión del diseño de la aplicación...

Pues sí puedes acceder a la forma A desde la forma B, siempre y cuando le des un "Use Unit" dirigido a la forma A DENTRO de la forma B, y tus llamadas pueden quedar así:

Código Delphi [-]
formaB.Variable := formaA.VariableTransporte;

No es tan complicado, lo complejo es evitar las llamadas circulares, pero ése es otro tema...

oscarac 08-02-2012 20:55:06

mmm y si posteriormente al frmB.showmodal en el fmrA ejecutas la accion que deseas...

algo asi


Código Delphi [-]
 
frmB.ShowModal; // aqui se activa el formB
frmA.loquesea; // esta linea se ejecutara despues de salir del frmB

study 08-02-2012 20:56:29

@[Caral]
Cuando un form se muestra modal, el resto se "desactiva" por decirlo de alguna forma, y luego se vuelven a activar, pero en ningún momento se ejecuta el evento onDeactivate u onActivate. Mi pregunta es, hay algún evento que SI ejecuten siempre en estos casos?

Caral 08-02-2012 21:02:42

Hola
Cita:

Empezado por study (Mensaje 424573)
@[Caral]
Cuando un form se muestra modal, el resto se "desactiva" por decirlo de alguna forma, y luego se vuelven a activar, pero en ningún momento se ejecuta el evento onDeactivate u onActivate. Mi pregunta es, hay algún evento que SI ejecuten siempre en estos casos?

NO, no hay ningun evento en el form que llama, en este caso el form1.
Lo correcto es crear y destruir los forms.
Desde el form que llama, en este caso el form1.
Código Delphi [-]
   Form2:=TForm2.Create(self);
   try
      Form2.ShowModal;
   finally
      Form2.Free;
   end;
Se crea, se muestra y se libera.
Saludos

study 08-02-2012 21:05:50

Gracias por las ideas pero ya las había intentado todas, el tema no es pasar la información entre los formularios, sino ejecutar la instrucción precisamente en el momento que el formulario se cierra. El tema es que la estructura de formularios que manejo es bastante compleja, y ejecutar una funcion del Form A desde B se puede pero es bastante complejo por la cantidad de variables posibles.

@oscarac, probando tu idea...

Caral 08-02-2012 21:09:17

Hola
Cita:

Empezado por study (Mensaje 424575)
Gracias por las ideas pero ya las había intentado todas, el tema no es pasar la información entre los formularios, sino ejecutar la instrucción precisamente en el momento que el formulario se cierra. El tema es que la estructura de formularios que manejo es bastante compleja, y ejecutar una funcion del Form A desde B se puede pero es bastante complejo por la cantidad de variables posibles.

@oscarac, probando tu idea...

Es lo mismo que dije, solo que hacer algo despues de cerrar el form:

Código Delphi [-]
Form2:=TForm2.Create(self);
   try
      Form2.ShowModal;
   finally
      Label1.caption:= 'ya cerré el form2 y tengo este dato en el form1';
     Form2.Free;
   end;

Saludos

study 08-02-2012 21:18:26

el tema es que los forms no los estoy creando dinamicamente. En general hacerlo así funciona bastante bien. Salvo en algunos casos especificos donde creo que lo voy a solucionar asegurandome de pasarle la referencia de que objeto tiene que ejecutar que funcion al cerrarse. Muhas gracias por su ayuda, al final la solución era mucho mas sencilla de lo que yo quería hacer. Creo que pasar tanto tiempo en PHP me arruino. :P

Caral 08-02-2012 21:21:46

Hola
El asunto va mas alla de crear el form dinamicamente.
Si se crean todos al inicio del programa, este se vuelve muy lento.
Para que hacerlo se se va a usar un showModal ?, eso esta bien para un sencillo show.
Saludos

oscarac 08-02-2012 21:24:30

Cita:

Empezado por study (Mensaje 424580)
el tema es que los forms no los estoy creando dinamicamente. En general hacerlo así funciona bastante bien. Salvo en algunos casos especificos donde creo que lo voy a solucionar asegurandome de pasarle la referencia de que objeto tiene que ejecutar que funcion al cerrarse. Muhas gracias por su ayuda, al final la solución era mucho mas sencilla de lo que yo quería hacer. Creo que pasar tanto tiempo en PHP me arruino. :P


y como lo solucionaste?
pregnuto por siacaso a alguien mas se le presente la misma inquietud

ecfisa 08-02-2012 21:41:25

Hola study.

Si no entendí mal tu planteo, podrías hacer de este modo:

FormA:
Código Delphi [-]
...
type
  TFormA = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    procedure FormBHasClosed(Sender: TObject);
  public
  end;

var
  FormA: TFormA;

implementation 

uses Unit2; // Unidad de FormB

procedure TFormA.FormBHasClosed(Sender: TObject);
begin
  Caption:= 'FormB se ha cerrado';
end;

procedure TFormA.FormShow(Sender: TObject);
begin
  with TFormB.Create(Self) do
  begin
    HasClosed:= FormBHasClosed;
    Show;
  end;
end;
...

FormB:
Código Delphi [-]
...
type
  TNotifyEvent = procedure(Sender: TObject) of object;
  TFormB = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FCloseEvent: TNotifyEvent;
  public
    property HasClosed: TNotifyEvent read FCloseEvent write FCloseEvent;
  end;

var
  FormB: TFormB;

implementation

procedure TFormB.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(FCloseEvent) then
    FCloseEvent(Self);
end;
...

Saludos.

study 08-02-2012 21:50:29

Código Delphi [-]
unit_menganito.form_fulanito.abrir; //funcion que ejecuta Self.showModal entre otras cosas
variable := unit_menganito.form_fulanito.getVariableQueMeInteresa; //Una vez que se cerro 
//el form rescato el dato que me importa

Así funciona bien en un caso básico. Ahora el tema es que tengo uno o dos casos donde por ejemplo formA ejecuta formB que ejecuta formA (no me miren así, se que es una aberración de diseño, lo voy a arreglar). Probablemente termine siendo algo tipo se crea y se ejecuta formA (TFormA) que crea y ejecuta FormB (TformB) que crea y ejecuta FormC (TFormA).

Espero que le sirva al proximo yo que venga con la misma duda.

@ecfisa, muy buena la de crear mi propio evento, en este caso creo que no va a ser necesario, pero me queda la nota para casos futuros.

Neftali [Germán.Estévez] 09-02-2012 10:00:18

Cita:

Empezado por ecfisa (Mensaje 424584)
...podrías hacer de este modo:

+1

Pues justo iba a proponer lo mismo que Ecfisa; Es decir, si necesitas un evento, crearlo del tipo TNotifyEvent, que justo está para eso (para notificar cosas).

Creo que es el más correcto y elegante.

engranaje 09-02-2012 10:33:11

Yo no estoy seguro de haber entendido bien el problema, ya que al mostrarse modal la siguiente linea de código que se procesa despues de que se cierre la ventana es la que hay justo despues de la que mostraba el form modal. Por lo que he leido, y pido disculpas si no entendi bien, creo que lo que sucede es el formulario desde el que se llama al modal necesita información seleccionada o añadida en el modal. Lo que yo suelo hacer en estos casos es crear un DataModule común a ambos formularios en el que hago todo el trabajo duro, dejando a los forms básicamente como interfaces con el usuario.
Ya digo que estoy suponiendo que realmente lo que pasa en esta aplicación en concreto es que un monton de formularios deben de compartir la información entre ellos y entendiendo que el problema básico con el que te estas encontrando es el "traspaso de datos" entre ellos.


La franja horaria es GMT +2. Ahora son las 19:43:54.

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