在DELPHI中动态创建控件以及控件的事件
在DELPHI中我们经常要动态的创建控件以及控件的事件。例如,我们可能想根据程序需要动态的创建一些Tshape组件来创建某个图形,并使得在鼠标移动上去之后可以完成某些操作。这一般需要需要三步:
- 生成一个制定组件类的实例
- 为这个实例付初值
- 在使用完毕后,释放资源
下面将通过一个例子来演示,例子的功能是动态创建一个Tshape的实例MyShape,并且在鼠标移动到MyShape后窗体的标题栏,显示鼠标的座标。
第一步:新建立一个工程,工程上主窗体上放一个按钮BitBtn1,并在代码文件的uses内添加ExtCtrls。
第二步:在按钮的OnClick事件中写
procedure TForm1.BitBtn1Click(Sender: TObject);
var
myShape : TShape;
begin
myShape := TShape.Create(nil);
with myShape do
begin
Parent := Form1;//如果没有这句,新创建的myShape将不会显示在窗体上
Left := 100;//位置信息
Top := 100;
Width := 200;//大小信息
Height := 200;
end;
end;
第三步:这个时候编译程序,并执行,点击BitBtn1,你会看到窗体上产生了一个新的Shape,大小是(200×200),当鼠标移动到Shape上后,并不会在窗体标题栏中显示任何信息。很简单,因为我们没有为它动态的创建事件处理过程。这当然不是我们需要的。我们知道,如果是在设计期内,我门只需要在它的onMouseMove事件中写一句代码就可以了,那这种动态创建的控件我们要如何去做呢?观察TShape类的声明,我们会发现它的onMouseMove事件是个属性,是一个类型为TMouseMoveEvent的属性。我们知道属性是客户访问组件内部存储空间的接口,而事件属性则是方法的指针。仔细观察下面的OnMousemove属性的声明
property OnMouseMove: TMouseMoveEvent read FOnMouseMove write FOnMouseMove;
然后再观察TMouseMoveEvent类型,我们会发现它定义如下:
TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;
看到这里我想你大概已经明白了,我们只需要创建一个和TMouseMoveEvent类型一个样的过程,并把此过程赋值给控件的onMouseMove属性就可以了。
注意:创建过程的参数个数、类型以及顺序必须和声明的类型一样!
第四步:为刚才的程序添加新的功能,修改代码。首先,在Form1的类型定义中添加过程声明MyMouseMove;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
procedure MyMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
publicend;
然后对MyMouseMove写完成制定功能的代码,这里是在窗体的标题栏显示鼠标的坐标信息;
procedure TForm1.MyMouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer);
begin
Form1.Caption := Format('x:%d;y:%d',[x,y]);
end;最后修改BitBtn1Click,将刚才创建的事件处理过程赋值给myShape的onMouseMove事件属性
OnMouseMove := MyMouseMove;
第五步:编译程序,并运行,点击按钮创建组件,然后将鼠标移动到新创建的组件上,你会发现标题栏上会显示当前的鼠标坐标信息。
注:本文写的内容比较简单,但笔者希望可以给初学DELPHI的人起到抛砖引玉的作用。
程序的完整源码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
procedure MyMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
publicend;
var
Form1: TForm1;implementation
{$R *.dfm}
procedure TForm1.MyMouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer);
begin
Form1.Caption := Format('x:%d;y:%d',[x,y]);
end;procedure TForm1.BitBtn1Click(Sender: TObject);
var
myShape : TShape;
begin
myShape := TShape.Create(nil);
with myShape do
begin
Parent := Form1;
Left := 100;
Top := 100;
Width := 200;
Height := 200;
OnMouseMove := MyMouseMove;
end;
end;end.
在DELPHI中动态创建控件以及控件的事件的更多相关文章
- Delphi中动态创建窗体有四种方式
Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...
- 实例讲解如何在Delphi中动态创建dxBarManager内容
一.dxBarManager中一些非常重要的概念: TCategorys:为了方便对dxBarManager中的项目进行归类而设计的一个属性,当然,只使用默认的名字为Default的Category也 ...
- Delphi 中 动态创建的Panel无法改变颜色的解决办法
刚开始代码如下: procedure TForm1.Button1Click(Sender: TObject); var Panel: TPanel; begin Panel := TPanel.Cr ...
- Delphi中动态创建的Panel无法改变颜色的解决办法(要把Panel的ParentBackground设为False)
刚开始代码如下: procedure TForm1.Button1Click(Sender: TObject); var Panel: TPanel; begin Panel := TPanel.Cr ...
- WPF 中动态创建和删除控件
原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName(" ...
- 在Delphi中动态地使用SQL查询语句 Adoquery sql 参数 冒号
在Delphi中动态地使用SQL查询语句 在一般的数据库管理系统中,通常都需要应用SQL查询语句来提高程序的动态特性.下面介绍如何在Delphi中实现这种功能.在Delphi中,使用SQL查询语句的途 ...
- WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件
动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName("Name") as 控 ...
- MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应
MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文: http://blog.csdn.net/supermanking/article/detail ...
- Android 在程序中动态添加 View 布局或控件
有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法: 1.addView 添加View到布局容器 2.removeView 在布局容器中删掉已有的View 3.LayoutPar ...
随机推荐
- Mac&Appium&Python自动化测试-环境搭建之安卓SDK
一.摘要 本博文将详细讲述在Mac环境下的jdk安装.配置以及环境校验:安卓sdk安装.配置以及环境校验 二.安装包工具准备: jdk1.8.0(64 位) android-sdk_r24.4.1-m ...
- cubemx+stm32串口学习汇总资料
这篇文章是串口中断的文章--STM32基于CubeMX的高速串口收发程序(中断模式)比较有帮助. http://www.stmcu.org.cn/module/forum/thread-616613- ...
- Python3-list
list = ['abcd', 786, 2.23, 'runoob', 70.2] tinylist = [123, 'runoob'] print(list) # 输出完整列表 print(lis ...
- 洛谷 P1600 天天爱跑步(LCA+乱搞)
传送门 我们把每一条路径拆成$u->lca$和$lca->v$的路径 先考虑$u->lca$,如果这条路径会对路径上的某一个点产生贡献,那么满足$dep[u]-dep[x]=w[x] ...
- (十八)链接数据库,QSqlTableModel
QMYSQL——mysql QSQLITE——sqlite QOICQ——orcale 所需头文件 .pro增加 sql #include <QSqlDatabase> #include ...
- TCO14 Wildcard CountTables——斯特林反演
不知道咕了多长时间的题... 讲了3遍,还是自己搞懂了.. 暂时没有找到题目链接 题意: n×m的网格,每个格子填[1,x]的数,使得不存在两行两列同构. 先保证一个,行相同. 再容斥掉列. 枚举至多 ...
- 云闪付个人免签支付用xposed解决强制升级
云闪付的xposed程序之前用的是6.18的版本,前段时间突然不能用了,提示要升级到最新的7.0版本.之前这个云闪付的个人免签支付程序一直跑的挺好,云闪付也是所有免签支付里面最能跑量的,不甘就这么放弃 ...
- 16.合并两个排序的链表 Java
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路 两种解法:递归和非递归 参考代码 /* public class ListNode { ...
- redis的哨兵
删除旧master或者不可达slave sentinel永远会记录好一个Master的slaves,即使slave已经与组织失联好久了.这是很有用的,因为sentinel集群必须有能力把一个恢复可用的 ...
- 笔记一(固件、BIOS、UEFI)
1.固件 固件一般是指保存在ROM中的程序和数据,通过固件操作系统按照标准的设备驱动实现特定机器的运行. 简单来讲,固件就是固化在ROM的软件,当然也可以通过特定的工具进行升级. MP3.MP4.手机 ...