Ir al contenido


Foto

Evitar retrazo en el evento OnCreate


  • Por favor identifícate para responder
14 respuestas en este tema

#1 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 02 junio 2010 - 01:12

Hola

Necesito realizar unos procesos en el momento de crear una aplicación, resulta que mientras ejecuta los procesos no se muestran los componentes visuales hasta que el proceso es finalizado.

No puedo utilizar el evento OnShow porque me duplica los procesos.

La pregunta es..... ¿ Hay forma de evitar este efecto o existe algún metodo de realizar este proceso en medio de los eventos OnCreate y OnShow ?

Bueno, una imagen vale mas que 1000 palabras.

Salud OS

Archivos adjuntos


  • 0

#2 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 02 junio 2010 - 01:18

Hola

Necesito realizar unos procesos en el momento de crear una aplicación, resulta que mientras ejecuta los procesos no se muestran los componentes visuales hasta que el proceso es finalizado.

No puedo utilizar el evento OnShow porque me duplica los procesos.

La pregunta es..... ¿ Hay forma de evitar este efecto o existe algún metodo de realizar este proceso en medio de los eventos OnCreate y OnShow ?

Bueno, una imagen vale mas que 1000 palabras.

Salud OS


Posiblemente, OnActivate (si será una ventana modal, por ejemplo) o generar dentro del OnCreate la visualización por medio de parámetros. Ejemplo:



delphi
  1. procedure MenuItem1(Sender:TObject);
  2. begin
  3.   LaPantalla := TLaPantalla.Create(Self);
  4.   LaPantalla.Elcontrol.Visible := True;
  5.   LaPantalla.OtroControl.Visible := True;
  6. end;



Creo que ésto puede funcionarte.
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 02 junio 2010 - 01:29

Gracias amigo Felipe.mx, resulta que es la forma Principal, de hecho es la única forma que tiene el programita. Hice lo que propones antes de ejecutar los procesos pero sigue sin mostrar los componentes visuales. :(

Salud OS
  • 0

#4 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 02 junio 2010 - 02:31

Gracias amigo Felipe.mx, resulta que es la forma Principal, de hecho es la única forma que tiene el programita. Hice lo que propones antes de ejecutar los procesos pero sigue sin mostrar los componentes visuales. :(

Salud OS


No, pos así visto..., creo que el OnActivate sería la mejor opción..., por que no creo que haya un evento intermedio entre OnCreate y OnShow, que sería lo que podrías usar.

Recordar: OnCreate CREA y propone la forma y su comportamiento. OnShow muestra visualmente la forma y ejecuta el comportamiento visual de los controles contenidos en ella...

O al menos, así me lo platicaron en el curso.
  • 0

#5 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 02 junio 2010 - 02:48

Hola Eliseo

Prueba con este código, como puedes ver ahora tendrás un evento que se ejecuta justo después del Show o después del Create puedes elegir cualquiera de los dos.

Saludos



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs;
  8.  
  9. const
  10.   WM_AFTER_SHOW = WM_USER + 300;
  11.   WM_AFTER_CREATE = WM_USER + 301;
  12.  
  13.  
  14. type
  15.   TForm1 = class(TForm)
  16.     procedure FormShow(Sender: TObject);
  17.     procedure FormCreate(Sender: TObject);
  18.   private
  19.     { Private declarations }
  20.     procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;
  21.     procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE;
  22.   public
  23.     { Public declarations }
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29.  
  30.  
  31. implementation
  32.  
  33. {$R *.dfm}
  34.  
  35. procedure TForm1.FormShow(Sender: TObject);
  36. begin
  37.   PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
  38. end;
  39.  
  40. procedure TForm1.FormCreate(Sender: TObject);
  41. begin
  42.   PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0);
  43. end;
  44.  
  45.  
  46. procedure TForm1.WmAfterShow(var Msg: TMessage);
  47. begin
  48.   ShowMessage('Después del Show!');
  49. end;
  50.  
  51. procedure TForm1.WmAfterCreate(var Msg: TMessage);
  52. begin
  53.   ShowMessage('Después del Create!');
  54. end;
  55.  
  56.  
  57. end.



  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 junio 2010 - 03:03

En estos casos, ¿no es mejor colocar un splash?. Si permitimos que el formulario principal se muestre da la sensación de cuelgue...

Otra forma simple de realizar lo que quieres, salvando el excelente truco de Héctor Randolph,  es colocar un timer cuyo evento sólo se ejecutará una vez, el timer comenzará a funcionar tras crearse el formulario y ser capar de recibir mensajes, con lo que ya se estará viendo completamente.

Saludos.
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 02 junio 2010 - 03:09

Hola Eliseo

Prueba con este código, como puedes ver ahora tendrás un evento que se ejecuta justo después del Show o después del Create puedes elegir cualquiera de los dos.

Saludos


Ahora lo pruebo amigo Hector.

En estos casos, ¿no es mejor colocar un splash?. Si permitimos que el formulario principal se muestre da la sensación de cuelgue...

Otra forma simple de realizar lo que quieres, salvando el excelente truco de Héctor Randolph,  es colocar un timer cuyo evento sólo se ejecutará una vez, el timer comenzará a funcionar tras crearse el formulario y ser capar de recibir mensajes, con lo que ya se estará viendo completamente.

Saludos.


El splash no lo he considerado sin embargo lo tengo como última alternativa, lo del timer lo pruebo ahora mismo.

Muchas gracias amigos.

Salud OS
  • 0

#8 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 02 junio 2010 - 03:13

Hice algunas pruebas y creo que esto puede funcionar



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls;
  8.  
  9. const
  10.   WM_AFTER_CREATE = WM_USER + 301;
  11.  
  12.  
  13. type
  14.   TForm1 = class(TForm)
  15.     Button1: TButton;
  16.     Button2: TButton;
  17.     Button3: TButton;
  18.     procedure FormCreate(Sender: TObject);
  19.   private
  20.     { Private declarations }
  21.     procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE;
  22.   public
  23.     { Public declarations }
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29.  
  30.  
  31. implementation
  32.  
  33. {$R *.dfm}
  34.  
  35.  
  36. procedure TForm1.FormCreate(Sender: TObject);
  37. begin
  38.   PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0);
  39. end;
  40.  
  41.  
  42.  
  43. procedure TForm1.WmAfterCreate(var Msg: TMessage);
  44. var
  45.   I: Integer;
  46. begin
  47.   Update;
  48.   //Entra en el proceso lento
  49.   for I:= 0 to 10 do
  50.   begin
  51.     Sleep(500);
  52.   end;
  53. end;
  54.  
  55.  
  56. end.


  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 02 junio 2010 - 03:14


