C++ Builder 动态创建控件
当开发类似解释程序或实现可视化操作功能等一类的应用程序时,都需要动态地创建控件(对象),而且还要为这些控件添加适当的事件处理程序,下面将介绍在C++Builder中如何实现基本的实现框架。
动态创建控件的一般过程:
TButton *btn = new TButton(this);
btn->Caption = "Button1";
btn->Parent = this;
btn->Show();
下面结合一个动态生成菜单的例子来实践如何动态创建控件并处理添加事件处理。
先编写一个函数用向一个已存在的菜单对象中插入菜单项:
void __fastcall TForm1::AddContextMenuItem(TPopupMenu *pMenu,
AnsiString caption, unsigned int tag, TNotifyEvent notifyEvent)
参数:
pMenu: 已存在的TPopupMenu对象指针
caption: 菜单项的标题
tag: 菜单项的tag值,用于标识不同的TMenuItem对象
notifyEvent: 该菜单项的事件处理函数
函数实现:
TMenuItem *mnuItem = new TMenuItem(pMenu); // Create new itempMenu->Items->Add(mnuItem); // Add it to pMenu mnuItem->Name = "CM_" + IntToStr(tag); mnuItem->Caption = caption; mnuItem->ImageIndex = imgIndex; mnuItem->Tag = tag; mnuItem->OnClick = notifyEvent; // Assign it an event handler |
然后编写调用AddContextMenuItem(...)的函数CreateContextMenu(),定义如下:
void __fastcall TForm1::CreateContextMenu(void) {FTagInc = 0;FContextMenu = new TPopupMenu(this);FContextMenu->AutoHotkeys = maManual;FContextMenu->OnPopup = UpdateContextMenuItem;AddContextMenuItem(FContextMenu, "菜单项 1", FTagInc++, MenuItemClick);AddContextMenuItem(FContextMenu, "菜单项 2", FTagInc++, MenuItemClick);AddContextMenuItem(FContextMenu, "-", FTagInc++, NullNotifyEvent);AddContextMenuItem(FContextMenu, "菜单项 3", FTagInc++, MenuItemClick); } |
FContextMenu是TForm1的成员变量,UpdateContextMenuItem()是用于在FContextMenu的Popup事件中更新菜单项。
MenuItemClick与NullNotifyEvent都是TForm1中成员函数,是动态创建的控件的事件处理函数,格式为:
void __fastcall TForm1::MenuItemClick(TObject *Sender)
void __fastcall TForm1::NullNotifyEvent(TObject *Sender)
---------------------------------------------------------------------------------------------
代码如下:
.h文件中:
class TMyThread : public TThread
{
public:
__fastcall TMyThread(void);
private:
void __fastcall Execute();
};
.cpp文件中:
__fastcall TMyThread::TMyThread(void): TThread(true)
{
FreeOnTerminate=true;
Resume();
}
void __fastcall TMyThread::Execute()
{
Form1->createview();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMyThread *mythread = new TMyThread;
}
void __fastcall TForm1::createview() //createview()是我自己定义的函数
{
//动态生成LISTVIEW列表
TListView *tempview = new TListView(Form1);
tempview->Visible = true;
tempview->Parent = Form1;
}
就是以上代码运行后出现2个问题:
第一:点击Button按钮时没有创建listview控件
第二:关闭应用程序时出现以下错误提示:
应用程序发生异常 未知的软件异常(0x0eedfade),位置为0x77e8bc3f。
1:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMyThread *mythread = new TMyThread();
mythread->Execute;
}
2:估计是内存未释放!!
TO:caizhen2000_82(猛将兄!!!)
你的方法不行呀,mythread->Execute;根本没有这个方法。
估计是内存未释放?可以说的具体一点吗?
希望大家给出可行的解决方案,在线等!
Form1->createview(); Form1??
你要把ListView 放在那里?
放在form1上呀
__fastcall TMyThread::TMyThread(void): TThread(true)
{
TListView *ListView1 = new TListView(Form1);
ListView1->Parent= Form1
FreeOnTerminate=true;
Resume();
}
放在构造函数中。
TO: chpst(斗转星移)
非常感谢你的帮助,2个问题全部解决,不过又出现了新的问题!
动态生成的listview如何在createview()函数中调用呀
---------------------------------------------------------------------------------------------
关于动态创建控件
2.这个控件要放在另一个控件上,比如panel上,怎么写?
3.如果动态创建的button的名字也是动态的,该怎么写?比如先判断是否要创建,如果需要则创建一个button1,再判断,再需要的话则创建button2,这种情况下如何给button命名?
TButton *a;
a = new TButton(this);
a->Parent = Form1;
a->Top = 10;
a->Left = 10;
a->Width = 30;
a->Height = 10;
a->Caption = "haha";
如果要放到Panel上,指定的Parent指到Panel上就可以了Top
2 楼fjye(老姜)
3 楼JUNE20(花和尚:我也要学BCB!)
4 楼xiaoshi0(Rain)
动态创建的控件数组是不用名字的,如果要在Panel上创建,只要把该控件的Parent属性设置为Panel就可以了Top
5 楼ToIP(朽木)
//..........
buttone1->Update();Top
6 楼wcccc1(小猪义义)
7 楼wcccc1(小猪义义)
------------------------------------------------------------------------------------
在有些情况由于特殊的需求,需要开发自己的VCL组件以满足需求。对于初学者来说有些问题是需要强调一下的。
一般情况下是需要为自己编写的组件选择一个合适的图标,以更形象地表达该组件的功能,这个图标是在设计阶段在RAD环境中的组件栏中显示,一般大小为24x24。
C++ Builder 动态创建控件相关推荐
- asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性
asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性 就是不用 XXX.Visible = false; // true 因为这样该容器及其子控件会彻底的从页面上消 ...
- 在.NET上如何根据字符串动态创建控件
在.Net上用字符串动态创建控件是通过反射来实现. 首先,利用System.Type.GetType方法,获得字符串中指定的控件的类型实例. 这里需要注意这个字符串的语法,根据msdn的解释: 按名称 ...
- MFC动态创建控件并响应事件代码实现过程
MFC动态创建控件以及响应动态创建的控件的事件的实现方法如下. 1.创建对象 用new进行动态创建一个对象.然后调用Create函数创建窗口,在函数的父窗口参数中传入this或者用AfxGet ...
- MFC中动态创建控件以及事件响应实现方法
本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...
- MFC中动态创建控件以及添加事件响应
本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...
- C# 动态创建控件时注册Name属性
动态创建控件 1. 容器控件 .RegisterName("Name",要注册的控件) //注册控件 2. 容器控件 .FindName("Name") a ...
- Android 动态创建控件并设置控件的大小之Android屏幕适配攻略(五)
Android 屏幕适配攻略(五)动态创建控件并设置控件的大小 题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 flutter中网络请求dio使用分析 视频 ...
- ASP.NET动态创建控件之绝境求生
来源:中国IT实验室 在ASP.NET中动态创建一个控件总是不那么顺利,特别是当对页面的Life Cycle不是那么了然的情况下!这里简单描述一下要求,然后提供一个解决方案,大家看看有没有更好的Ide ...
- ASP.NET动态创建控件之绝境求生第一页
ASP.NET动态创建控件之绝境求生 日期:2007年9月8日 作者: 查看:[ 大字体 中字体 小字体] <script src="../gg/info468.js" ty ...
最新文章
- PAT_B_1027 打印沙漏
- 京东某程序员哀叹:在大厂快待废了,出去面试问自己kafka,竟然全忘了!
- 为什么叫python编程-python为什么叫爬虫
- hdu 4667 Building Fence 计算几何模板
- 以supervisord启动elasticsearch
- spring框架 web开发_go语言web开发框架:Iris框架讲解(一)
- linux内核调用( )为进程创建虚存区_Linux内核分析-总结篇(九)
- 定时任务 - 定时任务弊端与优化方案
- 浙江理工大学计算机组成原理试卷,浙江理工大学计算机组成原理设计试题.doc...
- qt自定义含有拖动功能的窗口在点击窗口的下拉列表时窗口移动
- 去哪儿-07-city-router
- SpringBoot 入门篇(二) SpringBoot常用注解以及自动配置
- 没注意开源软件的文档和对应版本号,悲剧了
- 电子学会图形化三级编程题解析含答案:冬天下雪了
- 服务器 python cant open file_QQ炫舞转服系统-QQ炫舞官方网站-腾讯游戏
- 上海软星解散的前因后果
- 中国标准时间、标准时间、时间戳时间格式转换
- 整数划分问题将正整数n表示成一系列正整数之和
- 【opencv学习笔记】021之霍夫直线变换原理详解
- 气象ts评分_天气预报评分方法评述.doc