寻
寻路
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的消息机制.
望高手解答!
我查了一下,发现是由于消息循环引起的,部分代码如下:
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的消息机制.
望高手解答!