请问如何重载改变Button->Enabled时的代码?

kevincsdn 2003-06-24 08:49:57
请问如何重载改变Button->Enabled时的代码?

就是说,当我有一条语句:Button->Enabled=false;时,能够执行我自定义的代码。
...全文
36 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevincsdn 2003-06-24
  • 打赏
  • 举报
回复
谢谢2位

我的程序现在基本完成,现在想做一些小改动,也不想重写控件。

能不能在不声明新类,不用新控件的基础上,实现呢?
TopCat 2003-06-24
  • 打赏
  • 举报
回复
不好意思,回复有点长,直接贴这里了:

原贴内容:
如果你要重写控件,就New一个Component,祖先类选TButton,然后重载GetEnabled和SetEnabled方法
return TButton::GetEnabled();你这个有返回值吗?
http://expert.csdn.net/Expert/topic/1949/1949492.xml?temp=.4744837
-----------------------------------
不是很明白你的意思。
GetEnabled是当Enabled属性作为右值的时候调用的,当然应该有返回值了。

属性(property)是BCB扩展的特性,让成员函数可以像变量一样使用。Enabled属性的定义如下:
__property bool Enabled = {read=GetEnabled, write=SetEnabled, stored=IsEnabledStored, default=1};
它的意思是:当你读Enabled属性时,会调用GetEnabled函数,而写它的时候调用SetEnabled,后面两个参数不是很理解,你可以自己去看帮助。
所以,你写bool temp = Button1->Enabled;的时候,其实是执行了:bool temp=Button1->GetEnabled(); 当然,实际上你不能这么调用,因为GetEnabled是被保护的。那么你说GetEnabled该不该有返回值呢? :) 同样的,SetEnabled也应该有一个bool类型的参数。

在父类TButton中已经实现了GetEnabled和SetEnabled,所以你只要重载这两个函数就可以了
kevincsdn 2003-06-24
  • 打赏
  • 举报
回复
ActionList怎么用,我看了半天,也没明白

还有TActionManager, TActionToolBar
TopCat 2003-06-24
  • 打赏
  • 举报
回复
如果你要重写控件,就New一个Component,祖先类选TButton,然后重载GetEnabled和SetEnabled方法:

class PACKAGE TMyButton : public TButton
{
private:
protected:
__fastcall bool GetEnabled()
{
return TButton::GetEnabled();
};

__fastcall void SetEnabled(bool enabled)
{
if (enabled)
ShowMessage("Button Enabled");
else
ShowMessage("Button Disabled");

TButton::SetEnabled(enabled);
}
public:
__fastcall TMyButton(TComponent* Owner);
__published:
};

如果不想新写控件而只想用消息控制,那么楼上的方法不错。
xuv2002 2003-06-24
  • 打赏
  • 举报
回复
捕获CM_ENABLEDCHANGED消息
class TMyButton : public TButton
{
public:
__fastcall TMyButton(TComponent* Owner);
void __fastcall WndProc(TMessage &msg);
};

void __fastcall TMyButton::WndProc(TMessage &msg)
{
TButton::WndProc(msg);
if(msg.Msg == CM_ENABLEDCHANGED){
if(Enabled == false)
ShowMessage("haha");
}
}
yankcsdn 2003-06-24
  • 打赏
  • 举报
回复
我认为还是用ActionList,然后将Button的Enable代码指向不同的Action比较好!
kevincsdn 2003-06-24
  • 打赏
  • 举报
回复
谢谢,上面的可以。还有2个小问题。

Button1->WindowProc = MyProc;我是放在窗体的构造函数里的,会不会放在其他地方比较好?

为什么我用ClassExplorer中的New Method里的Message Handle添加函数不行,而且找不到CM_ENABLEDCHANGED,必须手动添加?
xuv2002 2003-06-24
  • 打赏
  • 举报
回复
那就捕捉消息咯
Button1->WindowProc = MyProc;
//---------------------------------------------------------------------------

void __fastcall TForm1::MyProc(TMessage &msg) // 在.h 里面声明
{
Button1->Dispatch(&msg);
if(msg.Msg == CM_ENABLEDCHANGED){
if(Button1->Enabled == false)
ShowMessage("haha");
}

}

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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