关于响应动态生成铵钮的CLICK事件。

tongzhenhua 2002-09-11 06:34:41
1.希望的结果在动态生成的按钮上按一下,用ShowMessage()给出它的Caption.
2.这些动态生成的按钮要删除的吧。应该在那里删?
void __fastcall TForm1::FormClick(TObject *Sender)
{
TButton *button;
button = new TButton(this);
button->Parent = this;
button->Caption = "按钮"+IntToStr(n++);
button->Top=t=t+25;
button->OnClick =MyButtonClick;
//??button要不要删呢?
}
//---------------------------------------------------------------
void __fastcall TForm1::MyButtonClick(TObject * Sender)
{
//TODO: Add your source code here

//这时怎么写。用ShowMessage()给出它的标题名。("按钮1"之类的格式)
//还有这个遍历怎么把不是按钮控件的Caption都给我了。还有BitBtn算不算TButton呀?
AnsiString tmp;
for (int i = 0;i < Form1->ComponentCount ; i ++)
{
if (dynamic_cast <TButton*> (Form1->Components [i]))
tmp= dynamic_cast <TButton*>(Form1->Components [i])->Caption;
ShowMessage(tmp);
}
}
...全文
79 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tongzhenhua 2002-09-13
  • 打赏
  • 举报
回复
只用chinagy(会员GY) 回的是有用的。
我的问题就是出在tmpButton=(TButton*)Sender上。一开始没转换,直接想看Sender->caption结果没这个下拦列表。
结帐。
chinagy 2002-09-12
  • 打赏
  • 举报
回复
1,MyButtonClick()应该这样写
//---------------------------------------------------------------
void __fastcall TForm1::MyButtonClick(TObject * Sender)
{
TButton *tmpButton;
AnsiString tmp;

tmpButton = (TButton *) Sender;

tmp= tmpButton->Caption;
ShowMessage(tmp);
}
2,窗体内的控件一般由窗体关闭时自动删除,如果有特殊要求,你可以让Enable=false.

bigcat00 2002-09-12
  • 打赏
  • 举报
回复
TList *plist=new TList();
void __fastcall TForm1::FormClick(TObject *Sender)
{
TButton *button;
button = new TButton(this);
button->Parent = this;
button->Caption = "按钮"+IntToStr(n++);
button->Top=t=t+25;
button->OnClick =MyButtonClick;
plist->Add(button);
}
void __fastcall TForm1::MyButtonClick(TObject * Sender)
{ for (int i=0;i<plist->Count;i++)
ShowMessage( ((TButton *)(plist->Items[i]))->Caption );
}

如果想删除所有的TButton,这样就行了:
void __fastcall TForm1::delbutton(void)
{ for (int i=0;i<plist->Count;i++)
delete (TButton *)(plist->Items[i]);
}

前两天我刚做完一个阅读器,里面用到了动态生成TLabel控件,我想原理应该差不多的吧。
上面的代码我是我自己用的,证实在Win2K+BCB5下运行通过,希望你能用得上。

aawolf 2002-09-11
  • 打赏
  • 举报
回复
给你看看这个吧,当时我也觉得RTTI比较烦,所以才想出这个办法来的。我至少已经贴这个连接有三次了,好象在推销似的,不过希望对你有帮助。
http://www.csdn.net/Develop/read_article.asp?id=14493
annkie 2002-09-11
  • 打赏
  • 举报
回复
哪你想做什么呀,用别的方法吧。
tongzhenhua 2002-09-11
  • 打赏
  • 举报
回复
1:上面那个代码是自己写的呀,可是没用的呀,我又不是想遍历出每个按钮的CAPTION,只是觉得有问题,也就顺便写到那里问了。因为它把一些不是按钮的CAPTION都给我了。因为它给的有的是空的。不知是FORM的还是什么的。

2:要是我能在写程序时的就知道Caption==“按钮的caption”)中按钮的caption话。我还要写程序获得我所点的那个动态按钮的CAPTION做SM(什么)^_^0
。(如果我要是已知的话当然会用遍历在一堆caption里去找了。)
annkie 2002-09-11
  • 打赏
  • 举报
回复
上面不是别人已经给你代码了吗?你理解一下就知道了。
在MyButtonClick事件里面遍历整个form的button,你如果只响应自己的caption,直接使用if判断一下啊。
比如:
if(dynamic_cast <TButton*>(Form1->Components [i])->Caption==“按钮的caption”)
ShowMessage(。。。。);
tongzhenhua 2002-09-11
  • 打赏
  • 举报
回复
十分尴尬,刚刚看了BCB的HELP。里面有的
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize);
VCL_MESSAGE_HANDLER(WM_SETFOCUS, TWMSetFocus, WMSetFocus);
VCL_MESSAGE_HANDLER(WM_KILLFOCUS, TWMKillFocus, WMKillFocus);
VCL_MESSAGE_HANDLER(WM_GETDLGCODE, TWMNoParams, WMGetDlgCode);
VCL_MESSAGE_HANDLER(CM_CTL3DCHANGED,TMessage, CMCtl3DChanged);
END_MESSAGE_MAP(TCustomControl);
可是我问这个问题是想知道怎样响应一个动态生成的按扭的CLICK事件得到它的caption.
annkie(爱已成歌) ,如果你知道就回答一下吧。我也好结帐了。查了以前2001的光盘上。只有动态生成的例子,响应就是一个showmessage("ok");要是结了以许也算是一常用的FAQ了吧。
annkie 2002-09-11
  • 打赏
  • 举报
回复
Example: Message handler

Here is the declaration of a message handler for a user-defined message called CM_CHANGECOLOR.

#define CM_CHANGECOLOR (WM_APP + 400)
class TMyControl : public TControl

{
protected:
void __fastcall CMChangeColor(TMessage &Message);

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(CM_CHANGECOLOR, TMessage, CMChangeColor)
END_MESSAGE_MAP(TControl)
};

void __fastcall TMyControl::CMChangeColor(TMessage &Message)

{
Color = Message.LParam; // set color from long parameter
TControl::CMChangeColor(Message); // call the inherited message handler
}
tongzhenhua 2002-09-11
  • 打赏
  • 举报
回复
感谢楼上两位。可是我主要是想实现按一下能用ShowMessage()给出它的Caption这一功能。其它地方无所谓的。

还有这是刚碰到的一个问题。就是当鼠标在程序外点一下程序标题变灰,想让程序showmessage出说变灰,当得到焦点变蓝时说变蓝。这一消息用那个映射?
试了试WM_KILLFOCUS,和setfocus。
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_KILLFOCUS, , Kill)
VCL_MESSAGE_HANDLER(WM_CAPTURECHANGED, void, cat)
VCL_MESSAGE_HANDLER(WM_SETFOCUS, , set)

END_MESSAGE_MAP(TForm)
试了都说Not allowed type.
yuanque 2002-09-11
  • 打赏
  • 举报
回复
不需要删除吧,因为它生成到了窗口上,窗口关闭时应该自动释放吧所生成的按钮吧。
annkie 2002-09-11
  • 打赏
  • 举报
回复
1.不在哪里删除,等你不需要的时候记得delete就行了,如果在哪里删除你根本看不到它。
2。给你的代码已经写了显示caption的语句,这里使用了动态类型转换,把是
button类型的全部找出来了,不是按钮的不能成功转化,也就不会显示caption。

13,870

社区成员

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

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