Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизПроцесс не выгружается Найти похожие ветки
← →
Belkova © (2005-06-30 20:14) [0]Мастера Delphi! Посоветуйте, пожалуйста. Процесс при закрытии главной формы не выгружается. В диспечере задач смотрю: в приложениях ничего нет, а в процессах остается. Что делать?
← →
Юрий Зотов © (2005-06-30 20:19) [1]Есть ли обработчики, срабатывающие при закрытии формы или приложения? Если да, покажите их код.
← →
Belkova © (2005-06-30 20:29) [2]Таких обработчиков нет.
← →
Belkova © (2005-06-30 20:34) [3]В файле проекта есть код для того чтобы не запускалась копия программы
var Rez:THandle;
begin
Rez:=CreateFileMapping(HWND($FFFFFFFF),nil,PAGE_READWRITE,0,1024,"PrjAlfa.exe"); //èìÿ ôàéëà
if (GetLastError<>ERROR_ALREADY_EXISTS) then
begin
Application.Initialize;
Application.CreateForm(TFSYS, FSYS);
Application.CreateForm(TFLogin, FLogin);
{Создание форм}
Application.Run;
CloseHandle(Rez);
end
А главная форма просто вызывается Close, в событии OnClose ничего не прописано.
← →
Юрий Зотов © (2005-06-30 21:26) [4]Попробуйте поставить CloseHandle(Rez) после end:
Rez := CreateFileMapping(...);
if GetLastError <> ERROR_ALREADY_EXISTS then
begin
...
end;
CloseHandle(Rez);
← →
Belkova © (2005-06-30 21:39) [5]Не выгружается.
← →
Юрий Зотов © (2005-07-01 03:13) [6]Чудес не бывает - значит, что-то где-то Вы все же перекрыли.
← →
Просто Джо © (2005-07-01 03:46) [7]
> [3] Belkova © (30.06.05 20:34)
А как называется класс главной формы?
← →
Belkova © (2005-07-01 08:41) [8]TForm
← →
Belkova © (2005-07-01 08:48) [9]И еще момент, это происходит не на всех компьютерах. На ноутбуке, на котором программа пишется, все нормально выгружается. Когда копирую на другие компьютеры, такое происходит.
← →
Digitman © (2005-07-01 08:53) [10]
> Belkova
что у тебя вообще в приложении делается-то ?
в угадайку играть будем ?
← →
Belkova © (2005-07-01 09:07) [11]Вообще-то приложение работает с БД. Главная форма вызывает форму, которая производит соединение с БД. (Там заводится пароль и Юзер).
← →
Digitman © (2005-07-01 09:09) [12]
> Belkova © (01.07.05 09:07) [11]
приводи код
← →
Belkova © (2005-07-01 09:22) [13]На главной форме есть меню, в котором вызов диалога для пароля, и выход из приложения.
Flogin.Show
и
FDM.DBAlfa.Connected:=False;
fSYS.Close;
В форме Flogin Есть поле для ввода пароля и юзера
и кнопочка Ok, на которую
ConnectToIniFile;
fDM.DBAlfa.Params.Values["Password"]:=EdPassword.text;
fDM.DBAlfa.Params.Values["user_name"]:=EDUserName.Text;
try
fDM.DBAlfa.Connected:=True ;
FLogin.Close;
FDir.Show
except
MessageDlg("Неправильный пароль",mtError,[mbOk],0);
FDM.DBAlfa.Connected:=False;
end;
procedure TFLogin.ConnectToIniFile;
var Cfg:TIniFile; S_Temp:String;
begin
if FDM.DBAlfa.Connected then FDM.DBAlfa.Connected:=False;
Cfg:=TIniFile.Create(ExtractFilePath(ParamStr(0))+"connect.ini");
S_Temp:=Cfg.ReadString("CONFIG","Server","localhost");
if S_Temp="localhost" then
begin
fDM.DBAlfa.DatabaseName:=Cfg.ReadString("CONFIG","Path","");
end else
begin
fDM.DBAlfa.DatabaseName:=Cfg.ReadString("CONFIG","Server","")+":"+Cfg.ReadString("CONFIG","Path","");
end;
Cfg.Free;
end;
← →
Digitman © (2005-07-01 09:34) [14]СУБД - InterBase ?
что такое fDM, fDir ? где , как, когда создаются , что в них творится ?
← →
Belkova © (2005-07-01 09:44) [15]СУБД - InterBase
FDM модуль данных, где все Query, dataSet и пр.
fdir форма, на которой расположен прайс и вызываются все остальные формы, которые выписывают документы и прочии торговые операции. Создаются все формы в проекте
Application.Initialize;
Application.CreateForm(TFSYS, FSYS);
Application.CreateForm(TFLogin, FLogin);
и т.д.
← →
evvcom © (2005-07-01 09:47) [16]Попробуй типа:
try
WriteLnLog("Подключение...");
fDM.DBAlfa.Connected:=True ;
WriteLnLog("Подключился");
Естественно WriteLnLog надо реализовать самой. После закрытия и "невыгруза" посмотреть лог-файл.
Хотя скорее всего в логе будет "Подключился". Вероятно fDM.DBAlfa.Connected := True; запускает отдельный поток и в нем пытается асинхронно подключиться. В этих случаях в грамотно написанных компонентах предусматривают способы извещения основного потока об удаче/неудаче подключения, а также должны быть какие-нибудь свойства таймаута при соединении. Если есть такие события, то "Подключился" или "Не подключился" надо вынести туда.
← →
evvcom © (2005-07-01 09:49) [17]
> что такое fDM, fDir
Плюс к этому что такое DBAlfa?
← →
Belkova © (2005-07-01 09:54) [18]DBAlfa Это компонент IBDateBase.
← →
evvcom © (2005-07-01 10:15) [19]В TIBDateBase есть обработчик AfterConnect. В нем и пишем WriteLnLog("Подключился"); тестируем и смотрим лог. Возможно на некоторых машинах существуют проблемы с подключением, поэтому и не выгружается сразу. Должно выгружаться по истечении какого-то более длительного времени.
← →
Belkova © (2005-07-01 10:20) [20]По истечении приемлемого времени не выгружается. Понаблюдаю еще.
Обработчик напишу, посмотрю. Спасибо.
← →
Tor © (2005-07-01 10:31) [21]Проверку пароля лучше производить в файле главной формы а не на кнопке ОК в форме вода пароля. Показыватьее как модальную возвращать mrOK и все это в цикле(в место рекурсии) там можно выводить сообщение о повторной попытке. Могу кинуть пример.
А при закрытии приложения ты закрываешь соединение с базой и всеми таблицами?
← →
Belkova © (2005-07-01 10:56) [22]Спасибо. Я поняла, но от примера не откажусь
belkova@alfacom.perm.ru
При закрытии делаю DBAlfa.Connected:=false;
Полагаю, что таблицы при этом тоже закроются.
← →
Tor © (2005-07-01 11:03) [23]Незнаю, я лично сначала закрываю все таблицы а потом БД. Щас найду и вышлю.
← →
evvcom © (2005-07-01 13:07) [24]
> При закрытии делаю DBAlfa.Connected:=false;
> Незнаю, я лично сначала закрываю все таблицы а потом БД
destructor TDataSet.Destroy;
begin
Destroying;
Close;
...
destructor TCustomConnection.Destroy;
begin
inherited Destroy;
SetConnected(False);
...
Вывод: проблема не в этом.
← →
Faraday (2005-07-01 13:46) [25]Попробуй после IBDataBase.Close поставить Sleep(1000).
Если не поможет - вставь в событие FormCloseQuery:procedure TfmMainForma.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var n:Integer;
begin
n:=MessageBox(Application.Handle,Pchar("Закончить работу с прогой ?"),PChar("Подтверждение"),MB_YESNO + MB_ICONQUESTION);
if n=IDYES then
begin
Fl_Close:=true;
CanClose:=True;
end
else
CanClose:=false;
end;
Как ни странно, но мне помогало.
← →
Faraday (2005-07-01 13:48) [26]Fl_Close:=true; - это я из своей проги скопировал - надо удалить.
← →
evvcom © (2005-07-01 13:52) [27]
> Faraday (01.07.05 13:46) [25]
Шаман, да и только. Чудеса какие-то рассказываешь.
Тогда уж по тексту, элегантнее писать:
CanClose := n = IDYES;
вместо всего этого наворота с проверкой булевой переменной и присвоения констант другой.
← →
Belkova © (2005-07-01 13:54) [28]Спасибо, попробую.
← →
Belkova © (2005-07-01 14:07) [29]К сожалению не помогло.
← →
Stakan © (2005-07-01 14:09) [30]Belkova © (01.07.05 13:54)
Попробуй как вариант принудительно разрывать соединение с базой в файле .dpr (перед CloseHandle)
← →
evvcom © (2005-07-01 14:15) [31]
> Belkova © (01.07.05 14:07) [29]
Ну а [19] пробовала? Что в логе? У тебя скорее всего проблема с коннектом, поэтому и [30] не поможет.
← →
Belkova © (2005-07-01 14:23) [32]Пишет подключился.
← →
Belkova © (2005-07-01 14:27) [33]Перед перед CloseHandle разрывать соединение попробовала, не помогло.
← →
КиТаЯц © (2005-07-01 14:47) [34]Знаю, что ща народ ржать будет, но... вот реальный кусок из моей программы:
procedure TModule.DataModuleDestroy(Sender: TObject);
begin
null; // ХЗ зачем это надо, но ошибка при закрытии почему-то пропала
end;
(TModule = class(TDataModule), где, собственно все компоненты IBX и лежат)
← →
3DxFantastika © (2005-07-02 08:46) [35]"экстремальный" выход: ExitProcess(0);
The ExitProcess function ends a process and all its threads.
VOID ExitProcess(
UINT uExitCode // exit code for all threads
);
но не рекомендуется ..
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.043 c