Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Delphi
Перезагрузить страницу Проверка наличия созданной формы
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Psycho DeepRat Psycho DeepRat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.11.2006
По умолчанию Проверка наличия созданной формы - 03.12.2006, 20:51

Мне нужно замутить, так чтоб форма запускалась только в одном экземпляре, чтобы нельзя было запустить её копию.
Я написал так в коде:
Код:
procedure TfrmCloc.popOptionsClick(Sender: TObject);
Var hPrevWin: HWND;
begin
hPrevWin:=FindWindow('TfrmOptions','frmOptions');
If ((FindWindow('TfrmOptions','frmOptions'))<>0) Then
  begin
    SetForegroundWindow(hPrevWin);
    Application.Terminate;
  end
  Else
    begin
      Application.CreateForm(TfrmOptions, frmOptions);
      frmOptions.pgcMain.ActivePageIndex:=0;
      frmOptions.Show;
    end;
end;
Но так почему-то не прокатывает. Никаких ошибок не выдает и всеравно запускает копию формы.

К примеру я вставил такой же код на запуск второй копии приложения и здесь все пашет. Вот код: Это уже прописано в файле ресурса
Код:
  If ((FindWindow('TfrmCloc','PsyCloc')) <> 0) Then Application.Terminate;
  Application.Initialize;
  Application.CreateForm(TfrmCloc, frmCloc);
  ShowWindow(Application.Handle, sw_Hide);
  Application.Run;
