Создать собственный Splashscreen Delphi 10 Сиэтл

Вместо того, чтобы использовать изображения png через параметры проекта для заставки, я хочу использовать свою собственную форму для заставки.

Я нашел решение для XE2 по следующей ссылке, но оно не работает для Delphi 10 Seattle: https://stackoverflow.com/a/9080804/2728408

Ниже у меня есть несколько примеров, которые я пробовал в своем проекте .dpr:

Пример 1:

program Project2;

uses
  FMX.Forms,
  System.SysUtils,
  Unit1 in 'Unit1.pas' {MainForm},
  Unit2 in 'Unit2.pas' {SplashForm};

{$R *.res}

begin
  Application.Initialize;
  SplashForm := TSplashForm.Create(nil);
  SplashForm.Show;
  Application.ProcessMessages;
  Sleep(1000);   // Whatever to control display time of splash screen

  Application.CreateForm(TMainForm, MainForm);
  SplashForm.Close;
  SplashForm.Free;
  Application.Run;
end.

Пример 2:

program Project2;

uses
  FMX.Forms,
  System.SysUtils,
  Unit1 in 'Unit1.pas' {MainForm},
  Unit2 in 'Unit2.pas' {SplashForm};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TSplashForm, SplashForm);
  Application.Run;
  Sleep(1000);
  Application.Terminate;// Also tried Application.Destroy
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.

Пример 3:

program Project2;

uses
  FMX.Forms,
  System.SysUtils,
  Unit1 in 'Unit1.pas' {MainForm},
  Unit2 in 'Unit2.pas' {SplashForm};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TSplashForm, SplashForm);
  Application.Run;
  Sleep(1000);
  Application.CreateForm(TMainForm, MainForm);
  SplashForm.Close;
  Application.ProcessMessages;     
  Application.Run;
end.

У кого-нибудь есть решение моей проблемы?


person Remi    schedule 14.04.2016    source источник


Ответы (2)


вы не должны мешать Application.Terminare/Inititalse так, как вы делаете это в коде.

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

См. пример: http://www.uweraabe.de/Blog/2016/01/22/a-splash-form-in-firemonkey/

procedure TFormSplash.FormCreate(Sender: TObject);
begin
  StartupTimer.Enabled := false;
  StartupTimer.Interval := 500; // can be changed to improve startup speed in later releases
end;

procedure TFormSplash.SplashImagePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
begin
  StartupTimer.Enabled := not FInitialized;
end;

procedure TFormSplash.StartupTimerTimer(Sender: TObject);
begin
  StartupTimer.Enabled := false;
  if not FInitialized then begin
    FInitialized := true;
    LoadMainForm;
  end;
end;

procedure TFormSplash.LoadMainForm;
var
  form: TForm;
begin
  form := TMainForm.Create(Application);
  form.Show;
  Application.MainForm := form;
  Close;
end;
person John Kouraklis    schedule 14.04.2016

Вот чем я занимался последние 3 дня или около того.

Первое: создайте форму заставки. Как и при обычной загрузке Delphi/C++ IDE, он имеет индикатор загрузки xxxx dll... Таким образом, основные шаги заключаются в том, чтобы включить заставку как часть обычной загрузки основного приложения.

Во-вторых: помните, что ваш файл DPR играет жизненно важную роль в загрузке и/или создании всех форм. Хотя я согласен с функцией VCL (Application.ProcessMessages), чтобы показать пользователю, что он создает форму.

Третье: никогда не запускайте процедуру в событии OnCreate основной формы, кроме как для создания скинов или для создания экземпляра скина. Но вызовите его снова в DPR после создания основной формы.

В-четвертых: сначала отключите основную форму после ее создания, чтобы пользователь не нажимал кнопки или что-то еще, а затем снова включите ее, когда экран-заставка скрыт.

Вот ДПР:

program xxxx;

uses
  Forms, MidasLib,.....

{$R *.res}

begin
   Application.Initialize;
   Application.MainFormOnTaskbar := True;
   Application.Title := 'xxxxx';
   SplashFrm := TSplashFrm.Create(Application);
  try
   Application.CreateForm(TMain_Form, Main_Form);
   Main_Form.Skinning;
   Application.ProcessMessages;
   SplashFrm.FormStyle := TFormStyle.fsStayOnTop;
   Main_Form.Enabled := False;
   Main_Form.WindowState := TWindowState.wsMaximized;
   Application.ProcessMessages;
   SplashFrm.Show; //Never use showModal coz splash form needs to be closed first and create all the rest of the forms.
   SplashFrm.Label5.Caption := 'Loading... Database handlers..';
   Application.CreateForm(TDM, DM);
   Application.ProcessMessages;
   SplashFrm.Label5.Caption := 'Loading... Login Libraries..';
   Application.CreateForm(TLogin_Frm, Login_Frm);
   Application.ProcessMessages;

   .....// All the rest of the Forms.
   Main_Form.DSiTrimWorkingSet; //[StockOverflow/questions/2031577][1] 

  finally
   SplashFrm.Free;
   Main_Form.Check_Registration;
   Main_Form.Checking_Internet_Proc;
   Main_Form.Enabled := True;
   Main_Form.sStatusBar1.Panels[0].Text := 'Ready...';
   Application.ProcessMessages;
   Main_Form.DSiTrimWorkingSet;
  end;
 Application.Run;
end.
person eric cabalida    schedule 01.01.2021