Форум: "Основная";
Текущий архив: 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