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


    在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.

  • 相关阅读:
    弧长的参方程表示形式
    selenium实例
    中英文混合分词
    准确率(Precision)、召回率(Recall)以及F值(F-Measure)
    安装zeromq以及zeromq的python示例
    uwsgi安装过程中遇到的问题
    安装python-devel 在升级到python2.7之后
    更新yum源
    yum mysql on centos 7
    vue--子组件主动获取父组件的数据和方法
  • 原文地址:https://www.cnblogs.com/Thenext/p/11312258.html
Copyright © 2020-2023  润新知