Gracias amigo Felipe.mx, resulta que es la forma Principal, de hecho es la única forma que tiene el programita. Hice lo que propones antes de ejecutar los procesos pero sigue sin mostrar los componentes visuales. :(

Salud OS


No, pos así visto..., creo que el OnActivate sería la mejor opción..., por que no creo que haya un evento intermedio entre OnCreate y OnShow, que sería lo que podrías usar.

Recordar: OnCreate CREA y propone la forma y su comportamiento. OnShow muestra visualmente la forma y ejecuta el comportamiento visual de los controles contenidos en ella...

O al menos, así me lo platicaron en el curso.


NO habia reparado en ese evento, ahora lo pruebo y les comento con cual alternativa me quedo :) Gracias amigo Felipe.mx

Salud OS
  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 02 junio 2010 - 03:31

Hola

Les informo, todos los métodos hacen exactamente lo mismo, ya se ve la forma con todos sus controles, ahora el punto es que se queda bloqueada hasta que termina de procesar la información.

Seguiré probando otras alternativas, muchas gracias.

Salud OS
  • 0

#11 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 02 junio 2010 - 03:43

Saludos.

Después de implementar la alternativa de Héctor Randolph, puedes mezclarlo con Hilos; esta opción es buena siempre y cuando los procesos que se ejecuten dentro de los botones no necesiten "algo" de lo que el Create realiza.

Prueba y postea! (y)
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 02 junio 2010 - 03:52

Saludos.

Después de implementar la alternativa de Héctor Randolph, puedes mezclarlo con Hilos; esta opción es buena siempre y cuando los procesos que se ejecuten dentro de los botones no necesiten "algo" de lo que el Create realiza.

Prueba y postea! (y)


Interesante punto, los botones solo minimizan la aplicación como trayIcon y la cierran, no tienen otro objetivo. Intentaré y les comento.

Salud OS
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 02 junio 2010 - 04:07

Bueno, pues me acordé de la genialidad de mi little bro cHackAll y utilicé su unidad _busy.pas y quedo perfecto con la combinación del evento OnActivate.

Muchas gracias a todos.

Salud OS

Archivos adjuntos


  • 0

#14 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 02 junio 2010 - 06:48

Saludos.

El uso del evento OnActivate se debe de usar con sumo cuidado, porque este se ejecuta cada vez que el formulario se activa, y dependiendo de los procesos que realices en dicho evento podrías causar mal funcionamiento o duplicidad de procesos cuando solo se necesite ejecutar una sola vez. 

Se debe tener sumo cuidado.
  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 02 junio 2010 - 08:15

Saludos.

El uso del evento OnActivate se debe de usar con sumo cuidado, porque este se ejecuta cada vez que el formulario se activa, y dependiendo de los procesos que realices en dicho evento podrías causar mal funcionamiento o duplicidad de procesos cuando solo se necesite ejecutar una sola vez. 

Se debe tener sumo cuidado.


Muchas gracias amigo Rolphy, lo tomaré en cuenta.

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.