在DELPHI中動態創建控件以及控件的事件


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

出處: http://blog.csdn.net/wudi_1982/article/details/766628


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM