Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не открыть бы несколько раз... ...окно моего приложения... 
:(
    Опции темы
bagira
Дата 5.5.2004, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2858
Регистрация: 25.10.2003
Где: в тайге Уральских гор

Репутация: нет
Всего: 123



Извините, может быть мой вопрос глупый...

Пользователь стал тестировать мою программу - открыл одно окно, свернул его, снова запустил программу - открылось второе, и также - третий раз и т.д. В-общем, издевался как мог... И их накопилось довольно много... А я раньше не задумывалась об этом. butbut.gif

Такое положение нежелательно... Окно программы должно открыться только один раз, а повторно программа не должна запускаться...

Я первый раз делала программу на Дельфи, и не знаю, как это организовать?
Подскажите, если можно, пожалуйста!!! sad.gif

(убегаю, приду вечером...)


--------------------
Сегодня ты не бродил, не искал, не любил - можно сказать - и не жил...
Ф.Х. Дагларджа (Турция)
http://zveriolginovour.ru/
https://vmeste.yandex.ru/zveriolginovour 
PM MAIL WWW ICQ   Вверх
Maverick
Дата 5.5.2004, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



В FAQ на запрос "копия" я первой получил такую ссылку...

Как сделать, чтобы запускалась только одна копия приложения?

Советую сделать тоже самое.... smile.gif



Это сообщение отредактировал(а) Maverick - 5.5.2004, 18:25


--------------------
smile
PM ICQ GTalk   Вверх
bagira
Дата 5.5.2004, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2858
Регистрация: 25.10.2003
Где: в тайге Уральских гор

Репутация: нет
Всего: 123



Maverick
Ты прав, как всегда... Вот, только что скачала его... А до этого ни разу не удавалось докачать до конца... Что ж, будем искать... Спасибо.



--------------------
Сегодня ты не бродил, не искал, не любил - можно сказать - и не жил...
Ф.Х. Дагларджа (Турция)
http://zveriolginovour.ru/
https://vmeste.yandex.ru/zveriolginovour 
PM MAIL WWW ICQ   Вверх
Medved
Дата 5.5.2004, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Обычно я использую такой механизм:

в модуль проекта (*.dpr) добавляешь следующие строчки:
Код

uses  syncobjs
...
var
 CheckEvent: TEvent;
...
begin
 CheckEvent := TEvent.Create(nil, false, true, 'MYPROGRAMM_CHECKEXIST');
 if CheckEvent.WaitFor(10) <> wrSignaled then
 begin
   Application.Terminate;
 end;
...
end;



--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
bagira
Дата 5.5.2004, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2858
Регистрация: 25.10.2003
Где: в тайге Уральских гор

Репутация: нет
Всего: 123



rolleyes.gif
Pegas

Получилось!!! И все работает превосходно! Спасибо! rolleyes.gif


--------------------
Сегодня ты не бродил, не искал, не любил - можно сказать - и не жил...
Ф.Х. Дагларджа (Турция)
http://zveriolginovour.ru/
https://vmeste.yandex.ru/zveriolginovour 
PM MAIL WWW ICQ   Вверх
Chyslyvchyk
Дата 20.5.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 9.5.2004

Репутация: 1
Всего: 5



Pegas, эээээ, а можно поподробнее куда вписать нужно?
Например, есть файл Project.dpr, состоящий из:
Код
program Project;

uses
 Forms,
 Unit1 in 'Unit1.pas' {Form1},
 Unit2 in 'Unit2.pas' {Form2},

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TForm2, Form2);
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.


Как вписать код, который ты привел? adv/54.gif


--------------------
Простота - сестра таланта!
PM MAIL   Вверх
p0s0l
Дата 20.5.2004, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



2 Chyslyvchyk :
Код
program Project;

uses
syncobjs, Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},

{$R *.res}

var
CheckEvent: TEvent;

begin
CheckEvent := TEvent.Create(nil, false, true, 'MYPROGRAMM_CHECKEXIST');
if CheckEvent.WaitFor(10) <> wrSignaled then Application.Terminate;
Application.Initialize;
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Только я бы вместо Application.Terminate делал Exit...




