![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Key Filter [D7, WinXP]
dmk © (2004-12-17 23:48:00)Подскажите как лучше реализовать в многопоточном приложении
фильтрацию ввода? Написать процедуру обслуживающую ввод через
ApplicationEvents или лучше оставить обработку VCL-компонентам?
В нынешней ситуации есть проблема. При выполнении отдельного
потока приложение продолжает воспринимать ввод. Хотелось оградить пользователя от случайных/неправильных параллельных
нажатий.
С одной стороны хотелось собрать всю обработку в одном месте -
для удобства, а с другой, в child-формах приложения могут использоваться одинаковые сочетания клавиш при разных задачах.
Поделитесь пожалуйста опытом.
dmk (2004-12-24 00:22:00) [1]О задаче. Нужно реагировать именно на нажатие клавиши, и
не реагировать при одной нажатой на другие.
dmk (2004-12-24 00:20:00) [2]Вот немного написал, но мне кажется,
что это можно сделать проще.
Ну а если сочетаний в программе будет около 100-200?
Как поступают профессионалы в таких случаях?
Избегают таких конструкций?
Procedure TMainForm.KeyFilter(var Msg: tagMSG; var Handled: Boolean; KeyDown: Boolean);
var
ks_CtrlDown: Boolean;
//ks_AltDown: Boolean;
//ks_ShiftDown: Boolean;
Procedure EnableAppKeys;
begin
FAppKeysEnabled := True;
Self.Caption := IntToStr(Integer(FAppKeysEnabled));
end;
Procedure DisableAppKeys;
begin
FAppKeysEnabled := False;
Self.Caption := IntToStr(Integer(FAppKeysEnabled));
end;
begin
Handled := False;
If FPrefixDlgOpened or FPrintDlgOpened then Exit;
ks_CtrlDown := CtrlKeyDown;
//ks_AltDown := AltKeyDown;
//ks_ShiftDown := ShiftKeyDown;
If ks_CtrlDown then
begin
case Msg.wParam of
ORD('W'): begin
Handled := True;
If KeyDown and FAppKeysEnabled then
begin
DisableAppKeys;
FLastKnownKey := ORD('W');
If AnyFormActivated then FActiveChild.Close;
EnableAppKeys;
end;
ORD('S'): begin
Handled := True;
If KeyDown and FAppKeysEnabled then
begin
DisableAppKeys;
FLastKnownKey := ORD('S');
If AnyFormActivated then SaveButtonClick(Self);
EnableAppKeys;
end;
ORD('P'): begin
Handled := True;
If KeyDown and FAppKeysEnabled then
begin
DisableAppKeys;
FLastKnownKey := ORD('P');
If AnyFormActivated then PrintBtnClick(Self);
EnableAppKeys;
end;
end;//case With CTRL
end
else
begin
case Msg.wParam of
VK_ESCAPE: begin
Handled := True;
If KeyDown and FAppKeysEnabled then
begin
DisableAppKeys;
FLastKnownKey := VK_ESCAPE;
EscapePressed;
end;
If (not KeyDown) and (not FAppKeysEnabled) then
begin
If FLastKnownKey = VK_ESCAPE then
EnableAppKeys;
end;
end;//VK_ESCAPE
VK_TAB: begin
Handled := True;
If KeyDown and FAppKeysEnabled then
begin
DisableAppKeys;
FLastKnownKey := VK_TAB;
SwitchPanels;
end;
If (not KeyDown) and (not FAppKeysEnabled) then
begin
If FLastKnownKey = VK_TAB then
EnableAppKeys;
end;
end;//VK_TAB
ORD('F'): begin
Handled := True;
If KeyDown and FAppKeysEnabled then
begin
DisableAppKeys;
FLastKnownKey := ORD('F');
If FFullScreenState then
RemoveFullScreen else SetFullScreen;
end;
If (not KeyDown) and (not FAppKeysEnabled) then
begin
If FLastKnownKey = ORD('F') then
EnableAppKeys;
end;
end;//Ord('F')
end;//case
end;
end;
Cobalt (2004-12-18 03:07:00) [3]Главное - не забыть оставить одну кнопку, с красным названием "Аборт" или "Прервать операцию (Аборт)"
;)
dmk (2004-12-18 00:56:00) [4]Издеваетесь =)
Palladin (2004-12-18 00:55:00) [5]а... так эта... при выполнении потока на контролах формы Enabled:=False;... + сообщение желтыми буквами на красном фоне, "ИДЕТ ОПЕРАЦИЯ!"
dmk (2004-12-18 00:50:00) [6]tnx, но мне внутри приложения нужно.
Palladin (2004-12-18 00:08:00) [7]http://www.delphimaster.ru/articles/hooks/index.html