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 13-12-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Mostrar un mensaje despues de la visualización de un form

Hola

Esto creo que ya se ha preguntado, pero no he logrado encontrarlo en la búsqueda

Bueno, pos lo que quiero es mostrar un mensaje después de la visualización de un Formulario según una condición dada (que la capturo en el OnShow o en el OnCreate, me da lo mismo).

Si alguno tiene alguna idea o logra encontrar el hilo donde se explicaba...

Muchas gracias
Responder Con Cita
  #2  
Antiguo 13-12-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Hola Cadetill:

Este es el orden en que se producen los eventos:

1. OnCreate
2. OnShow
3. OnPaint
4. OnActivate
5. OnResize
6. OnPaint again

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 13-12-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola. Que fas treballant ?

No sé si te he entendido bien, pero creo que tengo un problema parecido, y el único evento que he encontrado adecuado es el OnActivate.

Pare que solo se ejecute la primera vez, (y no si cambias a otra aplicación y luego vuelves), tengo una variable privada en el formulario llamada Inicializado, que evita que entre más de una vez. (No es nada bonito tener que declarar una variable en el módulo solo para eso, pero a la espera de encontrar una solución mejor, funciona).

Código:
procedure TForm1.FormActivate(Sender: TObject);
begin
  if Inicializado then Exit;
  Inicializado := True;
  Proceso_a_lanzar;
end;
Salut.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #4  
Antiguo 13-12-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Marc... creo que te valdria usar el OnShow, que se dispara una sola vez cuando el formulario es mostrado. Has tenido algun problema con este evento?

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 13-12-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Bueno, gracias a todos por responder y, precisamente lo que quería evitar era eso, Marc, lo de la variable global.

Pensé que el Loaded me podría servir, pero poniendo puntos de ruptura me saltaba antes el Loaded que el Create.

Por otro lado, Marcos, el orden lo tenía más o menos claro Pero con Create o Show, el formulario todabía no se ha mostrado y, los demás (Paint y Activate) tienen el problema que comenta Marc. Y el Resize no me sirve ya que no se produce ningún cambio de tamaño en el form por lo que no se me dispara.

Por lo descrito, Juan Antonio, no nos sirve ni a Marc ni a mi el OnShow ya que lo que queremos lograr (almenos yo ) es que el mensaje se muestre despues de la visualización del formulario.

Bueno, pues a falta de otras soluciones.... haré lo de la variable

Gracias a todos
Responder Con Cita
  #6  
Antiguo 13-12-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
cadetill comentó:
Bueno, pues a falta de otras soluciones.... haré lo de la variable
Calma, calma no desesperes!

En alguna ocasión di un respuesta para algo que creo es similar. No era para mostrar un mensaje pero sí para ejecutar algo una vez que el formulario se mostrado completamente.

A grandes rasgos la idea es definir un mensaje propio:

Código:
const
  CM_AFTERSHOW = WM_USER + 84;

type
  TForm1 = class(TForm)
  private
    procedure CMAfterShow(var Msg: TMessage); message CM_AFTERSHOW;
  end;
En el evento OnShow mandas el mensaje con Post:

Código:
PostMessage(Handle, CM_AFTERSHOW, 0, 0);
Y en el manejador de CM_AFTERSHOW muestras el mensaje que quieres. (Algunas veces conviene poner Application.ProcessMessages al principio del manejador de CM_AFTERSHOW)

El punto aquí es usar PostMessage en lugar de SendMessage ya que de esta manera el mensaje no se procesará sino hasta que terminen de procesarse los demás y de esta manera el formulario ya se habrá mostrado.
// Saludos
Responder Con Cita
  #7  
Antiguo 13-12-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
cadetill comentó:
Pensé que el Loaded me podría servir, pero poniendo puntos de ruptura me saltaba antes el Loaded que el Create.
¿Estás seguro? El procedimeinto Loaded se llama cuando se está procesando el constructor Create.

// Saludos
Responder Con Cita
  #8  
Antiguo 14-12-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Hola a todos, una posible solución podría ser el uso de un timer, claro habría que hacer un balance del uso de los recursos entre las soluciones propuestas ya que todas 'consumen' recursos en mayor o menor medida.
Con el uso del timer se puede usar tanto el OnCreate como el OnShow y sería ajustar enabled a false, y poner el tiempo adecuado. Quedaría mas o menos así:
Código:
procedure TForm1.FormShow(Sender: TObject);
begin
        if condicion then Timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
        Timer1.Enabled:=false;
        Showmessage('Hola cadetill');
end;
Quizas no sea lo óptima pero es sencilla y funciona.
Saludos
Responder Con Cita
  #9  
Antiguo 14-12-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Otra solución a parte de las ya propuestas, pudiera ser, si es que el formulario no se cierra durante la vida de la aplicación, utilizar su propiedad Tag.

Código:
procedure TForm2.FormPaint(Sender: TObject);
begin
form2.tag:=form2.tag+1;

if form2.Tag < 2 then
ShowMessage('Salut Cadetill');
end;
Si se cierra con la opciona CaFree, se destruiría todo por lo tanto no servirá lo propuesto, pero quizás haya un formulario que no se cierre en toda la aplicación y que se abra antes que este, entonces también podríamos utilizar la propiedad Tag de este.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #10  
Antiguo 14-12-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

Alla voy con otra propuesta :

Código:
procedure TForm1.FormActivate(Sender: TObject);
begin
  Proceso_a_lanzar;
  Self.OnActivate := nil;
end;
Simple y eficiente ¿ no os parece ?.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #11  
Antiguo 14-12-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
A eso se le llama cortar por la sano, anulas el evento y se acabo.

Tirando de refranero quedaría:
"Muerto el perro se acabo la rabia"

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #12  
Antiguo 14-12-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Cita:
roman comentó:
En alguna ocasión di un respuesta para algo que creo es similar. No era para mostrar un mensaje pero sí para ejecutar algo una vez que el formulario se mostrado completamente.
este creo que era el hilo que buscaba y no encontré

Con lo referente al Loaded, pues puse puntos de ruptura en él y en el OnCreate y OnShow y se paraba primero en el Loaded, luego Create y para terminar en el Show.

También decir que la respuesta de Marc me ha gustado

Dentro de 3 semanas ya veré cual de estas implemento (si es que me acuerdo )

De nuevo gracias a todos
Responder Con Cita
  #13  
Antiguo 15-12-2003
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Catedill, te iba sugerir la propuesta de marc (desactivar el onactivate) pq la habia probado hace tiempo en una aplicacion y funciona perfectamente y no me dio ningun efecto secundario..
Responder Con Cita
  #14  
Antiguo 15-12-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Thumbs up

Solo quiero comentar que este hilo me ha parecido un derroche de ingenio y talento!

Bravo por el club!

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
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 09:51:42.


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