文档章节

唤醒控件曾经拥有的能力

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 489
阅读 9
收藏 0

控件的祖先 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

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
C# 子线程调用主线程窗体的解决方法

摘自其他人博客,自己试过确实解决问题。(如在自己定义的线程里面给textbox赋值) 由于Windows窗体控件本质上不是线程安全的。因此如果有两个或多个线程适度操作某一控件的状态(set value)...

南飞鸟儿
08/27
0
0
C#使用委托调用主线程上的控件

源自:http://blog.csdn.net/wyvbboy/article/details/50587617摘自其他人博客,自己试过确实解决问题。(如在自己定义的线程里面给textbox赋值)由于Windows窗体控件本质上不是线程安全的。因...

whoisliang
2017/12/14
0
0
Java线程状态操作和锁与监视器的区别

进入正题前需要了解的概念 Java中的线程的状态分为6种。 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 运行(RUNNABLE):Java线程准备就绪(ready)和运行中(running)两种状...

kdy1994
08/20
0
0
5分钟了解Apple Watch开发

对Apple Watch的开发首先必须了解以下几点: 1: ) Apple Watch的UI只能通过StoryBoard一种方式,不可以通过代码添加控件 2:) Apple Watch的UI只有流式布局,(只能水平或竖直布局 ),那种...

xu54
07/12
0
0
rt-thread的IPC机制之事件源码分析

1 前言 事件主要用于线程间的同步,与信号量不同,它的特点是可以实现一对多,多对多的同步。即一个线程可等待多个事件的触发:可以是其中任一一个事件进行触发唤醒线程进行事件的处理操作;...

长平狐
2013/03/19
138
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈“李氏代换”——从纪念金庸和斯坦李说起

李氏代换(LSP)简介 李氏代换是软件设计的一个原则,又名依赖倒转原则或依赖倒置原则,其衍生原则有接口分离原则等。该原则由Barbara Liskov于1988年提出。 该原则指出,程序中高级别的元素...

SamYjy
31分钟前
16
0
JavaScript实现在线websocket WSS测试工具 -toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
50分钟前
1
0
linux-scp 远程拷贝报错原因

刚拿到一台重装后的服务器,远程ssh都正常,但是一scp拷贝东西就报错: 本地确定是有scp命令的,而且如果是本地没有scp不会报后面那句lost connection,因此就是远程没有scp这个命令。因此在...

linuxprobe16
今天
1
0
OSChina 周六乱弹 —— 谁小时候没当过熊孩子呀

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《行尸走肉》- amazarashi 《行尸走肉》- amazarashi 手机党少年们想听歌,请使劲儿戳(这里) @神话 :周五了,周末干啥...

小小编辑
今天
144
6
docker部署springboot项目

安装docker 菜鸟教程 springboot项目 maven依赖 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001......

yimingkeji
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部