在DELPHI中动态创建控件以及控件的事件

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

     在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编程中实现日志文件记录的综述 然后,我们创建了一个TLogger类,在构造函数中通过调用CreateLogFile函数创建日志文件,并在析构函数中释放文件资源。然后,我们使用TFileStream类创建一个文件流,并将文件指针移动到文件末尾,以便在后续的写入操作中始终将日志追加到文件的末尾。然后,我们使用TFileStream类创建一个文件流,并将文件指针移动到文件末尾,以便在后续的写入操作中始终将日志追加到文件的末尾。在Delphi中,常见的做法是创建一个日志记录类,该类提供了相应的方法来写入不同级别的日志信息。 阅读详情

相关推荐

Delphi 中自做动态显示的控件

---- Delphi以其优秀的界面和简单的用法深受广大程序员的喜爱.笔者经过摸索,自做了一个具有动态显示特性的控件。只需在主程序中调用该控件的一个方法即可实现动态显示。在动态显示的同时,为了不影响主程序做其他的事情,笔者采用了比较流行的线程技术。 一. 方案 ---- 自做一个父类为TEdit的控件,应该有一个Text属性,能自由地输入要动态显示的内容; 并且有一个MoveShow方法,使的Text的内容能动态的显示。在主程序中创建一个线程,启动线程时,调用该控件的MoveShow方法。 二. 制

s13596191285的博客 730

Delphi】实现彩色日志显示框(TRichEdit Helper)

Delphi实现显示彩色日志框功能,介绍使用Helper实现TRichEdit显示彩色文字

sensor_WU 博客 1152

Delphi编写的日志文件记录组件源程序

Delphi编写的日志记录组件源代码,从中可以学习自定义组件的一些技巧,如注册到组件面板、添加自定义图标等。 日志组件具有以下属性及方法: public { Public declarations } procedure AddLog(p_Info: string); //添加一条日志信息 procedure FlushLogFile; //日志内容立即写入文件 published { Published declarations } property LogFilePath: string; //日志文件保存的路径 property LogFileNamePrefix: string ; //日志文件名前缀 property LogFileNameSuffix: string; //日志文件名后缀 property MaxCountPreFile: integer; //每个文件最大记录数 property Reserved: integer; //保留前多少个日志文件 property SingleLine: boolean; //每行一条记录 property RecordTime: Boolean; //自动添加时间 property Display: TStrings read ; //显示日志内容的Memo或Listbox的Items property AddBlankLine: Boolean; //在日志信息后添加空白行 property FlushImmediately: Boolean ; //立即将文件缓存写入磁盘 end; ------------------------------------ 文件列表: LogWriter.pas//源代码 LogWriter.dcr//组件图标文件 为自己的组件添加图标的方法.doc //

Delphi程序中动态生成控件的方法及应用

一、Delphi中生成控件的两种方法 ---- 1、 Form(表单)设计中生成控件 ---- 在进行Form设计时,直接在控件工具箱选择所需控件,再设置其属性与响应事件,这种方法比较常见。 ---- 2、 程序中动态生成控件 ---- 有时候,我们需要在程序运行时动态生成控件,这样做有两大优点:一是可以增加程序的灵活性;二是如果生成控件的多少与程序中间运行结果相关,显然方法一是无法的实现的,必须用程序中动态生成方法。 ---- 程序中动态生成控件的方法分为三步,首先,定义生成的控件类型,再用

s13596191285的博客 1783

DELPHI动态创建控件以及控件事件(转)配合 让FIREDAC记录数据库的异常日志...

DELPHI中我们经常要动态的创建控件以及控件事件。例如,我们可能想根据程序需要动态的创建一些Tshape组件来创建某个图形,并使得在鼠标移动上去之后可以完成某些操作。这一般需要需要三步: 生成一个制定组件类的实例 为这个实例付初值 在使用完毕后,释放资源 下面将通过一个例子来演示,例子的功能是动态创建一个Tshape的实例MyShape,并且在鼠标移动到MyShape...

weixin_30745553的博客 203

Delphi 动态创建控件,并绑定控件事件

