PDA

Показать полную графическую версию : Delphi 7.0


Prisoner
08-10-2003, 05:38
Цель - создание окошка содержащее картинку и отображающее процесс запуска программы (как это делается при старте PhotoShop'а).
Имеем - форму frmSplashScreen (не автосоздаваемую) с размещенным на ней экземпляром TImage (imgSplash) и загруженной в него картинкой. На форме имеется также экземпляр TLable (lInfo) куда будем писать информацию о выполняемой работе на этапе загрузки программы (можно было бы выводить прямо на канву, но пусть так будет). Вся работа по инициализации выполняется в обработчике события OnCreate главной формы frmMain (которое до поры, до времени невидимо - Visible:=False), откуда на различных этапах по идее в frmSplashScreen.lInfo.Caption записываются различные строки отражающие идущую работу.
Реализация -

файл проекта Project.dpr:

Begin
 Application.Initialize;
 With TfrmSplashScreen.Create(nil) do
  Try
    Application.Title := 'Title';
    Show;
    Update;
    Application.CreateForm(TfrmMain, frmMain);
  Finally
   Free;
  End;
 frmMain.Visible:=True;
 Application.Run;
End.


часть обработчика события OnCreate главной формы frmMain:

frmSplashScreen.lInfo.Caption:='Инициализация регистров...';
frmSplashScreen.lInfo.Refresh;
InitRegisters(Regs);
frmSplashScreen.lInfo.Caption:='Инициализация файлов проекта...';
frmSplashScreen.lInfo.Refresh;
InitFile;


Проблема - программа генирирует исключение EAccessViolation при первом обращении к форме frmSplashScreen, то есть на строке

frmSplashScreen.lInfo.Caption:='Инициализация регистров...';

При проходе в режиме отладки в окне Watch переменная frmSplashScreen имеет значение nil. Это странно в то время как на этапе создания главной формы frmSplashScreen еще не уничтожена. Это следует из того, что frmSplashScreen видна все то время, пока в обработчике события OnCreate главной формы идет подготовительная работа.
Итого - SplashScreen реализован, но не до конца - нельзя записывать в него уточняющую информацию об этапах инициализиции.

Вопрос - что подскажите, господа?

Исправлено: Prisoner, 6:41 8-10-2003

DYURIK
08-10-2003, 11:13
У меня есть альтернативный вариант показа сплэш скрина:
Делаешь новую форму, размещаешь на ней все, что угодно, и при запуске программы на событие главной формы OnShow делаешь вот так
SplashScreen.ShowModal;
У тебя показивается сплэш форма, а главная форма не показывается пока не закроется сплэш.....
А дальше делаешь все как ты делал.
Изюминка этого метода - простота!!!!
Не надо лазить по  Project.dpr  и нет никакого гемороя!!!!
Сам так всегда делаю.....
Если будут проблемы пиши....

Prisoner
08-10-2003, 13:35
Spiderman
Хм... а порядок создания форм какой в таком случае? Или форма Splash создается там же в OnShow? Оки попробую, в самом деле просто...

DYURIK
09-10-2003, 13:35
Порядок создания форм не имеет значения!!!!
Дело вот в чем, сначала ведь все формы создаются, а потом показиваються, так ведь?
Вот, у тебя формы создадуться, а потом наступит евент OnShow, вот он и покажет твой сплеш!:)

Abell2000
10-10-2003, 05:32
Естественно у тебя буде вылетать Access vialation, сам подумай, ведь ты свой splash создаешь локально и естественно твоя frmMain о нем ничего не знает, поэтому нужно этот splash перевести в зону видимости frmMain, например введи "переменную" типа TForm в frmMain, далее после создания splasha присвой его этой переменной и далее работай в frmMain с этим объектом как со splash.




© OSzone.net 2001-2012