Клавиша со стрелкой не работает в компоненте - PullRequest
3 голосов
/ 12 апреля 2011

Я использую Gecko SDK, компонент, который позволяет просматривать веб-страницы.
Я использую этот компонент для создания редактора HTML.

Эта проблема возникает при отключении редактирования веб-страниц.
Проблема в том, что клавиши со стрелками и вкладка не работают с моим компонентом. Я пытался найти ответ на эту проблему, но не нашел. Я нашел трек здесь , но функция не работает.

Функция Movement (dx, dy) не существует. Спасибо за помощь в решении этой проблемы.

Procedure Tform1.TraiteMessages(Var msg : TMsg; Var Handled: boolean);
var
  dx, dy : integer;
begin   dx: 0; dy := 0; 
  With msg do
  begin
    IF Message = WM_KEYDOWN then
    Case  wparam of
      VK_LEFT  : dx := -1;
      VK_RIGHT : dx :=  1;
      VK_UP    : dy := -1;
      VK_DOWN  : dy :=  1;
    end;
  end;
  IF (dy = 0) AND (Dx = 0) then Handled := false else
  begin
    handled := true;     // message traité
    Mouvement(dx, dy)    // exécution du tracé 
  end;
end;

Ответы [ 3 ]

8 голосов
/ 12 апреля 2011

Добавьте это к классу вашего компонента:

procedure HandleDlgCode(var Msg:TMessage); message WM_GETDLGCODE;

и затем в разделе реализации:

procedure TComponentClass.HandleDlgCode(var Msg:TMessage);
var
  M: PMsg;
begin
  Msg.Result := DLGC_WANTALLKEYS or DLGC_WANTARROWS or DLGC_WANTCHARS or DLGC_HASSETSEL;
  if Msg.lParam <> 0 then
    begin
      M := PMsg(Msg.lParam);
      case M.message of
        WM_KEYDOWN, WM_KEYUP, WM_CHAR:
        begin
          Perform(M.message, M.wParam, M.lParam);
          Msg.Result := Msg.Result or DLGC_WANTMESSAGE;
        end;
      end;
    end
  else
    Msg.Result := Msg.Result or DLGC_WANTMESSAGE;
end;

Я только что скопировал этот код из моего собственного числового редакторатак работает.

2 голосов
/ 15 апреля 2011

Это не так, как это делается!
Именно так мы делали вещи до Delphi, в 1996 году.
Там нет необходимости в этом сложном материале Windows.

Вы делаете редактор.
Delphi уже имеет 2 встроенных редактора.

  1. TMemo
  2. TRichEdit.

Начните с TMemo в качестве родителя, и у вас есть готовый редактор, не нужно захватывать клавиши курсора.

interface

type
  TMyComponent = class(TMemo)   
  //                   ^^^^^^^^^^^^^^^^^^^^<<- use this as your parent class

protected
    procedure KeyPress(var Key: Char); override 
  ...

 implementation

 procedure TMyComponent.KeyPress(var Key: Char);
 begin
   inherited;
   //it works just like this, TMemo does everything.
 end;

На самом деле вы можете опустить KeyPress и начать работать над другими вещами.

Нет необходимости использовать код низкого уровня. Вы делаете это слишком сложно .

Получите книгу Delphi Component Design. Даже для более старых Delphi мало что изменилось. Каждый час, проведенный за чтением книги на эту тему, сэкономит 20 часов времени на кодирование.

Удачи.

0 голосов
/ 12 апреля 2011
Procedure Tform1.TraiteMessages(Var msg : TMsg; Var Handled: boolean);
var
  dx, dy : integer;
begin
  dx := 0;
  dy := 0; 
  With msg do
  begin
    IF Message = WM_KEYDOWN then
    begin
      Case  wparam of
        VK_LEFT  : dx := -1;
        VK_RIGHT : dx :=  1;
        VK_UP    : dy := -1;
        VK_DOWN  : dy :=  1;
      end;
    end;
  end;
  Mouvement(dx, dy);
  Handled := ((dy <> 0) or (dx <> 0));
end;

Это очищает ваш метод ... теперь вам следует поставить точку останова в вашем операторе IF, а в другом - в ваших условиях Case, чтобы в первую очередь определить, инициируется ли когда-либо перехват вашего сообщения, но также и еслиожидаемое сообщение - это то, что вы ожидаете.

Правильно ли ваш компонент перехватывает ключевые события?У вас есть другой визуальный компонент?Вы установили для свойства формы «KeyPreview» значение True?

Возможно, вы также захотите попробовать использовать элемент управления TApplicationEvents для обработки перехвата сообщения ключа (если ваш компонент невизуальный).

Взгляните на этот блок в моем SVN-репозитории (имя пользователя и пароль оба "anon" без кавычек), поскольку он демонстрирует, как перехватывать и обрабатывать ключевые вводы даже на невизуальных компонентах.

Надеюсь, это поможет, и удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...