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

解決


マリモ  2007-11-29 05:21:46  No: 28729

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


分家  2007-11-29 06:08:43  No: 28730

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


KHE00221  2007-11-29 06:16:42  No: 28731

こんな感じでしょうか?

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-29 06:29:38  No: 28732

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


KHE00221  2007-11-29 16:47:13  No: 28733

スタックが気になるのなら 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 18:08:07  No: 28734

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加