我想截獲TStringGrid的WM_VSCROLL事件﹐為可不行﹖(100分)

  • 主题发起人 主题发起人 dadabox
  • 开始时间 开始时间
D

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
我該怎么辦﹖我寫的事件用Form可以觸發﹐但不會觸發StringGrid的。哪位大俠出手﹖我不
會﹐也不明白為什么﹗有見解的答案﹐可視情況另外加分﹗謝﹗
 
wndproc
or
以"wndproc"搜索类似的帖子,肯定有答案
 
大哥﹐你能否說得詳細點﹐或者幫我驗証一下﹐我根本捕捉不到呀。
 
这一招是向xianjun学的,[:D] 我觉得他的办法实用而且比较安全.
参考他的帖子http://www.delphibbs.com/delphibbs/dispq.asp?lid=748885

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
StringGridWndProc: TWndMethod;
procedure NewWndProc(var Msg: TMessage);

public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGridWndProc := StringGrid1.WindowProc;
StringGrid1.WindowProc := NewWndProc;
end;

procedure TForm1.NewWndProc(var Msg: TMessage);
begin
if Msg.Msg = WM_VSCROLL then Beep;
StringGridWndProc(Msg);
end;

end.
 
多謝bluerain,我試一下。另外﹐dumpbin能用了。
 
bluerain,我還想問一下﹐要是有多個stringgrid﹐我只寫一個過程來判斷能否做到﹖不然﹐
我得寫多個。
 
应该不可以的. 因为
TWndMethod = procedure(var Message: TMessage) of object;
是对象过程,如果对多个stringgrid应用
StringGrid1.WindowProc := NewWndProc,系统要搞不清楚给谁发消息了.
 
想想也是這樣﹐但我有5﹐6個stringgrid﹐要是每個都這么寫﹐好煩。有沒有更好的法子﹖
再挂兩天看看。
 
那你就继承一下,写个类好了.例如处理VScroll时的过程为procedure MyScroll1;
就设
SrlStringGrid1.OnVScrollHandle := MyScroll1;
SrlStringGrid2.OnVScrollHandle := MyScroll1;
SrlStringGrid3.OnVScrollHandle := MyScroll1;
下面的代码如果你有空,可以完善一下.
==========================================================
unit SrlStringGrid;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, StdCtrls;
type
TVscrollHandle = procedure of object;
TSrlStringGrid = Class(TStringGrid)
private
FOldWndProc : TWndMethod;
FHandleVScroll : TVscrollHandle;
procedure MyWndProc(var Message: TMessage);
public
Constructor Create(AOwner : TComponent);override;
property OnVScrollHandle : TVScrollHandle read FHandleVScroll write FHandleVScroll;
end;

procedure Register;
implementation

procedure Register;
begin
RegisterComponents('Samples', [TSrlStringGrid]);
end;

{ TSrlStringGrid }
constructor TSrlStringGrid.Create(AOwner: TComponent);
begin
inherited;
FOldWndProc := WindowProc;
WindowProc := MyWndProc;
end;

procedure TSrlStringGrid.MyWndProc(var Message: TMessage);
begin
if Message.Msg = WM_VSCROLL then FHandleVScroll;
FOldWndProc(Message);
end;

end.
 
唉﹐難道在一個表單中寫一個函數共用真的不行嗎﹖沒有別的法子了﹖那為什么你寫繼承
就行﹐放在一個表單里就不行﹖不都是用的同一段代碼嗎﹖哪位能解釋一下﹖解釋清楚了
就給分﹗
 
再沒人回答﹐我今天就要准備結束了喲。
 
你仔细看一下新的WINPROC的代码就知道了,它的最后一句是调用旧的WINPROC
如果多个STRINGGRID共用一个WINPROC应该怎样区分最后调用谁呢?
但你用类的继承就不一样了,你的几个STRINGGRID是几个实例,它的WINPROC虽然代码一样
但地址指针是不同的。也就是说在EXE是有多个WINPROC
 
說得有理﹐但我能不能定義几個指針﹐動態改變其指針地址來達到這個目的呢﹖請老兄快點
回答﹐我想今天結束這個問題。[:)]
 
恐怕不行,指针的内容才是实体,没有内容的指针是没有什么作用的。
 
多人接受答案了。
 
后退
顶部