我使用的是Gecko SDK,这是一个允许您查看网页的组件。
我使用这个组件来创建一个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;发布于 2011-04-12 16:49:30
将此代码添加到组件的类中:
procedure HandleDlgCode(var Msg:TMessage); message WM_GETDLGCODE;然后在implementation部分:
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;我刚刚从我自己的数值编辑器中复制粘贴了这段代码,所以它可以工作。
发布于 2011-04-15 04:04:20
这不是这样做的!
这是我们在1996年Delphi之前做事情的方式。
不需要这些复杂的Windows东西。
你正在制作一个编辑器。
Delphi已经内置了2个编辑器。
从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个小时的编码时间。
祝好运。
发布于 2011-04-12 16:52:34
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“,不带引号),因为它演示了如何拦截和处理键输入,甚至在非可视化组件上也是如此。
希望这对你有所帮助,祝你好运!
https://stackoverflow.com/questions/5632411
复制相似问题