TBitBtnで、ボタンが押されている間、Integer型の変数をインクリメント
orデクリメントするには、どのようにしたらよいのでしょうか。
TSpinButtonでの、OnDownClickやOnUpClickみたいなことを、TBitBtnで実現できないか試行錯誤してきます。
よろしくお願いしいます。
本家のTSpinButtonもそうしているように、
タイマーを使えばいいんじゃないかな。
こんな感じでしょうか?
var
Form3: TForm3;
FMouseDown,FMouseUp : Boolean;
TickCount : DWord;
implementation
{$R *.dfm}
procedure TForm3.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if FMouseDown = True then
begin
while (1000 > GetTickCount - TickCount) and (FMouseUp = False) do
begin
Application.ProcessMessages;
end;
end;
if FMouseUp = False then
begin
Caption := Caption + '1';
FMouseDown := True;
TickCount := GetTickCount;
BitBtn1MouseDown(Sender,Button,Shift,X,Y);
end;
FMouseUp := False;
end;
procedure TForm3.BitBtn1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FMouseDown := False;
FMouseUp := True;
end;
再帰呼出しだと、長く押し続けた場合スタックあふれが心配だけど、
1秒間隔ならばそんなことないか...
スタックが気になるのなら PostMessage に変えてもいいかもしれません
var
C : Cardinal;
begin
//BitBtn1MouseDown(Sender,Button,Shift,X,Y);
C := 0;
if GetKeyState(VK_CONTROL) < 0 then C := C + MK_CONTROL;
if GetKeyState(VK_SHIFT ) < 0 then C := C + MK_SHIFT ;
PostMessage(BitBtn1.Handle,WM_LBUTTONDOWN,C,X + Y*$10000);
end;
サンプルコードで実現できました。
みなさんありがとうございました。
ツイート | ![]() |