--------------------
С уважением, г-н Посол.
PM   Вверх
Chyslyvchyk
Дата 20.5.2004, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 9.5.2004

Репутация: 1
Всего: 5



To p0s0l: Спасибо! Использую Exit - работает. smile.gif


--------------------
Простота - сестра таланта!
PM MAIL   Вверх
Chyslyvchyk
Дата 20.5.2004, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 9.5.2004

Репутация: 1
Всего: 5



To p0s0l: Допустим пользователь открыл программу и свернул ее. Через некоторое время он забыл, что он программу уже открывал и кликнул на *.exe программы еще раз. Копия программы теперь запускаться не будет. А как сделать, чтобы развернулась или активировалась, или (как это еще назвать....) программа, что он свернул? То есть, чтобы перед светлыми очами пользователя открылась программа, которую он свернул.


--------------------
Простота - сестра таланта!
PM MAIL   Вверх
_hunter
Дата 20.5.2004, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



нйти среди окон программу с твоим названием:
Код
HWND FindWindow(
   LPCTSTR lpClassName, // pointer to class name
   LPCTSTR lpWindowName  // pointer to window name
  );


и послать ей определенное сообщение ( по которому программа будет себя показывать )

Это сообщение отредактировал(а) _hunter - 20.5.2004, 20:00


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Chyslyvchyk
Дата 20.5.2004, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 9.5.2004

Репутация: 1
Всего: 5



To _hunter:И снова: а куда это прописывать. smile.gif


--------------------
Простота - сестра таланта!
PM MAIL   Вверх
Pakshin A. S.
Дата 20.5.2004, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Если прога есть, т. е. при ветке if'а перед exit'ом послать сообщение уже запущенной программы (где-то я это видел), которая, обработав его, выполнит Application.Restore...
PM   Вверх
p0s0l
Дата 20.5.2004, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Тогда можно обойтись без Event'ов. Вот так:
Код
program Project;

uses

Windows, Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},

{$R *.res}

var
wnd : HWND;

begin
wnd := FindWindow('TForm2', 'Form2');
if wnd <> 0 then
begin
 ShowWindow(wnd, SW_SHOW);
 SetForeGroundWindow(wnd);
 exit;

end;
Application.Initialize;
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Только обзови Form2 в что-нибудь по-замудреннее.
Если Form2.Name будет = 'Form2',
а Form2.Caption будет = 'Абракадабра',
то FindWindow делай таким:
wnd := FindWindow('TForm2', 'Абракадабра');



--------------------
С уважением, г-н Посол.
PM   Вверх
z-END
Дата 20.5.2004, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



ЗЫ. Конечно же можно (и лучьше) делать как сказал г-н p0s0l, но это невсегда помогает, например когда свернуто приложение, еще свернута форма и ктому же она инвисибле, тогда приведенный им пример несработает sad.gif
А вот такой пример поможет:
тело проекта
Код

if (FindWindow (PAnsiChar ('Tform1'), PAnsiChar ('Form1')) = 0)
    or
  (FindWindow (nil, PAnsiChar ('Delphi 7')) <> 0)
{когда запущен Delphi то прога может найти это же окно в delphi и передумать запускаться}
then          
begin
  Application.CreateForm (TForm1, Form1);
  ....
  Application.Run;
end
else
begin
  a := FindWindow (PAnsiChar ('TForm1'),PAnsiChar('Form1'));
SendMessage (A, WM_ACTIVATEAPP, a, 0); //посылает сообщение с параметром равным handle окна
end;

главный юнит
Код
 ...
 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;



--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Chyslyvchyk
Дата 21.5.2004, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 9.5.2004

Репутация: 1
Всего: 5



To p0s0l: nJIaKca.spb прав. Если окно приложения свернуто, тогда фокус просто переходит на него, но оно не открывается. sad.gif

To nJIaKca.spb: Если использовать твой код - ругается: Undeclared identifier: 'WM_ACTIVATEAPP'. И как должна быть оглашена переменная 'а'?


--------------------
Простота - сестра таланта!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0994 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.