7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DelphiAdvent Calendar 2024

Day 16

[Delphi][小ネタ] 静的クラスメソッド

Last updated at Posted at 2024-12-15

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++ のライブラリを取り込んだ場合などに、良く使っています。

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?