Показать сообщение отдельно
  #5  
Старый 26.07.2024, 06:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,107
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, вообще-то, splash screen показывается из файла проекта, а не из главной формы. Более того, если ты будешь создавать странички/фреймы в OnCreate, то и делать форму полупрозрачной нет необходимости, т.к. она и так в этот момент не видна. Как я понимаю, создание фрейма занимает какое-то время. А вот созщдать вкладку и "кинуть" на нее фрейм практически мгновенно. Тогда делаем примерно так:

Файл проекта (.dpr)
Код:
procedure AddFrameToColleaction(AFrame : TBaseFrame; ASplash : TSplashForm);
begin
  GetListOfFrames().Add(AFrame);
  ASplash.ProgressBar.Progress := Splash.ProgressBar.Progress + 1;
  ASplash.Invalidate; // Тут не помню какой именно метод вызывать для перерисовки окна
end;

var
  Splash : TSplashForm;
begin
  Splash := TSplashForm.Create(Nil);
  Try
    Splash.Show;
    Splash.ProgressBar.Max := 15;
    Splash.ProgressBar.Progress := 0;
    
    AddFrameToColleaction(TCustomFrame1.Create(Nil),Splash);
    AddFrameToColleaction(TCustomFrame2.Create(Nil),Splash);
    ...
    AddFrameToColleaction(TCustomFrame15.Create(Nil),Splash);
    Splash.Close;
  Finally
    Splash.Free;
  End;

  // ... далее создание дополнительных форм и запуск программы (Application.Run)
end.

Модуль с масивом фреймов
Код:
Unit ListOfFrames;

interface

function GetListOfFrames : TList<TBaseFrame>;

implementation

var
  AList : TList<TBaseFrame>;

function GetListOfFrames : TList<TBaseFrame>;
begin
  if Not Assigned(AList) Then AList := TList<TBaseFrame>.Create;
  Result := AList;
end;

initialization
  AList := Nil;

finalization
  IF Assigned(AList) Then FreeAndNil(AList>

end.

Базовый фрейм
Код:
unit TBaseFrame;

interface

type
  TBaseFrame = class(TFrame)
  public
    function GetTabName : String; virtual; abstract; // перекрыть в каждом наследнике, вощвращаем имя вкладки
  end

...

Главная форма
Код:
procedure TMainForm.FormCreate(Sender : TObject);
var
  I : Integer;
  Sheet : TTabSheet;
  Frame : TBaseFrame;
begin
  For I := 0 To GetListOfFrames.Count-1 Do
    Begin
      Frame := GetListOfFrames().Items[i];
      Sheet := TTabSheet.Create(Self);
      Sheet.Caption := Frame.GetTabName;
      Frame.Parent := Sheet;
      Frame.Aligh := alClient;
      Sheet.PageControl := PageControl1;
    End;

Ну вот как-то так.
Код не проверял, просто набросал саму идею.
Ответить с цитированием