Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 556

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Подскажите как сделать в Delphi чтоб откомпилированную программу нельзя было 2 и более раз запустить. Чтоб при повторном запуске например выводилось сообщение программа уже запущена или если программа свернута в трее то просто разворачивалась. Или подскажите где можно узнать как это сделать. За ранее благодарен.

Курцетов И.А. Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Курцетов И.А. (статус: Посетитель)
Вопрос отправлен: 6 мая 2007, 14:49
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Сергей Устинов

Здравствуйте, Курцетов И.А.!

Для этого нужно немного переделать файл *.dpr:
Изначально он примерно такой:
<code>
program Project1;

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

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
</code>
Вам же нужно сделать из него такой:
<code>
program Project1;

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

{$R *.res}

var HM: THandle;

function Check: boolean;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'FelixSUBDSubScribers');
Result := (HM <> 0);
if HM = 0 then
HM := CreateMutex(nil, false, 'FelixSUBDSubScribers');
end;

begin
if Check then
begin
Application.MessageBox('Программа уже запущена!','Внимание!',64);
Exit;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
</code>

Удачи!

Ответ отправил: Сергей Устинов (статус: 2-ой класс)
Время отправки: 6 мая 2007, 14:58
Оценка за ответ: 5

Комментарий к оценке: Спасибо

Ответ #2. Отвечает эксперт: ANBsoft

Здравствуйте, Курцетов И.А.!
Наберите в поисковике Kuliba. Это сборник ответов на часто встречающиеся вопросы по Делфи.
В разных выпусках приведено более десятка способов решения Вашей проблемы.
Если не найдете - пишите, вышлю на мыло.

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 6 мая 2007, 20:52
Оценка за ответ: 3

Комментарий к оценке: Спасибо за совет. Я думаю вы не огорчитесь, если я вам поставлю такую оценку. Я просто выхожу в инет через мобильник, и лазить в интернете и искать подходящие книги проблематично, и дорого, вот если бы вы скинули на реальальные ссылки на хорошие книги по Delphi, я был бы вам благодарен. А если хотите даже можете скинуть на Email.

Ответ #3. Отвечает эксперт: min@y™

Позволю себе дополнить ответ С. Устинова. Конечно, через создание мьютекса - самый красивый вариант. Но, чтобы запущенная прога разворачивалась из панели задач/трея, я делаю так (см. приложение):

Приложение:
  1. program XXX;
  2.  
  3. uses
  4. Forms,
  5. Windows, ...;
  6.  
  7. const
  8.  
  9. OneInstMutexName = 'xxxOneInstanceMutex';
  10. OneInstActivateMessage = 'xxxActivateMessage';
  11.  
  12. var
  13. MutexHandle: THandle;
  14. ActivateMessage: Cardinal;
  15.  
  16. procedure HaltProgram;
  17. begin
  18. try
  19. if MutexHandle <> 0
  20. then CloseHandle(MutexHandle);
  21. except
  22.  
  23. end;
  24.  
  25. Halt;
  26. end;
  27.  
  28. function IsNextInstance: Boolean;
  29. begin
  30. Result:= False;
  31. MutexHandle:= 0;
  32. MutexHandle:= CreateMutex(nil, True, OneInstMutexName);
  33.  
  34. if MutexHandle <> 0
  35. then begin
  36. if GetLastError = ERROR_ALREADY_EXISTS
  37. then begin
  38. Result:= True;
  39. CloseHandle(MutexHandle);
  40. MutexHandle:= 0;
  41. end;
  42. end;
  43. end;
  44.  
  45. begin
  46. Application.Initialize;
  47.  
  48. ActivateMessage:= RegisterWindowMessage(OneInstActivateMessage);
  49.  
  50. if IsNextInstance
  51. then begin
  52. PostMessage(HWND_BROADCAST, ActivateMessage, 0, 0);
  53. HaltProgram();
  54. end;
  55.  
  56.  
  57. LoadSettings;
  58.  
  59. Application.CreateForm(TMainForm, MainForm);
  60. Application.Run;
  61. SaveSettings;
  62. end.
  63.  
  64.  
  65.  
  66. procedure TMainForm.AppEventsMessage(var Msg: tagMSG;
  67. var Handled: Boolean);
  68. begin
  69. if Msg.message = ActivateMessage
  70. then begin
  71.  
  72. Application.Restore;
  73. Application.BringToFront;
  74. SetActiveWindow(Application.Handle);
  75. SetForegroundWindow(Application.Handle);
  76. end;
  77. end;


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 7 мая 2007, 10:36


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 6 мая 2007, 22:58; участников в обсуждении: 1.
ANBsoft

ANBsoft (статус: Студент), 6 мая 2007, 22:55 [#1]:

Проверка, у меня не отправляются сообщения в форум.
ANBsoft

ANBsoft (статус: Студент), 6 мая 2007, 22:57 [#2]:

Глюк форума, не принимает длинных сообщений, разобью на несколько.
Я уже давно не обижаюсь, иначе бы не отвечал на вопросы. По статистике около половины людей ставит подобные оценки, при этом сами ни в чем не хотят разбираться, а у некоторых хватает наглости писать, что им некогда в этом разбираться, а нужно готовое решение (типа Copy - Paste и все в шоколаде). Но во первых универсальных решений не бывает, во вторых так никогда не научишься программировать.
ANBsoft

ANBsoft (статус: Студент), 6 мая 2007, 22:58 [#3]:

Когда у меня встала проблема блоктровки копий программы, я перепробовал штук пять разных алгоритмов пока нашел приемлемый, при этом для разных задач использовал два разных подхода. Еще раз повторю, что универсальных решений не бывает, и даже сейчас я не совсем доволен тем алгоритмом блокировки, который у меня работает (если интересно, то не устраивает то, что при запуске копии она автоматом вызывает первую копию, но после этого вызова первая копия не хочет сворачиваться - тоесть окно на весь экран, с ним можно работать, но где-то в виндовсе хранится что окно свернуто. Просто для моей задачи это не важно, и нет времени решать второстепенные задачи).
ANBsoft

ANBsoft (статус: Студент), 6 мая 2007, 22:58 [#4]:

По поводу оценки это Ваше право, от себя я сделал, на мой взгляд, лучшее решение (откуда я знаю какой у Вас интернет), я предложил либо скачать нужные файлы, либо если проблематично, то выслать Вам их, при этом одна из первых версий Kuliba.chm занимает всего 35кб, даже для мобильного инета это не так много, в конце концов это Вам нужно, и можно отдать 0.5$ за час сидения в интернет-клубе и найти все что нужно.
В общем, успехов в программировании :).
С уважением, Александр.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.02 сек.