2011-04-12 3 views
3

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

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

Функция 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; 
+1

Не закрывайте, вопрос очень реальный, просто немного французский для переполнения стека. –

+2

Просто дай мне минуту, чтобы начать Google Translate здесь, и ... Вуаля! –

+0

Пожалуйста, используйте английский, StackOverflow не является многоязычным сайтом. –

ответ

8

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

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; 

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

+0

Вы не называете этот метод самостоятельно. Когда пользователь вводит что-либо в свой текстовый редактор, Windows сначала отправит WM_GETDLGCODE в ваше окно, чтобы узнать, хочет ли он это обработать. Обычно элементам управления не нужно обращаться со стрелками, клавишами вкладок, вводить и удалять, поэтому Windows может использовать их для диалога naviagion. Для редкого элемента управления, которому необходимо обработать эти ключи, вам необходимо предоставить обработчик WM_GETDLGCODE, чтобы Windows знала, что вы хотите использовать эти ключи. Сообщение '' WM_GETDLGCODE; '' сообщает Delphi, что это обработчик для WM_GETDLGCODE. –

+0

Добавьте 'DLGC_WANTTAB' в список в начале процедуры. –

+0

-1 Этот код слишком сложный для начинающих. Это низкоуровневый API-интерфейс WIN API, который я никогда не посещал в течение 25 лет программирования. – Johan

0
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, а другой на ваших условиях случая, чтобы определить, в первую очередь, если ваше сообщение крючок когда-либо срабатывает, но если обрабатываемое сообщение - это то, что вы ожидаете.

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

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

Взгляните на this unit на мой репозиторий SVN (имя пользователя и пароль являются «анонимными» без кавычек), поскольку он демонстрирует, как перехватывать и обрабатывать ввод ключей даже на невизуальные компоненты.

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

+0

Я предполагаю, что вы должны предоставить свое собственное «Движение»; То, что вы показываете, - это общий способ обработки всех 4 клавиш направления одной процедурой. Объявите свою собственную процедуру «Mouvement», которая принимает 2 целочисленных параметра ('procedure Mouvement (const dx, dy: Integer)') –

+0

Веббраузер не похож на не визуальное событие. Любой компонент, основанный на TWinControl, будет иметь всю эту встроенную систему. – Johan

2

Это не так!
Так мы делали что-то перед 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. Даже для старшего Delphi мало что изменилось. Каждый час, потраченный на чтение книги на эту тему, сэкономит 20 часов на время кодирования.

Удачи.

+0

Johan, но месяцев я работаю над компонентом, который не базируется на TMemo. на самом деле это компонент, который делает просмотр и редактирование веб-страницы tnack yous – user653395

+0

На каком компоненте есть? Дайте нам имя, пожалуйста. – Johan

+0

GeckoSDK использует OLE, COM и интерфейсы, очень сложный код для взаимодействия. Прочитайте Essential COM от David Box ISBN 0-201-63446-5 – Johan

Смежные вопросы