PDA

Ver la Versión Completa : Mostrar un mensaje despues de la visualización de un form


__cadetill
13-12-2003, 17:58:57
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

marcoszorrilla
13-12-2003, 18:15:27
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.

guillotmarc
13-12-2003, 18:17:43
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).


procedure TForm1.FormActivate(Sender: TObject);
begin
if Inicializado then Exit;
Inicializado := True;
Proceso_a_lanzar;
end;


Salut.

jachguate
13-12-2003, 19:03:08
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.

;)

__cadetill
13-12-2003, 19:29:04
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 :p 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 :p) 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 ;)

roman
13-12-2003, 22:44:48
cadetill comentó:
Bueno, pues a falta de otras soluciones.... haré lo de la variable


Calma, calma no desesperes! :D

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:


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:


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

roman
13-12-2003, 22:52:41
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

Ruben_Cu
14-12-2003, 01:48:34
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í:
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

marcoszorrilla
14-12-2003, 09:35:12
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.


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.

guillotmarc
14-12-2003, 19:07:38
Hola.

Alla voy con otra propuesta :


procedure TForm1.FormActivate(Sender: TObject);
begin
Proceso_a_lanzar;
Self.OnActivate := nil;
end;


Simple y eficiente ¿ no os parece ?.

Saludos.

marcoszorrilla
14-12-2003, 19:41:20
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.

__cadetill
14-12-2003, 22:49:53
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é :p

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 :D

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

De nuevo gracias a todos

Delfino
15-12-2003, 15:26:11
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..

jachguate
15-12-2003, 23:43:14
Solo quiero comentar que este hilo me ha parecido un derroche de ingenio y talento!

Bravo por el club!

:cool: :cool: