在DBGRID中,如何将用户TAB键用ENTER代替(200分)

  • 主题发起人 主题发起人 zy998
  • 开始时间 开始时间
Z

zy998

Unregistered / Unconfirmed
GUEST, unregistred user!
大家都知道:
DBGRID 中横向的切换靠tab。如果想要使ENTER键也具有TAB键的功能怎么办?
 
use key=vb_tab try
 
这个问题被问过无数次,查旧帖吧
 
if(key=#13)and(DBGrid1.SelectedIndex=0) then dbgrid1.SelectedIndex:=1
从第一列到第二列
 
在keydown中
if key=13 then
key=9;
 
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then
begin
PostMessage(DBGrid1.Handle, WM_KEYDOWN, VK_TAB, 0);
end;
end;
 
用XWOLF的方法是可以的,
但不知道为什么不能用
if Key=#13 (Key:char)
then
Key :=#9;

 
在编辑状态, 回车是不会被送到父窗口的,不过可以改源码:
将 delphi4/source/vcl/grids.pas 拷贝到自己的project目录下
将这个文件add到自己的project中:
查找
VK_TAB: if not (ssAlt in Shift) then SendToParent;
将他改为:
VK_TAB,VK_RETURN: if not (ssAlt in Shift) then SendToParent;

编译自己的程序,form的keypreview设置为true,在form的onshutcut就可以
改 VK_RETURN 为 VK_TAB 了
 
procedure TFrmMain.FormKeyPress( Sender:TObject;
var Key: Char);
begin
if Key = #13 then
begin
if not ( ( ActiveControl is TCustomGrid ) or
( ActiveControl is TCustomMemo ) ) then
begin
Key := #0;
PostMessage( Handle, wm_NextDlgCtl, 0, 0 );
end
else if ( ActiveControl is TCustomGrid ) then
Key := #9;
end;
end;

procedure TFrmMain.DBGrid1KeyDown( Sender: TObject;
var Key: Word; Shift: TShiftState );
begin
if Key = vk_Return then
Key := vk_Tab;
end;
 
我刚引用了别人的方法如下:

在窗体上放两个控件,Edit1和Edit2,再加入下列代码拦截击键:
Procedure TForm1.Edit1KeyPress(Sender:Tobject;Var Key:Char);
Begin
if key=#13 then { 判断是按执行键}
if not (ActiveControl is Tdbgrid) Then
Begin { 不是在Tdbgrid控件内}
key:=#0;
perform(WM_NEXTDLGCTL,0,0);{移动到下一个控件}
end else
if (ActiveControl is Tdbgrid) Then{是在 Tdbgrid 控件内}
begin
With Tdbgrid(ActiveControl) Do
if Selectedindex<(FieldCount-1) then
Selectedindex:=Selectedindex+1{ 移动到下一字段}
else Selectedindex:=0;
end;

还有通过我自己悟通的,要将Form的属性设置为True才可以。
已通过D4的编译运行。

 
一般讲技巧的网上都有
作为初学者,应多收集
几个经典网站!
 
提醒注意:
Delphi5中已经有所变化,在OnShortCut事件中直接进行处理,最好跟踪运行一遍.
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
if Msg.CharCode=13 then
begin
Msg.CharCode:=9;
Handled:=False;//消息没有处理.
end;
end;
 
需要用回车键代替TAB键下移一个控件时,把KeyPress设为True,加入下列代码拦截击键:
Procedure TForm1.FormKeyPress(Sender:Tobject;Var Key:Char);
Begin
 if key=#13 then { 判断是按执行键}
 if not (ActiveControl is TDbgrid) Then
 Begin { 不是在TDbgrid控件内}
  key:=#0;
  perform(WM_NEXTDLGCTL,0,0);{移动到下一个控件}
 end else
 if (ActiveControl is TDbgrid) Then{是在 TDbgrid 控件内}
 begin
  With TDbgrid(ActiveControl) Do
  if Selectedindex<(FieldCount-1) then
  Selectedindex:=Selectedindex+1{ 移动到下一字段}
  else Selectedindex:=0;
 end;
End;

Form1.KeyPreview:=True;
 
>>philips
你太过分了,灌水只敲一个“.”!!
 
我的意思是:这个问题差不多了!!

另外也把积压较深的问题提前了。有什么过分的呢?
 
g:xWolf and Hjking
to Hjking,是D3书上的源程序吗?怎么和我书上的一样呢?
 
Hjking pp:
你所说的方法在DBGrid中好象不能换行。
 
在DBGRID控件的ONKEYPRESS事件中编写如下代码:
if (key=char(vk_return)) and (dbgrid1.selectedindex<table1.fieldcount-1) then
dbgrid1.selectedindex:=dbgrid1.selectedindex+1
else
if dbgrid1.selectedindex=table1.fieldcount-1 then
begin
table1.append;
dbgrid1.selectedindex=0;
end;
 
后退
顶部