关于窗口子类化在ActiveForm中的应用(应该是有相当难度的问题) ( 积分: 300 )

  • 主题发起人 主题发起人 寻路
  • 开始时间 开始时间

寻路

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个类,在WINDOWS下面运行得很好,但是在ActiveForm中调用,在退出的时候,或者再次创建的时候,出现地址错误.
我查了一下,发现是由于消息循环引起的,部分代码如下:
procedure TPuckerLineEx.SetParent(AParent: TWinControl);
begin
//由于 TWinControl 的 Destroy 中调用了 Parent 属性
//所以这里必须判断一下 AParent 是否为 nil
if (Parent <> AParent) and Assigned(AParent) then
begin
FParent := AParent;
Canvas.Handle := GetDC(Parent.Handle);
//Canvas.Pen.Mode := pmXor;
Parent.DoubleBuffered := True;
//程序在这里将父亲控件的消息循环替换成自己的
//可以肯定是由于下面的两行代码引起的,去掉之后没有任何问题
FOldWndProc := Parent.WindowProc

Parent.WindowProc := NewWindowProc;
Parent.Invalidate;
end;
inherited SetParent(AParent);
end;

在消息循环中:
procedure TPuckerLineEx.NewWindowProc(var Message: TMessage);
begin
//错误是在这里,非常奇怪,作成WINDOWS程序没有任何问题,在ActiveForm中调用就出现问题了
if Assigned(FOldWndProc) then FOldWndProc(Message);
case Message.Msg of
WM_PAINT: DrawShapeEx;
WM_NCHITTEST: WmNcHitTest(Message);
WM_LBUTTONDOWN: WmLButtonDown(Message);
WM_LBUTTONUP: WmLButtonOnup(Message);
WM_MOUSEMOVE: WmMouseMove(Message);
WM_ERASEBKGND: WmErasebkgnd(Message);
WM_HSCROLL: WmHScroll(Message);
WM_VSCROLL: WmVScroll(Message);
end;
end;

这个类是由TWinControl派生下来的,我不知道ActiveForm中的消息到底是怎么跑的.类本身没有问题.估计问题出现在ActiveForm的消息机制.
望高手解答!
 
我写了一个类,在WINDOWS下面运行得很好,但是在ActiveForm中调用,在退出的时候,或者再次创建的时候,出现地址错误.
我查了一下,发现是由于消息循环引起的,部分代码如下:
procedure TPuckerLineEx.SetParent(AParent: TWinControl);
begin
//由于 TWinControl 的 Destroy 中调用了 Parent 属性
//所以这里必须判断一下 AParent 是否为 nil
if (Parent <> AParent) and Assigned(AParent) then
begin
FParent := AParent;
Canvas.Handle := GetDC(Parent.Handle);
//Canvas.Pen.Mode := pmXor;
Parent.DoubleBuffered := True;
//程序在这里将父亲控件的消息循环替换成自己的
//可以肯定是由于下面的两行代码引起的,去掉之后没有任何问题
FOldWndProc := Parent.WindowProc

Parent.WindowProc := NewWindowProc;
Parent.Invalidate;
end;
inherited SetParent(AParent);
end;

在消息循环中:
procedure TPuckerLineEx.NewWindowProc(var Message: TMessage);
begin
//错误是在这里,非常奇怪,作成WINDOWS程序没有任何问题,在ActiveForm中调用就出现问题了
if Assigned(FOldWndProc) then FOldWndProc(Message);
case Message.Msg of
WM_PAINT: DrawShapeEx;
WM_NCHITTEST: WmNcHitTest(Message);
WM_LBUTTONDOWN: WmLButtonDown(Message);
WM_LBUTTONUP: WmLButtonOnup(Message);
WM_MOUSEMOVE: WmMouseMove(Message);
WM_ERASEBKGND: WmErasebkgnd(Message);
WM_HSCROLL: WmHScroll(Message);
WM_VSCROLL: WmVScroll(Message);
end;
end;

这个类是由TWinControl派生下来的,我不知道ActiveForm中的消息到底是怎么跑的.类本身没有问题.估计问题出现在ActiveForm的消息机制.
望高手解答!
 
没看懂你代码~~~~~~但在ActiveForm的Form资源是不能自己释放的,其parent应该是IE吧
 
我写的类的Parent是TScrollBox,TScrollBox的Parent是ActiveForm,ActiveForm的Parent可能是IE,我不是很清楚.
我现在使用的办法是一次性创建,就是说不用二次创建(创建我的类,再释放,在创建)我自己写的类了.问题是解决了,但是道理还是没有明白.
知道是由于子类化引起的问题,但不知道为什么会引起二次创建(创建我的类,再释放,在创建)的时候报错的问题.
有没有人遇到过同样的问题,欢迎讨论!
 
接受答案了.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部