如何屏蔽控件自己的事件(100分)

  • 主题发起人 主题发起人 Marlowe
  • 开始时间 开始时间
M

Marlowe

Unregistered / Unconfirmed
GUEST, unregistred user!
我要在Grid的基础上改进一下,不过当按下Del键时,Grid的内容被删除了
一个字,我该如何不让TStringGrid不响应Del键???????
(当然还的响应我自己写的KeyPress事件)
 
替换它的窗口函数,在WM_KEYDOWN时判断,如果是DEL键,就忽略,
否则就转发给原来的窗口函数.
 
application.OnMessage 处理也可以:-)
 
procedure OnKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); message WM_KEYDOWN;
begin
if Key = del // I haven't found the key value, sorry
then ;
else inherited;
end;

对lhz的方法的程序描述。:-)
 
del = VK_DELETE
 
没什么好说的了,Marlowe付钱吧!哦,还有几句补充一下:
你的KeyPress事件是截获不了del按键的,而仅截获ASC码按键!
所以必须在keydown事件里写!而且顺序上keydown先于keypress被激发!
 
屏蔽消息处理过程:
可以屏蔽所有消息,一般情况不屏蔽屏蔽WM_PAINT

procedure WndProc(var Message:TMessage);override;

procedure TYourControl.WndProc(var Message:TMessage);
begin
if Message.Msg=不屏蔽的消息 then inherited WndProc(Message);
end;

若次控件不是你自己设计的,可以试着用下面的方法(本人未验证)
procedure TOneObject.MyWndProc(var Message:TMessage);
begin
if Message.Msg<>不屏蔽的消息 then FBackWndProc(Message);
end;

执行部分:(假设要屏蔽Form1的消息)
var
OneObject:TOneObject;

FBackWndProc:=Form1.WindowProc;
Form1.WindowProc=OneObject.MyWndProc;



 
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_DELETE then Key=0;
end;
 
如柳五公子所说"必须在keydown事件里写!"

//---------------------------------------------------------------------------

void __fastcall TYourClass::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if (Key ==VK_DELETE) //其他相应的键名你可以在msdn中查
Key = 0; //让系统忽略
}
//---------------------------------------------------------------------------
 
2. 鼠标在移到richedit内,鼠标双键不让反应!
 
defwinproc也可以
 
多人接受答案了。
 
后退
顶部