箭头键在组件中不起作用

| 我使用Gecko SDK,该组件可让您查看网页。 我使用此组件来创建html编辑器。 关闭编辑网页时会发生此问题。 问题是箭头键和选项卡不适用于我的组件。我试图找到这个问题的答案,但是没有找到答案。我在这里找到了一个曲目,但是该功能不起作用。 功能“ 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
    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;
    
已邀请:
将此添加到您组件的类中:
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;
我只是从我自己的数字编辑器复制粘贴了此代码,因此它可以工作。     
这不是完成的方式! 这就是我们在1996年Delphi之前所做的事情的方式。 不需要这些复杂的Windows东西。 您正在编辑。 Delphi已经内置了2个编辑器。 TMemo 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;
实际上,您可以省去ѭ5并开始从事其他工作。 无需使用底层代码。您做的太复杂了。 获得有关delphi组件设计的书。即使对于较老的Delphi,也没有太大变化。 读一本有关该主题的书,每花费一小时即可节省20个小时的编码时间。 祝好运。     
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 \”,不带引号),因为它演示了如何即使在非可视组件上也可以拦截和处理键输入。 希望这会有所帮助,并祝你好运!     

要回复问题请先登录注册