如何在VCL中增加事件,当Visible改变时触发该事件?

Jim3 2003-01-15 05:52:47
我想在VCL中增加一个事件,当Visible改变时触发该事件

可是SetVisible和GetVisible都是private,无法改写

能不能增加一个同名同类型的属性替代原来的Visible呢?
...全文
35 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jim3 2003-01-15
  • 打赏
  • 举报
回复
谢谢
Jim3 2003-01-15
  • 打赏
  • 举报
回复
用RequestAlign也可以,加个判断就可以了,只是没有拦截消息那么有效率
jishiping 2003-01-15
  • 打赏
  • 举报
回复
就是重载WndProc这个函数。
void __fastcall MyControl::WndProc(TMessage& Msg)
{
TControl::WndProc(Msg); //这儿假设从TControl派生

if (Msg.Msg==CM_VISIBLECHANGED) {
//调用你自己写的事件函数
}
}
jishiping 2003-01-15
  • 打赏
  • 举报
回复
我又看了一下,还是拦截消息CM_VISIBLECHANGED比较好。如果重载RequestAlign的话,除了SetVisible会调用RequestAlign外,其它地方也会调用RequestAlign。怎么拦截消息CM_VISIBLECHANGED,就不用我说了吧。
Jim3 2003-01-15
  • 打赏
  • 举报
回复
呵呵,我看到了

谢谢啦!

另外,拦截消息就是改写消息处理函数吧?
jishiping 2003-01-15
  • 打赏
  • 举报
回复
是看controls.pas得来的。

procedure TControl.SetVisible(Value: Boolean);
begin
if FVisible <> Value then
begin
VisibleChanging;
FVisible := Value;
Perform(CM_VISIBLECHANGED, Ord(Value), 0);
RequestAlign; //RequestAlign是虚拟函数
end;
end;
Jim3 2003-01-15
  • 打赏
  • 举报
回复
谢谢

RequestAlign()和Visible有什么关系?

哪里有这方面的知识?

是看controls.pas得来的么?
jishiping 2003-01-15
  • 打赏
  • 举报
回复
void __fastcall MyControl::RequestAlign()
{
TControl::RequestAlign(); //这儿假设从TControl派生
//调用你自己写的事件函数
}
jishiping 2003-01-15
  • 打赏
  • 举报
回复
拦截消息CM_VISIBLECHANGED,或者重载RequestAlign函数。注意重载函数时,需要调用原来的RequestAlign函数。

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