Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вылет на попытке высветить форму-заставку [D6, Win95/98]


Страницы:   1 2

MsGuns ©   (2002-08-27 20:02:00) 

Ситуация банальная. Есть осн.форма (Например, MainForm), которая криэйтится довольно долго из-за большого кол-ва разных проверок (инициализация БД и прочее). Хотел для услады глаз юзера на время создания этой формы показать другую (Допустим, MiscForm), которая просто содержит красивый пикчер и запускает невидимый медиаплейер с неким звуковым файлом. Так вот, при попытке закриэйтить и запустить MiscForm из MainForm дает ексепшн.
В конце обработчика MainForm.OnCreate я останавливаю плейер и убиваю эту форму. Но до этого не доходит..
В чем я не прав ?


MsGuns   (2002-08-28 19:16:00) [1]

Всем спасибо ! Все O`k !
DPR по образцу

program Zp1;

uses
Forms,
UMain in "UMain.pas" {MainForm},
UCreate in "UCreate.pas",
UServ in "UServ.pas" {frmDBServ};

{$R *.res}

begin
Application.Initialize;
// Application.CreateForm(TfrmDBServ, frmDBServ);
frmDBServ := TfrmDBServ.Create(Application);
frmDBServ.Show;
frmDBServ.Update;
Application.CreateForm(TMainForm, MainForm);
// frmDBServ.Hide;
// frmDBServ.Free;
// MainForm.Show;
Application.Run;
end.


Вспом.форма frmDBServ модифицируется из обработчика OnCreate Гл.формы (меняется статусбар и прогресбар), а в конце этого обработчика нйдится и фриится.


Настя   (2002-08-28 17:28:00) [2]

Не понимаю в чем собственно проблемма.
Писал же wicked уже:

SplashForm:=TApplication.CreateForm(TSplashForm, SplashForm);
SplashForm.Show;
SplashForm.Update;
...
Application.Createform(TMyForm, MyForm);
...

После этого в конструкторе MyForm, делаешь вызов

if Assigned(SplashForm) then
begin
Splash.InfoLabel.Caption:="Создаю БД";
...
//Делаешь БД
...
end;

И посмотри просто Демо поставляемое с Дельфи MastApp.


Mikhail   (2002-08-28 11:58:00) [3]

1) Выкинь frmDMServ из автосоздаваемых
2) Убери из модуля описание frmDBServ в var-е
3)

procedure CreateDBLs;
var
frmDBServ: TfrmDBServ;
begin
frmDBServ := TfrmDBServ.Create(self);
try
frmDBServ.Show;
DefineTableStuctures;
// Вместо этой мессаги должно быть создание БД и запись туда данных из архива. Это-то и работает очень долго
ShowMessage("Надо создать БД !!!");
finally
frmDBServ.Free;
end;
end;


MsGuns   (2002-08-27 23:42:00) [4]

>Юрий Зотов
Премного благодарен. Скачал все 3 сампла - буду разбираться

Спасибо всем !!! (Даже философам.)))))


wicked   (2002-08-27 23:37:00) [5]

2 MsGuns ©
чисто из любопытства, можно глянуть на dpr-файл?...


Юрий Зотов   (2002-08-27 23:07:00) [6]

> MsGuns
Решение Вашей задачи есть здесь:
http://www.delphikingdom.com/helloworld/samples_win.htm


MsGuns   (2002-08-27 22:54:00) [7]

Все показывает и создается, но после frmDBCreate.Hide прога благополучно терминится.(( Добавил в DPR MainForm.Show, но эффект тот же !


MsGuns   (2002-08-27 22:44:00) [8]

Ну это-то понятно !
Благодарю за ценный совет.
Переставлю в DPR операторы и попробую !


wicked   (2002-08-27 22:42:00) [9]

2 MsGuns ©
конечно можно... только имхо после каждого действия надо будет делать SplashFrm.Update для того, чтоб она перерисовалась...


MsGuns   (2002-08-27 22:39:00) [10]

>wicked © (27.08.02 22:32)
Т.е. Сначала создается и запускается вспом.форма ?
Тогда вопрос: в течение создания осн.формы я могу из ее обработчика Create воздействовать на форму-заставку: менять кэпшини у меток, тянуть прогрессбар и прочее ?


wicked   (2002-08-27 22:32:00) [11]

2 MsGuns ©
окей... моё скромное мнение или обьяснение на пальцах... следующее относится к dpr-файлу...
1) создаём форму, которая должна появляться при загрузке
SplashFrm := TSplashFrm.Create(Application);
2) обновляем и показываем форму
SplashFrm.Show;
3) делаем всё, что заблагорассудится: создаём формы, вычисляем и т. д.... попутно можем переставлять ползунок на форме или крутить анимацию... думаю, этот пункт очевиден...
4) убиваем форму, при этом главной стаёт та, которая была создана следующей...
SplashFrm.Hide;
SpalshFrm.Free;
5) делаем Application.Run


MsGuns   (2002-08-27 22:30:00) [12]

Да, форма создана в дизайн-моде, но мне надо, чтобы Дельфя ДО завершения конструктора осн.формы создали фоновую..
Если это бред, то поясните почему. У Тексейры был такой пример. (Жаль что книжки щас нет)


Mikhail   (2002-08-27 22:23:00) [13]

1) Какая ошибка?
2) frmDBServ создавалась в дизайне?
3) Никак не пойму: Вы пытаетесь показать форму после "этой мессаги должно быть создание БД и запись туда данных из архива. Это-то и работает очень долго".


MsGuns   (2002-08-27 22:19:00) [14]

>Mikhail © (
>Уберите ее на хер
Ее раньше и не было. Но на frmDBServ.Visible := true тот же глюк !


Mikhail   (2002-08-27 22:13:00) [15]

>MsGuns ©
Уберите ее на хер.


MsGuns   (2002-08-27 22:10:00) [16]

>Mikhail © (27.08.02 22:08)
>frmDBServ.Create();

Ну и ?..
Это что, совет или ключ к ошибке ? Оно ж именно здесь и глючит, философ !)


Mikhail   (2002-08-27 22:08:00) [17]


frmDBServ.Create();


MsGuns   (2002-08-27 21:31:00) [18]


procedure TMainForm.FormCreate(Sender: TObject);
// Проверка наличия БД в тек.каталоге с программой
var
TabList: TStrings;
i,j: integer;
begin
DBDir := "DBPX";
DBAliasDir := GetCurrentDir+"\"+DBDir;
DBAliasName := "TempZPLs";
If Not DirectoryExists(DBAliasDir) then
CreateDir(DBDir); // Создание каталога для БД лицевых
// Проверка наличия алиаса для БД лицевых
if not Session.IsAlias(DBAliasName) then
begin // Создание алиаса для БД лицевых
with Session do
begin
// ConfigMode := cmSession;
try
AddStandardAlias(DBAliasName, DBAliasDir, "PARADOX");
finally
// ConfigMode := cmAll;
end;
end;
end;
if Session.GetAliasDriverName(DBAliasName)<>"STANDARD" then
begin
ShowMessage("В файле конфигурации BDE обнаружен алиас "+DBAliasName+" не Paradox типа");
Application.Terminate;
end;
// Открытие БД
MainForm.dbZpLs.AliasName := DBAliasName;
MainForm.dbZpLs.Connected := true;
DefineTableStuctures;
// Проверка наличие таблиц БД
// Если хоть одна отсутствует, все пересоздаются по новой
TabList := TStringList.Create;
MainForm.dbZpLs.GetTableNames(TabList,false);
if TabList.Count<>High(Tables)+1 then
begin // Кол-во таблиц не совпадает
CreateDBLs;
exit;
end;
// Сверка таблиц поименно
for i := 0 to TabList.Count-1 do
begin
for j := Low(Tables) to High(Tables) do
if TabList[i]=Tables[j] then
break
else
continue;
if j<=High(Tables) then continue;
// Таблица отсутствует в описателях БД
CreateDBLs;
break;
end;

procedure CreateDBLs;
begin
DefineTableStuctures;
// Вместо этой мессаги должно быть создание БД и запись туда данных из архива. Это-то и работает очень долго
ShowMessage("Надо создать БД !!!");
frmDBServ.Create();
frmDBServ.Visible := true;
end;


Форма ничего не делает, в смысле на ней нет никаких элементов управления (тулбаров, кнопок и пр)


Anatoly Podgoretsky   (2002-08-27 21:05:00) [19]

Ты бы код привел, минимально необходимый


Mikhail   (2002-08-27 21:02:00) [20]

Да сколько угодно. И сей вопрос не раз здесь обсуждался.
Ищите и обрящите.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо