お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"インテリマウスのオートスクロールもどき"

この発言に対し以下のコメントが寄せられています
#00595 おじちゃま さん RE:インテリマウスのオートスクロールもど

インテリマウスのオートスクロールもどきをTMemoで実現するサンプル ・縦方向のオートスクロール ・基準マウス位置の残像(?)未サポート フォーム上にTmemo,TTimerコンポーネントを貼り付けてください。 内容は簡単ですから、とくに説明は要らないと思います。 ====================================================================== var FX, FY, //基準位置(ホイールボタン押下位置) FSaX, FSaY, //マウス移動位置 FBsTmr: integer; //基準タイマイベント間隔 procedure TForm1.FormCreate(Sender: TObject); var cnt: integer; begin FBsTmr := 500; FX:=0; FY:=0; FSaX:=0; FSaY:=0; for cnt := 0 to 1000 do Memo1.Lines.Append(IntToStr(cnt)); end; procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Screen.Cursor = crSizeNS then Screen.Cursor := crDefault; FX:=X; FY:=Y; //基準座標取得 if Button = mbMiddle then begin if Shift = [ssMiddle] then begin if Timer1.Enabled then begin Timer1.Enabled := False; //タイマーイベント無効 FSaX := 0; FSaY := 0; //差分値の初期化 end else begin //オートスクロール状態に Timer1.Enabled := True; //タイマーイベント有効 Screen.Cursor := crSizeNS; //カーソル変更 end; end else begin Timer1.Enabled := False; //タイマーイベント無効 FSaX := 0; FSaY := 0; //差分値の初期化 end; end else begin Timer1.Enabled := False; //タイマーイベント無効 FSaX := 0; FSaY := 0; //差分値の初期化 end; end; procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Timer1.Enabled then begin //差分値取得 FSaX := Round((X - FX) * 0.1); FSaY := Round((Y - FY) * 0.1); if FSaY <> 0 then begin if FSaY > 0 then begin //差分値によるタイマイベント間隔の最適化 Timer1.Interval := Round(FBsTmr / FSaY); Application.ProcessMessages; Caption := IntToStr(Timer1.Interval); end else begin //差分値によるイベント間隔の最適化 Timer1.Interval := Round(FBsTmr / -FSaY); Caption := IntToStr(Timer1.Interval); end; end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if Timer1.Enabled then begin if FSaY <> 0 then begin if (Memo1.ScrollBars = ssVertical) or (Memo1.ScrollBars = ssBoth) then begin //スクロールバーの移動 if FSaY < 0 then Memo1.Perform(WM_VSCROLL,SB_LINEUP,0); if FSaY > 0 then Memo1.Perform(WM_VSCROLL,SB_LINEDOWN,0); end; end; end; end; ====================================================================== 個々の手続きは動作しますが、動作するサンプルのサブセット的なコーディン グ部分を抜き出したものですので、上記だけでは動きません。(^^ゞ悪しから ず。 動作保証できるサンプル本体は、 http://www.infonia.ne.jp/~triple/ の「フリーウェア」に置いてあります。 ぼやき... ・ライブラリにアップしたいけど何処に揚げれば良いんだろう? ・基準になるマウス位置に、残像を残す方法が、わかる方がいましたら 続けていただければ幸いです。 おじちゃま Original document by おじちゃま 氏 ID:(BYY01245)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum