{從道理上來講, 這會隱藏或替換了父類的 Create ; 但實際上沒有, 編譯器 肯定要做一個幕後工作!}
//再如:TMyClass = class(TObject)
public
constructor Create(x,y: Integer);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyClass }
constructor TMyClass.Create(x, y: Integer);
begin
//inherited Create;
//...
end;
{
編譯器竟也允許沒有 overload 的重載; 竟也允許去掉這句: inherited Create;
如果沒有 TObject.Create 方法, 類如何初始化、分配內存?
所以這都是表面現象, 我想編譯器會自動 overload、自動 inherited Create 的.
其他方法不會有這些特殊待遇的, 看來哪都有走後門的.
}
[11] - 事件方法
在方法的類別中, 應該還有一種事件方法;
事件是一種特殊的屬性, 使用事件, 就是使用屬性; 然後屬性再調用事件方法.
到屬性裡面再深入學習吧.
[12] - 消息方法
//一個前導示例:{創建一 Win32 工程, 給窗體添加 OnKeyDown 事件}
{功能: 在鍵盤上按一個鍵, 窗體的標題欄會顯示鍵名}
procedure Tbu.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Self.Text := Char(Key);
end;
//現在我們用消息方法重新實現這個功能unit Unit1;
//解釋一下這個消息方法的定義:
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure KeyDown(var msg: TWMKeyDown); message WM_KEYDOWN;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.KeyDown(var msg: TWMKeyDown);
begin
Self.Text := Char(msg.CharCode);
end;procedure KeyDown(var msg: TWMKeyDown); message WM_KEYDOWN;
//如果把以上兩個功能放在一起, 當我們按下一個鍵? 會執行哪一個呢?
{
1、和其他方法的最大不同: 多了一個 message 指示字;
2、指示字後面是要攔截的消息名稱: WM_KEYDOWN;
3、它是一個過程, 過程名 KeyDown 是自定義的;
4、參數類型是消息對應的參數結構, 因為 TWMKeyDown 是 TWMKey 的重命名, 也可以 用 TWMKey;
5、參數名 msg 是自定義的;
6、參數的前綴必須是 var;
7、方法實現時不能攜帶指示字.
}{ 測試一下}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
{窗體 OnKeyDown 事件的定義}
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
{WM_KEYDOWN 消息方法的定義}
procedure KeyDown(var msg: TWMKeyDown); message WM_KEYDOWN;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{窗體 OnKeyDown 事件的實現}
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
ShowMessage('事件: ' + Char(Key));
end;
{WM_KEYDOWN 消息方法的實現}
procedure TForm1.KeyDown(var msg: TWMKeyDown);
begin
ShowMessage('消息: ' + Char(msg.CharCode));
end;
end.