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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 23.10.2011, 11:03   #1
ВалекFCRK
Форумчанин
 
Регистрация: 04.06.2011
Сообщений: 120
По умолчанию защита от повторного открытия программы

например я главной форме програмки сделал visible:=false . Пользователь хочет ее открыть и запускает програмку ещё раз. Так вот как сделать так, чтобы програмка не второй раз открывалась и была запущена 2 раза, а просто visible менялось на true.
ВалекFCRK вне форума
Старый 23.10.2011, 11:38   #2
Стелс
Я с вами :-)
Форумчанин
 
Аватар для Стелс
 
Регистрация: 19.10.2008
Сообщений: 110
По умолчанию

зачем такой геморрой ?? программа или видна или нет вот и все !!!!
или это опять студентам дали задачу ? тогда вам в раздел "В помощь студентам"
ищите на форуме такой вопрос уже был совсем недавно
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга - Окна for чайников . Кодить начал ещё вчера . ......кто там кодит ? Да не кто не кодит это я куякнулся
Стелс вне форума
Старый 23.10.2011, 11:44   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
зачем такой геморрой ?? программа или видна или нет вот и все !!!!
Нормальная ситуация, очень часто нужна защита от повторного запуска проги. Можно посмотреть http://programmersforum.ru/showthread.php?t=55722 да и другие темы подобные есть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 23.10.2011, 11:59   #4
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

В dpr пишешь функцию
Код:
Var HM :THandle;
function Check: boolean;
begin
  HM:=OpenMutex(MUTEX_ALL_ACCESS, false, 'ProgName');
  Result:=(HM<>0);
  if HM=0 then HM:=CreateMutex(nil, false, 'ProgName');
end;
а потом прочто проверяешь
if Check then Exit;
FaTaL вне форума
Старый 23.10.2011, 12:04   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

я с этим так справляюсь..
Код:
function CheckMutex(AppCaption: string): Boolean;
var
  HM: Thandle;
begin
  HM := OpenMutex(MUTEX_ALL_ACCESS, false, PAnsiChar(AppCaption));
  Result := (HM <> 0);
  if HM = 0 then
    CreateMutex(nil, false, PAnsiChar(AppCaption));
end;

If CheckMutex('THIS IS SPARTA!!!!1111') then
begin
MessageBox(0,PChar('ПШЁЛ НА ЙУХ... :d'),PChar('ERROR!!!'),MB_OK OR MB_ICONERROR);
end;
Человек_Борща вне форума
Старый 23.10.2011, 12:18   #6
[MoNAMur]
читер
Форумчанин
 
Аватар для [MoNAMur]
 
Регистрация: 05.10.2009
Сообщений: 150
По умолчанию

еще один вариант решения проблемы

Код:
Const
 MemFileSize = 1024;
 MemFileName = 'one_instance_myprog';
Var
 MemHnd : HWND;

begin

//see more  http://msdn.microsoft.com/en-us/library/aa366537(v=vs.85).aspx
//
 MemHnd := CreateFileMapping(HWND($FFFFFFFF),nil,
                              PAGE_READWRITE,0,
                              MemFileSize,
                              MemFileName);
  if (GetLastError <> ERROR_ALREADY_EXISTS) then
  begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.Title := 'моя прога';
      Application.CreateForm(TMainForm, MainForm);
  Application.Run;
  end
  else MessageDlg('Ололо, прога уже запущена', mtInformation, [mbOk], 0);
end.
$me = $me == $me ? $me : $me;
[MoNAMur] вне форума
Старый 23.10.2011, 12:29   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

я использую ещё это:
Код:
function FirstHinstanceRunning(RunMode: Integer = 0): boolean;
const
  MemFileSize = 127;
var
  MemHnd: HWND;
  MemFileName: string;
  lpBaseAddress: ^HWND;
  FirstAppHandle: HWND;
begin
  Result := False;
  MemFileName := Application.ExeName;
  case RunMode of
    0:
      MemFileName := AnsiReplaceText(MemFileName, '\', '/');
    1:
      MemFileName := ExtractFileName(MemFileName);
  else
    Exit;
  end;
  MemHnd := CreateFileMapping(HWND($FFFFFFFF), nil,
    PAGE_READWRITE, 0, MemFileSize, PChar(MemFileName));
  if GetLastError <> ERROR_ALREADY_EXISTS then
  begin
    if MemHnd <> 0 then
    begin
      lpBaseAddress := MapViewOfFile(MemHnd, FILE_MAP_WRITE, 0, 0, 0);
      if lpBaseAddress <> nil then
        lpBaseAddress^ := Application.Handle;
    end;
  end
  else
  begin
    Result := True;
    if MemHnd <> 0 then
    begin
      lpBaseAddress := MapViewOfFile(MemHnd, FILE_MAP_READ, 0, 0, 0);
      if lpBaseAddress <> nil then
      begin
        FirstAppHandle := lpBaseAddress^;
        ShowWindow(FirstAppHandle, SW_RESTORE);
        SetForegroundWindow(FirstAppHandle);
      end;
    end;
  end;
  if lpBaseAddress <> nil then
    UnMapViewOfFile(lpBaseAddress);
end;

begin
  Application.Initialize;
  SetThreadLocale(1049);
  CheckMutex(Mutex_name);


  //Не разрешён запуск более 1 копии
  if not AllowedMultiEXE then
  begin
    if FirstHinstanceRunning(0) then
    begin
      Exit;
    end;
  end;
Человек_Борща вне форума
Старый 23.10.2011, 14:19   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Мой неоднократно проверенный способ.
Код:
uses SyncObjs;
...
CheckEvent: TEvent;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckEvent:= TEvent.Create( nil, false, true, 'MYPROJECT_CHECKEXIST' );
If CheckEvent.WaitFor(10)<>wrSignaled then
begin
ShowMessage('Сколько можно запускать одну и ту же программу ?');
Application.Terminate;
end else
...
Закрыто. Неоднократно обсуждалось.
ТС получает большую красную карточку за несоблюдение пункта 0 правил раздела.
mihali4 вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема повторного открытия базы данных berkeley db ViY Помощь студентам 2 29.03.2010 19:52
Запуск программы сразу после открытия папки artemavd Общие вопросы Delphi 16 25.08.2009 08:41
Обновление программы по http протоколу без открытия браузера и подтверждения The Best Работа с сетью в Delphi 9 21.07.2009 16:57
Защита от повторного запуска Vladya Помощь студентам 8 24.06.2009 09:04