怎样让stringgrid像dbgrid一样接受tab键(80分)

  • 主题发起人 主题发起人 server
  • 开始时间 开始时间
S

server

Unregistered / Unconfirmed
GUEST, unregistred user!
从customgrid继承一个对象并继承keydown事件,但当按下
tab健时并不触发这个事件.
但同样从customgrid继承下来的customdbgrid却能激发
这个事件.
为什么tab健不触发keydown事件呢.
 
试了一下,果然如此,听听大侠怎么说。
 
看TCustomGrid、TStringGrid和TCustomDBGrid的源码。
TCustomGrid虽然处理了TAB键,但没有因此键按下而触发KeyDown事件。
TStringGrid的KeyDown是继承自TCustomGrid的,当然没有反应。
而TCustomDBGrid在处理TAB键前就用
KeyDownEvent := OnKeyDown;
if Assigned(KeyDownEvent) then KeyDownEvent(Self, Key, Shift);
触发了KeyDown事件。
 
不理解zry的回答.
代码
KeyDownEvent := OnKeyDown;
if Assigned(KeyDownEvent) then KeyDownEvent(Self, Key, Shift);
就在keydown事件里.
但stringgrid不调用keydown事件,怎么去调用这些代码呢.
 
我写了一个继承自TStringGrid的新构件,override其KeyDown,然后在KeyDown
中用
if Assigned(OnKeyDown) then OnKeyDown(Self, Key, Shift);
但TAB键还是没有触发KeyDown事件,看来我上面的分析是错误的。

自己水平有限,还是听听大侠们的高见吧。
 
CustomDbgrid重载了keydown,看看source就知道了。
你自己的程序也要重载它,我想customgrid的keydown应该是虚拟的吧。
 
server:

贴一下你的keydown。
 
KeyDown是<B>方法</B>,不是事件,<B>OnKeyDown</B>才是<B>事件</B>过程,要触发KeyDown事件,
就要调用OnKeyDown。我所说的是KeyDown方法中没有调用OnKeyDown,所以
KeyDown事件没有被触发。
 
To menxin:
我有重载KeyDown,并按TCustomDBGrid的方式去做,但没用。
TCustomGrid的KeyDown是重载其父类的KeyDown,并对包括TAB键在内的一些
键做了反应。
 
set it's option property
goTabs=True
then successful
try it
 
wwwjjjccc的方法完全能用,不过我还要
开一下源代码,看能不能解决上面遗留的问题.
 
需要的话,可用onKeyPress事件,检查Key值,tab键的ASCII码为#9,如下:

if Key=#9 then
...
 
test:
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;
 
在KeyDown事件前,TAB健已经被TControl对象设为默认健
你可以抓取CN_KEYDOWN消息,来对TAB健进行处理
CN_KEYDOWN消息在WM_KEYDOWN消息前发生,因此在CN_KEYDOWN消息中
可以抓取到所有的健值
 
多人接受答案了。
 
后退
顶部