<p>フォームでボタンをクリックしたとき、メニューをクリックしたときの操作がある程度以上時間がかかる場合ありますよね。こんな時にもう一度、ボタンをクリックされたら...。同じ処理が平行して同時に行われることになってしまいます。<br /> たいていこんな時には、処理中にもう一度ボタンをクリックされないように、Enabled プロパティを使用してクリックできないようにされていると思います。でも複数のオブジェクトを使用不可にするのは面倒な作業です。<br /> そこで今回は、アプリケーション中のすべてのフォームとフォームに張り付いたすべてのオブジェクトが使用不可能になる方法をご紹介します。<br />この方法は、Forms ユニットにある ShowModal や MessageDlg も使用している関数を使用します。</p>
<ul>
<li>ほかのフォームを触れなくする場合、function DisableTaskWindows(ActiveWindow: HWnd): Pointer; を使用します。</li>
<li>逆に使用可能に戻す場合には procedure EnableTaskWindows(WindowList: Pointer); を使用します。</li>
</ul>
<p>で使い方ですが...</p>
<ol>
<li>DisableTaskWindows(0) を実行します。(ちなみに特定のフォームのウィンドウハンドルを渡すと、特定のフォーム以外を使用不可にできます。)<br /> 戻り値のポインタは、適当な変数に保存しておいてください。後で使用します。</li>
<li>特定の処理を書きます</li>
<li>元に戻すタイミングで、EnableTaskWindows(保存しておいたポインタ) を実行します。</li>
</ol>
<p><br />実際のコードは以下のようになります。（斜体部分のみ入力します。）</p>
<pre class="brush: delphi">procedure TForm1.Button1Click(Sender: TObject);
var
  pDTW: pointer;
begin
  pDTW := DisableTaskWindows(0);  // 使用不可にして
  try
    Sleep(1000);                  // 処理をして
  finally
    EnableTaskWindows(pDTW);      // 終わったら戻す
  end;
end;
</pre>