Topic: Контроль запуска одного экземпляра программы
Здравствуйте, подскажите, как можно контролировать запуск одного экземпляра программы. Сп.
My Visual Database → Russian → Контроль запуска одного экземпляра программы
Здравствуйте, подскажите, как можно контролировать запуск одного экземпляра программы. Сп.
Здравствуйте, подскажите, как можно контролировать запуск одного экземпляра программы. Сп.
// запрет запуска более одной копии
if FindWindow(nil,'Имя программы') <> 0 then
begin
ShowMessage('Приложение уже запущено.');
Form1.Close;
end;
var ZF:TZipFile;
procedure Form1_OnClose (Sender: TObject; Action: string);
begin
ZF.Free;
end;
begin
try
ZF:=TZipFile.Create;
ZF.Open('~$applock',zmWrite);
except
ShowMessage('Уже запущен экземпляр программы');
Form1.Close;
end;
end.
Спасибо. А во втором случаи это если прогу из архива извлекать или для каких случаев...
if FindWindow(nil,'Database') <> 0 then
Перепробовал разные знаки и цифры. Реагирует на первый запуск.
Спасибо. А во втором случаи это если прогу из архива извлекать или для каких случаев...
А причем тут архив?
Реакция на Zip...
Реакция на Zip...
Это для случаев, когда из одной и той же папки выполняется повторная попытка запустить exe-шник.
zip - это контрольный файл, по которому проверяется запущенный экземпляр. Если "занят", значит программа уже открыта.
Понял, сп.
Если надо ловить глобально (а не только из одной папки), тогда можно попробовать так:
begin
if FindWindow('','already_launched')>0 then
begin
ShowMessage('Программа уже запущена');
Application.Minimize;
Form1.Close;
end;
with TForm.Create(Application) do
begin
Name := 'already_launched';
BorderStyle := bsNone;
Width:=0;
Height:=0;
Show;
Hide;
end;
end.
Как понял про TZipMode, она создает файл, и дальше смотрит его наличие... и после завершения созданная "какашка" остается... а функции удаления нет или скрытого параметра...
И больше подходит с TZipMode, т.к. у меня выскакивает запрос на закрытие...
Как понял про TZipMode, она создает файл, и дальше смотрит его наличие
Не столько "наличие", сколько "занятость" другим, ранее открытым экземпляром.
..и после завершения созданная "какашка" остается...
Я должен "бумажку подать"?
Люблю "сделать" красиво...
Блин, просто DeleteFile('~$applock') не прокатывает, надо оказывается путь прописывать или его создавать из начально в корне или Temp...
Ну это подумает сп. TZipMode - подходит.
try
ZF:=TZipFile.Create;
ZF.Open('C:\Windows\Temp\~$applock',zmWrite);
except
ZF.Free;
MessageBox('Уже запущен экземпляр программы','Ошибка',MB_OK+MB_ICONINFORMATION);
Application.Minimize;
frmFon.Close;
Люблю "сделать" красиво...
Ну это тогда винегрет... Или помидоры со шкурками.
По мне так лучше минимизировать операции записи на диск, даже с "какашкой" весом 22 г̶р̶а̶м̶м̶а̶ байта...
DeleteFile('~$applock') не прокатывает
У меня прокатывает.
Если надо ловить глобально (а не только из одной папки), тогда можно попробовать так:
begin if FindWindow('','already_launched')>0 then begin ShowMessage('Программа уже запущена'); Application.Minimize; Form1.Close; end; with TForm.Create(Application) do begin Name := 'already_launched'; BorderStyle := bsNone; Width:=0; Height:=0; Show; Hide; end; end.
Мне этот вариант больше нравится. И как я сам не догадался, что окно с нужной надписью можно самому создать? А то вечные приколы с главной формой и её заголовком. Беру себе в блокнотик )))
В адекватном варианте это надо было реализовать мьютексом, но в MVDb его нет...
А подскажите, как условия сделать приведенных примерах... не понимаю к чему привязываться...
А то у меня реализовано
frmFon.OnCloseQuery := @frmFon_OnCloseQuery;
и поэтому постоянно выскакивает подтверждение выхода.
А если поставить в теле программы
begin
...
end.
до OnCloseQuery , то появляется пустое окно, на которое надо нажать, чтоб оно исчезло...
т.е. мне надо условие чтоб можно было перепрыгнуть show следующей формы.
procedure frmFon_OnShow (Sender: TObject; Action: string);
begin
//Контроль запуска одного экземпляра программы
if FindWindow('','already_launched')>0 then
begin
MessageBox('Уже запущен экземпляр программы','Ошибка',MB_OK+MB_ICONINFORMATION);
Application.Minimize;
frmFon.Close;
end;
with TForm.Create(Application) do
begin
Name := 'already_launched';
BorderStyle := bsNone;
Width:=0;
Height:=0;
Show;
Hide;
end;
begin
//При стиле "без рамки" убирает второе окно
frmMain.Parent := frmFon;
frmMain.Show;
frmMain.TableGrid1.dbUpdate;
end;
end;
begin
frmFon.OnCloseQuery := @frmFon_OnCloseQuery;
end.
Перенесите строчку
frmFon.OnCloseQuery := @frmFon_OnCloseQuery;
внутрь обработчика frmFon_OnShow , перед frmMain.Parent := frmFon;
Кстати,
frmMain.Parent := frmFon;
для чего делаете?
Это чтоб на панели задач не было открыто много окон при открытых двух формах...
Сп. помогло... думал что OnCloseQuery должно только в основном теле.
Это чтоб на панели задач не было открыто много окон при открытых двух формах...
Это чтоб на панели задач не было открыто много окон при открытых двух формах...
Чтобы форма не отображалась на таскбаре, установите её свойство ShowOnTaskbar = False, доступно в редакторе.
Про форму и её свойства: https://k245.ru/mvdb/formy.html
My Visual Database → Russian → Контроль запуска одного экземпляра программы
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi