Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.09;
Скачать: CL | DM;

Вниз

Вылет на попытке высветить форму-заставку   Найти похожие ветки 

 
MsGuns ©   (2002-08-27 20:02) [0]

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


 
Mikhail ©   (2002-08-27 20:09) [1]

Да в чем угодно


 
MsGuns ©   (2002-08-27 20:16) [2]

>Mikhail

> Да в чем угодно

Вот это ответ !!! Я просто сражен ! Наповал !


 
Anatoly Podgoretsky ©   (2002-08-27 20:31) [3]

У тебя ошибка в 17 строке


 
oomneeq ©   (2002-08-27 20:34) [4]

Пока не выполнен Аpplication.Run не запущен главный цикл обработки сообщений - основа всех гуевых вин-приложений.
А у тебя очевидно MiscForm пытается сделать то, для чего этот самый цикл необходим.
Проверить эту догадку можно убрав из МiscForm всю начинку
(MEdiaplayer)


 
DenKop ©   (2002-08-27 20:52) [5]

Конкретного ответа на вопрос не знаю, так как не понял сути, но я делаю это так примерно так:

LogoForm.Tag в Design Time должно быть обнулено.

procedure TMainForm.FormActivate(Sender: TObject);
begin
if LogoForm.Tag=0 then {На случай если OnActivate возникнет ещё раз}
begin
MainForm.Enabled:=False;{Это чтобы зловещие ручки пользователя не наделали чего плохого во время инита}
LogoForm.Show;
LogoForm.Tag:=1;
Application.ProcessMessages;
.........
{Здесь выполняешь громоздкие во времени операции}
LogoForm.Close;
MainForm.Enabled:=True;{Восстанавливаем главную форму}
end;
end;


 
wicked ©   (2002-08-27 20:53) [6]


> Так вот, при попытке закриэйтить и запустить MiscForm из
> MainForm дает ексепшн

скорей всего, ошибка здесь...


 
MsGuns ©   (2002-08-27 21:01) [7]

>DenKop
По Activate - это понятно, а как по OnCreate ?
Есть, конечно такой выход:
Создать Misc как основную форму, а из нее шарить Main, но как-то это костляво, что ли.. Неужели нет решения ?


 
Mikhail ©   (2002-08-27 21:02) [8]

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


 
Anatoly Podgoretsky ©   (2002-08-27 21:05) [9]

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


 
MsGuns ©   (2002-08-27 21:31) [10]


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;


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



 
Mikhail ©   (2002-08-27 22:08) [11]


frmDBServ.Create();



 
MsGuns ©   (2002-08-27 22:10) [12]

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

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


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

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


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

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


 
Mikhail ©   (2002-08-27 22:23) [15]

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


 
MsGuns ©   (2002-08-27 22:30) [16]

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


 
wicked ©   (2002-08-27 22:32) [17]

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:39) [18]

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


 
wicked ©   (2002-08-27 22:42) [19]

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


 
MsGuns ©   (2002-08-27 22:44) [20]

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


 
MsGuns ©   (2002-08-27 22:54) [21]

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


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

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


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

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


 
MsGuns ©   (2002-08-27 23:42) [24]

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

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


 
Mikhail ©   (2002-08-28 11:58) [25]

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;


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

Не понимаю в чем собственно проблемма.
Писал же 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.


 
MsGuns ©   (2002-08-28 19:16) [27]

Всем спасибо ! Все 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 Гл.формы (меняется статусбар и прогресбар), а в конце этого обработчика нйдится и фриится.



Страницы: 1 вся ветка

Текущий архив: 2002.09.09;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
1-27076
ruslan_as
2002-08-28 14:01
2002.09.09
Как узнать TabOrder текущего элемента


14-27219
dikiimouse
2002-08-15 17:41
2002.09.09
Помоните!!! Пишу прогу на VB, запускаю на другом компе, а она не.


4-27278
wman
2002-07-08 10:33
2002.09.09
Ограничение процессорного времени


4-27276
Ильдар
2002-07-18 13:55
2002.09.09
узнать IPадрес


3-26876
RDA
2002-08-18 14:57
2002.09.09
Клиент-серверное програмирование. Вкусно - но...