Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
3-1102486661
Владимир С.
2004-12-08 09:17
2005.01.09
возможно ли составить запрос?


1-1103785522
Jeka
2004-12-23 10:05
2005.01.09
Вопрос по настройке D2005


3-1102567979
Владимир
2004-12-09 07:52
2005.01.09
MS Access


1-1103610892
Mate_ru
2004-12-21 09:34
2005.01.09
Обновление Image


1-1103698035
WondeRu
2004-12-22 09:47
2005.01.09
Как поменять цвет текста в консоли?