1. Pascal / Говнокод #9063

    +96

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    WM_KEYDOWN: begin
            if GetAsyncKeyState(VK_CONTROL) <> 0 then case W of
              integer('X') : SendMessage(H, WM_CUT,   0, 0);
              integer('C') : SendMessage(H, WM_COPY,  0, 0);
              integer('V') : SendMessage(H, WM_PASTE, 0, 0);
              integer('Z') : SendMessage(H, WM_UNDO , 0, 0);
              integer('Y') : ReDo(H);
              integer('A') : SelectAll(H);
              VK_INSERT    : SendMessage(H, WM_COPY,  0, 0);
              VK_PRIOR     : MoveCaretLine   (H, -1000000);  
              VK_NEXT      : MoveCaretLine   (H,  1000000);
              VK_DELETE    : SendMessage(H, WM_CLEAR, 0, 0);
          //  end else if GetAsyncKeyState(VK_ALT) then case W of
          //    VK_BACK      : SendMessage(H, WM_UNDO , 0, 0);
            end else if GetAsyncKeyState(VK_SHIFT) <> 0 then case W of
              VK_DELETE    : SendMessage(H, WM_CUT  , 0, 0);
              VK_INSERT    : SendMessage(H, WM_PASTE, 0, 0);
            end else case W of
              VK_SHIFT     : SDown(H);
              VK_LEFT      : MoveCaretSymbol (H, -1);
              VK_RIGHT     : MoveCaretSymbol (H,  1);
              VK_UP        : MoveCaretLine   (H, -1);
              VK_DOWN      : MoveCaretLine   (H,  1);
              VK_PRIOR     : MoveCaretLine   (H, -MaxLinesInScreenByH(H));
              VK_NEXT      : MoveCaretLine   (H,  MaxLinesInScreenByH(H));
              VK_DELETE    : DeleteSymbol(H, False);
            end;
            DrawText(H);
            Exit;
          end;

    Пишу свой винапи-класс типа Edit.
    Так сделаны горячие клавиши.

    Запостил: TarasB, 10 Января 2012

    Комментарии (25) RSS

    • показать все, что скрытоpascal sucks
      Ответить
    • любопытства ради спрошу: а чем стандартный не устроил?
      Ответить
    • Ваша редигия не Индуизм случайно?
      Ответить
    • Поцоны, вы меня сейчас отпиздите, я знаю, но я спрошу таки.
      Как это по-нормальному делается? Я про горячие клавиши в своих компонентах.
      Ответить
      • Хуки, не?
        Ответить
        • Скорее уж, RegisterHotKey.
          Ответить
          • Насколько я знаю, такой хоткей работает даже при неактивном окне. Не руками ж их деактивировать каждый раз.
            Ответить
            • Почему сразу руками? Можно сделать активацию\деактивацию хука только при использовании компонента. Например, когда форма будет активной.
              Ответить
              • Чё-то мне кажется, что лучше как сейчас.
                Ответить
                • Солидарен.
                  Ответить
                  • Я думал, есть способ собрать TMsg из параметров, передаваемых в оконную функцию, тогда можно будет сделать TranslateAccelerator из заранее сделанной таблицы. Или что-то аналогичное.
                    Ответить
            • Не исключено. Сам я не пользовался давно, сказать не могу. Хотя, вроде как, они должны быть не системно-глобальные.
              Ответить
            • насколько я помню, есть две winapi функции, навесить хук на класс (окно, приложение) или на всю систему
              Ответить
              • Хук, ЕМНИП, вешается безусловно, но если функцию обратного вызова помещать непосредственно в приложении, будет ограничено только этим приложением.
                Разве что мы говорим про разные хуки.

                P.S. Всё равно делать это хуком - грязный хак.
                Ответить
      • мне нужно было таб ловить, поэтому:
        function DoKeyDown(Key: Word; Shift: TShiftState): integer;
        // тут вся обработка

        procedure RExcelGridViewer.WMKeyDown2(var Message: TWMKeyDown); message CM_CHILDKEY;
        var ss: TShiftState;
        ks: TKeyboardState;
        begin
        if (not Focused) then exit;
        GetKeyboardState(ks);
        ss := KeyboardStateToShiftState(ks);
        Message.Result := DoKeyDown(Message.CharCode, ss);
        end;
        Ответить
        • если без извращений с табом, то:
          FOnKeyDown: TKeyEvent;
          property OnKeyDown: TKeyEvent read FOnKeyDown write FOnKeyDown;
          в конструкторе
          inherited OnKeyDown := MyOnKeyDown;
          FOnKeyDown := NIL;
          и обработчик
          procedure MyKeyDown(...);
          begin
          // тут обработка
          if (Assigned(FOnKeyDown)) then FOnKeyDown(...);
          end;
          Ответить

    Добавить комментарий