唤醒控件曾经拥有的能力(重新继承是可以使用的.)
2016-11-03 19:05
253 查看
控件的祖先 TControl 有很多功能, 但它的有些子孙确丧失了很多(为了专用).
譬如 TBevel 就没有把一些常规的事件继承下来, 那些没有被继承的功能一般都隐藏在 protected 区, 如果重新继承是可以使用的.
这里尝试了另外一种方法: 自己没有继承时, 问一问有继承的兄弟、叔伯获取其它亲戚; 当然应先确保自己的祖先有该功能且没被覆盖过.
通过传统的继承法让 TBevel 相应双击事件:
先在窗体上添加一个 TBevel, 它没有双击事件, 问一问 TForm 吧:
TBevel 通过 TForm 唤醒了对 OnMouseDown、OnMouseMove、OnMouseUp 的记忆, 从而实现被拖动的动能:
http://www.cnblogs.com/del/archive/2011/05/12/2044112.html
譬如 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
相关文章推荐
- 唤醒控件曾经拥有的能力
- 最简单的方法在DataGrid中自定义样式列(通过继承可以在Datagrid中使用下拉列表框,日期控件等)
- 控件风格19种,必须倒背如流——其实就是控件所拥有的能力,即有条件使用VCL框架所提供的(功能)代码
- 在使用jquery时间控件的时候无论怎么设置readonly都没有效果,折腾了N久才知道了这个属性,希望可以为同样有过苦恼的童鞋有些帮助
- 【第二篇】Qt学习与使用---qwt可以绘制出的控件展示
- 继承自TWinControl的控件不能在设计期间接受子控件,用代码设置子控件却可以(它的自绘是直接改写PaintWindow虚函数,而不是覆盖Paint函数——对TWinControl.WMPaint又有新解了)
- duilib中加入自己定义控件之后怎么可以在xml文件里配置使用
- 不用重新安装PowerBuilder8.0也可以使用
- navisworks 二次开发 使用Controls控件的同时可以获取Autodesk.Navisworks.Api.Interop.ComApi.InwOpState10 state
- 解压MongoDB到一个目录,不知道什么原因就连接不上了,重新解压一份的同时更换目录名称,就可以正常使用了
- android控件——继承AdapterView的控件无法使用addView方法
- up和down还可以使用类似选择器的形式来捕获控件
- [ASP.NET 控件实作 Day12] 继承 TBActiveX 重新改写 TBMediaPlayer 控件
- 为什么其他类没继承System类 ,也可以直接使用System.exit()方法??
- Controls 属性与继承 TShape 类的小练习(使用TShape可以解决很多图形问题)
- WP7 可以在XAML中使用的 缓存图片控件(适合静态)
- 使用autolayout,设置子控件的宽度 与父视图的宽度成比例大小(这样类似可以设置多个按钮平均横屏排列)
- 不错的下拉列表.HTML控件和服务器控件都可以使用
- ENViews, 一个华丽丽的动效控件库,所有控件原型取自Nick Buturishvili的设计作品,使用详情可以参考demo
- 如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下: