![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Цитата:
Нет, таймер не создает отдельного потока. Все выполняется в основном потоке. Поэтому, если запрос, который надо выполнить, долгий или тяжелый, его надо выносить в самостоятельный поток. Кстати, если очень уж нужно, то можно дополнительно после обновления метки "кидать" какое-либо сообщение в главную форму приложения и уже там его обрабатывать для дополнительный действий В ГЛАВНОМ потоке приложения, |