Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо