2

フェードインし、しばらく表示してからフェードアウトするスプラッシュフォームをコーディングしました。フェージングは​​、フォームも閉じるタイマーで実装されます。正常に動作します。

フォームをモーダルに表示していましたが、スプラッシュフォームが閉じられるまで、メインフォームの作成と表示が開始されていなかったのではないかと思いました。

次に、フォームを非モーダルで表示し、fsStayOnTop(つまり、SplashForm.ShowModalの代わりにSplashForm.Show)を使用すると、スプラッシュフォームが表示されるとすぐに、メインフォームがスプラッシュフォームの背後で初期化される可能性があることがわかりました。つまり、アプリの準備ができているということです。スプラッシュフォームが閉じたときに移動します。

ただし、タイマーイベントはもう発生しません。TApplication.OnIdleイベントもありません。何が得られますか?

4

3 に答える 3

5

これはスプラッシュ画面だとあなたは言います。Application.Run;DPRのラインに到達する前に、プログラムの起動中に表示されていますか?その場合、TApplicationイベントループはまだ開始されていないため、OnIdleイベントは取得されません。

于 2010-11-10T23:01:31.880 に答える
2

Fadeは、Application.Runを呼び出すまでアプリケーションループが機能しないため(Masonによると)、標準のタイマーでは機能しません。タイマーは、メッセージベースのタイマーAPIメカニズムのラッパーです。

スレッドベースのタイマーは使用できません。UIを操作するにはSynchronizeが必要であり、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セント、お楽しみください。

于 2010-11-11T00:18:55.847 に答える
1

私はそれを次のように行いました:

  • 「フォームの自動作成」からスプラッシュフォームを削除しました。
  • FormCreate私が持っているメインフォームの:

    with TfSplash.Create(Self) do Show;
    
  • そして、スプラッシュ形式で私は次のものを持っています:

    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;
    
于 2010-11-11T00:58:33.010 に答える