Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Delphi 7.0 (http://forum.oszone.net/showthread.php?t=30236)

Prisoner 08-10-2003 05:38 207879

Цель - создание окошка содержащее картинку и отображающее процесс запуска программы (как это делается при старте 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 реализован, но не до конца - нельзя записывать в него уточняющую информацию об этапах инициализиции.

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

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

DYURIK 08-10-2003 11:13 207880

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

Prisoner 08-10-2003 13:35 207881

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

DYURIK 09-10-2003 13:35 207882

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

Abell2000 10-10-2003 05:32 207883

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


Время: 05:30.

Время: 05:30.
© OSzone.net 2001-