Форум: "Основная";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
ВнизKey Filter Найти похожие ветки
← →
dmk © (2004-12-17 23:48) [0]Подскажите как лучше реализовать в многопоточном приложении
фильтрацию ввода? Написать процедуру обслуживающую ввод через
ApplicationEvents или лучше оставить обработку VCL-компонентам?
В нынешней ситуации есть проблема. При выполнении отдельного
потока приложение продолжает воспринимать ввод. Хотелось оградить пользователя от случайных/неправильных параллельных
нажатий.
С одной стороны хотелось собрать всю обработку в одном месте -
для удобства, а с другой, в child-формах приложения могут использоваться одинаковые сочетания клавиш при разных задачах.
Поделитесь пожалуйста опытом.
← →
Palladin © (2004-12-18 00:08) [1]http://www.delphimaster.ru/articles/hooks/index.html
← →
dmk © (2004-12-18 00:50) [2]tnx, но мне внутри приложения нужно.
← →
Palladin © (2004-12-18 00:55) [3]а... так эта... при выполнении потока на контролах формы Enabled:=False;... + сообщение желтыми буквами на красном фоне, "ИДЕТ ОПЕРАЦИЯ!"
← →
dmk © (2004-12-18 00:56) [4]Издеваетесь =)
← →
Cobalt © (2004-12-18 03:07) [5]Главное - не забыть оставить одну кнопку, с красным названием "Аборт" или "Прервать операцию (Аборт)"
;)
← →
dmk © (2004-12-24 00:20) [6]Вот немного написал, но мне кажется,
что это можно сделать проще.
Ну а если сочетаний в программе будет около 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;
← →
dmk © (2004-12-24 00:22) [7]О задаче. Нужно реагировать именно на нажатие клавиши, и
не реагировать при одной нажатой на другие.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c