Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2011, 23:59   #1
ВалекFCRK
Форумчанин
 
Регистрация: 04.06.2011
Сообщений: 120
По умолчанию узнать запущена программа или нет

Допустим у меня запущена программа, свойство формы программы visible:=False . Ее не видно. Что прописать и где, чтобы если например пользователь форму не видит а захочет ее увидеть и запустит программу повторно, программа не запускалась повторно, а просто visible:=True; И Возможно ли вобще это сделать. Спасибо
ВалекFCRK вне форума Ответить с цитированием
Старый 10.10.2011, 00:16   #2
Стелс
Я с вами :-)
Форумчанин
 
Аватар для Стелс
 
Регистрация: 19.10.2008
Сообщений: 110
По умолчанию

при попытке запустить 2 й экземпляр ??
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга - Окна for чайников . Кодить начал ещё вчера . ......кто там кодит ? Да не кто не кодит это я куякнулся

Последний раз редактировалось Стелс; 10.10.2011 в 00:28.
Стелс вне форума Ответить с цитированием
Старый 10.10.2011, 00:38   #3
ВалекFCRK
Форумчанин
 
Регистрация: 04.06.2011
Сообщений: 120
По умолчанию

Цитата:
Сообщение от Стелс Посмотреть сообщение
при попытке запустить 2 й экземпляр ??
да. Правильно поняли
ВалекFCRK вне форума Ответить с цитированием
Старый 10.10.2011, 00:47   #4
Стелс
Я с вами :-)
Форумчанин
 
Аватар для Стелс
 
Регистрация: 19.10.2008
Сообщений: 110
По умолчанию

ну думаю что возможно только вот вопрос ЗАЧЕМ такой геморрой ???
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга - Окна for чайников . Кодить начал ещё вчера . ......кто там кодит ? Да не кто не кодит это я куякнулся
Стелс вне форума Ответить с цитированием
Старый 10.10.2011, 01:24   #5
Стелс
Я с вами :-)
Форумчанин
 
Аватар для Стелс
 
Регистрация: 19.10.2008
Сообщений: 110
По умолчанию

вот наковырял http://cf.pop3.ru/Project1.exe
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга - Окна for чайников . Кодить начал ещё вчера . ......кто там кодит ? Да не кто не кодит это я куякнулся
Стелс вне форума Ответить с цитированием
Старый 10.10.2011, 01:26   #6
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Первое, что пришло в голову:
Код:
Procedure OnlyOne;
Begin
If OpenMutex(MUTEX_ALL_ACCESS,False,'Form1') <> 0 Then
Begin
CreateMutex(Nil,True,'Form2');
Sleep(300);
Halt;
End
Else
Begin
CreateMutex(Nil,True,'Form1');
End;
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
Application.ShowMainForm:=False;
OnlyOne;
End;

Procedure TForm1.Timer1Timer(Sender: TObject);
Begin
If OpenMutex(MUTEX_ALL_ACCESS,False,'Form2') <> 0 Then
Begin
Form1.Visible:=True;
End;
End;
У таймера интервал 200. Если так не устроит, что можно подумать над оптимизацией.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 10.10.2011, 09:00   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Terran +1

тема достаточно "избитая". Точно помню в том же "Delphi World" были различные варианты решения данной задачи.

ну, и как вариант могу посоветовать то, что используется у нас в рабочем проекте.
из JEDI (JVCL):
модуль JvVCLUtils
функция
function ActivatePrevInstance(const MainFormClass: ShortString;
const ATitle: string): Boolean;

использовать можно так:
в файле проекта (****.dpr) прямо после начального begin
Код:
    
if ActivatePrevInstance(TMainForm.ClassName, '') then Exit;
где TMainForm - класс главного окна...

Последний раз редактировалось Serge_Bliznykov; 10.10.2011 в 09:04.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.10.2011, 12:42   #8
Стелс
Я с вами :-)
Форумчанин
 
Аватар для Стелс
 
Регистрация: 19.10.2008
Сообщений: 110
По умолчанию

Код:
program Project1;

uses
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}


  begin
    Application.Initialize;
    Application.Title := 'Моя программа';
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  
end.



юнит

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var AppHandle: THandle;
begin
if Form1.Visible =True
   then
         begin
               Form1.Visible :=False;
              CreateSemaphore(nil,1,1,'SIPOM - Моя программа');
  if GetLastError = ERROR_ALREADY_EXISTS
    then
        begin 
             AppHandle:= FindWindow(nil,'Моя программа');
             ShowMessage('Сейчас будет видно');
            if not IsWindowVisible(AppHandle)
            then
                begin
                     ShowWindow(AppHandle,SW_SHOWMAXIMIZED);
                    Abort;
                    SetForegroundWindow(AppHandle);


  end;
   end
   ;end;
       end;

end.

ну почти тоже что и у Terran
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга - Окна for чайников . Кодить начал ещё вчера . ......кто там кодит ? Да не кто не кодит это я куякнулся

Последний раз редактировалось Стелс; 10.10.2011 в 13:01.
Стелс вне форума Ответить с цитированием
Старый 10.10.2011, 12:55   #9
Стелс
Я с вами :-)
Форумчанин
 
Аватар для Стелс
 
Регистрация: 19.10.2008
Сообщений: 110
По умолчанию

а есчо можно создать файл ini с переменной булевского типа и при первой загрузке переписывать истину на ложь а при закрытии возвращать в исходное состояние а перед всем этим проверять состояние переменной и в зависимости от её состояния принимать решение при этом не забывать ExitProcess(0);

недостаток такого подхода - если прога зависнет и ее придется убить то конечно все будет через "ж"
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга - Окна for чайников . Кодить начал ещё вчера . ......кто там кодит ? Да не кто не кодит это я куякнулся

Последний раз редактировалось Стелс; 10.10.2011 в 13:05.
Стелс вне форума Ответить с цитированием
Старый 10.10.2011, 14:59   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

фрагмент с рабочего проекта
Код:

procedure GetProcessList(var List: TstringList); 
var ovi: TOSVersionInfo;
begin 
  if List = nil then Exit;
  ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); 
  GetVersionEx(ovi); 
  case ovi.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(List);
    VER_PLATFORM_WIN32_NT     : CreateWinNTProcessList(List);
  end
end;

function GetExeRunCount(const FileName: string):integer;
var i     : Integer;
    fList : TstringList;
    s0,S1 : string;
begin
  result:=0;
  s0:=ExtractFileName(FileName);
  fList := TStringList.Create;
  try
    GetProcessList(fList);
    for i := 0 to fList.Count - 1 do
    begin
     s1:=ExtractFileName(Trim(fList.strings[i]));
     inc(result, byte(s1=s0));
    end;
   finally
    fList.Free;
  end;
end;

begin
Application.Initialize;
  if GetExeRunCount(Application.ExeName, false)>1 then
   begin
    MessageBox(0,'Процесс уже запущен ','ХХХХХХХХХХ',0);
    Application.Terminate;
    exit;
   end;
...
...
...
Application.run;
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать, запущена программа с локальных диска или с флешки? KWN, lnc Общие вопросы Delphi 4 07.07.2011 22:31
Как узнать программа запущена или нет? ilSMoKEli Общие вопросы Delphi 5 02.05.2010 23:01
обновление в блоге - Как узнать, запущена программа с правами администратора или нет Pblog Обсуждение статей 0 05.03.2010 20:50
Как узнать деректорию откуда запущена программа? dolphin705 Общие вопросы Delphi 4 22.03.2009 19:32
Запущена программа или нет Маркъ Общие вопросы Delphi 6 05.02.2007 18:21