一个困扰了我多天的问题,关于回车键模仿Tab键,在一个单独的form1中可以用这样的语句实现:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then { 如果按下了回车键 }
begin
Key := #0; { 吃掉回车键 }
Perform(WM_NEXTDLGCTL, 0, 0); { 移动到下一个控制 }
end;
end;
但是后来发现,如果将form1放到另外一个form2中的panel1容器里,具体的方法是这样:
form1.ManualDock(Fform2.Panel1,nil,AlClient);
form1.Show;在这之后,
Perform(WM_NEXTDLGCTL, 0, 0)
就失效了。请问如何解决??????谢谢各位!
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then { 如果按下了回车键 }
begin
Key := #0; { 吃掉回车键 }
Perform(WM_NEXTDLGCTL, 0, 0); { 移动到下一个控制 }
end;
end;
但是后来发现,如果将form1放到另外一个form2中的panel1容器里,具体的方法是这样:
form1.ManualDock(Fform2.Panel1,nil,AlClient);
form1.Show;在这之后,
Perform(WM_NEXTDLGCTL, 0, 0)
就失效了。请问如何解决??????谢谢各位!
begin
Key := #0; { 吃掉回车键 }
Perform(WM_NEXTDLGCTL, 0, 0); { 移动到下一个控制 }
end;
perform(WM_NEXTDLGCTL,1,0);即可向上移动
为什么不看MSDN,不看HELP你当然不知道了。
perform(WM_NEXTDLGCTL,0,1)
控制焦点移动,还可以利用TWinControl.SelectNext()方法来做!
*********************
Form.KeyPreview := true; 在Form的KeyDown中
if Key = VK_RETURN then
begin
if ActiveControl is TDBGrid or ... then
PostMessage(ActiveControl.Handle, WM_KEYDOWN, VK_TAB, 0);
else
PostMessage(Handle, WM_KEYDOWN, VK_TAB, 0);
Key := 0;
end
---------------
procedure EnterToTab(aForm: TForm; var Key: Char);
begin
if Key = #13 then
begin
key := #0;
aForm.Perform(CM_DialogKey, VK_TAB, 0);
end;
end;
***************
或者拦截Application.OnMessage即可,添加代码:
if Msg.Message = WM_KEYDOWN then
begin
if Msg.wParam = VK_RETURN then
Keybd_event(VK_TAB, 0, 0, 0);
end; //if
if Key=VK_RETURN then
Key := VK_TAB
//如果窗体上还有象Memo需要处理回车的控件咋办?~~
//所以需要判断~~function GetParentForm(mHandle: THandle): THandle; overload;
begin
Result := mHandle;
while GetParent(Result) <> 0 do Result := GetParent(Result);
end; { GetParentForm }procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
vBuffer: array[0..255] of Char;
begin
case Msg.message of
WM_KEYDOWN: if Msg.wParam = VK_RETURN then begin
GetClassName(Msg.hwnd, vBuffer, SizeOf(vBuffer));
if SameText(vBuffer, 'TEdit') or SameText(vBuffer, 'TComboBox') or
SameText(vBuffer, 'Edit') then begin
Handled := True;
SendMessage(GetParentForm(Msg.hwnd), WM_NEXTDLGCTL, 0, 0);
end;
end;
end;
end;
伴水老大, 果然高人一筹, 从小节就可看出