Topic: Контроль запуска одного экземпляра программы

Здравствуйте, подскажите, как можно контролировать запуск одного экземпляра программы. Сп.

2 (edited by pavlenko.vladimir.v 2023-09-27 15:20:06)

Re: Контроль запуска одного экземпляра программы

vit007 wrote:

Здравствуйте, подскажите, как можно контролировать запуск одного экземпляра программы. Сп.

// запрет запуска более одной копии
  if FindWindow(nil,'Имя программы') <> 0 then
  begin
      ShowMessage('Приложение уже запущено.');
      Form1.Close;
  end;

Re: Контроль запуска одного экземпляра программы

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.

Re: Контроль запуска одного экземпляра программы

Спасибо. А во втором случаи это если прогу из архива извлекать или для каких случаев...

Re: Контроль запуска одного экземпляра программы

if FindWindow(nil,'Database') <> 0 then

Перепробовал разные знаки и цифры. Реагирует на первый запуск.

Re: Контроль запуска одного экземпляра программы

vit007 wrote:

Спасибо. А во втором случаи это если прогу из архива извлекать или для каких случаев...

А причем тут архив?

Re: Контроль запуска одного экземпляра программы

Реакция на Zip... smile

8 (edited by vovka3003 2023-09-28 09:57:09)

Re: Контроль запуска одного экземпляра программы

vit007 wrote:

Реакция на Zip... smile

Это для случаев, когда из одной и той же папки выполняется повторная попытка запустить exe-шник.
zip - это контрольный файл, по которому проверяется запущенный экземпляр. Если "занят", значит программа уже открыта.

Re: Контроль запуска одного экземпляра программы

Понял, сп.

Re: Контроль запуска одного экземпляра программы

Если надо ловить глобально (а не только из одной папки), тогда можно попробовать так:

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.

11 (edited by vit007 2023-09-28 11:57:06)

Re: Контроль запуска одного экземпляра программы

Как понял про TZipMode, она создает файл, и дальше смотрит его наличие... и после завершения созданная "какашка" остается... а функции удаления нет или скрытого параметра...

И больше подходит с TZipMode, т.к. у меня выскакивает запрос на закрытие...

Re: Контроль запуска одного экземпляра программы

vit007 wrote:

Как понял про TZipMode, она создает файл, и дальше смотрит его наличие

Не столько "наличие", сколько "занятость" другим, ранее открытым экземпляром.

vit007 wrote:

..и после завершения созданная "какашка" остается...

Я должен "бумажку подать"?

13 (edited by vit007 2023-09-28 12:21:23)

Re: Контроль запуска одного экземпляра программы

Люблю "сделать" красиво...
Блин, просто 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;

14 (edited by vovka3003 2023-09-28 12:30:55)

Re: Контроль запуска одного экземпляра программы

vit007 wrote:

Люблю "сделать" красиво...

Ну это тогда винегрет... Или помидоры со шкурками.
По мне так лучше минимизировать операции записи на диск, даже с "какашкой" весом 22  г̶р̶а̶м̶м̶а̶  байта...

vit007 wrote:

DeleteFile('~$applock') не прокатывает

У меня прокатывает.

Re: Контроль запуска одного экземпляра программы

vovka3003 wrote:

Если надо ловить глобально (а не только из одной папки), тогда можно попробовать так:

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.

Мне этот вариант больше нравится. И как я сам не догадался, что окно с нужной надписью можно самому создать? А то вечные приколы с главной формой и её заголовком. Беру себе в блокнотик )))

Визуальное программирование: блог и телеграм-канал.

16 (edited by vovka3003 2023-09-28 13:32:03)

Re: Контроль запуска одного экземпляра программы

В адекватном варианте это надо было реализовать мьютексом, но в MVDb его нет...

17 (edited by vit007 2023-09-29 08:52:02)

Re: Контроль запуска одного экземпляра программы

А подскажите, как условия сделать приведенных примерах... не понимаю к чему привязываться...
А то у меня реализовано

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.

Re: Контроль запуска одного экземпляра программы

Перенесите строчку

frmFon.OnCloseQuery := @frmFon_OnCloseQuery;

внутрь обработчика frmFon_OnShow , перед  frmMain.Parent := frmFon;


Кстати,

frmMain.Parent := frmFon;

для чего делаете?

Визуальное программирование: блог и телеграм-канал.

Re: Контроль запуска одного экземпляра программы

Это чтоб на панели задач не было открыто много окон при открытых двух формах...

20 (edited by vit007 2023-09-29 10:30:15)

Re: Контроль запуска одного экземпляра программы

Сп. помогло... думал что OnCloseQuery должно только в основном теле.

Re: Контроль запуска одного экземпляра программы

Это чтоб на панели задач не было открыто много окон при открытых двух формах...

https://myvisualdatabase.com/forum/view … 970#p23970

Re: Контроль запуска одного экземпляра программы

vit007 wrote:

Это чтоб на панели задач не было открыто много окон при открытых двух формах...

Чтобы форма не отображалась на таскбаре, установите её свойство ShowOnTaskbar = False, доступно в редакторе.

Про форму и её свойства: https://k245.ru/mvdb/formy.html

Визуальное программирование: блог и телеграм-канал.