実際に目にすることはあまりない現象かも知れませんが,ちょっとしたテストです.
Windows Vista 以降で,ランタイムテーマが有効な場合の現象です.
Delphi 7 では,uses に XPMan がある場合に相当します.
新規にプロジェクトを作成し,TButton を 2 つ配置し,各々のクリックイベントを以下のようにします.
どちらのクリックイベントも,最初に 2 つのボタンの Enabled プロパティの値を False にしています.
//----------------------------------------------------------------------------- // uses に MMSystemが必要 //----------------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var StartTime : DWORD; begin Button1.Enabled := False; Button2.Enabled := False;
StartTime := TimeGetTime; //何かの処理の代わりとしてのループ while True do begin if (timeGetTime - StartTime) > 2000 then break; Application.ProcessMessages; Sleep(1); end;
Button1.Enabled := True; Button2.Enabled := True; end;
procedure TForm1.Button2Click(Sender: TObject); begin Button1.Enabled := False; Button2.Enabled := False;
Sleep(2000);
//これがないとSleep中の操作が実行されてしまう Application.ProcessMessages; Button1.Enabled := True; Button2.Enabled := True; end;
これを実行すると下図のようになります.
Windows 7 + Delphi XE pro での実行結果です.
問題は,下の Button2 をクリックした時です.False の状態になっていないように見えます.
実際には False の状態になっていますが,描画が更新されていません.
Windows Vista 以降,画面でも明らかなように,デザインが変更されています.
処理内容によっては,コントロールの描画が追いつかないことがあります.
このような場合,意識的に Repaint を実行するか,少しタイムラグを付けて Repaint を実行すると描画が更新されます.
ランタイムテーマが無効であれば,この現象は発生しません.
下図は,Windows 7 + Delphi 7 Pro で,XPMan がない場合の結果です.
[参考]
[840_処理のキャンセル・画面更新の停止・キーやマウスの操作禁止]
http://mrxray.on.coocan.jp/Delphi/plSamples/840_CancellLockDisable.htm
追記
Twitter で見かけた書き込みでこの記事を書いたのですが,該当ツィートが見つかりません.
Twitter はそのような目的には適していないようです.
Twitter はリアルタイム用ですね.
本来は,[Windows システム Windows 固有の話題]だと思いますが,対象が TButton なのでこちらに書きました.
|