Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.49 MB
Время: 0.044 c
14-1103641954
Григорьев Антон
2004-12-21 18:12
2005.01.09
Торт для настоящего программиста :))


14-1103634756
Gorlum
2004-12-21 16:12
2005.01.09
Задачи при приёме на работу


1-1103812351
stelius
2004-12-23 17:32
2005.01.09
Факториал


1-1103598978
Sash
2004-12-21 06:16
2005.01.09
excel


3-1102567324
Submarine
2004-12-09 07:42
2005.01.09
Вставка данных в Interbase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский