| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Не открыть бы несколько раз... |
| Автор: bagira 5.5.2004, 15:32 |
| Извините, может быть мой вопрос глупый... Пользователь стал тестировать мою программу - открыл одно окно, свернул его, снова запустил программу - открылось второе, и также - третий раз и т.д. В-общем, издевался как мог... И их накопилось довольно много... А я раньше не задумывалась об этом. Такое положение нежелательно... Окно программы должно открыться только один раз, а повторно программа не должна запускаться... Я первый раз делала программу на Дельфи, и не знаю, как это организовать? Подскажите, если можно, пожалуйста!!! (убегаю, приду вечером...) |
| Автор: Maverick 5.5.2004, 15:45 |
| В FAQ на запрос "копия" я первой получил такую ссылку... Как сделать, чтобы запускалась только одна копия приложения? Советую сделать тоже самое.... |
| Автор: bagira 5.5.2004, 21:40 |
| Maverick Ты прав, как всегда... Вот, только что скачала его... А до этого ни разу не удавалось докачать до конца... Что ж, будем искать... Спасибо. |
| Автор: Medved 5.5.2004, 22:28 | ||
| Обычно я использую такой механизм: в модуль проекта (*.dpr) добавляешь следующие строчки:
|
| Автор: bagira 5.5.2004, 22:55 |
| Pegas Получилось!!! И все работает превосходно! Спасибо! |
| Автор: Chyslyvchyk 20.5.2004, 16:04 | ||
| Pegas, эээээ, а можно поподробнее куда вписать нужно? Например, есть файл Project.dpr, состоящий из:
Как вписать код, который ты привел? |
| Автор: p0s0l 20.5.2004, 16:41 | ||
2 Chyslyvchyk :
Только я бы вместо Application.Terminate делал Exit... |
| Автор: Chyslyvchyk 20.5.2004, 18:29 |
| To p0s0l: Спасибо! Использую Exit - работает. |
| Автор: Chyslyvchyk 20.5.2004, 19:47 |
| To p0s0l: Допустим пользователь открыл программу и свернул ее. Через некоторое время он забыл, что он программу уже открывал и кликнул на *.exe программы еще раз. Копия программы теперь запускаться не будет. А как сделать, чтобы развернулась или активировалась, или (как это еще назвать....) программа, что он свернул? То есть, чтобы перед светлыми очами пользователя открылась программа, которую он свернул. |
| Автор: _hunter 20.5.2004, 19:59 | ||
нйти среди окон программу с твоим названием:
и послать ей определенное сообщение ( по которому программа будет себя показывать ) |
| Автор: Chyslyvchyk 20.5.2004, 20:10 |
| To _hunter:И снова: а куда это прописывать. |
| Автор: Pakshin A. S. 20.5.2004, 20:58 |
| Если прога есть, т. е. при ветке if'а перед exit'ом послать сообщение уже запущенной программы (где-то я это видел), которая, обработав его, выполнит Application.Restore... |
| Автор: p0s0l 20.5.2004, 23:06 | ||
Тогда можно обойтись без Event'ов. Вот так:
Только обзови Form2 в что-нибудь по-замудреннее. Если Form2.Name будет = 'Form2', а Form2.Caption будет = 'Абракадабра', то FindWindow делай таким: wnd := FindWindow('TForm2', 'Абракадабра'); |
| Автор: z-END 20.5.2004, 23:11 | ||||
| ЗЫ. Конечно же можно (и лучьше) делать как сказал г-н p0s0l, но это невсегда помогает, например когда свернуто приложение, еще свернута форма и ктому же она инвисибле, тогда приведенный им пример несработает А вот такой пример поможет: тело проекта
главный юнит
|
| Автор: Chyslyvchyk 21.5.2004, 15:55 |
| To p0s0l: nJIaKca.spb прав. Если окно приложения свернуто, тогда фокус просто переходит на него, но оно не открывается. To nJIaKca.spb: Если использовать твой код - ругается: Undeclared identifier: 'WM_ACTIVATEAPP'. И как должна быть оглашена переменная 'а'? |
| Автор: _hunter 21.5.2004, 16:23 |
| to Chyslyvchyk подключи Windows.pas |
| Автор: Chyslyvchyk 21.5.2004, 17:02 |
| Дык вроде прописано: uses Windows, ... |
| Автор: _hunter 21.5.2004, 17:04 |
| фиг его знает тогда просто определи такое сообщение и при его получении разворачивай форму |
| Автор: z-END 21.5.2004, 17:10 | ||
| Chyslyvchyk FindWindow возвращает handle окна соответственно a должна быть - Thandle или Cardinal как тебе больше понравиться а по поводу WM_ACTIVEAPP то можно сделать так:
и использовать вместо WM_ACTIVEAPP ее |
| Автор: <Spawn> 21.5.2004, 17:22 |
| WM_ACTIVATEAPP в Messages лежит |
| Автор: _hunter 21.5.2004, 17:25 | ||
| ??? а как это:
понимать? |
| Автор: Chyslyvchyk 21.5.2004, 18:29 |
| To All: WM_ACTIVATEAPP точно в Messages лежит To nJIaKca.spb: ... private procedure WndProc(var Message: TMessage); override; .... procedure TForm1.WndProc(var Message: TMessage); begin if (Message.Msg = WM_ACTIVATEAPP) and (Message.WParam = Handle) then begin А КАКИЕ, НАПРИМЕР, НЕОБХОДИМЫЕ ДЕЙСТВИЯ ПО РАЗВЕРТЫВАНИЮ ПРОГИ НУНО ЗДЕСЬ ВЫПОЛНЯТЬ? end else inherited end; |
| Автор: z-END 22.5.2004, 08:38 | ||
| Chyslyvchyk ну например
ну и т.п. все зависит от того как у тебя сприятана прога и че необходимо сделать |
| Автор: <Spawn> 22.5.2004, 09:48 | ||||
Ну дак это для Си |
| Автор: Chyslyvchyk 22.5.2004, 16:19 | ||||||
| НичАво не работает.... Так, гляньте, что не так. В project.dpr прописывается:
В юнит:
To nJIaKca.spb:
|
| Автор: z-END 22.5.2004, 19:44 | ||
| Chyslyvchyk сразу скажу при запущеных дельфях это неработает у тя хоть сообщение появлентся что прога запущена? а вообще для того чтобы развенруть форму нуно WindowSate:=wsNormal а если у тебя приложение свернуто то Application.Restore Добавлено @ 19:49 ЗЫ если тебя это неустраивает то убери етот кусок
но тогда (по крайней мере у меня |
| Автор: Chyslyvchyk 22.5.2004, 20:17 |
| nJIaKca.spb: Все работает, если проект в дельфях закрыть. Только проблемка в том, что и WindowSate:=wsNormal, и Application.Restore - просто разворачивают прогу фоном, а фокус на нее не передают. Было испробовано сначала удалить одну запись, потом другую. А нужно, чтобы она еще и поверх всех окон "вылазила". |
| Автор: z-END 23.5.2004, 19:36 |
| Chyslyvchyk для этого используй BringToFront а еше лучше SetForegroundWindow щас нет Дельфей под руками так что более конкретно сказать несмогу. а чтобы поверх всех то это FromStyle:=fsStayonTop и Application.RestoreTopMost |
| Автор: Akella 24.5.2004, 08:17 | ||
В процедуре показа формы напиши
|
| Автор: Albinos_x 27.5.2004, 22:04 |
| Также можно прописать приведённый пример в procedure TForm1.FormCreate(Sender: TObject); и перед завершение проги выдавать сообщение ShowMessage() с предупреждением, что прога уже запущена! |