首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >箭头键在组件中不起作用

箭头键在组件中不起作用
EN

Stack Overflow用户
提问于 2011-04-12 16:30:23
回答 3查看 1.7K关注 0票数 3

我使用的是Gecko SDK,这是一个允许您查看网页的组件。

我使用这个组件来创建一个html编辑器。

这个问题发生在编辑网页的时候。

问题是箭头键和制表符在我的组件中不起作用。我试图找到这个问题的答案,但我没有找到。我找到了一个曲目here,但该函数不起作用。

函数Movement (dx, dy)不存在。谢谢你帮我解决这个问题。

代码语言:javascript
运行
复制
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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-12 16:49:30

将此代码添加到组件的类中:

代码语言:javascript
运行
复制
procedure HandleDlgCode(var Msg:TMessage); message WM_GETDLGCODE;

然后在implementation部分:

代码语言:javascript
运行
复制
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;

我刚刚从我自己的数值编辑器中复制粘贴了这段代码,所以它可以工作。

票数 8
EN

Stack Overflow用户

发布于 2011-04-15 04:04:20

这不是这样做的!

这是我们在1996年Delphi之前做事情的方式。

不需要这些复杂的Windows东西。

你正在制作一个编辑器。

Delphi已经内置了2个编辑器。

  1. TMemo
  2. TRichEdit.

从TMemo作为您的父级开始,您就有了现成的编辑器,不需要捕获光标键。

代码语言:javascript
运行
复制
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个小时的编码时间。

祝好运。

票数 2
EN

Stack Overflow用户

发布于 2011-04-12 16:52:34

代码语言:javascript
运行
复制
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存储库上的this unit (用户名和密码都是"anon“,不带引号),因为它演示了如何拦截和处理键输入,甚至在非可视化组件上也是如此。

希望这对你有所帮助,祝你好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5632411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档