詳細はリンク先の Owl's perspective さんの所でご覧頂くとして、先日記事した TFindDialogEx を、class helper に書き換えてみました。
まず、TCommonDialog と TFindDialog の class helper を書きます。
typeTCommonDialogHelper = class helper for TCommonDialogpublicprocedure ReleaseRedirector;end;TFindDialogHelper = class helper for TFindDialogpublicprocedure ReleaseHandle;end;{ TCommonDialogHelper }procedure TCommonDialogHelper.ReleaseRedirector;beginSelf.FRedirector.Free;end;{ TFindDialogHelper }procedure TFindDialogHelper.ReleaseHandle;beginSelf.FFindHandle := 0;end;
TCommonDialog のヘルパが必要なのは FRedirector は TCommonDialog のメンバだからです。
TFindDialog は TCommonDialog と同じ Unit 内にあるので、特に何もせず FRedirector を参照できます。
コードで Self を強調表示してありますが、それは Self を外すとコンパイルが通らないためです。
注意してください。
これらのヘルパメソッドを実際に使う部分は以下のようになります。
function TFindDialogEx.Execute(ParentWnd: HWND): Boolean;varTId: DWORD;begin// 無効なウィンドウハンドルでは 0 が返るTId := GetWindowThreadProcessId(Handle);if (TId = 0) then beginReleaseHandle;ReleaseRedirector;end;Result := inherited;end;
RTTI を使った場合より大分すっきりしました。
どのメンバを操作しなくてはいけないのかが判っている場合は、class helper の方が良さそうです。
0 件のコメント:
コメントを投稿