• 唤醒控件曾经拥有的能力(重新继承是可以使用的.)


    控件的祖先 TControl 有很多功能, 但它的有些子孙确丧失了很多(为了专用).

    譬如 TBevel 就没有把一些常规的事件继承下来, 那些没有被继承的功能一般都隐藏在 protected 区, 如果重新继承是可以使用的.

    这里尝试了另外一种方法: 自己没有继承时, 问一问有继承的兄弟、叔伯获取其它亲戚; 当然应先确保自己的祖先有该功能且没被覆盖过.



    通过传统的继承法让 TBevel 相应双击事件:


    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
    
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    type
      TMyBevel = class(TBevel)
      protected
        procedure DblClick; override;
      end;
    
    procedure TMyBevel.DblClick;
    begin
      inherited;
      ShowMessage(ClassName);
    end;
    
    //
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      with TMyBevel.Create(Self) do
      begin
        Left := 10;
        Top := 10;
        Parent := Self;
      end;
    end;
    
    end.
    


    先在窗体上添加一个 TBevel, 它没有双击事件, 问一问 TForm 吧:


    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
    
    type
      TForm1 = class(TForm)
        Bevel1: TBevel;
        procedure FormCreate(Sender: TObject);
      private
        procedure MyDbClick(Sender: TObject);
      public
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      TForm(Bevel1).OnDblClick := MyDbClick;
    end;
    
    procedure TForm1.MyDbClick(Sender: TObject);
    begin
      ShowMessage(TComponent(Sender).Name);
    end;
    
    end.
    


    TBevel 通过 TForm 唤醒了对 OnMouseDown、OnMouseMove、OnMouseUp 的记忆, 从而实现被拖动的动能:


    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
    
    type
      TForm1 = class(TForm)
        Bevel1: TBevel;
        procedure FormCreate(Sender: TObject);
      private
      protected
        procedure MyMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
        procedure MyMouseMove(Sender: TObject; Shift: TShiftState; X: Integer; Y: Integer);
        procedure MyMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
      public
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    var
      a,b: Integer;
      f: Boolean;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      TForm(Bevel1).OnMouseDown := MyMouseDown;
      TForm(Bevel1).OnMouseMove := MyMouseMove;
      TForm(Bevel1).OnMouseUp := MyMouseUp;
    end;
    
    procedure TForm1.MyMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      f := True;
      a := X;
      b := Y;
    end;
    
    procedure TForm1.MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      if f then with TControl(Sender) do
      begin
        Left := Left + X - a;
        Top := Top + Y - b;
      end;
    end;
    
    procedure TForm1.MyMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      f := False;
    end;
    
    end.

    http://www.cnblogs.com/del/archive/2011/05/12/2044112.html

  • 相关阅读:
    oracle(Xe)数据库远程连接需修改配置参数
    oracl 权限循环查询
    控件网站
    java常用类(1)
    关于webdriver和谷歌浏览器的那些事
    2020年第27周,24.75h,完成计算智能/物联网/数据挖掘大作业
    2020年第26周,24.75h,计算智能的大小作业
    2020年第25周,25.5h,随机过程考试、report和计算智能作业
    2020年24周,11.75h,以完成作业和考试为主,看了一点点论文
    2020年第23周,11h,努力完成课程作业
  • 原文地址:https://www.cnblogs.com/findumars/p/6027850.html
Copyright © 2020-2023  润新知