代码之家  ›  专栏  ›  技术社区  ›  rossmcm

如果非模式显示,delphi splash窗体不会触发计时器事件

  •  2
  • rossmcm  · 技术社区  · 14 年前

    我已经编写了一个splash表单,它淡入,显示一段时间,然后淡出。淡入是通过一个计时器来实现的,该计时器也会关闭窗体。它工作得很好。

    我只是在模式上展示表单,但我怀疑主表单直到splash表单关闭后才开始构建和显示。

    然后我想,如果我非模态地显示表单并使用fsstationtop(即splash form.Show而不是SplashForm.showmodel),那么只要SplashForm显示出来,主表单就可以在SplashForm后面初始化,这意味着当SplashForm关闭时,应用程序已经准备就绪。

    但我发现计时器事件不再触发。也没有一个TApplication.OnIdle事件。给什么?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Mason Wheeler    14 年前

    你说这是一个启动屏幕。它是在程序启动时显示的吗 Application.Run; 在朝鲜?如果是,那么应用程序事件循环尚未启动,因此您将不会得到任何OnIdle事件。

        2
  •  2
  •   jachguate    14 年前

    Fade不能与标准计时器一起使用,因为在调用application.Run(如Mason所说)之前,应用程序循环不会运行,计时器是基于消息的计时器API机制的包装器。

    不能使用基于线程的计时器,因为它需要Synchronize才能与UI一起工作,Synchronize是基于消息的机制。

    但是你可以 浪费 淡入淡出所需的时间,因此您可以启动一个漂亮的应用程序,如果您正在寻找这个,我可以自由地认为您不必担心浪费一点时间。我可以用(工作和测试)代码示例更好地解释,所以这对您很有用:

    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.
    

    我的5美分,享受。

        3
  •  1
  •   Alberto Martinez    14 年前

    我是这样做的:

    • 我从“自动创建表单”中删除了splash表单。
    • FormCreate 我的主要形式有:

      with TfSplash.Create(Self) do Show;
      
    • 在splash表单中,我有以下内容:

      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;