Win32 API のコールバック関数
Delphi では一般的に Win32 API のコールバック関数は、こんな風にグローバルに定義します。
EnumWindowsを呼ぶ例
function EnumWindowsProc(AWnd: HWND; AlParam: LPARAM): BOOL; stdcall;
begin
// 何か処理
Result := True;
end;
procedure TFoo.CallEnumWindows; // TFoo クラスのメソッド
begin
EnumWindows(@EnumWindowsProc, 0);
end;
でも、グローバル関数を定義すると、なんだか TFoo と分断されてるし、場所をどこに書くか迷っちゃう…
静的クラスメソッド
実は、静的クラスメソッドを使うとそんな悩みともおさらばです。
type
TFoo = class
private
// class がクラスメソッド、最後の static が静的メソッド、を示しています
class function EnumWindowsProc(AWnd: HWND; AlParam: LPARAM): BOOL; stdcall; static;
public
procedure CallEnumWindows;
end;
class function TFoo.EnumWindowsProc(AWnd: HWND; AlParam: LPARAM): BOOL;
begin
// 何か処理
Result := True;
end;
procedure TFoo.CallEnumWindows; // TFoo クラスのメソッド
begin
EnumWindows(@EnumWindowsProc, 0);
end;
通常の Delphi のメソッドポインタとは違い、静的クラスメソッドはグローバル関数と同じ形式にコンパイルされます。
そのため、グローバル関数が必要な場合は、静的クラスメソッドとして作ると所属がはっきりしたままグローバル関数を使えるというわけです。
これは Win32 に限らず、C/C++ のライブラリを取り込んだ時とかにも使えます。
まとめ
所属がはっきりするのでコードが見やすくなります。
C/C++ のライブラリを取り込んだ場合などに、良く使っています。