{測試結果: 只執行了消息方法, 沒有執行事件, 也就是事件被消息攔截了}
//可以並存嗎? 當然可以!{把消息的實現改為:}
[13] - 方法的調用約定
procedure TForm1.KeyDown(var msg: TWMKeyDown);
begin
ShowMessage('消息: ' + Char(msg.CharCode));
inherited;
end;
{會先執行消息, 後調用方法}
{把消息的實現改為:}
procedure TForm1.KeyDown(var msg: TWMKeyDown);
begin
inherited;
ShowMessage('消息: ' + Char(msg.CharCode));
end;
{會先調用方法, 後執行消息}
{
消息這個概念還是非常復雜的,
譬如, 現在只是攔截了 WM_KEYDOWN , Windows 的消息多著呢;
譬如, 現在只是攔截了當前窗體的消息, 能接受消息的的對象也多著呢;
還有 Delphi 定義的類似 TWMKey 這樣的眾多消息結構, 譬如鼠標的消息等等...
這是一個需要另辟專欄的話題.
總之消息很強大, 能替代所有事件; 我們研究它就是為了解決事件所不能的事情.
}
因為使用方法參數的不同, 所以有了調用約定.
譬如 Delphi 默認的是從左到右讀取參數; Window API 是從右到左讀取參數.
如果沒有調用約定, Delphi 就無法使用由 C 語言編寫的 Window API;
如果沒有調用約定, 別的語言也無法使用由 Delphi 編寫的 DLL 文件中的方法.
指示字 參數讀取順序 參數刪除 參數傳遞 備注 register 左→右 方法返回時自動刪除參數 前三個參數使用CPU的三個寄存器傳遞; 其他使用棧傳遞 速度最快, 是 Delphi 的默認方式 pascal 左→右 方法返回時自動刪除參數 使用棧傳遞參數 為兼容存在 cdecl 右→左 由調用者在調用返回時從棧中刪除參數 使用棧傳遞參數 調用來自用 C 或 C++ 編寫的共享庫, 一般用於非 Windows 操作系統 stdcall 右→左 方法返回時自動刪除參數 使用棧傳遞參數 用於調用 Windows API safecall 右→左 方法返回時自動刪除參數 使用棧傳遞參數 用於調用 Windows 中的雙重接口中的方法(除了繼承自 IInterface 和 IDispatch 的方法) near Win16 位下的產物, 現在不用了 far export