Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > потеря активности


Автор: Siv 4.5.2006, 01:21
Как проследить, когда текущее приложение перестает быть активным? пробовал через Application.active, с применением таймера, но думаю не хорошо в программах использовать постоянно тикающий таймер, отслеживающий каждые пару секунд состояние активности... что думаете? 

Автор: Yanis 4.5.2006, 01:48
Способ из drkb:
Код
type 
   //... 
  private 
    { Private declarations } 
    procedure WMNCACTIVATE(var M: TWMNCACTIVATE); message WM_NCACTIVATE; 
  end; 

implementation 

//... 

procedure TForm1.WMNCACTIVATE(var M: TWMNCACTIVATE); 
begin 
  inherited; 
  if M.Active then 
    caption:='Form active' 
  else caption:='Form not active' ; 
end;


Yanis method smile
Цитата
The WM_ACTIVATE message is sent when a window is being activated or deactivated. This message is sent first to the window procedure of the top-level window being deactivated; it is then sent to the window procedure of the top-level window being activated. 

Соответсвенно, полагаю, что можно так:
Код

{ ... }

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
  private
    { Private declarations }
    procedure CatchActivate(var M: TMessage); message WM_ACTIVATE;
  public
    { Public declarations }
  end;

{ ... }

procedure TForm1.CatchActivate(var M: TMessage);
begin
  Inherited;
  if (M.WParamLo = WA_CLICKACTIVE) or (M.WParamLo = WA_ACTIVE) then
    Caption := 'Actived'
  else
    Caption := 'Non actived';

  M.Result := 0;
end;

{ ... }
  

Автор: Sunvas 4.5.2006, 07:45
А если тебе надо узнать является ли твое приложение (не одна форма) активным, то пробегай циклом по всем формам приложения и смотри, являются ли они ативными
Код

var i:word;
begin
for i:=0 to application.ComponentCount-1
do
if (application.Components[i] is tform) then
if not (application.Components[i] as tform).Active then
showmessage('Приложение не ативно');
end;

Этот код прописываешь в процедуре, которую тебе дал Yanis. 

Автор: Guedda 4.5.2006, 07:50
Юзай события Form1.OnActivate, и, соответственно, Form1.OnDeactivate; 

Автор: evilbllodydemon 4.5.2006, 09:08
А Application.OnDeactivate и Application.OnActivate чем не хороши?? 

Автор: Yanis 4.5.2006, 10:09
Цитата(evilbllodydemon @  4.5.2006,  09:08 Найти цитируемый пост)
А Application.OnDeactivate и Application.OnActivate чем не хороши?? 

Эти два события меня вполне устраивают, но дело как раз в том, что их два. А при отлове сообщений всего одна. Для меня так удобнее. Хотя для бонального showmessage при активации/деактивации формы можно и 2 процедурами пользоваться. 

Автор: Akella 4.5.2006, 10:52
есть ведь компонента ApplicationEvents
а у неё есть и собитие OnIdle, есть также события
OnActivate и OnDeactivate 

Автор: Siv 5.5.2006, 02:44
ужо внедрил, всем спасибо 

Автор: Yanis 6.5.2006, 16:52
Цитата(Guedda @  4.5.2006,  07:50 Найти цитируемый пост)
Юзай события Form1.OnActivate, и, соответственно, Form1.OnDeactivate; 

Цитата(evilbllodydemon @  4.5.2006,  09:08 Найти цитируемый пост)
А Application.OnDeactivate и Application.OnActivate чем не хороши??  

Цитата(Akella @  4.5.2006,  10:52 Найти цитируемый пост)
OnActivate и OnDeactivate  

Создайте две формы. Напишите обработчики события активации/деактивации, например такие:
Код

procedure TForm1.FormActivate(Sender: TObject);
// и
// procedure TForm2.FormActivate(Sender: TObject);
begin
  Caption := 'Активна';
end;

procedure TForm1.FormDeactivate(Sender: TObject);
// и
// procedure TForm2.FormDeactivate(Sender: TObject);
begin
  Caption := 'Неактивна';
end;

Запустите программу и покажите вторую форму не модально. Вы заметите, что при потере активности обоих форм событие не отлавливается. В предложеном мной варианте такого "глюка" не наблюдается smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)