|
Вопрос # 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™
Позволю себе дополнить ответ С. Устинова. Конечно, через создание мьютекса - самый красивый вариант. Но, чтобы запущенная прога разворачивалась из панели задач/трея, я делаю так (см. приложение):
Приложение: Переключить в обычный режим- program XXX;
-
- uses
- Forms,
- Windows, ...;
-
- const
-
- OneInstMutexName = 'xxxOneInstanceMutex';
- OneInstActivateMessage = 'xxxActivateMessage';
-
- var
- MutexHandle: THandle;
- ActivateMessage: Cardinal;
-
- procedure HaltProgram;
- begin
- try
- if MutexHandle <> 0
- then CloseHandle(MutexHandle);
- except
-
- end;
-
- Halt;
- end;
-
- function IsNextInstance: Boolean;
- begin
- Result:= False;
- MutexHandle:= 0;
- MutexHandle:= CreateMutex(nil, True, OneInstMutexName);
-
- if MutexHandle <> 0
- then begin
- if GetLastError = ERROR_ALREADY_EXISTS
- then begin
- Result:= True;
- CloseHandle(MutexHandle);
- MutexHandle:= 0;
- end;
- end;
- end;
-
- begin
- Application.Initialize;
-
- ActivateMessage:= RegisterWindowMessage(OneInstActivateMessage);
-
- if IsNextInstance
- then begin
- PostMessage(HWND_BROADCAST, ActivateMessage, 0, 0);
- HaltProgram();
- end;
-
-
- LoadSettings;
-
- Application.CreateForm(TMainForm, MainForm);
- Application.Run;
- SaveSettings;
- end.
-
-
-
- procedure TMainForm.AppEventsMessage(var Msg: tagMSG;
- var Handled: Boolean);
- begin
- if Msg.message = ActivateMessage
- then begin
-
- Application.Restore;
- Application.BringToFront;
- SetActiveWindow(Application.Handle);
- SetForegroundWindow(Application.Handle);
- end;
- end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 7 мая 2007, 10:36
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 6 мая 2007, 22:58; участников в обсуждении: 1.
|
ANBsoft (статус: Студент), 6 мая 2007, 22:55 [#1]:
Проверка, у меня не отправляются сообщения в форум.
|
|
ANBsoft (статус: Студент), 6 мая 2007, 22:57 [#2]:
Глюк форума, не принимает длинных сообщений, разобью на несколько.
Я уже давно не обижаюсь, иначе бы не отвечал на вопросы. По статистике около половины людей ставит подобные оценки, при этом сами ни в чем не хотят разбираться, а у некоторых хватает наглости писать, что им некогда в этом разбираться, а нужно готовое решение (типа Copy - Paste и все в шоколаде). Но во первых универсальных решений не бывает, во вторых так никогда не научишься программировать.
|
|
ANBsoft (статус: Студент), 6 мая 2007, 22:58 [#3]:
Когда у меня встала проблема блоктровки копий программы, я перепробовал штук пять разных алгоритмов пока нашел приемлемый, при этом для разных задач использовал два разных подхода. Еще раз повторю, что универсальных решений не бывает, и даже сейчас я не совсем доволен тем алгоритмом блокировки, который у меня работает (если интересно, то не устраивает то, что при запуске копии она автоматом вызывает первую копию, но после этого вызова первая копия не хочет сворачиваться - тоесть окно на весь экран, с ним можно работать, но где-то в виндовсе хранится что окно свернуто. Просто для моей задачи это не важно, и нет времени решать второстепенные задачи).
|
|
ANBsoft (статус: Студент), 6 мая 2007, 22:58 [#4]:
По поводу оценки это Ваше право, от себя я сделал, на мой взгляд, лучшее решение (откуда я знаю какой у Вас интернет), я предложил либо скачать нужные файлы, либо если проблематично, то выслать Вам их, при этом одна из первых версий Kuliba.chm занимает всего 35кб, даже для мобильного инета это не так много, в конце концов это Вам нужно, и можно отдать 0.5$ за час сидения в интернет-клубе и найти все что нужно.
В общем, успехов в программировании .
С уважением, Александр.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|