|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Событие получения формой фокуса
Всем добрый день!
Есть приложение с MDI формами. На главной форме есть Label, который выводит результат некоего запроса. Мне нужно, чтобы запрос повторялся, а Label обновлялся как можно чаще. Но без помощи таймера. Я решил, что было бы неплохо выполнять запрос и обновлять Label всякий раз, когда главная форма получает фокус. Соответственно вопрос! Как отловить событие получения формой фокуса? OnShow и OnActivate отпадают, т.к. главная форма никогда не прячется, а всегда открыта на фоне других MDI форм. Заранее, спасибо! |
#2
|
||||
|
||||
у TApplicationEvents событие OnActivate
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
Это событие реагирует на приложение в целом. А мне нужен только фокус формы.
|
#4
|
||||
|
||||
Цитата:
вы противоречите сами себе |
#5
|
||||
|
||||
когда форма получает фокус приложение просто обязано его иметь. ТЗ немного напутано.
Пишу программы за еду. __________________ |
#6
|
|||
|
|||
Не получит главная форма фокус в 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
|
|||
|
|||
А не проще ли сделать тоже самое через таймер? Он же тоже создает отдельный поток? Или есть разница в нагрузке на приложение?
|
#8
|
|||
|
|||
Цитата:
|
#9
|
|||
|
|||
Цитата:
|
#10
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |
#11
|
|||
|
|||
Цитата:
Нет, таймер не создает отдельного потока. Все выполняется в основном потоке. Поэтому, если запрос, который надо выполнить, долгий или тяжелый, его надо выносить в самостоятельный поток. Кстати, если очень уж нужно, то можно дополнительно после обновления метки "кидать" какое-либо сообщение в главную форму приложения и уже там его обрабатывать для дополнительный действий В ГЛАВНОМ потоке приложения, |