Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2017, 16:03   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию проверка модификаторов

Здравствуйте.
код:
Код:
function WindowProc1(wnd:HWND; Msg : uint; Wpar:Wparam; Lpar:LPARAM):Lresult; stdcall;
var
  t : string;
  c: Cardinal;
Begin
  case msg of

    WM_KEYDOWN:
    begin
      if (Wpar = VK_SHIFT) then
      c := c or VK_SHIFT;
      if  (Wpar = VK_CONTROL) then
      c := c or VK_CONTROL;
      if (Wpar = VK_MENU) then
      c := c or VK_MENU;

      if (c and VK_SHIFT)<>0 then
      t := 'shift + ';
      if (c and VK_CONTROL)<>0 then
      t := t + 'Ctrl + ';
      if (c and VK_MENU)<>0 then
      t := t + 'alt + ';
      SetWindowText(wnd,PChar(t));

    end;
При нажатии Shift или Ctrl, переменная t = shift + ctrl + alt +. При нажатии любых других клавиш t = ctrl +.
В чём ошибка?

Последний раз редактировалось BLACK_RAIN; 07.03.2017 в 16:18.
BLACK_RAIN вне форума Ответить с цитированием
Старый 07.03.2017, 16:28   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А как на счет мусора в с, которая изначально не инициализирована?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.03.2017, 16:35   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Код:
     VK_SHIFT = 16;  16+0
     VK_CONTROL = 17; 16+1
     VK_MENU = 18; 16+2
(16+0) and (16+1) =16 <>0
(16+0) and (16+2) =16 <>0
(16+1) and (16+2) =16 <>0

Код:
if (с and VK_CONTROL) = VK_CONTROL  then t:=t+'Ctrl +';
аналогично для остальных.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 07.03.2017 в 16:46.
evg_m вне форума Ответить с цитированием
Старый 07.03.2017, 16:44   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Дописал в начало c := 0;
при нажатии shift / ctrl / alt , t = 'shift + ctrl + alt + '
почему все сразу-то? я же их по одной нажимаю. И код так написан, что в 'с' только одна клавиша может быть.
чё за глюк на ровном месте?
BLACK_RAIN вне форума Ответить с цитированием
Старый 07.03.2017, 16:52   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
почему все сразу-то?
потому что все модификаторы имеют общий (ненулевой) бит (см.пост 3)
и как бороться там же.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 07.03.2017 в 16:54. Причина: конечно же п.3
evg_m вне форума Ответить с цитированием
Старый 07.03.2017, 16:53   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
if (с and VK_CONTROL) = VK_CONTROL then t:=t+'Ctrl +';
если так , то получается следующее:
при нажатии на shift t = 'shift +'
при нажатии на ctrl, t = 'shift + ctrl + '
BLACK_RAIN вне форума Ответить с цитированием
Старый 07.03.2017, 16:58   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

аналогично это
Код:
if (c and <модификатор> ) =<ТОТже модификатор>
в прочем да действительно это ВСЕГДА будет добавлять Shift =(16 +0).
так что придется ОТКАЗАТЬСЯ от использования этих констант в качестве битовых масок и завести СВОИ собственные константы.
Код:
MVK_Shift =1
MVK_Ctrl   =2
MVK_Alt    =4
которыми и пользоваться
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 07.03.2017 в 17:04.
evg_m вне форума Ответить с цитированием
Старый 07.03.2017, 17:12   #8
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Код:
      c := 0;
      if (Wpar = VK_SHIFT) then
      c := c or VK_SHIFT;
      if  (Wpar = VK_CONTROL) then
      c := c or VK_CONTROL;
      if (Wpar = VK_MENU) then
      c := c or VK_MENU;

      if (c and VK_SHIFT)= VK_SHIFT then
      t := t + 'shift + ';//c=16
      if (c and VK_CONTROL) = VK_CONTROL then
      t := t + 'Ctrl + ';// c=17
      if (c and VK_MENU)= VK_MENU then
      t := t + 'alt + ';
      SetWindowText(wnd,PChar(IntToStr(c)+','+t));
если так , то получается следующее:
при нажатии на shift t = 'shift +'
при нажатии на ctrl, t = 'shift + ctrl + '
alt переходит в меню окна. До него код вообще не доходит.
Можно, конечно, сделать изврат в виде трёх дополнительных переменных. Но как-то же можно без этого?
BLACK_RAIN вне форума Ответить с цитированием
Старый 07.03.2017, 17:18   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

можно конечно обойтись и одной доп. константой
MVK_Shift =16+4
но совершенно точно нельзя будет продолжать пользоваться VK_shift (=16+0) из-за её нулевого бита.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 08.03.2017, 09:02   #10
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Спасибо. Разобрался
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проверка с++ Zaraaa Общие вопросы C/C++ 0 23.11.2014 17:55
Проверка KIRILOW Паскаль, Turbo Pascal, PascalABC.NET 8 19.12.2012 11:49
Объясните разницу модификаторов CONST и VOLATILE svatorus Помощь студентам 0 07.06.2012 13:13
excel.Проверка VBA и проверка функции Будда Помощь студентам 0 14.04.2011 21:10
Проверка veter48 Visual C++ 14 29.08.2010 15:28