在DELPHI中动态创建控件以及控件的事件(转)配合 让FIREDAC记录数据库的异常日志
在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.
原文地址:https://www.cnblogs.com/Thenext/p/11312258.html
- 使用Visual Studio 2013进行单元测试--初级篇
- forever让nodejs应用后台执行
- 三分钟理解“装饰模式”——设计模式轻松掌握
- 想玩集群?读写分离?你要先懂这个!
- 三分钟理解“状态模式”——设计模式轻松掌握
- JS生成UUID
- Mysql性能优化之开启Mysql慢查询日志
- 三分钟理解“命令模式”——设计模式轻松掌握
- 把表单转成json,并且name为key,value为值
- PHP经典面试题目汇总(上篇)
- 横向滑动的HorizontalListView滑动指定位置的解决方法
- 高可用架构-- MySQL主从复制的配置
- 零基础入门深度学习 | 第二章:线性单元和梯度下降
- 比特币价,黄金和无稽之谈 - 怎样不去给比特币估值
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript单元测试及原理
- 前端进阶知识汇总
- 前端也能学算法:由浅入深讲解动态规划
- 轻松理解JS中的面向对象,顺便搞懂prototype和__proto__
- 前端也能学算法:由浅入深讲解贪心算法
- web.py指南性说明
- this到底指向啥?看完这篇就知道了!
- 学以致用:手把手教你撸一个工具库并打包发布,顺便解决JS小数计算不准问题
- python 实现 php 的 var_dump 功能
- RSA初探,聊聊怎么破解HTTPS
- 深入解析Underscore.js源码架构
- python正向连接后门
- setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop
- emlog全版本CSRF加用户xsser.me模块
- 从发布订阅模式入手读懂Node.js的EventEmitter源码