T
tansin
Unregistered / Unconfirmed
GUEST, unregistred user!
我想捕获tstringgrid的CM_INVALIDATE消息在TStringGrid重画时做别的事情。
我知道TControl有WindowPro属性,我自己编写wndpro函数,付给windowpro属性。编译通过
但在运行是出现EOSError(名字上看似乎是操作系统异常)抛出的异常code:1411 .类别不
存在。苦思不得其解。示例如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure StringGridWindowProc(var Message: TMessage);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.StringGridWindowProc(var Message: TMessage);
begin
inherited;{该处函数体为空的话为也出现同样的错误}
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.WindowProc := StringGridWindowProc;
end;
end.
我觉得问题的所在是出现了某种混乱。在delphi里面所有的组件放在一个form里面
所有的函数都像是form的成员函数,只有一个神秘的sender标识其真正的主人。
想在函数体内调用父类的某个成员函数,一不小心可能调用了form的同名函数。总之,
delphi里的类和c++里的大不相同。
向上面的那个问题,从tsinggrid类派生一个类,在改写wndpro就不会出现问题了。
做法如下
TMyStringGrid = class(TStringGrid)
private
procedure SubClassWndProc(var Message: TMessage);
public
constructor Create(AOwner: TComponent); override;
end;
......
constructor TMyStringGrid.Create(AOwner: TComponent);
begin
inherited;
Options := Options +[goColSizing];
WindowProc := SubClassWndProc;//改写;
end;
procedure TMyStringGrid.SubClassWndProc(var Message: TMessage);
begin
if Message.Msg = CM_INVALIDATE then
Showmessage('Hi!') ;
WndProc(Message);
end;
问题虽然解决了,但还有遗憾,如果你不是动态创建而是想象tstringgrid一样方便的操纵
它,你必须注册。为了这么小的一个功能注册一个组件,得不偿失!
那位高手对delphi有更好的理解,或更好的解决方案,愿不吝赐教!
我知道TControl有WindowPro属性,我自己编写wndpro函数,付给windowpro属性。编译通过
但在运行是出现EOSError(名字上看似乎是操作系统异常)抛出的异常code:1411 .类别不
存在。苦思不得其解。示例如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure StringGridWindowProc(var Message: TMessage);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.StringGridWindowProc(var Message: TMessage);
begin
inherited;{该处函数体为空的话为也出现同样的错误}
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.WindowProc := StringGridWindowProc;
end;
end.
我觉得问题的所在是出现了某种混乱。在delphi里面所有的组件放在一个form里面
所有的函数都像是form的成员函数,只有一个神秘的sender标识其真正的主人。
想在函数体内调用父类的某个成员函数,一不小心可能调用了form的同名函数。总之,
delphi里的类和c++里的大不相同。
向上面的那个问题,从tsinggrid类派生一个类,在改写wndpro就不会出现问题了。
做法如下
TMyStringGrid = class(TStringGrid)
private
procedure SubClassWndProc(var Message: TMessage);
public
constructor Create(AOwner: TComponent); override;
end;
......
constructor TMyStringGrid.Create(AOwner: TComponent);
begin
inherited;
Options := Options +[goColSizing];
WindowProc := SubClassWndProc;//改写;
end;
procedure TMyStringGrid.SubClassWndProc(var Message: TMessage);
begin
if Message.Msg = CM_INVALIDATE then
Showmessage('Hi!') ;
WndProc(Message);
end;
问题虽然解决了,但还有遗憾,如果你不是动态创建而是想象tstringgrid一样方便的操纵
它,你必须注册。为了这么小的一个功能注册一个组件,得不偿失!
那位高手对delphi有更好的理解,或更好的解决方案,愿不吝赐教!