ボタンを押している間インクリ

解決


マリモ  2007-11-28 20:21:46  No: 28729  IP: 192.*.*.*

TBitBtnで、ボタンが押されている間、Integer型の変数をインクリメント
orデクリメントするには、どのようにしたらよいのでしょうか。
TSpinButtonでの、OnDownClickやOnUpClickみたいなことを、TBitBtnで実現できないか試行錯誤してきます。
よろしくお願いしいます。

編集 削除
分家  2007-11-28 21:08:43  No: 28730  IP: 192.*.*.*

本家のTSpinButtonもそうしているように、
タイマーを使えばいいんじゃないかな。

編集 削除
KHE00221  2007-11-28 21:16:42  No: 28731  IP: 192.*.*.*

こんな感じでしょうか?

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;

編集 削除
杞憂  2007-11-28 21:29:38  No: 28732  IP: 192.*.*.*

再帰呼出しだと、長く押し続けた場合スタックあふれが心配だけど、
1秒間隔ならばそんなことないか...

編集 削除
KHE00221  2007-11-29 07:47:13  No: 28733  IP: 192.*.*.*

スタックが気になるのなら 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;

編集 削除
マリモ  2007-11-29 09:08:07  No: 28734  IP: 192.*.*.*

サンプルコードで実現できました。
みなさんありがとうございました。

編集 削除