弟兄们帮忙给看看:

Libran 2002-09-24 11:24:54
1,下载http://61.132.74.87/libran/Project1.zip(很小,6K Byte),解压,在CB里打开运行
(为兼容用CB4做的,用5、6的哥们儿Update一下应该也没问题)
2,在Form1的DBGrid里双击某一条记录
3,最小化Form3
4,在DBGrid里选其它记录
??怎么搞?

另外,不知数量、类型的若干控件的OnClick事件调用同一个响应函数OnCtrlClick(TObject* Sender),如何根据参数Sender得到相应控件并访问其方法、属性?
...全文
29 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Libran 2002-09-25
  • 打赏
  • 举报
回复
哥们儿,TWinControl和TGraphicControl都没实现OnClick事件,用它们和用TControl是一样的
而且,
if(pWinControl)
{
pWinControl->OnClick=ProcessClick;
}
if(pGraphicControl)
{
pGraphicControl->OnClick=ProcessClick;
}
这两个条件不互斥吧,都会执行的
再帮忙想想办法呀
dragonhux 2002-09-24
  • 打赏
  • 举报
回复
太复杂啦,你不如把想要的东东先描述一下!
Libran 2002-09-24
  • 打赏
  • 举报
回复
对于第二个问题,我要访问的属性和方法,对于具体控件是可用的,但在TControl被声明为Protect,而我又不知道该控件究竟是从TWinControl还是TGraphicControl继承
例如,一个控件可能是TEdit、TLabel、TPanel或其它什么的,要在OnClick里改变其Color的值,怎么把Sender转换为其对应的类型来访问Color属性?
(Color在TControl被声明为Protect)
kingcaiyao 2002-09-24
  • 打赏
  • 举报
回复
To huzhangyou:
还没有,我的考试有两个在10月份(其中包括高程),还有一个在12月份,进度还可以,书都看完了,现在主要是看大纲,做习题,谢谢你的关心,谢谢。
huzhangyou 2002-09-24
  • 打赏
  • 举报
回复
learning....................................

aking兄考试如何了?
kingcaiyao 2002-09-24
  • 打赏
  • 举报
回复
但你要知道从TObject派生下来的类并不是个个都有OnClick事件,所以这里需要指明,加上TGraphicControl,应该这样写:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(int i=0;i<ComponentCount;i++)
{
TWinControl *pWinControl=dynamic_cast<TWinControl*>(Components[i]);
TGraphicControl *pGraphicControl=dynamic_cast<TGraphicControl*>(Components[i]);

if(pWinControl)
{
pWinControl->OnClick=ProcessClick;
}
if(pGraphicControl)
{
pGraphicControl->OnClick=ProcessClick;
}

}
}
void __fastcall TForm1::ProcessClick(TObject *Sender)
{
//判断该对象是否有Color属性
TPropInfo *PropInfo;
PropInfo=GetPropInfo((TTypeInfo*)Sender->ClassInfo,"Color");
if(PropInfo)
{
SetOrdProp(Sender,PropInfo,clRed);//如果有Color属性,则将该颜色设置为红色
}
.....
//Other codes 其它代码
}



Libran 2002-09-24
  • 打赏
  • 举报
回复
如果是从TGraphicControl继承的呢?
我的意思就是不要用明确的类进行来转换,而根据Sender自身做判断,还原为原来实际的类
kingcaiyao 2002-09-24
  • 打赏
  • 举报
回复
我刚才看了一下Object Pascal的源码,它是在protected域,对于本类而言它是不可以直接访问的。 那就用TWinControl吧,将上面TControl的地方改成TWinControl,因为通常有单击事件的控件差不多都是窗口控件,而TWinControl是所有窗口控件的父类.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(int i=0;i<ComponentCount;i++)
{
TWinControl *pControl=dynamic_cast<TWinControl*>(Components[i]);
if(pControl)
{
pControl->OnClick=ProcessClick;
}
}
}
void __fastcall TForm1::ProcessClick(TObject *Sender)
{
//判断该对象是否有Color属性
TPropInfo *PropInfo;
PropInfo=GetPropInfo((TTypeInfo*)Sender->ClassInfo,"Color");
if(PropInfo)
{
SetOrdProp(Sender,PropInfo,clRed);//如果有Color属性,则将该颜色设置为红色
}
.....
//Other codes 其它代码
}

Libran 2002-09-24
  • 打赏
  • 举报
回复
多谢阿King哥!
不过:
TControl *pControl=dynamic_cast<TControl*>(Components[i]);
if(pControl)
{
pControl->OnClick=ProcessClick;// 这行就过不去呀
}
TControl的OnClick是Protect的,不让访问啊!
kingcaiyao 2002-09-24
  • 打赏
  • 举报
回复
我来回答第二个问题:不知数量、类型的若干控件的OnClick事件调用同一个响应函数OnCtrlClick(TObject* Sender),如何根据参数Sender得到相应控件并访问其方法、属性?
这样来解决:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(int i=0;i<ComponentCount;i++)
{
TControl *pControl=dynamic_cast<TControl*>(Components[i]);
if(pControl)
{
pControl->OnClick=ProcessClick;
}
}
}
void __fastcall TForm1::ProcessClick(TObject *Sender)
{
//判断该对象是否有Color属性
TPropInfo *PropInfo;
PropInfo=GetPropInfo((TTypeInfo*)Sender->ClassInfo,"Color");
if(PropInfo)
{
SetOrdProp(Sender,PropInfo,clRed);//如果有Color属性,则将该颜色设置为红色
}
.....
//Other codes 其它代码
}


Libran 2002-09-24
  • 打赏
  • 举报
回复
顶~~~
Libran 2002-09-24
  • 打赏
  • 举报
回复
用ClassName方法得到了类名,又怎么对Sender进行类型转换?

还有上边那个程序,帮忙看看呀
huang_jihua 2002-09-24
  • 打赏
  • 举报
回复
用Sender->ClassName 或者Sender->ClassNameIs来知道你的类名

13,825

社区成员

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

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