formulario de inicio de delphi hace acontecimientos no se muestra temporizador incendio si no de forma modal

StackOverflow https://stackoverflow.com/questions/4149818

Pregunta

he codificado un formulario de inicio que se desvanece en, espectáculos para un tiempo, luego se desvanece a cabo. El desvanecimiento se implementa con un temporizador que cierra el formulario también. Funciona bien.

I estaba mostrando la forma modal, pero sospechaba que la forma principal no estaba empezando a construir y que muestra hasta después del formulario de inicio estaba cerrado.

Entonces pensó que si mostraba la forma no de forma modal y solía fsStayOnTop (es decir SplashForm.Show en lugar de SplashForm.ShowModal) entonces la forma principal podría inicializar detrás del formulario de inicio tan pronto como se demostró el formulario de inicio, es decir, el aplicación estaba listo para salir cuando el formulario de inicio cerrado.

Me parece sin embargo que el evento de temporizador no se dispara más. Tampoco un evento TApplication.OnIdle. Lo que da?

¿Fue útil?

Solución

decir que esto es una pantalla de bienvenida. ¿Se está mostrado durante el arranque del programa, antes de que usted ha golpeado el Application.Run; línea de la DPR? Si es así, entonces el bucle de eventos TApplication no ha comenzado todavía, por lo que no recibirá eventos OnIdle.

Otros consejos

Fundido no funcionarán con temporizadores estándar porque bucle de aplicación no funcionará hasta que llame Application.Run (como se ha dicho por Mason), y temporizadores son contenedores para un mecanismo temporizador API basado en mensajes.

No se puede utilizar temporizadores base de hilo, porque va a requerir una sincronización para el trabajo con la interfaz de usuario y Sincronizar es el mensaje mecanismo basado.

Pero se puede residuos El tiempo necesario para fade-in / fade out, por lo que podría conseguir un inicio de la aplicación de fantasía y si usted está buscando para esto he libremente en cuenta que no está preocupado por perder un poco de tiempo. Puedo explicar mucho mejor con (trabajo y probado) ejemplo de código, por lo que esto va a funcionar para usted:

USplashForm.pas:

//...
interface
//...
type
  TSplashForm = class(TForm)
    //...
  public
    procedure FadeIn;
    procedure FadeOut;
    //...
  end;

//...
implementation
//...
procedure TSplashForm.FadeIn;
begin
  AlphaBlend := True;
  AlphaBlendValue := 0;
  Show;
  Update;
  repeat
    AlphaBlendValue := AlphaBlendValue + 5;
    Update;
    Sleep(20);
  until AlphaBlendValue >= 255;
end;

procedure TSplashForm.FadeOut;
begin
  repeat
    AlphaBlendValue := AlphaBlendValue - 5;
    Update;
    Sleep(20);
  until AlphaBlendValue <= 5;
  Hide;
end;
//...

YourProject.dpr

var
  Splash: TSplashForm;

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Splash := TSplashForm.Create(nil);
  try
    Splash.FadeIn;
    //any initialization code here!!!
    Application.CreateForm(TMainForm, MainForm);
    MainForm.Show;
    MainForm.Update;
    //more code
    Sleep(500);  //I used it to delay a bit, because I only create one form and I have not initialization code at all!
    Splash.FadeOut;
  finally
    Splash.Free;
  end;
  Application.Run;
end.

Mis 5 centavos, disfrutar.

lo he hecho de la siguiente manera:

  • I elimina el formulario de inicio de la "Auto-crear formas".
  • En el FormCreate de la forma principal que tengo:

    with TfSplash.Create(Self) do Show;
    
  • Y en el formulario de inicio tengo el siguiente:

    procedure TfSplash.FormShow(Sender: TObject);
    begin
      Timer.Enabled:=True;
    end;
    
    
    procedure TfSplash.TimerTimer(Sender: TObject);
    begin
      Release; // like free, but waits for events termination
    end;
    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top