在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. 我的第一个Node.js项目

    Node.js的安装通常有两种方式:自己编译源代码和使用编译好的文件,我这里使用编译好的文件目前我的home目录下有刚下载来的node-v4.2.3-linux-x641.首先解压缩 tar xvf ...

  2. YOLO---Darknet下使用YOLO的常用命令

    Darknet下使用YOLO的常用命令 整理了一下,随手记一下. 在终端里,直接运行时Yolo的Darknet的各项命令,/home/wp/darknet/cfg/coco.data文件,使用原件:= ...

  3. debug:The key "" is not recognized and ignored.

    今天写代码时候发现chrome浏览器有一个警告The key "" is not recognized and ignored.既然发现了就处理一下吧,于是就有了这篇小文章. 查阅 ...

  4. python3 scrapy爬虫项目的诞生

    前提安装好scrapy模块最好 requests和bs4模块都安装好 可以概括为五个步骤 步骤一:新建一个项目 无论你用windows也好,linux也罢,在cmd或者终端 切换到目标文件夹,然后输入 ...

  5. [2019HDU多校第一场][HDU 6590][M. Code]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6590 题目大意(来自队友):二维平面上有\(n\)个点,每个点要么是黑色要么是白色,问能否找到一条直线 ...

  6. python 处理 json 四个函数dumps、loads、dump、load的区别

    1 .json.dumps() 函数是将一个 Python 数据类型列表(可以理解为字典)进行json格式的编码(转换成字符串,用于传播)eg, dict = {"age": &q ...

  7. [python]@cached_property缓存装饰器

    cached_property缓存装饰器 class cached_property(object): """ Decorator that converts a met ...

  8. 最近公共祖先lca模板

    void dfs(int x,int root){//预处理fa和dep数组 fa[x][0]=root; dep[x]=dep[root]+1; for(int i=1;(1<<i)&l ...

  9. [NLP] cs224n-2019 Assignment 1 Exploring Word Vectors

      CS224N Assignment 1: Exploring Word Vectors (25 Points)¶ Welcome to CS224n! Before you start, make ...

  10. chromedriver安装

    chromedriver.exe下载 淘宝的镜像地址可以下载 https://npm.taobao.org/mirrors/chromedriver/ 找到自己chrome浏览器适合的chromeDr ...