Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.08.2014, 17:28
delphi_begin delphi_begin вне форума
Прохожий
 
Регистрация: 23.09.2011
Сообщения: 22
Репутация: 10
По умолчанию Событие получения формой фокуса

Всем добрый день!

Есть приложение с MDI формами.
На главной форме есть Label, который выводит результат некоего запроса.

Мне нужно, чтобы запрос повторялся, а Label обновлялся как можно чаще. Но без помощи таймера.
Я решил, что было бы неплохо выполнять запрос и обновлять Label всякий раз, когда главная форма получает фокус.

Соответственно вопрос! Как отловить событие получения формой фокуса?

OnShow и OnActivate отпадают, т.к. главная форма никогда не прячется, а всегда открыта на фоне других MDI форм.

Заранее, спасибо!
Ответить с цитированием
  #2  
Старый 20.08.2014, 18:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

у TApplicationEvents событие OnActivate
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 20.08.2014, 19:14
delphi_begin delphi_begin вне форума
Прохожий
 
Регистрация: 23.09.2011
Сообщения: 22
Репутация: 10
По умолчанию

Это событие реагирует на приложение в целом. А мне нужен только фокус формы.
Ответить с цитированием
  #4  
Старый 20.08.2014, 20:13
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от delphi_begin
когда главная форма получает фокус.
главная форма никогда не прячется

вы противоречите сами себе
Ответить с цитированием
  #5  
Старый 20.08.2014, 20:13
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

когда форма получает фокус приложение просто обязано его иметь. ТЗ немного напутано.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 20.08.2014, 22:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не получит главная форма фокус в MDI приложении (ну за исключением случая, когда идет переключение между приложениями). Я в свое время просто "повесил" отдельный поток, который запускался автоматически при старте приложения и сам обновлял информацию в метке раз в 10 минут (такое ТЗ было, 10 минутного интервала было достаточно). Что-то типа такого:
Код:
// Поток
type
  TInfoUpdateThread = class(TThread)
  private
    FInfo : String;
    procedure UpdateLabel;
  protected
    procedure Execute; override;
  end;

procedure TInfoUpdateThread.UpdateLabel;
begin
  MainForm.lbInfo.Caption := FInfo;
end;

procedure TInfoUpdateThread.Execute;
begin
  While not Terminated Do
    Begin
      // Здесь твой запрос
      FInfo := TimeToStr(Time);

      // Обновляем метку
      Synchronize(UpdateLabel);

      // Пауза
      Sleep(60000); // Sleep for 1 min
    End;
end;

// Главная форма
type
  TMainForm = class(TForm)
  private
    FInfoThread : TInfoUpdateThread
  ...

procedure TMainForm.OnCreate(Sender : TObject);
begin
  FInfoThread := TInfoUpdateThread.Create(True);
  FInfoThread.FreeOnTerminate := True;
  FInfoThreaf.Resume;
end;

procedure TMainForm.OnDestroy(Sender : TObject);
begin
  FInfoThread.Terminate;
  FInfoThread.WaitFor;
end;
Ответить с цитированием
  #7  
Старый 21.08.2014, 10:48
delphi_begin delphi_begin вне форума
Прохожий
 
Регистрация: 23.09.2011
Сообщения: 22
Репутация: 10
По умолчанию

А не проще ли сделать тоже самое через таймер? Он же тоже создает отдельный поток? Или есть разница в нагрузке на приложение?
Ответить с цитированием
  #8  
Старый 21.08.2014, 10:49
delphi_begin delphi_begin вне форума
Прохожий
 
Регистрация: 23.09.2011
Сообщения: 22
Репутация: 10
По умолчанию

Цитата:
Сообщение от Uniq!
вы противоречите сами себе
Сори, возможно, я не так описал... Но задача такая: выполнять определенную процедуру когда кроме главной формы ничего не открыто. Но так, что бы это было событие, т.е. отслеживалось системой.
Ответить с цитированием
  #9  
Старый 21.08.2014, 10:51
delphi_begin delphi_begin вне форума
Прохожий
 
Регистрация: 23.09.2011
Сообщения: 22
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
когда форма получает фокус приложение просто обязано его иметь. ТЗ немного напутано.
А когда форма получает фокус, кроме того раза, когда показывается в первый раз и между переключениями между приложениями?
Ответить с цитированием
  #10  
Старый 21.08.2014, 20:41
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от delphi_begin
А когда форма получает фокус, кроме того раза, когда показывается в первый раз и между переключениями между приложениями?
не вижу в этом проблемы
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 21.08.2014, 22:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от delphi_begin
А не проще ли сделать тоже самое через таймер? Он же тоже создает отдельный поток? Или есть разница в нагрузке на приложение?

Нет, таймер не создает отдельного потока. Все выполняется в основном потоке. Поэтому, если запрос, который надо выполнить, долгий или тяжелый, его надо выносить в самостоятельный поток. Кстати, если очень уж нужно, то можно дополнительно после обновления метки "кидать" какое-либо сообщение в главную форму приложения и уже там его обрабатывать для дополнительный действий В ГЛАВНОМ потоке приложения,
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter