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

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

Правильно завершить Приложение при создании [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;

Все работает.


Наверх

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