type TForm13 = class(TForm) Button1: TButton; ScrollBox1: TScrollBox; procedure Button1Click(Sender: TObject); private { Private declarations } procedure myClick(...

aldsot0997的博客 960

(32)uniGUI for Delphi下如何动态创建控件

(中行雷威2019.5.30) (同一个世界,同一个梦想,交流学习C++Builder and Delphi XE10,传承c++builder and Delphi的魅力!欢迎各地朋友加入我的QQ群484979943、860634510、299497712,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。) 【阅读倡议】 1、有问题请留言; 2、没问题请点赞; 3、看连载请加群; 4、下源码请加群; 【开发工具】 1、

martian6125 's blog! 873

Delphi7下面关于动态创建控件和释放的个人总结

昨天,一个网友在动态创建控件时释放出了错。他的情况是,动态创建了N个Panel,然后双击Panel就释放掉该Panel。可问题就来了,一释放就出错。然后就一顿讨论。当然也有其他的高手给出了代码,可高手的代码用的是XE5写的。我和那位网友都是Delphi7。网上也有别的一些动态创建和释放控件的代码但是跟我这讲的不一样。现在就把我自己在这件事的一些所想写下来,为后面的一些人提示或者铺路。软件这玩意跟环

迷路的指南针的专栏 9655

C++ Builder 实现动态生成窗口、控件,以及处理控件事件

以下代码出自http://blog.csdn.net/hellogv/,引用请注明出处!  废话就不多说,直接开始本文的重点 //---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){//

hellogv的专栏 7596

Delphi 动态创建CheckBox

本章来说说在Delphi中,动态创建CheckBox控件;在要在界面显示之前就创建好,可在create事件中创建。 CheckboxFlag=0  单个选择   1 全选/全不选 由于全选或全不选都调用MyCheckboxClick 第一步:创建CheckBox控件 Checkboxs:array[0..200] of TCheckBox; for i:=0 to (MainForm....

^@^lemon tea^@^ 1782

[Delphi]动态创建控件, 实现右键点击不同控件展示不同选项

1.动态创建按钮,并安放在ScrollBox中获得按钮信息,然后创建, 目前案例是从数据库中取值, 然后动态创建. 源代码仅给出实现方式参考procedure TFrm1.LoadElementPage; var mSetBase1 : TButton; i,j : Integer; tmpQuery : TDBQuery; begin fControl1Manager := TO...

艴小鱼的博客 2070

動態創建Webbrowser並給定OnDocumentComplete事件!!!多個創建有問題

 一個動態創建Webbrowser並給定OnDocumentComplete事件的簡單例子  ---------------聲明是這樣子的(事件不同就不同)-----------------------private{ Private declarations }public{ Public declarations }procedure proDocumentComplete(Sen

devhp的专栏 1145

***************我动态创建的EDIT,怎么给他加 OnChange事件

***************我动态创建的EDIT,怎么给他加 OnChange事件 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiDB/html/delphi_20061216164404267.html 我动态创建的EDIT,怎么给他加 OnChange事件 写个事件付值给它 procedure E...

aibi9196的博客 230

DELPHI 动态 创建和释放 多个 EDIT 控件

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) pnl1: TPanel; ...

weixin_33921089的博客 334

delphi tips and articles 4

1用回车键代替Tab键 把Form的KeyPreview属性设为True在Form的OnKeyDown事件处理程序中:  if Key = VK_RETURN then  begin    Key := VK_TAB;    FindNextControl(ActiveControl, True, True, False).SetFocus;  end但是,发现对cxgrid类的控件上述代

yethyeth的专栏 3170

控件对象引用

控件对象引用 The following example creates 20 edit boxes, using FindComponent with the edit box name to access each newly created edit boxprocedure TForm1.Button1Click(Sender: TOb...

weixin_30553065的博客 121
上一篇: 在DELPHI中编程生成ACCESS数据库文件并创建指向此连接的ODBC数据源
下一篇: 在DELPHI中根据事件指针调用事件
wudi_1982
博客等级 码龄24年 40粉丝 58原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值