Форма всплеска delphi не запускает события таймера, если отображается немодально - PullRequest
2 голосов
/ 11 ноября 2010

Я закодировал всплывающую форму, которая появляется, некоторое время показывает, а затем исчезает. Затухание реализовано с помощью таймера, который также закрывает форму. Работает нормально.

Я показывал форму модально, но подозревал, что основная форма не начала создаваться и показываться до тех пор, пока форма-заставка не была закрыта.

Затем я решил, что если бы я показал форму немодально и использовал fsStayOnTop (т.е. SplashForm.Show вместо SplashForm.ShowModal), то основная форма могла бы инициализироваться за формой-всплеск, как только будет показана форма-заставка, то есть приложение было готово к работе, когда всплывающая форма закрылась.

Однако я считаю, что событие таймера больше не срабатывает. Также не происходит событие TApplication.OnIdle. Что дает?

Ответы [ 3 ]

5 голосов
/ 11 ноября 2010

Вы говорите, что это заставка.Показывается ли это во время запуска программы, прежде чем вы наберете строку Application.Run; в DPR?Если это так, то цикл событий TApplication еще не начался, поэтому вы не получите никаких событий OnIdle.

2 голосов
/ 11 ноября 2010

Fade не будет работать со стандартными таймерами, потому что цикл приложения не будет функционировать до тех пор, пока вы не вызовете Application.Run (как сказал Мейсон), а таймеры являются обертками для механизма API таймера на основе сообщений.

Нельзя использовать таймеры на основе потоков, поскольку для работы с пользовательским интерфейсом потребуется синхронизация, а синхронизация - это механизм на основе сообщений.

Но вы можете тратить время, необходимое для постепенного появления / исчезновения, так что вы можете запустить модное приложение, и если вы ищете это, я свободно считаю, что вы не беспокоитесь о том, чтобы терять немного времени Я могу объяснить намного лучше с (работающим и проверенным) примером кода, так что это будет работать для вас:

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 центов, наслаждайтесь.

1 голос
/ 11 ноября 2010

Я сделал это следующим образом:

  • Я удалил всплывающую форму из «Авто-создания форм».
  • В 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;
    
...