Почему-же с формой так не прокатывает??? Ведь по сути-то одно и тоже.
Ответить с цитированием
  (#2 (permalink)) Старый
KachoK KachoK вне форума
Member
 
Сообщений: 244
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.07.2004
По умолчанию 04.12.2006, 06:27

Может дело в том, что "This function does not search child windows"?
Ответить с цитированием
  (#3 (permalink)) Старый
Psycho DeepRat Psycho DeepRat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.11.2006
По умолчанию 04.12.2006, 10:18

Таки незнаю...
У меня вообще не вылетает никаких предупреждений или ошибок.
Кстати приложение у меня не MDI. Просто есть несколько форм, которые нужно контролировать, чтоб они не запускались повторно, если уже запущены.
Ответить с цитированием
  (#4 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 04.12.2006, 11:17

Если форма хратится в frmOptions, то она там только одна и будет одна. Надо только проверять, что в переменной уже что-то есть
Ответить с цитированием
  (#5 (permalink)) Старый
zsv zsv вне форума
Member
 
Сообщений: 47
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.06.2006
По умолчанию 04.12.2006, 17:26

Кстате, к этой теме, подскажите, как мне при попытке запуска второй копии приложения, первую выводить из минимизированного состояния и давать ей фокус?
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
KachoK KachoK вне форума
Member
 
Сообщений: 244
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.07.2004
По умолчанию 05.12.2006, 05:56

Код:
if Assigned(frmOptions) then
begin
frmOptions.WindowState := wsNormal;
frmOptions.BringToFront;
frmOptions.SetFocus;
end;
хотя мне кажется что последнее уже необязательно, фокус должен установиться еще на BringToFront.
Ответить с цитированием
  (#7 (permalink)) Старый
Psycho DeepRat Psycho DeepRat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.11.2006
По умолчанию 05.12.2006, 06:14

to zsv
Прописываешь в файле ресурса своей проги следующий код:
Код:
If ((FindWindow('TИмя Формы','Значение написанное в свойстве Caption формы')) <> 0) Then
begin
  SetForegroundWindow('TИмяФормы','ИмяФормы');
  Application.Terminate;
end;
  Application.Initialize;
  Application.CreateForm(TИмяФормы, ИмяФормы);
  ShowWindow(Application.Handle, sw_Hide);
  Application.Run;
Незнаю поднимит ли данный код из трея твою прогу, но сделать окно активным уж точно должно.


to KachoK
Всё ништяк. Спасибо разобрался. Все пашет отлично. Теперь форма только в одном экзампляре запускается.
СПАСИБО БОЛЬШОЕ!
Ответить с цитированием
  (#8 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 6,760
Сказал(а) спасибо: 15
Поблагодарили 820 раз(а) в 805 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 05.12.2006, 07:51

нифигА!
FindWindow нельзя использовать для организации запуска одной копии приложения, то что оно работает, тебе только кажется, так как условия испытания идеальные.
надо использовать атомарные обьекты типа Mutex и подобных.
Ответить с цитированием
  (#9 (permalink)) Старый
zsv zsv вне форума
Member
 
Сообщений: 47
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.06.2006
По умолчанию 05.12.2006, 10:44

Цитата:
нифигА!
FindWindow нельзя использовать для организации запуска одной копии приложения, то что оно работает, тебе только кажется, так как условия испытания идеальные.
надо использовать атомарные обьекты типа Mutex и подобных.
Да, если бы не надо было активизировать первую копию, то через мутекс я делал.
А вот как узнать минимизирована ли первая копия, причем не формы. а приложения я не знаю.

Цитата:
to zsv
Прописываешь в файле ресурса своей проги следующий код:
<div class='codetop'>Код Pascal
<div class='codemain'>If ((FindWindow('TИмя Формы','Значение написанное в свойстве Caption формы')) <> 0) Then
begin
SetForegroundWindow('TИмяФормы','ИмяФормы');
Application.Terminate;
end;
Application.Initialize;
Application.CreateForm(TИмяФормы, ИмяФормы);
ShowWindow(Application.Handle, sw_Hide);
Application.Run;[/code][/quote]

SetForegroundWindow(HWND) выводит окно поверх остальных, но если приложение до этого было минимизоровано (Application.Minimize), то оно остается минимизированным,хотя и выведено на экран
Ответить с цитированием
  (#10 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 6,760
Сказал(а) спасибо: 15
Поблагодарили 820 раз(а) в 805 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 05.12.2006, 10:46

для передачи информации уже запущенному приложению можно установить его Event Object в signaled state
уже запущенное приложение должно восстанавливать окно при его установке, вроде так...
Ответить с цитированием
  (#11 (permalink)) Старый
zsv zsv вне форума
Member
 
Сообщений: 47
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.06.2006
По умолчанию 05.12.2006, 12:14

Цитата:
для передачи информации уже запущенному приложению можно установить его Event Object в signaled state
уже запущенное приложение должно восстанавливать окно при его установке, вроде так...
Недопонял :(. Поподробнее, пожалуйста.
Ответить с цитированием
  (#12 (permalink)) Старый
Psycho DeepRat Psycho DeepRat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.11.2006
По умолчанию 05.12.2006, 19:28

Одно дополнение к коду, который написал KachoK.
Чтоб небыло косяков и ошибок, да и вообще чтоб форма снова открывалась при её вызове. Её нужно в момент закрытия занилить:
Код:
procedure TfrmOptions.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  frmOptions:=nil;
  Action:=caFree;
end;
Иначе форма второй раз уже не запустится.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Psycho DeepRat Psycho DeepRat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.11.2006
По умолчанию 05.12.2006, 19:49

Цитата:
нифигА!
FindWindow нельзя использовать для организации запуска одной копии приложения, то что оно работает, тебе только кажется, так как условия испытания идеальные.
.......
Нифига не понл. Почему-это нельзя так использовать? Конечно, когда через саму Делфю запускаешь, то данный код работать не будет. но в откомпелированной проге при запуске экзешника все нормально пашет. И повторная копия не запускается.

Объясни плиз, где я неправ.
Ответить с цитированием
  (#14 (permalink)) Старый
KachoK KachoK вне форума
Member
 
Сообщений: 244
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.07.2004
По умолчанию 06.12.2006, 06:05

Цитата:
Psycho DeepRat:
Чтоб небыло косяков и ошибок, да и вообще чтоб форма снова открывалась при её вызове. Её нужно в момент закрытия занилить.
Это точно, у меня буквально на днях именно этот косяк и проявился... :-( Причем уже у заказщика. А все потому, что мелочевку поленился протестировать.

Только если предполагается эту форму повторно использовать на OnClose лучше вешать caHide или caMinimize, чтоб она повторно не создавалась, а только показывалась.
Ответить с цитированием
  (#15 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 6,760
Сказал(а) спасибо: 15
Поблагодарили 820 раз(а) в 805 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 06.12.2006, 06:20

Цитата:
Нифига не понл. Почему-это нельзя так использовать? Конечно, когда через саму Делфю запускаешь, то данный код работать не будет. но в откомпелированной проге при запуске экзешника все нормально пашет. И повторная копия не запускается.

Объясни плиз, где я неправ.
дело не в том откуда запускаешь, а в том, что при запуске сразу 2 программ и такой проверке к моменту проверки второе окно программы еще может быть не создано и код его не найдет. т.е. код работает только если новый экземпляр запускать не раньше, чем полностью загрузится и отобразится на экране предыдущий экземпляр.
к тому же никто не может гарантировать, что название класса формы уникально.
статься по теме (где-то читал гораздо более подробную статью, но ссылку посеял..)
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка наличия таблицы mico C++ Builder 11 26.02.2011 07:49
Проверка наличия места на диске imported_Simba С/С++ 1 05.07.2010 20:27
проверка наличия элемента в списке. zven_ Prolog 3 12.05.2010 00:08
Проверка наличия записей в таблице Jonano SQL 56 25.10.2008 17:36
Проверка наличия соединения Leon WinAPI 3 07.05.2007 19:51
Проверка наличия данных в потоке Satae С/С++ 0 31.03.2005 16:33
Проверка наличия монитора Maxxon WinAPI 15 29.11.2004 13:16
Проверка наличия диска в CD-ROM Anonymous Delphi 5 24.04.2004 19:41
Кок осуществляется проверка наличия таблицы в схеме crelby PostgreSQL 0 12.03.2004 13:32
Проверка наличия соединения к интернету crazycyberlady Visual C++ 2 19.02.2004 13:56
Проверка наличия переменной в оперативной памяти. Anonymous Visual C++ 3 19.12.2003 13:09
Проверка наличия определенной строки в файле ресурса Anonymous Delphi 0 27.03.2003 08:21



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов