在DELPHI中我们经常要动态的创建控件以及控件的事件。例如,我们可能想根据程序需要动态的创建一些Tshape组件来创建某个图形,并使得在鼠标移动上去之后可以完成某些操作。这一般需要需要三步:

  1. 生成一个制定组件类的实例
  2. 为这个实例付初值
  3. 在使用完毕后,释放资源

下面将通过一个例子来演示,例子的功能是动态创建一个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);
  public

  end;

然后对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);
  public

  end;

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中动态创建控件以及控件的事件的更多相关文章

  1. Delphi中动态创建窗体有四种方式

    Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...

  2. 实例讲解如何在Delphi中动态创建dxBarManager内容

    一.dxBarManager中一些非常重要的概念: TCategorys:为了方便对dxBarManager中的项目进行归类而设计的一个属性,当然,只使用默认的名字为Default的Category也 ...

  3. Delphi 中 动态创建的Panel无法改变颜色的解决办法

    刚开始代码如下: procedure TForm1.Button1Click(Sender: TObject); var Panel: TPanel; begin Panel := TPanel.Cr ...

  4. Delphi中动态创建的Panel无法改变颜色的解决办法(要把Panel的ParentBackground设为False)

    刚开始代码如下: procedure TForm1.Button1Click(Sender: TObject); var Panel: TPanel; begin Panel := TPanel.Cr ...

  5. WPF 中动态创建和删除控件

    原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件.FindName(" ...

  6. 在Delphi中动态地使用SQL查询语句 Adoquery sql 参数 冒号

    在Delphi中动态地使用SQL查询语句 在一般的数据库管理系统中,通常都需要应用SQL查询语句来提高程序的动态特性.下面介绍如何在Delphi中实现这种功能.在Delphi中,使用SQL查询语句的途 ...

  7. WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件

    动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件.FindName("Name") as  控 ...

  8. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  9. Android 在程序中动态添加 View 布局或控件

    有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法: 1.addView 添加View到布局容器 2.removeView 在布局容器中删掉已有的View 3.LayoutPar ...

随机推荐

  1. jQuery基础 (一)—样式篇

    jQuery的优势 jQuery有很多特性和工具方法

  2. 从Excel中读取数据并批量写入MySQL数据库(基于pymysql)

    一.Excel内容时这样的: 二.最初的代码是这样的: # -*- coding:utf-8 -*-import pymysqlfrom xlrd import open_workbook class ...

  3. zabbix验证微信

    在Zabbix服务端设置邮件报警,当被监控主机宕机或者达到触发器预设值时,会自动发送报警邮件到指定邮箱. 具体操作: 以下操作在Zabbix监控服务端进行 备注:Zabbix监控服务端 操作系统:Ce ...

  4. WinForm DevExpress使用之ChartControl控件绘制图表二——进阶

    1. 多坐标折线图 在这个项目中,我需要做不同采集地方和不同数据类型的数据对比,自然而然就用到了多重坐标轴,多重坐标轴可以是多个X轴,也可以是Y轴,它们的处理方式类似.本文通过项目中的实际例子介绍多重 ...

  5. node.js----一个httpserver提交和解析get参数的例子

    前端代码 <!doctype html> <html lang="en"> <head> <meta charset="utf- ...

  6. 218多校第九场 HDU 6424 (数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6424 题意:定义f(A) = log log log log …. (A个log) n ,g[A,B, ...

  7. Codeforces Round #586 (Div. 1 + Div. 2) E. Tourism

    链接: https://codeforces.com/contest/1220/problem/E 题意: Alex decided to go on a touristic trip over th ...

  8. Serializable(转)

    最近在阅读JDK源码中的集合,看到很多集合类实现了Serializable接口,Cloneable接口.在阅读了很多关于Serializable接口的博客后,浅谈下我对Serializable接口的理 ...

  9. Python文本和字节序列

    ASCII码 早期人们用8位二进制来编码英文字母(最前面的一位是0) 也就是说,将英文字母和一些常用的字符和这128种二进制0.1串一一对应起来, 比如:大写字母“A”所对应的二进制位“0100000 ...

  10. Luogu P1450 [HAOI2008]硬币购物 背包+容斥原理

    考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可. 因为有个数的限制,所以容斥一下:没有1个超过限制的方案=至少0个超过限制-至少1个超过限制+至少2个 ...