![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильно завершить Приложение при создании [D6, Win2k, WinXP]
Kacnep © (2005-10-03 08:54:00)Всем доброе время суток.
Тут такой вопрос родился. Как при запуске программы ЕДИНЫЖДЫ проверив какое либо условие определиться работать программе дальше или завершить ее работу. Условие может быть довольно сложное. Пусть например при запуске нужно дать пользователю выбрать OpenDialog'ом какой нибудь файл. И если он нажал Cancel в диалоге то заершить работу программы. Как известно в методе формы OnCreate завершить приложение нельзя. Я последней строкой прописывал PostMessage(f_Main.Handle,WM_User+1,0,0); и в обработчике процедуры OnAfterCreate закрывал приложение.
Может кто нить привести свои примеры или что нить умнее этого? Спасибо.
Kacnep (2005-10-03 12:51:00) [1]Большое Спасибо за исчераывающий ответ. В принципе если никто не дополнит то тема закрыта.
Проверю обязательно ибо обе эти ошибки наличиствуют (2. - У меня проверка если законектен то отконектиться, прописать полученый в опенфайлдиалог путь и законектиться).
В общем все понятно. Еще раз спасибо y-soft.
y-soft (2005-10-03 12:46:00) [2]>Kacnep © (03.10.05 12:28) [6]
Ошибка при загрузке DataModule говорите?
Следующие ошибки:
1. Указывают в строке соединения абсолютный путь
2. Указывают, что соединение должно установиться сразу же после загрузки
Естественно, в этом случае указанный файл найти не удается, и выскакивает исключение :)
Лечится очень просто: не указывайте явно пути к базам и не устанавливайте в свойствах Connected := True. Делайте это в OnCreate: сначала проверку на существование базы, потом, если база отсутствует, запрос пользователю, чтобы указал путь. Только потом Connected := True...
y-soft (2005-10-03 12:33:00) [3]>Kacnep © (03.10.05 11:37) [5]
Если я работаю с АДО,ДБ компонентами а также использую ОПЕНДИАЛОГи нормально ли это в модуле ДПР? По поводу секции Initialization вопрос такойже
Если функция проверки не используют объекты, которые на момент проверки еще не существуют, то нормально. Вообще в таких процедурах стараются использовать "быстрые" средства, т.е. по максимуму работать с WinAPI...
И с диалогами открытия файлов, и с ADO, и с доступом к БД это возможно...
Kacnep (2005-10-03 12:28:00) [4]Ну хотя бы подскажите КАК "ВЫ" в своих проектах от этого избавляетесь?
Я убрал ошибку но не так как хотелось бы просто убрал создание дата модуля :(
Application.Initialize;
Application.CreateForm(Tf_Main, f_Main);
///Application.CreateForm(Tdm, dm);
Application.Run;
Kacnep (2005-10-03 11:37:00) [5]О! Это уже ближе к теме...
В приведенном примере такой вопрос - Если я работаю с АДО,ДБ компонентами а также использую ОПЕНДИАЛОГи нормально ли это в модуле ДПР? По поводу секции Initialization вопрос такойже.
Спасибо.
y-soft (2005-10-03 10:47:00) [6]>Kacnep © (03.10.05 08:54)
Проверяйте свое условие еще до создания форм и запуска главного цикла и в случае невыполнения просто используйтеHalt
Т.к. в момент проверки никакого распределения ресурсов еще не произошло, то ничего страшного не произойдет. По этой же причине срабатывать будет очень быстро
program MyProject;
uses
Forms,
...;
{$R *.RES}
begin
if not CheckCondition() then
Halt;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Можно сделать еще проще - поместить проверку условия (вместе с вызовомHalt) в секциюInitializationкакого-то специального модуля и поместить его первымв Uses своего DPR
Kacnep (2005-10-03 09:58:00) [7]Забыл добавить.
Это все в ОнКреате главной формы. А в методе который вызывыается постмессаджем я спокойно БЕЗ ошибки закрываю приложение.
Kacnep (2005-10-03 09:55:00) [8]Не уверен...
with TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini')) do begin
Global_DBConnection_String:=ReadString('Settings','DB',ExtractFilePath(Application.ExeName));
Free;
end;
with TOpenDialog.Create(Self) do begin
Filter:='Файлы данных (*.mdb)|*.mdb|All files (*.*)|*.*';
InitialDir:=ExtractFilePath(Global_DBConnection_String);
Options:=Options+[ofFileMustExist];
Title:='Укажите файл данных...';
DBNAME:=ExtractFileName(Global_DBConnection_String);
if DBNAME<>'' then FileName:=DBNAME;
if Execute then begin
Global_DBConnection_String:='Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source='+FileName+';'+
'Persist Security Info=False;';
// 'Jet OLEDB:Database Password='+c_DBPASSWORD;
DBNAME:=FileName;
end
else Application.Terminate;// Global_DBConnection_String:='';
Free;
end; //with opendialoig
// PostMessage(f_Main.Handle,WM_User+1,0,0);
Программа вываливается с Эксепшеном ApplicationError. Подозреваю с обращением к несозданым или удаленным объектам.
Вот так то.... :(
Код вроде совсем простой - ошибок ДУМАЮ нет.
ZeroDivide (2005-10-03 09:08:00) [9]О чем ты?
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.Terminate;
end;
Все работает.