Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.007 c
3-26915
DARS73
2002-08-17 21:07
2002.09.09
problema pri rabote MS SQL 2000


1-27014
Jonny
2002-08-27 15:28
2002.09.09
Передача управления на форму


1-27016
c0pYc@t
2002-08-30 08:57
2002.09.09
Вопрос о реестре


1-27029
Егор
2002-08-27 15:33
2002.09.09
Кооректна ли моя конструкция?


1-26952
Kurt
2002-08-28 20:35
2002.09.09
Как реализовать механизм передачи параметров в разрабатываемую





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский