如何继承DBGRID的KEYDOWN事件(100分)

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

sandylao

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库表有两列,一列是项目,第二列是项目值,想根据不同的项目在DBGRID里进行不同处理(项目值为‘类型’时,DBGRID第二列可以显示按钮),我在ADOQUERY的AfterScroll事件写了如下代码:
procedure Tform1.adoquery1AfterScroll(DataSet: TDataSet);
begin
if adoquery1.FieldValues['item']='类型' then //如果第一列的值为‘类型’
dbgrid1.Columns[1].ButtonStyle :=cbsEllipsis //显示CELL的按钮
else dbgrid1.Columns[1].ButtonStyle :=cbsNone;//否则不显示CELL的按钮
end;

现在的情况是当用鼠标点第二列各个CELL时,程序可以按预期的执行,但是如果使用键盘的DOWN和UP键上下移动记录时,在‘类型’行不出现按钮,下移时在‘类型’的下一行出现按钮,上移时在‘类型’的上一行出现按钮。(DOWN和UP键是DBGRID自己的事件控制的,会自动调用ADOQUERY的MOVEBY)。不知道是什么原因?我怀疑与DBGRID的事件有关,想把DBGRID的KEYDOWN事件继承下来后修改,或者屏蔽掉自己写KEYDOWN事件。但没写过,不知道各位大侠能否提供一个例子?急,不胜感激!

我写的组件代码如下,但测试发现KEYDOWN事件不能触发(方向键还是起作用,估计是DBGRID带的),请各位帮我看看:
unit Mydbgrid;

interface

uses
SysUtils, Classes, Controls, Grids, DBGrids;

type
tMydbgrid = class(TDBGrid)
private
FOnKeyDown:TNotifyEvent;

protected
procedure KeyDown;Dynamic;
public

published
property OnKeyDown: TNotifyEvent read FOnKeyDown write FOnKeyDown;

end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Data Controls', [tMydbgrid]);
end;

procedure tMydbgrid.KeyDown;
begin
if assigned(FOnKeyDown) then FOnKeyDown(Self);
end;
 
没什么可写的
继承WndProc()
然后处理keydown消息就可以了
 
我对消息处理不熟悉,可以详细点吗?
 
这么简单的问题没人回答?郁闷
 
等待回答
 
没有人能解决吗?[:(]
 
这不是很简单的问题,如果没有直接的第三方组件可用,那么你自己必须处理很多相关的咚咚,麻烦着呢.基本上第一个需要处理的就是WM_PAINT/(DrawCell),然后还有设计一个编辑器,当相应的Cell为当前CELL的时候,根据字段类型把你的编辑器设置到相应位置,并且还要根据需要处理很多其他咚咚.
 
不知道有没有可用的第三方控件?相信这个应用在很多地方都会有
 
后退
顶部