唤醒控件曾经拥有的能力
生活随笔
收集整理的這篇文章主要介紹了
唤醒控件曾经拥有的能力
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
控件的祖先 TControl 有很多功能, 但它的有些子孫確喪失了很多(為了專用).
譬如 TBevel 就沒有把一些常規(guī)的事件繼承下來, 那些沒有被繼承的功能一般都隱藏在 protected 區(qū), 如果重新繼承是可以使用的.
這里嘗試了另外一種方法: 自己沒有繼承時, 問一問有繼承的兄弟、叔伯獲取其它親戚; 當(dāng)然應(yīng)先確保自己的祖先有該功能且沒被覆蓋過.
通過傳統(tǒng)的繼承法讓 TBevel 相應(yīng)雙擊事件:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ExtCtrls;typeTForm1 = class(TForm)procedure FormCreate(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}typeTMyBevel = class(TBevel)protectedprocedure DblClick; override;end;procedure TMyBevel.DblClick; begininherited;ShowMessage(ClassName); end;// procedure TForm1.FormCreate(Sender: TObject); beginwith TMyBevel.Create(Self) dobeginLeft := 10;Top := 10;Parent := Self;end; end;end.
先在窗體上添加一個 TBevel, 它沒有雙擊事件, 問一問 TForm 吧:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ExtCtrls;typeTForm1 = class(TForm)Bevel1: TBevel;procedure FormCreate(Sender: TObject);privateprocedure MyDbClick(Sender: TObject);publicend;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); beginTForm(Bevel1).OnDblClick := MyDbClick; end;procedure TForm1.MyDbClick(Sender: TObject); beginShowMessage(TComponent(Sender).Name); end;end.
TBevel 通過 TForm 喚醒了對 OnMouseDown、OnMouseMove、OnMouseUp 的記憶, 從而實現(xiàn)被拖動的動能:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ExtCtrls;typeTForm1 = class(TForm)Bevel1: TBevel;procedure FormCreate(Sender: TObject);privateprotectedprocedure 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);publicend;varForm1: TForm1;implementation{$R *.dfm}vara,b: Integer;f: Boolean;procedure TForm1.FormCreate(Sender: TObject); beginTForm(Bevel1).OnMouseDown := MyMouseDown;TForm(Bevel1).OnMouseMove := MyMouseMove;TForm(Bevel1).OnMouseUp := MyMouseUp; end;procedure TForm1.MyMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); beginf := True;a := X;b := Y; end;procedure TForm1.MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); beginif f then with TControl(Sender) dobeginLeft := Left + X - a;Top := Top + Y - b;end; end;procedure TForm1.MyMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); beginf := False; end;end.
轉(zhuǎn)載于:https://my.oschina.net/hermer/blog/320083
總結(jié)
以上是生活随笔為你收集整理的唤醒控件曾经拥有的能力的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 制作放两个小图片的按钮 - 回复 xhu
- 下一篇: JSONObject.parseObje