Kłopot ze SplashScreen

0

Hejka wszystkim :)

Mam malutki problem do swojej aplikacji dodałem SplashScreen
Jest dodany do Formy Głównej jako osobna forma wywoływana w zdarzeniu OnShow

procedure TForm1.FormShow(Sender: TObject);
begin
   SplashForm.ShowModal;
end;

a to co na formie SplashScreen

procedure TSplashForm.Timer1Timer(Sender: TObject);
begin
 Timer1.Enabled := false ;
 SplashForm.close;
end;

Działa
Problem polega na tym że na inne formie mam między innymi button z:

Form1.Visible := False;

Jak przywrócę wszystko pokazuje mi się ponownie SplashScreen. Tak wiem dlaczego bo jest w zdarzeniu OnShow Jak powinno wyglądać zabezpieczenie by pokazywał nam się tylko na starcie aplikacji?

1

powinien być w pliku projektu, czyli w dpr

0

Jakby można było prosić o przykład nigdy tu nie grzebałem dodałem
SplashForm.ShowModal ale nic się nie dzieje tu jestem blady

begin
  if debughook = 1 then
    reportmemoryleaksonshutdown := true;
  Application.Initialize;
  Application.MainFormOnTaskbar := true;

  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);

  Application.CreateForm(TSplashForm, SplashForm);
  Application.Run;
  SplashForm.ShowModal;
end.
4

No nie, tak to nie będzie działać. Według mnie też najlepszym miejscem na takie zabiegi jest główny plik projektu, dlatego że można się pobawić splashem zanim zostanie utworzony obiekt głównego okna programu i pozostałe formularze (jeśli tworzone są automatycznie).

Schemat jest dość prosty:

var
  Splash: TSplashForm;
begin
  if DebugHook = 1 then
    ReportMemoryLeaksOnShutDown := True;

  Splash := TSplashForm.Create(nil);
  try
    Splash.Show();

    // tutaj wstrzymywanie pracy programu np. przez 5 sekund
    //
    // dla przykładu może to być pętla wywołująca na przemian
    // Sleep(50) i Application.ProcessMessages, aby splash
    // odbierał komunikaty i w razie potrzeby mógł zostać przemalowany
  finally
    Splash.Free();
  end;

  Application.Initialize();
  Application.MainFormOnTaskbar := True;

  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);

  Application.Run();
end.

Przy czym zabawę z wizytówką warto przenieść do jakiejś zewnętrznej procedury lub dorobić sobie helper do klasy TApplication, aby składnia obsługi splasha była ładna i czytelna.

Pamiętać należy, że okno wizytówki musi być zsynchronizowane z pętlą odliczającą, tak aby nie dało się zamknąć go przed upływem określonego czasu. Bo nawet jeśli okno splasha nie będzie posiadało obramowania to w dalszym ciągu da się je zamknąć kombinacją Alt+F4. Wystarczy proste zabezpieczenie:

procedure TSplashForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := False;
end;

Nie mówię, że to najlepsze rozwiązanie, jednak jest dość proste w implementacji. Z okienka wizytówki można wycisnąć o wiele więcej, jednak podstawowa funkcjonalność dla Ciebie jak na początek spokojnie wystarczy.

0

Dziękuję i życzę spokojnej nocy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1