[解決しました] Delphi XE Pro - 2つのボタンを procedureを使って一時的に無効にしたい。
2つのボタンを procedureを使って一時的に無効にしたいと思って作ってみたけど無効にならなくて何故だ?と思ったので記事にしてみた。
フォームにButtonを2つ置く。
b0003577_1231565.png

以下のようなコードを書いて、それぞれ1つ目のButtonOnOff(Sender);にブレイクポイントを置いて実行してみた。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ButtonOnOff(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ButtonOnOff(Sender);
Form1.Caption := '1111111';
ButtonOnOff(Sender);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
ButtonOnOff(Sender);
Form1.Caption := '2222222';
ButtonOnOff(Sender);
end;

procedure TForm1.ButtonOnOff(Sender: TObject);
begin
if Button1.Enabled = True then
begin
Button1.Enabled := False;
Button2.Enabled := False;
end
else
begin
Button1.Enabled := True;
Button2.Enabled := True;
end;
end;

end.
しかし、Form1.Caption := の所に戻ってくると押したボタンだけが無効になっている。
そんで2回目の ButtonOnOff(Sender); で不可解な動きになるので
理由がわかる方はコメントかトラックバックをお願いします(≧_≦)

追記:「Button2.Enabled := False;」の次に ShowMessage(''); を書くと2つのボタンがちゃんと無効になる。





2013年5月17日追記:
Delphi Forum に解答をしてもらえてました。感謝です。
TButton の Enabled := False の時の描画の問題|Delphi Forum

でも、教えてもらったコードを ButtonOnOff(Sender); に書くとボタンを押した時に他のボタンが無効にならないので
それぞれのボタンのonClickイベントの頭に書いて対応しました。
//-----------------------------------------------------------------------------
// uses に MMSystemが必要
//-----------------------------------------------------------------------------
var
StartTime := TimeGetTime;
begin
Button1.Enabled := False;
Button2.Enabled := False;
//何かの処理の代わりとしてのループ
while True do begin
if (timeGetTime - StartTime) > 2000 then break;
Application.ProcessMessages;
Sleep(1);
end;
以下略



絶対独学(完全に一人な状態)じゃ解決は無理だこれw




2013年5月23日追記:
ButtonOnOff(Sender); に書いても動くコードを
if Button1.Enabled = True then
begin
Button1.Enabled := False;
Button2.Enabled := False;

Sleep(100);
   Button1.Repaint;
Button2.Repaint;
end
else
begin
Sleep(500);
Application.ProcessMessages;

Button1.Enabled := True;
Button2.Enabled := True;
end;
end;


Application.ProcessMessages; は、無効にしている間にボタンを押した場合に復活時に実行されてしまうのを無視するために必須。

表示が更新されないのはAeroテーマを使っていると、この問題に遭遇するらしいです。
つまりVista、Win7、Win8?。
[PR]

by arigayas | 2013-05-16 12:43 | Delphi Programming | Trackback | Comments(0)
トラックバックURL : http://arigayas.exblog.jp/tb/20449366
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。
<< サクラエディタ 2.0.8.0... Delphi XE Pro -... >>